Train route Titles

- Schedules now display stops in their tooltip
- Schedules can now be given a name through one of their instructions
- Fixed Display boards rendering cogs on the wrong axis
This commit is contained in:
simibubi 2022-04-11 16:25:38 +02:00
parent f2850183f5
commit 0c6a23db83
41 changed files with 719 additions and 516 deletions

View file

@ -543,22 +543,22 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
7fbb25c577025ff61388c54c43401d8bb80723dd assets/create/lang/en_ud.json
d19d6fb4534f1a3cdc05d98e2368cb622cb0b35c assets/create/lang/en_us.json
b23660c03917a455183094b16eee6574790856cd assets/create/lang/unfinished/de_de.json
6afa96843a684ce21a1d86b1f92741a9683ee4b9 assets/create/lang/unfinished/es_cl.json
9d8088da986e4d2a16cd68f29db9a72170868053 assets/create/lang/unfinished/es_es.json
0b4738efc913fdee63681abe73b2eb0f30b7248b assets/create/lang/unfinished/fr_fr.json
b42daac1a01bfcbdc1b029f343175211cc6efdbd assets/create/lang/unfinished/it_it.json
0b73ce20763075102b6a034dd261796a47bbaf11 assets/create/lang/unfinished/ja_jp.json
973bfaaaffbfc6a1577073262faf3960e4b0e81d assets/create/lang/unfinished/ko_kr.json
18491774d2545653fba5471e166136e8662d8c7f assets/create/lang/unfinished/nl_nl.json
ff022ea6d4d89f0f156bebbe9305f8a114bccf0f assets/create/lang/unfinished/pl_pl.json
df3767bf9e308e77597d173fb88c6c3f113a00af assets/create/lang/unfinished/pt_br.json
ff50da076781c6545bb7dc35898d6ff91bec8952 assets/create/lang/unfinished/pt_pt.json
ed7386a57b1758cda9d43ddf12236e56f3394649 assets/create/lang/unfinished/ro_ro.json
3a3e94e9a8ef33a7d75e60404e4a3cd0356ee86c assets/create/lang/unfinished/ru_ru.json
ca9cdfbe87c61b3d0773aaa2360d6ee0a91cff60 assets/create/lang/unfinished/zh_cn.json
8f6fefc6d5aeb0bc180b80dc8229e2c4361bc036 assets/create/lang/unfinished/zh_tw.json
0a3b09db8a3bd71570afc1452d62a1fa6bd22baa assets/create/lang/en_us.json
7ac6b939d4d1b574806ac3fa3ec495498c9c00a6 assets/create/lang/unfinished/de_de.json
58a1b86058fcebf323e2208ba26df584d42f9f97 assets/create/lang/unfinished/es_cl.json
1419151466490bfa42b84a99e0e296b54e1aeec5 assets/create/lang/unfinished/es_es.json
a366bd2c9b80079b9c42572623165497b6d49531 assets/create/lang/unfinished/fr_fr.json
b21c2d0a7cdf713492ab1eb85061df8c73a9d9b9 assets/create/lang/unfinished/it_it.json
9874ddfacd2effec2eb852ea9cc009923e372ae5 assets/create/lang/unfinished/ja_jp.json
0334b52e3e84870e84fce1e485c6153456dc84e9 assets/create/lang/unfinished/ko_kr.json
7f0bd618c72b9743832a7133db0359f546b48f5e assets/create/lang/unfinished/nl_nl.json
f6826d25ea7aca1db76e806a44434f64fb11e6b2 assets/create/lang/unfinished/pl_pl.json
5ff6c067e106418b32dbb97b3bce56a6990eaf67 assets/create/lang/unfinished/pt_br.json
8e639a6e5337e7723c454b3d01dd70e9715318fe assets/create/lang/unfinished/pt_pt.json
763413532441a056bd88bbcea394fcf9e50e8c29 assets/create/lang/unfinished/ro_ro.json
24430fe32f666e6df5fa9185dabedbe9746155d2 assets/create/lang/unfinished/ru_ru.json
9955890700831881c15b3df9d720448c09ae341e assets/create/lang/unfinished/zh_cn.json
7294335fc11c054fb761a251493b17866f01f0c2 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

View file

@ -893,6 +893,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "Clockwise",
"create.generic.counter_clockwise": "Counter-Clockwise",
"create.generic.in_quotes": "\"%1$s\"",
"create.action.scroll": "Scroll",
"create.action.confirm": "Confirm",
@ -1336,24 +1337,27 @@
"create.gui.schedule.lmb_edit": "Left-Click to Edit",
"create.gui.schedule.rmb_remove": "Right-Click to Remove",
"create.gui.schedule.duplicate": "Duplicate",
"create.gui.schedule.remove_entry": "Remove Stop",
"create.gui.schedule.add_entry": "Add Stop",
"create.gui.schedule.remove_entry": "Remove Action",
"create.gui.schedule.add_entry": "Add Action",
"create.gui.schedule.move_up": "Move up",
"create.gui.schedule.move_down": "Move down",
"create.gui.schedule.add_condition": "Add Condition",
"create.gui.schedule.alternative_condition": "Alternative Condition",
"create.schedule.destination_type": "Next Stop:",
"create.schedule.destination.editor": "Destination Editor",
"create.schedule.destination.filtered": "Specific Station",
"create.schedule.destination.filtered_matching": "Station: %1$s",
"create.schedule.destination.filter": "Station Name",
"create.schedule.destination.filter_2": "Use * as a text wildcard",
"create.schedule.destination.filter_3": "Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "Nearest Station",
"create.schedule.destination.redstone": "Station with Redstone Pulse",
"create.schedule.condition_type": "Continue when:",
"create.schedule.instruction_type": "Next Action:",
"create.schedule.instruction.editor": "Instruction Editor",
"create.schedule.instruction.destination": "Travel to Station",
"create.schedule.instruction.destination.summary": "Next Stop:",
"create.schedule.instruction.filter_edit_box": "Station Name",
"create.schedule.instruction.filter_edit_box_1": "Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "Update Schedule Title",
"create.schedule.instruction.rename.summary": "New Title:",
"create.schedule.instruction.name_edit_box": "Schedule Title",
"create.schedule.instruction.name_edit_box_1": "Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "Defaults to next destination's name",
"create.schedule.condition_type": "Continue if/after:",
"create.schedule.condition.editor": "Condition Editor",
"create.schedule.condition.delay": "Scheduled Delay",
"create.schedule.condition.delay_short": "Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1514",
"_": "Missing Localizations: 1518",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "Uhrzeigersinn",
"create.generic.counter_clockwise": "Gegen-Uhrzeigersinn",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Wechseln",
"create.action.confirm": "Bestätigen",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 525",
"_": "Missing Localizations: 529",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "En sentido del Reloj",
"create.generic.counter_clockwise": "Al contrario del Reloj",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Rueda",
"create.action.confirm": "Confirmar",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 196",
"_": "Missing Localizations: 200",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "En el sentido de las agujas del reloj",
"create.generic.counter_clockwise": "En sentido contrario a las agujas del reloj",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Desplazar",
"create.action.confirm": "Confirmar",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1776",
"_": "Missing Localizations: 1780",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smS",
"create.generic.clockwise": "dans le sens horaire",
"create.generic.counter_clockwise": "dans le sens anti-horaire",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Faire défiler",
"create.action.confirm": "Confirmer",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1465",
"_": "Missing Localizations: 1469",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$s mB",
"create.generic.clockwise": "Senso orario",
"create.generic.counter_clockwise": "Senso anti-orario",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Scorri",
"create.action.confirm": "Conferma",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 191",
"_": "Missing Localizations: 195",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "時計回り",
"create.generic.counter_clockwise": "反時計回り",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "スクロール",
"create.action.confirm": "確認",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 191",
"_": "Missing Localizations: 195",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "시계 방향",
"create.generic.counter_clockwise": "시계 반대 방향",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "스크롤하세요",
"create.action.confirm": "확인",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 2129",
"_": "Missing Localizations: 2133",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB",
"create.generic.clockwise": "UNLOCALIZED: Clockwise",
"create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Scroll",
"create.action.confirm": "Bevestigen",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 564",
"_": "Missing Localizations: 568",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smW",
"create.generic.clockwise": "Zgodnie ze wskazówkami zegara",
"create.generic.counter_clockwise": "Przeciwnie do wskazówek zegara",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Przewiń",
"create.action.confirm": "Potwierdź",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1376",
"_": "Missing Localizations: 1380",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "Sentido horário",
"create.generic.counter_clockwise": "Sentido anti-horário",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Rolar",
"create.action.confirm": "Confirmar",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1748",
"_": "Missing Localizations: 1752",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "Sentido horário",
"create.generic.counter_clockwise": "Sentido anti-horário",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Rolar",
"create.action.confirm": "Confirmar",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 192",
"_": "Missing Localizations: 196",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "În sensul acelor de ceasornic",
"create.generic.counter_clockwise": "În sensul invers acelor de ceasornic",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Derulează",
"create.action.confirm": "Confirmă",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 569",
"_": "Missing Localizations: 573",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "По часовой стрелке",
"create.generic.counter_clockwise": "Против часовой стрелки",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "Прокрутка",
"create.action.confirm": "Подтвердить",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 191",
"_": "Missing Localizations: 195",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "顺时针方向",
"create.generic.counter_clockwise": "逆时针方向",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "滚轮",
"create.action.confirm": "确认",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 583",
"_": "Missing Localizations: 587",
"_": "->------------------------] Game Elements [------------------------<-",
@ -894,6 +894,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "順時鐘方向",
"create.generic.counter_clockwise": "逆時鐘方向",
"create.generic.in_quotes": "UNLOCALIZED: \"%1$s\"",
"create.action.scroll": "滾輪",
"create.action.confirm": "確認",
@ -1337,24 +1338,27 @@
"create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit",
"create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove",
"create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop",
"create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Action",
"create.gui.schedule.add_entry": "UNLOCALIZED: Add Action",
"create.gui.schedule.move_up": "UNLOCALIZED: Move up",
"create.gui.schedule.move_down": "UNLOCALIZED: Move down",
"create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition",
"create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition",
"create.schedule.destination_type": "UNLOCALIZED: Next Stop:",
"create.schedule.destination.editor": "UNLOCALIZED: Destination Editor",
"create.schedule.destination.filtered": "UNLOCALIZED: Specific Station",
"create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s",
"create.schedule.destination.filter": "UNLOCALIZED: Station Name",
"create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station",
"create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse",
"create.schedule.condition_type": "UNLOCALIZED: Continue when:",
"create.schedule.instruction_type": "UNLOCALIZED: Next Action:",
"create.schedule.instruction.editor": "UNLOCALIZED: Instruction Editor",
"create.schedule.instruction.destination": "UNLOCALIZED: Travel to Station",
"create.schedule.instruction.destination.summary": "UNLOCALIZED: Next Stop:",
"create.schedule.instruction.filter_edit_box": "UNLOCALIZED: Station Name",
"create.schedule.instruction.filter_edit_box_1": "UNLOCALIZED: Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "UNLOCALIZED: Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "UNLOCALIZED: Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "UNLOCALIZED: Update Schedule Title",
"create.schedule.instruction.rename.summary": "UNLOCALIZED: New Title:",
"create.schedule.instruction.name_edit_box": "UNLOCALIZED: Schedule Title",
"create.schedule.instruction.name_edit_box_1": "UNLOCALIZED: Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "UNLOCALIZED: Defaults to next destination's name",
"create.schedule.condition_type": "UNLOCALIZED: Continue if/after:",
"create.schedule.condition.editor": "UNLOCALIZED: Condition Editor",
"create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay",
"create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s",

View file

@ -321,7 +321,9 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
return;
if (!(passenger instanceof LivingEntity living))
return;
float prevAngle = living.getYRot();
float angle = AngleHelper.deg(-Mth.atan2(motion.x, motion.z));
angle = AngleHelper.angleLerp(0.4f, prevAngle, angle);
if (level.isClientSide) {
living.lerpTo(0, 0, 0, 0, 0, 0, false);
living.lerpHeadTo(0, 0);

View file

@ -331,7 +331,7 @@ public class Train {
GlobalStation destination = navigation.destination;
if (!navigatingManually && fullRefresh) {
GlobalStation preferredDestination = runtime.findNextStation();
GlobalStation preferredDestination = runtime.startCurrentInstruction();
if (preferredDestination != null)
destination = preferredDestination;
}

View file

@ -234,7 +234,8 @@ public class FlapDisplayRenderer extends KineticTileEntityRenderer {
@Override
protected SuperByteBuffer getRotatedModel(KineticTileEntity te, BlockState state) {
return CachedBufferer.partial(AllBlockPartials.SHAFTLESS_COGWHEEL, state);
return CachedBufferer.partialFacingVertical(AllBlockPartials.SHAFTLESS_COGWHEEL, state,
state.getValue(FlapDisplayBlock.HORIZONTAL_FACING));
}
@Override

View file

@ -1,10 +0,0 @@
package com.simibubi.create.content.logistics.trains.management.schedule;
public class RunningScheduleScreen {
/**
* use the same rendering and mouse handling from schedule screen but add
* progress of train based on ScheduleRuntime
*/
}

View file

@ -13,10 +13,9 @@ import com.simibubi.create.content.logistics.trains.management.schedule.conditio
import com.simibubi.create.content.logistics.trains.management.schedule.condition.StationPoweredCondition;
import com.simibubi.create.content.logistics.trains.management.schedule.condition.StationUnloadedCondition;
import com.simibubi.create.content.logistics.trains.management.schedule.condition.TimeOfDayCondition;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.FilteredDestination;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.NearestDestination;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.RedstoneDestination;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleDestination;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.ChangeTitleInstruction;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.DestinationInstruction;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleInstruction;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.Pair;
@ -29,15 +28,14 @@ import net.minecraft.resources.ResourceLocation;
public class Schedule {
public static List<Pair<ResourceLocation, Supplier<? extends ScheduleDestination>>> DESTINATION_TYPES =
public static List<Pair<ResourceLocation, Supplier<? extends ScheduleInstruction>>> INSTRUCTION_TYPES =
new ArrayList<>();
public static List<Pair<ResourceLocation, Supplier<? extends ScheduleWaitCondition>>> CONDITION_TYPES =
new ArrayList<>();
static {
registerDestination("filtered", FilteredDestination::new);
registerDestination("nearest", NearestDestination::new);
registerDestination("redstone", RedstoneDestination::new);
registerInstruction("destination", DestinationInstruction::new);
registerInstruction("rename", ChangeTitleInstruction::new);
registerCondition("delay", ScheduledDelay::new);
registerCondition("time_of_day", TimeOfDayCondition::new);
registerCondition("fluid_threshold", FluidThresholdCondition::new);
@ -47,8 +45,8 @@ public class Schedule {
registerCondition("powered", StationPoweredCondition::new);
}
private static void registerDestination(String name, Supplier<? extends ScheduleDestination> factory) {
DESTINATION_TYPES.add(Pair.of(Create.asResource(name), factory));
private static void registerInstruction(String name, Supplier<? extends ScheduleInstruction> factory) {
INSTRUCTION_TYPES.add(Pair.of(Create.asResource(name), factory));
}
private static void registerCondition(String name, Supplier<? extends ScheduleWaitCondition> factory) {
@ -56,7 +54,7 @@ public class Schedule {
}
public static <T> List<? extends Component> getTypeOptions(List<Pair<ResourceLocation, T>> list) {
String langSection = list.equals(DESTINATION_TYPES) ? "destination." : "condition.";
String langSection = list.equals(INSTRUCTION_TYPES) ? "instruction." : "condition.";
return list.stream()
.map(Pair::getFirst)
.map(rl -> rl.getNamespace() + ".schedule." + langSection + rl.getPath())

View file

@ -4,7 +4,7 @@ import java.util.ArrayList;
import java.util.List;
import com.simibubi.create.content.logistics.trains.management.schedule.condition.ScheduleWaitCondition;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleDestination;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleInstruction;
import com.simibubi.create.foundation.utility.NBTHelper;
import net.minecraft.nbt.CompoundTag;
@ -12,7 +12,7 @@ import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag;
public class ScheduleEntry {
public ScheduleDestination destination;
public ScheduleInstruction instruction;
public List<List<ScheduleWaitCondition>> conditions;
public ScheduleEntry() {
@ -26,20 +26,23 @@ public class ScheduleEntry {
public CompoundTag write() {
CompoundTag tag = new CompoundTag();
ListTag outer = new ListTag();
tag.put("Destination", destination.write());
tag.put("Instruction", instruction.write());
if (!instruction.supportsConditions())
return tag;
for (List<ScheduleWaitCondition> column : conditions)
outer.add(NBTHelper.writeCompoundList(column, ScheduleWaitCondition::write));
tag.put("WaitConditions", outer);
tag.put("Conditions", outer);
return tag;
}
public static ScheduleEntry fromTag(CompoundTag tag) {
ScheduleEntry entry = new ScheduleEntry();
entry.destination = ScheduleDestination.fromTag(tag.getCompound("Destination"));
entry.instruction = ScheduleInstruction.fromTag(tag.getCompound("Instruction"));
entry.conditions = new ArrayList<>();
for (Tag t : tag.getList("WaitConditions", Tag.TAG_LIST))
if (t instanceof ListTag list)
entry.conditions.add(NBTHelper.readCompoundList(list, ScheduleWaitCondition::fromTag));
if (entry.instruction.supportsConditions())
for (Tag t : tag.getList("Conditions", Tag.TAG_LIST))
if (t instanceof ListTag list)
entry.conditions.add(NBTHelper.readCompoundList(list, ScheduleWaitCondition::fromTag));
return entry;
}

View file

@ -1,11 +1,14 @@
package com.simibubi.create.content.logistics.trains.management.schedule;
import java.util.List;
import com.simibubi.create.AllContainerTypes;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
import com.simibubi.create.content.logistics.trains.entity.CarriageContraption;
import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity;
import com.simibubi.create.content.logistics.trains.entity.Train;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.DestinationInstruction;
import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.Lang;
@ -13,6 +16,8 @@ import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.core.NonNullList;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
@ -27,8 +32,11 @@ import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.network.NetworkHooks;
public class ScheduleItem extends Item implements MenuProvider {
@ -122,6 +130,29 @@ public class ScheduleItem extends Item implements MenuProvider {
return InteractionResult.SUCCESS;
}
@Override
@OnlyIn(Dist.CLIENT)
public void appendHoverText(ItemStack stack, Level worldIn, List<Component> tooltip, TooltipFlag flagIn) {
Schedule schedule = getSchedule(stack);
if (schedule == null || schedule.entries.isEmpty())
return;
MutableComponent caret = new TextComponent("> ").withStyle(ChatFormatting.GRAY);
MutableComponent arrow = new TextComponent("-> ").withStyle(ChatFormatting.GRAY);
List<ScheduleEntry> entries = schedule.entries;
for (int i = 0; i < entries.size(); i++) {
boolean current = i == schedule.savedProgress && schedule.entries.size() > 1;
ScheduleEntry entry = entries.get(i);
if (!(entry.instruction instanceof DestinationInstruction destination))
continue;
ChatFormatting format = current ? ChatFormatting.YELLOW : ChatFormatting.GOLD;
MutableComponent prefix = current ? arrow : caret;
tooltip.add(prefix.copy()
.append(new TextComponent(destination.getFilter()).withStyle(format)));
}
}
public static Schedule getSchedule(ItemStack pStack) {
if (!pStack.hasTag())
return null;

View file

@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.trains.management.schedule;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import com.simibubi.create.AllItems;
import com.simibubi.create.content.logistics.trains.entity.Train;
@ -11,8 +12,9 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePoi
import com.simibubi.create.content.logistics.trains.management.edgePoint.station.GlobalStation;
import com.simibubi.create.content.logistics.trains.management.schedule.condition.ScheduleWaitCondition;
import com.simibubi.create.content.logistics.trains.management.schedule.condition.TimedWaitCondition;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.FilteredDestination;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleDestination;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.ChangeTitleInstruction;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.DestinationInstruction;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleInstruction;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.CTrains;
import com.simibubi.create.foundation.utility.NBTHelper;
@ -42,6 +44,7 @@ public class ScheduleRuntime {
int cooldown;
List<Integer> conditionProgress;
List<CompoundTag> conditionContext;
String currentTitle;
int ticksInTransit;
List<Integer> predictionTicks;
@ -107,12 +110,10 @@ public class ScheduleRuntime {
return;
}
GlobalStation nextStation = findNextStation();
if (nextStation == null) {
train.status.failedNavigation();
cooldown = INTERVAL;
GlobalStation nextStation = startCurrentInstruction();
if (nextStation == null)
return;
}
train.status.successfulNavigation();
if (nextStation == train.getCurrentStation()) {
state = State.IN_TRANSIT;
@ -146,14 +147,16 @@ public class ScheduleRuntime {
}
}
public GlobalStation findNextStation() {
public GlobalStation startCurrentInstruction() {
ScheduleEntry entry = schedule.entries.get(currentEntry);
ScheduleDestination destination = entry.destination;
ScheduleInstruction instruction = entry.instruction;
if (destination instanceof FilteredDestination filtered) {
String regex = filtered.nameFilter.replace("*", ".*");
if (instruction instanceof DestinationInstruction destination) {
String regex = destination.getFilter()
.replace("*", ".*");
GlobalStation best = null;
double bestCost = Double.MAX_VALUE;
for (GlobalStation globalStation : train.graph.getPoints(EdgePointType.STATION)) {
if (!globalStation.name.matches(regex))
continue;
@ -166,9 +169,23 @@ public class ScheduleRuntime {
best = globalStation;
bestCost = cost;
}
if (best == null) {
train.status.failedNavigation();
cooldown = INTERVAL;
return null;
}
return best;
}
if (instruction instanceof ChangeTitleInstruction title) {
currentTitle = title.getScheduleTitle();
state = State.PRE_TRANSIT;
currentEntry++;
return null;
}
return null;
}
@ -196,6 +213,7 @@ public class ScheduleRuntime {
paused = true;
isAutoSchedule = false;
currentEntry = 0;
currentTitle = "";
schedule = null;
state = State.PRE_TRANSIT;
conditionProgress = new ArrayList<>();
@ -213,56 +231,68 @@ public class ScheduleRuntime {
if (state == State.POST_TRANSIT || current >= entryCount) {
GlobalStation currentStation = train.getCurrentStation();
if (currentStation != null)
predictions.add(createPrediction(current, currentStation.name, 0));
predictions.add(createPrediction(current, currentStation.name, currentTitle, 0));
int departureTime = estimateStayDuration(current);
if (departureTime == -1)
accumulatedTime = -1;
} else if (train.navigation.destination != null) {
CTrains conf = AllConfigs.SERVER.trains;
double speed = (conf.getTopSpeedMPT() + conf.getTurningTopSpeedMPT()) / 2;
int timeRemaining = (int) (train.navigation.distanceToDestination / speed) * 2;
} else {
GlobalStation destination = train.navigation.destination;
if (destination != null) {
CTrains conf = AllConfigs.SERVER.trains;
double speed = (conf.getTopSpeedMPT() + conf.getTurningTopSpeedMPT()) / 2;
int timeRemaining = (int) (train.navigation.distanceToDestination / speed) * 2;
if (predictionTicks.size() > current && train.navigation.distanceStartedAt != 0) {
float predictedTime = predictionTicks.get(current);
if (predictedTime > 0) {
predictedTime *=
Mth.clamp(train.navigation.distanceToDestination / train.navigation.distanceStartedAt, 0, 1);
timeRemaining = (timeRemaining + (int) predictedTime) / 2;
if (predictionTicks.size() > current && train.navigation.distanceStartedAt != 0) {
float predictedTime = predictionTicks.get(current);
if (predictedTime > 0) {
predictedTime *= Mth
.clamp(train.navigation.distanceToDestination / train.navigation.distanceStartedAt, 0, 1);
timeRemaining = (timeRemaining + (int) predictedTime) / 2;
}
}
}
accumulatedTime += timeRemaining;
predictions.add(createPrediction(current, train.navigation.destination.name, accumulatedTime));
accumulatedTime += timeRemaining;
predictions.add(createPrediction(current, destination.name, currentTitle, accumulatedTime));
int departureTime = estimateStayDuration(current);
if (departureTime != -1)
accumulatedTime += departureTime;
if (departureTime == -1)
accumulatedTime = -1;
int departureTime = estimateStayDuration(current);
if (departureTime != -1)
accumulatedTime += departureTime;
if (departureTime == -1)
accumulatedTime = -1;
} else
predictForEntry(current, accumulatedTime, predictions);
} else
predictForEntry(current, currentTitle, accumulatedTime, predictions);
}
// Upcoming
String currentTitle = this.currentTitle;
for (int i = 1; i < entryCount; i++) {
int index = (i + current) % entryCount;
if (index == 0 && !schedule.cyclic)
break;
accumulatedTime = predictForEntry(index, accumulatedTime, predictions);
if (schedule.entries.get(index).instruction instanceof ChangeTitleInstruction title) {
currentTitle = title.getScheduleTitle();
continue;
}
accumulatedTime = predictForEntry(index, currentTitle, accumulatedTime, predictions);
}
predictions.removeIf(Objects::isNull);
return predictions;
}
private int predictForEntry(int index, int accumulatedTime, Collection<TrainDeparturePrediction> predictions) {
private int predictForEntry(int index, String currentTitle, int accumulatedTime,
Collection<TrainDeparturePrediction> predictions) {
ScheduleEntry entry = schedule.entries.get(index);
if (!(entry.destination instanceof FilteredDestination filter))
if (!(entry.instruction instanceof DestinationInstruction filter))
return accumulatedTime;
if (predictionTicks.size() <= currentEntry)
return accumulatedTime;
if (accumulatedTime == -1) {
predictions.add(createPrediction(index, filter.nameFilter, accumulatedTime));
predictions.add(createPrediction(index, filter.getFilter(), currentTitle, accumulatedTime));
return -1;
}
@ -277,7 +307,7 @@ public class ScheduleRuntime {
accumulatedTime += departureTime;
}
predictions.add(createPrediction(index, filter.nameFilter, accumulatedTime));
predictions.add(createPrediction(index, filter.getFilter(), currentTitle, accumulatedTime));
if (departureTime == -1)
return -1;
@ -301,20 +331,22 @@ public class ScheduleRuntime {
return 5; // TODO properly ask conditions for time prediction
}
private TrainDeparturePrediction createPrediction(int index, String destination, int time) {
if (++index >= schedule.entries.size()) {
private TrainDeparturePrediction createPrediction(int index, String destination, String currentTitle, int time) {
if (index >= schedule.entries.size()) {
if (!schedule.cyclic)
return new TrainDeparturePrediction(train, time, new TextComponent(" "), destination);
index %= schedule.entries.size();
}
ScheduleEntry scheduleEntry = schedule.entries.get(index);
if (!(scheduleEntry.destination instanceof FilteredDestination fd))
return new TrainDeparturePrediction(train, time, new TextComponent(" "), destination);
if (!(scheduleEntry.instruction instanceof DestinationInstruction instruction))
return null;
String station = fd.nameFilter.replaceAll("\\*", "")
.trim();
return new TrainDeparturePrediction(train, time, new TextComponent(station), destination);
return new TrainDeparturePrediction(train, time,
new TextComponent(currentTitle.isBlank() ? instruction.getFilter()
.replaceAll("\\*", "")
.trim() : currentTitle),
destination);
}
public CompoundTag write() {
@ -363,7 +395,7 @@ public class ScheduleRuntime {
discardSchedule();
return stack;
}
public void setSchedulePresentClientside(boolean present) {
schedule = present ? new Schedule() : null;
}

View file

@ -19,8 +19,8 @@ import com.mojang.math.Matrix4f;
import com.simibubi.create.content.logistics.trains.management.schedule.condition.ScheduleWaitCondition;
import com.simibubi.create.content.logistics.trains.management.schedule.condition.ScheduledDelay;
import com.simibubi.create.content.logistics.trains.management.schedule.condition.TimedWaitCondition.TimeUnit;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.FilteredDestination;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleDestination;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.DestinationInstruction;
import com.simibubi.create.content.logistics.trains.management.schedule.destination.ScheduleInstruction;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.UIRenderHelper;
@ -66,7 +66,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
private LerpedFloat scroll = LerpedFloat.linear()
.startWithValue(0);
Schedule schedule;
private Schedule schedule;
private IconButton confirmButton;
private IconButton cyclicButton;
@ -75,7 +75,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
private IconButton resetProgress;
private IconButton skipProgress;
private ScheduleDestination editingDestination;
private ScheduleInstruction editingDestination;
private ScheduleWaitCondition editingCondition;
private SelectionScrollInput scrollInput;
private Label scrollInputLabel;
@ -159,6 +159,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
cyclicIndicator.visible = false;
skipProgress.visible = false;
resetProgress.visible = false;
scrollInput = new SelectionScrollInput(leftPos + 56, topPos + 65, 143, 16);
scrollInputLabel = new Label(leftPos + 59, topPos + 69, new TextComponent("")).withShadow();
editorConfirm = new IconButton(leftPos + 56 + 168, topPos + 65 + 22, AllIcons.I_CONFIRM);
@ -167,20 +168,20 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
menu.slotsActive = true;
menu.targetSlotActive = field.needsSlot();
if (field instanceof ScheduleDestination dest) {
if (field instanceof ScheduleInstruction instruction) {
int startIndex = 0;
for (int i = 0; i < Schedule.DESTINATION_TYPES.size(); i++)
if (Schedule.DESTINATION_TYPES.get(i)
for (int i = 0; i < Schedule.INSTRUCTION_TYPES.size(); i++)
if (Schedule.INSTRUCTION_TYPES.get(i)
.getFirst()
.equals(dest.getId()))
.equals(instruction.getId()))
startIndex = i;
editingDestination = dest;
editingDestination = instruction;
updateEditorSubwidgets(editingDestination);
scrollInput.forOptions(Schedule.getTypeOptions(Schedule.DESTINATION_TYPES))
.titled(Lang.translate("schedule.destination_type"))
scrollInput.forOptions(Schedule.getTypeOptions(Schedule.INSTRUCTION_TYPES))
.titled(Lang.translate("schedule.instruction_type"))
.writingTo(scrollInputLabel)
.calling(index -> {
ScheduleDestination newlyCreated = Schedule.DESTINATION_TYPES.get(index)
ScheduleInstruction newlyCreated = Schedule.INSTRUCTION_TYPES.get(index)
.getSecond()
.get();
if (editingDestination.getId()
@ -230,19 +231,24 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
cyclicIndicator.visible = true;
skipProgress.visible = true;
resetProgress.visible = true;
if (editingCondition == null && editingDestination == null)
return;
removeWidget(scrollInput);
removeWidget(scrollInputLabel);
removeWidget(editorConfirm);
removeWidget(editorDelete);
IScheduleInput editing = editingCondition == null ? editingDestination : editingCondition;
editing.setItem(menu.getSlot(36)
.getItem());
editorSubWidgets.forEach(p -> p.getSecond()
.accept(editing, p.getFirst()));
editorSubWidgets.forEach(p -> removeWidget(p.getFirst()));
editorSubWidgets.clear();
editorDividers = null;
editingCondition = null;
editingDestination = null;
@ -257,7 +263,9 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
editorSubWidgets.forEach(p -> removeWidget(p.getFirst()));
editorSubWidgets.clear();
editorDividers = new ArrayList<>();
field.createWidgets(this, editorSubWidgets, editorDividers, leftPos - 2, topPos + 40);
if (editorSubWidgets.isEmpty())
editorDividers = null;
editorSubWidgets.forEach(pair -> {
@ -307,7 +315,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
float scrollOffset = -scroll.getValue(partialTicks);
for (int i = 0; i <= entries.size(); i++) {
if (schedule.savedProgress == i && !schedule.entries.isEmpty()) {
matrixStack.pushPose();
float expectedY = scrollOffset + topPos + yOffset + 4;
@ -348,6 +356,9 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
matrixStack.popPose();
endStencil();
if (!scheduleEntry.instruction.supportsConditions())
continue;
float h = cardHeight - 26;
float y1 = cardY + 24 + scrollOffset;
float y2 = y1 + h;
@ -363,7 +374,6 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
continue;
startStencil(matrixStack, leftPos + 43, topPos + y1, 161, h);
matrixStack.pushPose();
matrixStack.translate(0, scrollOffset, 0);
renderScheduleConditions(matrixStack, scheduleEntry, cardY, mouseX, mouseY, partialTicks, cardHeight, i);
@ -409,7 +419,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
int maxRows = 0;
for (List<ScheduleWaitCondition> list : entry.conditions)
maxRows = Math.max(maxRows, list.size());
int cardHeight = cardHeader + 24 + maxRows * 18;
boolean supportsConditions = entry.instruction.supportsConditions();
int cardHeight = cardHeader + (supportsConditions ? 24 + maxRows * 18 : 4);
matrixStack.pushPose();
matrixStack.translate(leftPos + 25, topPos + yOffset, 0);
@ -418,7 +429,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
UIRenderHelper.drawStretched(matrixStack, 1, 0, cardWidth - 2, cardHeight, zLevel, light);
UIRenderHelper.drawStretched(matrixStack, 1, 1, cardWidth - 2, cardHeight - 2, zLevel, dark);
UIRenderHelper.drawStretched(matrixStack, 2, 2, cardWidth - 4, cardHeight - 4, zLevel, medium);
UIRenderHelper.drawStretched(matrixStack, 2, 2, cardWidth - 4, cardHeader, zLevel, light);
UIRenderHelper.drawStretched(matrixStack, 2, 2, cardWidth - 4, cardHeader, zLevel,
supportsConditions ? light : medium);
AllGuiTextures.SCHEDULE_CARD_REMOVE.render(matrixStack, cardWidth - 14, 2);
AllGuiTextures.SCHEDULE_CARD_DUPLICATE.render(matrixStack, cardWidth - 14, cardHeight - 14);
@ -431,12 +443,15 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
UIRenderHelper.drawStretched(matrixStack, 8, 0, 3, cardHeight + 10, zLevel,
AllGuiTextures.SCHEDULE_STRIP_LIGHT);
AllGuiTextures.SCHEDULE_STRIP_TRAVEL.render(matrixStack, 4, 6);
AllGuiTextures.SCHEDULE_STRIP_WAIT.render(matrixStack, 4, 28);
(supportsConditions ? AllGuiTextures.SCHEDULE_STRIP_TRAVEL : AllGuiTextures.SCHEDULE_STRIP_ACTION)
.render(matrixStack, 4, 6);
Pair<ItemStack, Component> destination = entry.destination.getSummary();
if (supportsConditions)
AllGuiTextures.SCHEDULE_STRIP_WAIT.render(matrixStack, 4, 28);
Pair<ItemStack, Component> destination = entry.instruction.getSummary();
renderInput(matrixStack, destination, 26, 5, false, 100);
entry.destination.renderSpecialIcon(matrixStack, 30, 5);
entry.instruction.renderSpecialIcon(matrixStack, 30, 5);
matrixStack.popPose();
@ -518,7 +533,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
ItemStack stack = pair.getFirst();
Component text = pair.getSecond();
boolean hasItem = !stack.isEmpty();
int fieldSize = getFieldSize(minSize, pair);
int fieldSize = Math.min(getFieldSize(minSize, pair), 150);
matrixStack.pushPose();
AllGuiTextures left =
@ -542,7 +557,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
}
if (text != null)
font.drawShadow(matrixStack, text, hasItem ? 28 : 8, 4, 0xff_f2f2ee);
font.drawShadow(matrixStack, font.substrByWidth(text, 120)
.getString(), hasItem ? 28 : 8, 4, 0xff_f2f2ee);
matrixStack.popPose();
return fieldSize;
@ -575,28 +591,26 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
int maxRows = 0;
for (List<ScheduleWaitCondition> list : entry.conditions)
maxRows = Math.max(maxRows, list.size());
int cardHeight = CARD_HEADER + 24 + maxRows * 18;
int cardHeight = CARD_HEADER + (entry.instruction.supportsConditions() ? 24 + maxRows * 18 : 4);
if (y >= cardHeight) {
if (y >= cardHeight + 5) {
y -= cardHeight + 10;
if (y < 0)
return false;
continue;
}
int fieldSize = getFieldSize(100, entry.destination.getSummary());
int fieldSize = getFieldSize(100, entry.instruction.getSummary());
if (x > 25 && x <= 25 + fieldSize && y > 4 && y <= 20) {
List<Component> components = new ArrayList<>();
components.add(Lang.translate("schedule.destination_type")
.withStyle(ChatFormatting.GOLD));
components.addAll(entry.destination.getTitleAs("destination"));
components.addAll(entry.instruction.getTitleAs("instruction"));
components.add(empty);
components.add(clickToEdit);
renderTooltip(ms, components, Optional.empty(), mx, my);
if (click == 0)
startEditing(entry.destination, confirmed -> {
startEditing(entry.instruction, confirmed -> {
if (confirmed)
entry.destination = editingDestination;
entry.instruction = editingDestination;
}, false);
return true;
}
@ -746,7 +760,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
renderTooltip(ms, ImmutableList.of(Lang.translate("gui.schedule.add_entry")), Optional.empty(), mx, my);
if (click == 0)
startEditing(new FilteredDestination(), confirmed -> {
startEditing(new DestinationInstruction(), confirmed -> {
if (!confirmed)
return;
@ -754,7 +768,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
ScheduledDelay delay = new ScheduledDelay();
ArrayList<ScheduleWaitCondition> initialConditions = new ArrayList<>();
initialConditions.add(delay);
entry.destination = editingDestination;
entry.instruction = editingDestination;
delay.value = 5;
delay.timeUnit = TimeUnit.SECONDS;
entry.conditions.add(initialConditions);
@ -935,7 +949,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
AllGuiTextures.PLAYER_INVENTORY.render(pPoseStack, leftPos + 38, topPos + 122);
font.draw(pPoseStack, playerInventoryTitle, leftPos + 46, topPos + 128, 0x505050);
formattedcharsequence = editingCondition == null ? Lang.translate("schedule.destination.editor")
formattedcharsequence = editingCondition == null ? Lang.translate("schedule.instruction.editor")
.getVisualOrderText()
: Lang.translate("schedule.condition.editor")
.getVisualOrderText();

View file

@ -0,0 +1,56 @@
package com.simibubi.create.content.logistics.trains.management.schedule.destination;
import java.util.List;
import com.google.common.collect.ImmutableList;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
public class ChangeTitleInstruction extends ScheduleInstructionWithEditBox {
@Override
public Pair<ItemStack, Component> getSummary() {
return Pair.of(icon(), new TextComponent(getLabelText()));
}
@Override
public ResourceLocation getId() {
return Create.asResource("rename");
}
@Override
public ItemStack getSecondLineIcon() {
return icon();
}
@Override
public boolean supportsConditions() {
return false;
}
public String getScheduleTitle() {
return getLabelText();
}
private ItemStack icon() {
return new ItemStack(Items.NAME_TAG);
}
@Override
public List<Component> getSecondLineTooltip() {
return ImmutableList.of(Lang.translate("schedule.instruction.name_edit_box"),
Lang.translate("schedule.instruction.name_edit_box_1")
.withStyle(ChatFormatting.GRAY),
Lang.translate("schedule.instruction.name_edit_box_2")
.withStyle(ChatFormatting.DARK_GRAY));
}
}

View file

@ -0,0 +1,80 @@
package com.simibubi.create.content.logistics.trains.management.schedule.destination;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ImmutableList;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class DestinationInstruction extends ScheduleInstructionWithEditBox {
public boolean isWaypoint;
@Override
public Pair<ItemStack, Component> getSummary() {
return Pair.of(AllBlocks.TRACK_STATION.asStack(), new TextComponent(getLabelText()));
}
@Override
public boolean supportsConditions() {
return !isWaypoint;
}
@Override
protected void write(CompoundTag tag) {
tag.putBoolean("Waypoint", isWaypoint);
super.write(tag);
}
@Override
protected void read(CompoundTag tag) {
isWaypoint = tag.getBoolean("Waypoint");
super.read(tag);
}
@Override
public ResourceLocation getId() {
return Create.asResource("destination");
}
@Override
public ItemStack getSecondLineIcon() {
return AllBlocks.TRACK_STATION.asStack();
}
public String getFilter() {
return getLabelText();
}
@Override
public List<Component> getSecondLineTooltip() {
return ImmutableList.of(Lang.translate("schedule.instruction.filter_edit_box"),
Lang.translate("schedule.instruction.filter_edit_box_1")
.withStyle(ChatFormatting.GRAY),
Lang.translate("schedule.instruction.filter_edit_box_2")
.withStyle(ChatFormatting.DARK_GRAY),
Lang.translate("schedule.instruction.filter_edit_box_3")
.withStyle(ChatFormatting.DARK_GRAY));
}
@Override
@OnlyIn(Dist.CLIENT)
protected void modifyEditBox(EditBox box) {
box.setFilter(s -> StringUtils.countMatches(s, '*') <= 3);
}
}

View file

@ -1,89 +0,0 @@
package com.simibubi.create.content.logistics.trains.management.schedule.destination;
import java.util.List;
import java.util.function.BiConsumer;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ImmutableList;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create;
import com.simibubi.create.content.logistics.trains.management.schedule.IScheduleInput;
import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleScreen;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class FilteredDestination extends ScheduleDestination {
public String nameFilter = "";
@Override
public Pair<ItemStack, Component> getSummary() {
return Pair.of(AllBlocks.TRACK_STATION.asStack(), new TextComponent(nameFilter));
}
@Override
protected void read(CompoundTag tag) {
nameFilter = tag.getString("Filter");
}
@Override
protected void write(CompoundTag tag) {
tag.putString("Filter", nameFilter);
}
@Override
public ResourceLocation getId() {
return Create.asResource("filtered");
}
@Override
public ItemStack getSecondLineIcon() {
return AllBlocks.TRACK_STATION.asStack();
}
@Override
public List<Component> getTitleAs(String type) {
return ImmutableList.of(Lang.translate("schedule.destination.filtered_matching",
new TextComponent(nameFilter).withStyle(ChatFormatting.YELLOW)));
}
@Override
public List<Component> getSecondLineTooltip() {
return ImmutableList.of(Lang.translate("schedule.destination.filter"),
Lang.translate("schedule.destination.filter_2")
.withStyle(ChatFormatting.GRAY),
Lang.translate("schedule.destination.filter_3")
.withStyle(ChatFormatting.DARK_GRAY),
Lang.translate("schedule.destination.filter_4")
.withStyle(ChatFormatting.DARK_GRAY));
}
@Override
@OnlyIn(Dist.CLIENT)
public void createWidgets(ScheduleScreen screen,
List<Pair<GuiEventListener, BiConsumer<IScheduleInput, GuiEventListener>>> editorSubWidgets,
List<Integer> dividers, int x, int y) {
super.createWidgets(screen, editorSubWidgets, dividers, x, y);
EditBox editBox = new EditBox(screen.getFont(), x + 84, y + 52, 112, 10, new TextComponent(nameFilter));
editBox.setBordered(false);
editBox.setTextColor(0xFFFFFF);
editBox.setValue(nameFilter);
editBox.setFilter(s -> StringUtils.countMatches(s, '*') <= 3);
editBox.changeFocus(false);
editBox.mouseClicked(0, 0, 0);
editorSubWidgets
.add(Pair.of(editBox, (dest, box) -> ((FilteredDestination) dest).nameFilter = ((EditBox) box).getValue()));
}
}

View file

@ -1,29 +0,0 @@
package com.simibubi.create.content.logistics.trains.management.schedule.destination;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
public class NearestDestination extends ScheduleDestination {
@Override
public Pair<ItemStack, Component> getSummary() {
return Pair.of(AllBlocks.TRACK_STATION.asStack(), Lang.translate("schedule.destination.nearest"));
}
@Override
protected void write(CompoundTag tag) {}
@Override
protected void read(CompoundTag tag) {}
@Override
public ResourceLocation getId() {
return Create.asResource("nearest");
}
}

View file

@ -1,29 +0,0 @@
package com.simibubi.create.content.logistics.trains.management.schedule.destination;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
public class RedstoneDestination extends ScheduleDestination {
@Override
public Pair<ItemStack, Component> getSummary() {
return Pair.of(AllBlocks.TRACK_STATION.asStack(), new TextComponent("Redstone Pulse"));
}
@Override
protected void write(CompoundTag tag) {}
@Override
protected void read(CompoundTag tag) {}
@Override
public ResourceLocation getId() {
return Create.asResource("redstone");
}
}

View file

@ -10,11 +10,13 @@ import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;
public abstract class ScheduleDestination implements IScheduleInput {
public abstract class ScheduleInstruction implements IScheduleInput {
protected abstract void write(CompoundTag tag);
protected abstract void read(CompoundTag tag);
public abstract boolean supportsConditions();
public final CompoundTag write() {
CompoundTag tag = new CompoundTag();
@ -23,20 +25,20 @@ public abstract class ScheduleDestination implements IScheduleInput {
return tag;
}
public static ScheduleDestination fromTag(CompoundTag tag) {
public static ScheduleInstruction fromTag(CompoundTag tag) {
ResourceLocation location = new ResourceLocation(tag.getString("Id"));
Supplier<? extends ScheduleDestination> supplier = null;
for (Pair<ResourceLocation, Supplier<? extends ScheduleDestination>> pair : Schedule.DESTINATION_TYPES)
Supplier<? extends ScheduleInstruction> supplier = null;
for (Pair<ResourceLocation, Supplier<? extends ScheduleInstruction>> pair : Schedule.INSTRUCTION_TYPES)
if (pair.getFirst()
.equals(location))
supplier = pair.getSecond();
if (supplier == null) {
Create.LOGGER.warn("Could not parse schedule destination type: " + location);
return null;
Create.LOGGER.warn("Could not parse schedule instruction type: " + location);
return new DestinationInstruction();
}
ScheduleDestination scheduleDestination = supplier.get();
ScheduleInstruction scheduleDestination = supplier.get();
scheduleDestination.read(tag);
return scheduleDestination;
}

View file

@ -0,0 +1,69 @@
package com.simibubi.create.content.logistics.trains.management.schedule.destination;
import java.util.List;
import java.util.function.BiConsumer;
import com.google.common.collect.ImmutableList;
import com.simibubi.create.content.logistics.trains.management.schedule.IScheduleInput;
import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleScreen;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.Pair;
import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public abstract class ScheduleInstructionWithEditBox extends ScheduleInstruction {
private String labelText = "";
protected String getLabelText() {
return labelText;
}
protected void setLabelText(String labelText) {
this.labelText = labelText;
}
@Override
protected void read(CompoundTag tag) {
labelText = tag.getString("Text");
}
@Override
protected void write(CompoundTag tag) {
tag.putString("Text", labelText);
}
@Override
public List<Component> getTitleAs(String type) {
return ImmutableList.of(Lang.translate("schedule." + type + "." + getId().getPath() + ".summary")
.withStyle(ChatFormatting.GOLD), Lang.translate("generic.in_quotes", new TextComponent(getLabelText())));
}
@Override
@OnlyIn(Dist.CLIENT)
public void createWidgets(ScheduleScreen screen,
List<Pair<GuiEventListener, BiConsumer<IScheduleInput, GuiEventListener>>> editorSubWidgets,
List<Integer> dividers, int x, int y) {
super.createWidgets(screen, editorSubWidgets, dividers, x, y);
EditBox editBox = new EditBox(screen.getFont(), x + 84, y + 52, 112, 10, new TextComponent(labelText));
editBox.setBordered(false);
editBox.setTextColor(0xFFFFFF);
editBox.setValue(labelText);
editBox.changeFocus(false);
editBox.mouseClicked(0, 0, 0);
editorSubWidgets.add(Pair.of(editBox,
(dest, box) -> ((ScheduleInstructionWithEditBox) dest).labelText = ((EditBox) box).getValue()));
}
@OnlyIn(Dist.CLIENT)
protected void modifyEditBox(EditBox box) {}
}

View file

@ -112,7 +112,7 @@ public class DumpRailwaysCommand {
.replaceAll("_", " ")),
runtime.paused ? darkBlue : blue);
if (!runtime.paused && runtime.state != State.POST_TRANSIT) {
for (Component component : runtime.getSchedule().entries.get(runtime.currentEntry).destination
for (Component component : runtime.getSchedule().entries.get(runtime.currentEntry).instruction
.getTitleAs("destination")) {
chat.accept(" - " + component.getString(), blue);
}

View file

@ -110,6 +110,7 @@ public enum AllGuiTextures implements ScreenElement {
SCHEDULE_STRIP_TRAVEL("schedule", 12, 239, 11, 16),
SCHEDULE_STRIP_DOTTED("schedule", 23, 239, 11, 16),
SCHEDULE_STRIP_END("schedule", 34, 239, 11, 16),
SCHEDULE_STRIP_ACTION("schedule", 209, 239, 11, 16),
SCHEDULE_EDITOR("schedule_2", 256, 89),
SCHEDULE_EDITOR_INACTIVE_SLOT("schedule_2", 0, 91, 18, 18),
SCHEDULE_EDITOR_SECOND_LINE("schedule_2", 20, 91, 124, 18),

View file

@ -94,6 +94,7 @@
"create.generic.unit.millibuckets": "%1$smB",
"create.generic.clockwise": "Clockwise",
"create.generic.counter_clockwise": "Counter-Clockwise",
"create.generic.in_quotes": "\"%1$s\"",
"create.action.scroll": "Scroll",
"create.action.confirm": "Confirm",
@ -557,25 +558,31 @@
"create.gui.schedule.lmb_edit": "Left-Click to Edit",
"create.gui.schedule.rmb_remove": "Right-Click to Remove",
"create.gui.schedule.duplicate": "Duplicate",
"create.gui.schedule.remove_entry": "Remove Stop",
"create.gui.schedule.add_entry": "Add Stop",
"create.gui.schedule.remove_entry": "Remove Action",
"create.gui.schedule.add_entry": "Add Action",
"create.gui.schedule.move_up": "Move up",
"create.gui.schedule.move_down": "Move down",
"create.gui.schedule.add_condition": "Add Condition",
"create.gui.schedule.alternative_condition": "Alternative Condition",
"create.schedule.destination_type": "Next Stop:",
"create.schedule.destination.editor": "Destination Editor",
"create.schedule.destination.filtered": "Specific Station",
"create.schedule.destination.filtered_matching": "Station: %1$s",
"create.schedule.destination.filter": "Station Name",
"create.schedule.destination.filter_2": "Use * as a text wildcard",
"create.schedule.destination.filter_3": "Example: 'My Station, Platform *'",
"create.schedule.destination.filter_4": "Train picks nearest unoccupied match",
"create.schedule.destination.nearest": "Nearest Station",
"create.schedule.destination.redstone": "Station with Redstone Pulse",
"create.schedule.condition_type": "Continue when:",
"create.schedule.instruction_type": "Next Action:",
"create.schedule.instruction.editor": "Instruction Editor",
"create.schedule.instruction.destination": "Travel to Station",
"create.schedule.instruction.destination.summary": "Next Stop:",
"create.schedule.instruction.filter_edit_box": "Station Name",
"create.schedule.instruction.filter_edit_box_1": "Use * as a text wildcard",
"create.schedule.instruction.filter_edit_box_2": "Example: 'My Station, Platform *'",
"create.schedule.instruction.filter_edit_box_3": "Train picks nearest unoccupied match",
"create.schedule.instruction.rename": "Update Schedule Title",
"create.schedule.instruction.rename.summary": "New Title:",
"create.schedule.instruction.name_edit_box": "Schedule Title",
"create.schedule.instruction.name_edit_box_1": "Affects text shown on displays",
"create.schedule.instruction.name_edit_box_2": "Defaults to next destination's name",
"create.schedule.condition_type": "Continue if/after:",
"create.schedule.condition.editor": "Condition Editor",
"create.schedule.condition.delay": "Scheduled Delay",
"create.schedule.condition.delay_short": "Wait: %1$s",
"create.schedule.condition.idle": "Cargo Inactivity",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB