Auto-Schedules

- Updated bogey assets
- Schedules are now consumed and returned when added/removed from Trains
- Added a schedule retrieval option to the Stations' UI
- Schedule items now keep track of their 'progress', which can be modified to skip stations
- Fixed crash when displaying station summary on a tiny display
- Fixed display boards breaking each other when blocks are added after providing rotational force
- Added placement assist for Display Boards
- Stations can now be given a Schedule via funnels/hoppers, which will apply a copy to its train
This commit is contained in:
simibubi 2022-04-07 18:11:48 +02:00
parent 39b51821aa
commit dc44c7aa68
51 changed files with 678 additions and 15093 deletions

View file

@ -543,21 +543,21 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
dde2b8043a318bc88b6d381f9de6bfd557c0f079 assets/create/lang/en_ud.json
0ea900a1d36f0b19568f8183844a64016c539dcf assets/create/lang/en_us.json
c9977bb0eb8912a4260e414d8868628904d847a0 assets/create/lang/unfinished/de_de.json
4d30c4754b8494fbbe62340b7c67ba3d2ada6721 assets/create/lang/unfinished/es_cl.json
29c05f8ed2ec05e5bd4c73f6678946041c4e8293 assets/create/lang/unfinished/es_es.json
027514a78a5f233c2d579694fa3c6a2c57ce3272 assets/create/lang/unfinished/fr_fr.json
f354377f09ebc8ee7863dc24266215fc77003c11 assets/create/lang/unfinished/it_it.json
8e8d4fe60ca6386e14c31cb4a24274cd21e92212 assets/create/lang/unfinished/ja_jp.json
39194f6899360e4a13f0d3feac07ab25b5c18256 assets/create/lang/unfinished/ko_kr.json
4b067fe0830950e7cc6615c8f466686b5aefee7f assets/create/lang/unfinished/nl_nl.json
44fd3bc93eb6f2dce30a7f52a765662fb1093791 assets/create/lang/unfinished/pl_pl.json
410f0132633089e26db9d7b70c49fc3c39541cd6 assets/create/lang/unfinished/pt_br.json
bec4373054c1e0d2cd803572f8491e7597e292c2 assets/create/lang/unfinished/pt_pt.json
3ff78cccb260071cf5d55af9ace4f7ed1eadb46b assets/create/lang/unfinished/ru_ru.json
9ea4b032f852a55d9359fb931f5eb91243d87e36 assets/create/lang/unfinished/zh_cn.json
33a7cf2b3b6014b5714fdb5f63de49474f23d2aa assets/create/lang/unfinished/zh_tw.json
c4e50a58a6ce948f7441177a0646a866a7af5e06 assets/create/lang/en_us.json
1cb9472d43897acb2baf3e0cc98155884335c848 assets/create/lang/unfinished/de_de.json
ff2fda28b73ceca2a57e5017e7cdb2e4b81b7d38 assets/create/lang/unfinished/es_cl.json
72c764f41c300e0d189fbb3a738a8f0d49fbf545 assets/create/lang/unfinished/es_es.json
70cbad61cc90ec1ee4175aa5890bee554475273c assets/create/lang/unfinished/fr_fr.json
d5fced42d980b3bf62876546a80ede03d77126a3 assets/create/lang/unfinished/it_it.json
07cc8e1ce1015b2a8698a782053956294ea113b7 assets/create/lang/unfinished/ja_jp.json
bc66f974d2ac075a2322618dfe5ba56b5b81313c assets/create/lang/unfinished/ko_kr.json
f2ff899c0949098a60d03785a2c79b84f7c436c3 assets/create/lang/unfinished/nl_nl.json
3fe312603ca0543d03da5a9a6f889b558ce699a6 assets/create/lang/unfinished/pl_pl.json
b43a832423e18aefed0143174530abc7f5269ab3 assets/create/lang/unfinished/pt_br.json
97efc1b8919b5771ef911860a03aa98dac612978 assets/create/lang/unfinished/pt_pt.json
9fbe47bd6472b70608c0e0b4381403b9c4798ae4 assets/create/lang/unfinished/ru_ru.json
96eaf97775d91daea4fc12e4835ac4ce1a917f1b assets/create/lang/unfinished/zh_cn.json
e1039c7374dbc6b536bae27f6ff37db5f87506c0 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

@ -1383,9 +1383,15 @@
"create.schedule.loop": "Loop Forever",
"create.schedule.loop1": "Schedule starts over",
"create.schedule.loop2": "when completed",
"create.schedule.reset": "Reset Progress",
"create.schedule.skip": "Skip current Stop",
"create.schedule.train_still_assembling": "Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "Train is now following this Schedule",
"create.schedule.non_controlling_seat": "Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "Auto-Schedule discarded",
"create.schedule.removed_from_train": "Schedule retrieved from Train",
"create.schedule.no_stops": "This Schedule does not have any Stops yet",
"create.track.selection_cleared": "Selection Cleared",
"create.track.valid_connection": "Can Connect ✔",
@ -1402,6 +1408,11 @@
"create.track.leave_slope_descending": "Cannot leave this slope while descending",
"create.track.turn_90": "Can only turn up to 90 Degrees",
"create.station.create_train": "Create new Train",
"create.station.disassemble_train": "Disassemble Train",
"create.station.remove_schedule": "Retrieve Schedule",
"create.station.remove_auto_schedule": "Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1503",
"_": "Missing Localizations: 1513",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 514",
"_": "Missing Localizations: 524",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 185",
"_": "Missing Localizations: 195",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1765",
"_": "Missing Localizations: 1775",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1454",
"_": "Missing Localizations: 1464",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 180",
"_": "Missing Localizations: 190",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 180",
"_": "Missing Localizations: 190",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 2118",
"_": "Missing Localizations: 2128",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 553",
"_": "Missing Localizations: 563",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1365",
"_": "Missing Localizations: 1375",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1737",
"_": "Missing Localizations: 1747",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 558",
"_": "Missing Localizations: 568",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 180",
"_": "Missing Localizations: 190",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 572",
"_": "Missing Localizations: 582",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1384,9 +1384,15 @@
"create.schedule.loop": "UNLOCALIZED: Loop Forever",
"create.schedule.loop1": "UNLOCALIZED: Schedule starts over",
"create.schedule.loop2": "UNLOCALIZED: when completed",
"create.schedule.reset": "UNLOCALIZED: Reset Progress",
"create.schedule.skip": "UNLOCALIZED: Skip current Stop",
"create.schedule.train_still_assembling": "UNLOCALIZED: Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "UNLOCALIZED: Train is now following this Schedule",
"create.schedule.non_controlling_seat": "UNLOCALIZED: Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "UNLOCALIZED: Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "UNLOCALIZED: Auto-Schedule discarded",
"create.schedule.removed_from_train": "UNLOCALIZED: Schedule retrieved from Train",
"create.schedule.no_stops": "UNLOCALIZED: This Schedule does not have any Stops yet",
"create.track.selection_cleared": "UNLOCALIZED: Selection Cleared",
"create.track.valid_connection": "UNLOCALIZED: Can Connect ✔",
@ -1403,6 +1409,11 @@
"create.track.leave_slope_descending": "UNLOCALIZED: Cannot leave this slope while descending",
"create.track.turn_90": "UNLOCALIZED: Can only turn up to 90 Degrees",
"create.station.create_train": "UNLOCALIZED: Create new Train",
"create.station.disassemble_train": "UNLOCALIZED: Disassemble Train",
"create.station.remove_schedule": "UNLOCALIZED: Retrieve Schedule",
"create.station.remove_auto_schedule": "UNLOCALIZED: Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "UNLOCALIZED: Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "UNLOCALIZED: Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "UNLOCALIZED: No Bogeys Found",

View file

@ -261,6 +261,11 @@ public class AllSoundEvents {
public static SoundEntryProvider provider(DataGenerator generator) {
return new SoundEntryProvider(generator);
}
public static void playItemPickup(Player player) {
player.level.playSound(null, player.blockPosition(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, .2f,
1f + Create.RANDOM.nextFloat());
}
// @SubscribeEvent
// public static void cancelSubtitlesOfCompoundedSounds(PlaySoundEvent event) {

View file

@ -28,10 +28,11 @@ public class BlazeBurnerInteractionBehaviour extends MovingInteractionBehaviour
public boolean handlePlayerInteraction(Player player, InteractionHand activeHand, BlockPos localPos,
AbstractContraptionEntity contraptionEntity) {
ItemStack itemInHand = player.getItemInHand(activeHand);
if (!AllItems.SCHEDULE.isIn(itemInHand))
return false;
if (!(contraptionEntity instanceof CarriageContraptionEntity carriageEntity))
return false;
if (activeHand == InteractionHand.OFF_HAND)
return false;
Contraption contraption = carriageEntity.getContraption();
if (!(contraption instanceof CarriageContraption carriageContraption))
return false;
@ -44,26 +45,55 @@ public class BlazeBurnerInteractionBehaviour extends MovingInteractionBehaviour
Direction assemblyDirection = carriageContraption.getAssemblyDirection();
for (Direction direction : Iterate.directionsInAxis(assemblyDirection.getAxis())) {
if (carriageContraption.inControl(localPos, direction)) {
if (!carriageContraption.inControl(localPos, direction))
continue;
Schedule schedule = ScheduleItem.getSchedule(itemInHand);
if (schedule == null)
return false;
Train train = carriageEntity.getCarriage().train;
if (train == null)
return false;
if (train.heldForAssembly) {
player.displayClientMessage(Lang.translate("schedule.train_still_assembling"), true);
Train train = carriageEntity.getCarriage().train;
if (train == null)
return false;
if (player.level.isClientSide)
return true;
if (train.runtime.getSchedule() != null) {
if (!itemInHand.isEmpty()) {
AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1);
player.displayClientMessage(Lang.translate("schedule.remove_with_empty_hand"), true);
return true;
}
train.runtime.setSchedule(schedule, false);
AllSoundEvents.CONFIRM.playOnServer(player.level, player.blockPosition(), 1, 1);
player.displayClientMessage(Lang.translate("schedule.applied_to_train")
.withStyle(ChatFormatting.GREEN), true);
AllSoundEvents.playItemPickup(player);
player.displayClientMessage(Lang.translate(
train.runtime.isAutoSchedule ? "schedule.auto_removed_from_train" : "schedule.removed_from_train"),
true);
player.setItemInHand(activeHand, train.runtime.returnSchedule());
return true;
}
if (!AllItems.SCHEDULE.isIn(itemInHand))
return true;
Schedule schedule = ScheduleItem.getSchedule(itemInHand);
if (schedule == null)
return false;
if (train.heldForAssembly) {
AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1);
player.displayClientMessage(Lang.translate("schedule.train_still_assembling"), true);
return true;
}
if (schedule.entries.isEmpty()) {
AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1);
player.displayClientMessage(Lang.translate("schedule.no_stops"), true);
return true;
}
train.runtime.setSchedule(schedule, false);
AllSoundEvents.CONFIRM.playOnServer(player.level, player.blockPosition(), 1, 1);
player.displayClientMessage(Lang.translate("schedule.applied_to_train")
.withStyle(ChatFormatting.GREEN), true);
itemInHand.shrink(1);
player.setItemInHand(activeHand, itemInHand.isEmpty() ? ItemStack.EMPTY : itemInHand);
return true;
}
player.displayClientMessage(Lang.translate("schedule.non_controlling_seat"), true);

View file

@ -69,7 +69,7 @@ public class DataGathererTileEntity extends SmartTileEntity {
BlockPos sourcePosition = getSourcePosition();
BlockPos targetPosition = getTargetPosition();
if (!level.isAreaLoaded(targetPosition, 1) || !level.isAreaLoaded(sourcePosition, 1))
if (!level.isLoaded(targetPosition) || !level.isLoaded(sourcePosition))
return;
DataGathererTarget target = AllDataGathererBehaviours.targetOf(level, targetPosition);

View file

@ -2,8 +2,11 @@ package com.simibubi.create.content.logistics.trains.management.display;
import static net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED;
import java.util.List;
import java.util.Random;
import java.util.function.Predicate;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock;
@ -12,7 +15,11 @@ import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.placement.IPlacementHelper;
import com.simibubi.create.foundation.utility.placement.PlacementHelpers;
import com.simibubi.create.foundation.utility.placement.PlacementOffset;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.BlockPos;
import net.minecraft.core.BlockPos.MutableBlockPos;
import net.minecraft.core.Direction;
@ -24,6 +31,7 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
@ -61,7 +69,7 @@ public class FlapDisplayBlock extends HorizontalKineticBlock
@Override
protected boolean areStatesKineticallyEquivalent(BlockState oldState, BlockState newState) {
return false;
return super.areStatesKineticallyEquivalent(oldState, newState);
}
@Override
@ -111,6 +119,12 @@ public class FlapDisplayBlock extends HorizontalKineticBlock
return InteractionResult.PASS;
ItemStack heldItem = player.getItemInHand(hand);
IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId);
if (placementHelper.matchesItem(heldItem))
return placementHelper.getOffset(player, world, state, pos, ray)
.placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray);
FlapDisplayTileEntity flapTe = getTileEntity(world, pos);
if (flapTe == null)
@ -191,7 +205,7 @@ public class FlapDisplayBlock extends HorizontalKineticBlock
Move: for (Direction movement : Iterate.directionsInAxis(axis)) {
currentPos.set(pos);
for (int i = 0; i < 1000; i++) {
if (!level.isAreaLoaded(currentPos, 1))
if (!level.isLoaded(currentPos))
break;
BlockState other1 = currentPos.equals(pos) ? state : level.getBlockState(currentPos);
@ -216,6 +230,7 @@ public class FlapDisplayBlock extends HorizontalKineticBlock
@Override
public void onPlace(BlockState pState, Level pLevel, BlockPos pPos, BlockState pOldState, boolean pIsMoving) {
super.onPlace(pState, pLevel, pPos, pOldState, pIsMoving);
if (pOldState.getBlock() == this)
return;
LevelTickAccess<Block> blockTicks = pLevel.getBlockTicks();
@ -238,10 +253,7 @@ public class FlapDisplayBlock extends HorizontalKineticBlock
@Override
public BlockState updateShape(BlockState state, Direction pDirection, BlockState pNeighborState,
LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pNeighborPos) {
BlockState newState = updatedShapeInner(state, pDirection, pNeighborState, pLevel, pCurrentPos);
if (pLevel instanceof Level level)
KineticTileEntity.switchToBlockState(level, pCurrentPos, newState);
return newState;
return updatedShapeInner(state, pDirection, pNeighborState, pLevel, pCurrentPos);
}
private BlockState updatedShapeInner(BlockState state, Direction pDirection, BlockState pNeighborState,
@ -297,4 +309,34 @@ public class FlapDisplayBlock extends HorizontalKineticBlock
}
}
private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper());
@MethodsReturnNonnullByDefault
private static class PlacementHelper implements IPlacementHelper {
@Override
public Predicate<ItemStack> getItemPredicate() {
return AllBlocks.FLAP_DISPLAY::isIn;
}
@Override
public Predicate<BlockState> getStatePredicate() {
return AllBlocks.FLAP_DISPLAY::has;
}
@Override
public PlacementOffset getOffset(Player player, Level world, BlockState state, BlockPos pos,
BlockHitResult ray) {
List<Direction> directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getLocation(),
state.getValue(FlapDisplayBlock.HORIZONTAL_FACING)
.getAxis(),
dir -> world.getBlockState(pos.relative(dir))
.getMaterial()
.isReplaceable());
return directions.isEmpty() ? PlacementOffset.fail()
: PlacementOffset.success(pos.relative(directions.get(0)),
s -> s.setValue(HORIZONTAL_FACING, state.getValue(FlapDisplayBlock.HORIZONTAL_FACING)));
}
}
}

View file

@ -39,7 +39,7 @@ public class FlapDisplaySection {
this.cycle = cycle;
this.hasGap = hasGap;
this.singleFlap = singleFlap;
this.spinning = new boolean[singleFlap ? 1 : (int) (width / FlapDisplaySection.MONOSPACE)];
this.spinning = new boolean[singleFlap ? 1 : Math.max(0, (int) (width / FlapDisplaySection.MONOSPACE))];
this.text = Strings.repeat(" ", spinning.length);
this.component = null;
}
@ -95,7 +95,7 @@ public class FlapDisplaySection {
boolean continueSpin = Create.RANDOM.nextInt(increasingChance * max / 4) != 0;
continueSpin &= max > 5 || spinningTicks < 2;
spinning[i] &= continueSpin;
if (i > 0 && Create.RANDOM.nextInt(3) > 0)
spinning[i - 1] &= continueSpin;
if (i < spinning.length - 1 && Create.RANDOM.nextInt(3) > 0)

View file

@ -2,8 +2,8 @@ package com.simibubi.create.content.logistics.trains.management.edgePoint.statio
import com.simibubi.create.AllItems;
import com.simibubi.create.AllShapes;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.gui.ScreenOpener;
@ -15,7 +15,6 @@ import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
@ -73,10 +72,22 @@ public class StationBlock extends HorizontalDirectionalBlock implements ITE<Stat
ItemStack itemInHand = pPlayer.getItemInHand(pHand);
if (AllItems.WRENCH.isIn(itemInHand))
return InteractionResult.PASS;
if (itemInHand.getItem() == Items.SPONGE)
Create.RAILWAYS.trains.clear();
DistExecutor.unsafeRunWhenOn(Dist.CLIENT,
() -> () -> withTileEntityDo(pLevel, pPos, te -> this.displayScreen(te, pPlayer)));
InteractionResult result = onTileEntityUse(pLevel, pPos, station -> {
ItemStack autoSchedule = station.getAutoSchedule();
if (autoSchedule.isEmpty())
return InteractionResult.PASS;
if (pLevel.isClientSide)
return InteractionResult.SUCCESS;
pPlayer.getInventory()
.placeItemBackInInventory(autoSchedule);
AllSoundEvents.playItemPickup(pPlayer);
return InteractionResult.SUCCESS;
});
if (result == InteractionResult.PASS)
DistExecutor.unsafeRunWhenOn(Dist.CLIENT,
() -> () -> withTileEntityDo(pLevel, pPos, te -> this.displayScreen(te, pPlayer)));
return InteractionResult.SUCCESS;
}

View file

@ -4,19 +4,30 @@ import com.simibubi.create.Create;
import com.simibubi.create.content.logistics.trains.GraphLocation;
import com.simibubi.create.content.logistics.trains.entity.Train;
import com.simibubi.create.foundation.networking.TileEntityConfigurationPacket;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
public class StationEditPacket extends TileEntityConfigurationPacket<StationTileEntity> {
boolean dropSchedule;
boolean assemblyMode;
Boolean tryAssemble;
String name;
public static StationEditPacket dropSchedule(BlockPos pos) {
StationEditPacket packet = new StationEditPacket(pos);
packet.dropSchedule = true;
return packet;
}
public static StationEditPacket tryAssemble(BlockPos pos) {
StationEditPacket packet = new StationEditPacket(pos);
packet.tryAssemble = true;
@ -47,6 +58,9 @@ public class StationEditPacket extends TileEntityConfigurationPacket<StationTile
@Override
protected void writeSettings(FriendlyByteBuf buffer) {
buffer.writeBoolean(dropSchedule);
if (dropSchedule)
return;
buffer.writeBoolean(tryAssemble != null);
if (tryAssemble != null) {
buffer.writeBoolean(tryAssemble);
@ -58,6 +72,10 @@ public class StationEditPacket extends TileEntityConfigurationPacket<StationTile
@Override
protected void readSettings(FriendlyByteBuf buffer) {
if (buffer.readBoolean()) {
dropSchedule = true;
return;
}
name = "";
if (buffer.readBoolean()) {
tryAssemble = buffer.readBoolean();
@ -73,6 +91,11 @@ public class StationEditPacket extends TileEntityConfigurationPacket<StationTile
BlockPos blockPos = te.getBlockPos();
BlockState blockState = level.getBlockState(blockPos);
if (dropSchedule) {
scheduleDropRequested(player, te);
return;
}
if (!name.isBlank()) {
GlobalStation station = te.getStation();
GraphLocation graphLocation = te.edgePoint.determineGraphLocation();
@ -92,7 +115,7 @@ public class StationEditPacket extends TileEntityConfigurationPacket<StationTile
if (tryAssemble)
te.assemble(player.getUUID());
else {
if (disassembleAndEnterMode(te))
if (disassembleAndEnterMode(player, te))
te.refreshAssemblyInfo();
}
return;
@ -103,7 +126,7 @@ public class StationEditPacket extends TileEntityConfigurationPacket<StationTile
BlockState newState = blockState.cycle(StationBlock.ASSEMBLING);
Boolean nowAssembling = newState.getValue(StationBlock.ASSEMBLING);
if (nowAssembling) {
if (!disassembleAndEnterMode(te))
if (!disassembleAndEnterMode(player, te))
return;
} else {
te.cancelAssembly();
@ -116,17 +139,46 @@ public class StationEditPacket extends TileEntityConfigurationPacket<StationTile
te.refreshAssemblyInfo();
}
private boolean disassembleAndEnterMode(StationTileEntity te) {
private void scheduleDropRequested(ServerPlayer sender, StationTileEntity te) {
GlobalStation station = te.getStation();
if (station == null)
return;
Train train = station.getPresentTrain();
if (train == null)
return;
ItemStack schedule = train.runtime.returnSchedule();
dropSchedule(sender, te, schedule);
}
private boolean disassembleAndEnterMode(ServerPlayer sender, StationTileEntity te) {
GlobalStation station = te.getStation();
if (station != null) {
Train train = station.getPresentTrain();
BlockPos trackPosition = te.edgePoint.getGlobalPosition();
ItemStack schedule = train == null ? ItemStack.EMPTY : train.runtime.returnSchedule();
if (train != null && !train.disassemble(te.getAssemblyDirection(), trackPosition.above()))
return false;
dropSchedule(sender, te, schedule);
}
return te.tryEnterAssemblyMode();
}
private void dropSchedule(ServerPlayer sender, StationTileEntity te, ItemStack schedule) {
if (schedule.isEmpty())
return;
if (sender.getMainHandItem()
.isEmpty()) {
sender.getInventory()
.placeItemBackInInventory(schedule);
return;
}
Vec3 v = VecHelper.getCenterOf(te.getBlockPos());
ItemEntity itemEntity = new ItemEntity(te.getLevel(), v.x, v.y, v.z, schedule);
itemEntity.setDeltaMovement(Vec3.ZERO);
te.getLevel()
.addFreshEntity(itemEntity);
}
@Override
protected void applySettings(StationTileEntity te) {}

View file

@ -14,6 +14,7 @@ import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import net.minecraft.client.gui.components.EditBox;
@ -26,7 +27,7 @@ public class StationScreen extends AbstractStationScreen {
private EditBox trainNameBox;
private IconButton newTrainButton;
private IconButton disassembleTrainButton;
private IconButton openScheduleButton;
private IconButton dropScheduleButton;
private int leavingAnimation;
private LerpedFloat trainPosition;
@ -69,20 +70,23 @@ public class StationScreen extends AbstractStationScreen {
};
newTrainButton = new WideIconButton(x + 84, y + 65, AllGuiTextures.I_NEW_TRAIN);
newTrainButton.setToolTip(new TextComponent("New Train"));
newTrainButton.setToolTip(Lang.translate("station.create_train"));
newTrainButton.withCallback(assemblyCallback);
addRenderableWidget(newTrainButton);
disassembleTrainButton = new WideIconButton(x + 94, y + 65, AllGuiTextures.I_DISASSEMBLE_TRAIN);
disassembleTrainButton.active = false;
disassembleTrainButton.visible = false;
disassembleTrainButton.setToolTip(Lang.translate("station.disassemble_train"));
disassembleTrainButton.withCallback(assemblyCallback);
addRenderableWidget(disassembleTrainButton);
openScheduleButton = new IconButton(x + 73, y + 65, AllIcons.I_VIEW_SCHEDULE);
openScheduleButton.active = false;
openScheduleButton.visible = false;
addRenderableWidget(openScheduleButton);
dropScheduleButton = new IconButton(x + 73, y + 65, AllIcons.I_VIEW_SCHEDULE);
dropScheduleButton.active = false;
dropScheduleButton.visible = false;
dropScheduleButton
.withCallback(() -> AllPackets.channel.sendToServer(StationEditPacket.dropSchedule(te.getBlockPos())));
addRenderableWidget(dropScheduleButton);
onTextChanged = s -> trainNameBox.x = nameBoxX(s, trainNameBox);
trainNameBox = new EditBox(font, x + 23, y + 47, background.width - 20, 10, new TextComponent(""));
@ -133,8 +137,8 @@ public class StationScreen extends AbstractStationScreen {
newTrainButton.visible = false;
disassembleTrainButton.active = false;
disassembleTrainButton.visible = true;
openScheduleButton.active = false;
openScheduleButton.visible = true;
dropScheduleButton.active = te.trainHasSchedule;
dropScheduleButton.visible = true;
trainNameBox.active = true;
trainNameBox.setValue(imminentTrain.name.getString());
@ -164,8 +168,8 @@ public class StationScreen extends AbstractStationScreen {
displayedTrain = new WeakReference<>(null);
disassembleTrainButton.visible = false;
openScheduleButton.active = false;
openScheduleButton.visible = false;
dropScheduleButton.active = false;
dropScheduleButton.visible = false;
return;
}
@ -176,7 +180,14 @@ public class StationScreen extends AbstractStationScreen {
boolean trainAtStation = trainPresent();
disassembleTrainButton.active = trainAtStation && te.trainCanDisassemble;
openScheduleButton.active = train.runtime.getSchedule() != null;
dropScheduleButton.active = te.trainHasSchedule;
if (te.trainHasSchedule)
dropScheduleButton.setToolTip(
Lang.translate(te.trainHasAutoSchedule ? "station.remove_auto_schedule" : "station.remove_schedule"));
else
dropScheduleButton.getToolTip()
.clear();
float f = trainAtStation ? 0 : (float) (train.navigation.distanceToDestination / 30f);
trainPosition.setValue(targetPos - (targetPos + trainIconWidth) * f);

View file

@ -12,6 +12,8 @@ import java.util.UUID;
import javax.annotation.Nullable;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException;
import com.simibubi.create.content.logistics.trains.IBogeyBlock;
@ -28,11 +30,14 @@ import com.simibubi.create.content.logistics.trains.entity.TrainPacket;
import com.simibubi.create.content.logistics.trains.entity.TravellingPoint;
import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType;
import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour;
import com.simibubi.create.content.logistics.trains.management.schedule.Schedule;
import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleItem;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.WorldAttached;
import net.minecraft.core.BlockPos;
@ -43,6 +48,7 @@ import net.minecraft.core.Direction.AxisDirection;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.structure.BoundingBox;
@ -50,6 +56,11 @@ import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.network.PacketDistributor;
public class StationTileEntity extends SmartTileEntity {
@ -58,18 +69,24 @@ public class StationTileEntity extends SmartTileEntity {
protected int failedCarriageIndex;
protected AssemblyException lastException;
protected IItemHandlerModifiable autoSchedule;
protected LazyOptional<IItemHandler> capability;
// for display
UUID imminentTrain;
boolean trainPresent;
boolean trainBackwards;
boolean trainCanDisassemble;
boolean trainHasSchedule;
boolean trainHasAutoSchedule;
public StationTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
setLazyTickRate(20);
lastException = null;
failedCarriageIndex = -1;
autoSchedule = new StationInventory();
capability = LazyOptional.of(() -> autoSchedule);
}
@Override
@ -85,6 +102,8 @@ public class StationTileEntity extends SmartTileEntity {
super.read(tag, clientPacket);
invalidateRenderBoundingBox();
autoSchedule.setStackInSlot(0, ItemStack.of(tag.getCompound("HeldItem")));
if (!clientPacket)
return;
if (!tag.contains("ImminentTrain")) {
@ -96,15 +115,19 @@ public class StationTileEntity extends SmartTileEntity {
}
imminentTrain = tag.getUUID("ImminentTrain");
trainPresent = tag.getBoolean("TrainPresent");
trainCanDisassemble = tag.getBoolean("TrainCanDisassemble");
trainBackwards = tag.getBoolean("TrainBackwards");
trainPresent = tag.contains("TrainPresent");
trainCanDisassemble = tag.contains("TrainCanDisassemble");
trainBackwards = tag.contains("TrainBackwards");
trainHasSchedule = tag.contains("TrainHasSchedule");
trainHasAutoSchedule = tag.contains("TrainHasAutoSchedule");
}
@Override
protected void write(CompoundTag tag, boolean clientPacket) {
AssemblyException.write(tag, lastException);
tag.putInt("FailedCarriageIndex", failedCarriageIndex);
tag.put("HeldItem", autoSchedule.getStackInSlot(0)
.serializeNBT());
super.write(tag, clientPacket);
if (!clientPacket)
@ -113,9 +136,17 @@ public class StationTileEntity extends SmartTileEntity {
return;
tag.putUUID("ImminentTrain", imminentTrain);
tag.putBoolean("TrainPresent", trainPresent);
tag.putBoolean("TrainCanDisassemble", trainCanDisassemble);
tag.putBoolean("TrainBackwards", trainBackwards);
if (trainPresent)
NBTHelper.putMarker(tag, "TrainPresent");
if (trainCanDisassemble)
NBTHelper.putMarker(tag, "TrainCanDisassemble");
if (trainBackwards)
NBTHelper.putMarker(tag, "TrainBackwards");
if (trainHasSchedule)
NBTHelper.putMarker(tag, "TrainHasSchedule");
if (trainHasAutoSchedule)
NBTHelper.putMarker(tag, "TrainHasAutoSchedule");
}
@Nullable
@ -157,13 +188,24 @@ public class StationTileEntity extends SmartTileEntity {
boolean trainPresent = imminentTrain != null && imminentTrain.getCurrentStation() == station;
boolean canDisassemble = trainPresent && imminentTrain.canDisassemble();
UUID imminentID = imminentTrain != null ? imminentTrain.id : null;
boolean trainHasSchedule = trainPresent && imminentTrain.runtime.getSchedule() != null;
boolean trainHasAutoSchedule = trainHasSchedule && imminentTrain.runtime.isAutoSchedule;
boolean newlyArrived = this.trainPresent != trainPresent;
if (newlyArrived)
applyAutoSchedule();
if (newlyArrived || this.trainCanDisassemble != canDisassemble
|| !Objects.equals(imminentID, this.imminentTrain) || this.trainHasSchedule != trainHasSchedule
|| this.trainHasAutoSchedule != trainHasAutoSchedule) {
if (this.trainPresent != trainPresent || this.trainCanDisassemble != canDisassemble
|| !Objects.equals(imminentID, this.imminentTrain)) {
this.imminentTrain = imminentID;
this.trainPresent = trainPresent;
this.trainCanDisassemble = canDisassemble;
this.trainBackwards = imminentTrain != null && imminentTrain.currentlyBackwards;
this.trainHasSchedule = trainHasSchedule;
this.trainHasAutoSchedule = trainHasAutoSchedule;
notifyUpdate();
}
}
@ -531,4 +573,51 @@ public class StationTileEntity extends SmartTileEntity {
return new AABB(worldPosition, edgePoint.getGlobalPosition()).inflate(2);
}
public ItemStack getAutoSchedule() {
return autoSchedule.getStackInSlot(0);
}
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
if (isItemHandlerCap(cap))
return capability.cast();
return super.getCapability(cap, side);
}
private void applyAutoSchedule() {
ItemStack stack = getAutoSchedule();
if (!AllItems.SCHEDULE.isIn(stack))
return;
Schedule schedule = ScheduleItem.getSchedule(stack);
if (schedule == null || schedule.entries.isEmpty())
return;
GlobalStation station = getStation();
if (station == null)
return;
Train imminentTrain = station.getImminentTrain();
if (imminentTrain == null || imminentTrain.getCurrentStation() != station)
return;
imminentTrain.runtime.setSchedule(schedule, true);
AllSoundEvents.CONFIRM.playOnServer(level, worldPosition, 1, 1);
}
private class StationInventory extends ItemStackHandler {
public StationInventory() {
super(1);
}
@Override
protected void onContentsChanged(int slot) {
applyAutoSchedule();
sendData();
}
@Override
public boolean isItemValid(int slot, ItemStack stack) {
return super.isItemValid(slot, stack) && AllItems.SCHEDULE.isIn(stack);
}
}
}

View file

@ -66,10 +66,12 @@ public class Schedule {
public List<ScheduleEntry> entries;
public boolean cyclic;
public int savedProgress;
public Schedule() {
entries = new ArrayList<>();
cyclic = true;
savedProgress = 0;
}
public CompoundTag write() {
@ -77,6 +79,8 @@ public class Schedule {
ListTag list = NBTHelper.writeCompoundList(entries, ScheduleEntry::write);
tag.put("Entries", list);
tag.putBoolean("Cyclic", cyclic);
if (savedProgress > 0)
tag.putInt("Progress", savedProgress);
return tag;
}
@ -84,6 +88,8 @@ public class Schedule {
Schedule schedule = new Schedule();
schedule.entries = NBTHelper.readCompoundList(tag.getList("Entries", Tag.TAG_COMPOUND), ScheduleEntry::fromTag);
schedule.cyclic = tag.getBoolean("Cyclic");
if (tag.contains("Progress"))
schedule.savedProgress = tag.getInt("Progress");
return schedule;
}

View file

@ -100,11 +100,24 @@ public class ScheduleItem extends Item implements MenuProvider {
return InteractionResult.SUCCESS;
}
if (train.runtime.getSchedule() != null) {
AllSoundEvents.DENY.playOnServer(pPlayer.level, pPlayer.blockPosition(), 1, 1);
pPlayer.displayClientMessage(Lang.translate("schedule.remove_with_empty_hand"), true);
return InteractionResult.SUCCESS;
}
if (schedule.entries.isEmpty()) {
AllSoundEvents.DENY.playOnServer(pPlayer.level, pPlayer.blockPosition(), 1, 1);
pPlayer.displayClientMessage(Lang.translate("schedule.no_stops"), true);
return InteractionResult.SUCCESS;
}
train.runtime.setSchedule(schedule, false);
AllSoundEvents.CONFIRM.playOnServer(pPlayer.level, pPlayer.blockPosition(), 1, 1);
pPlayer.displayClientMessage(Lang.translate("schedule.applied_to_train")
.withStyle(ChatFormatting.GREEN), true);
pStack.shrink(1);
pPlayer.setItemInHand(pUsedHand, pStack.isEmpty() ? ItemStack.EMPTY : pStack);
}
return InteractionResult.SUCCESS;
}

View file

@ -0,0 +1,79 @@
package com.simibubi.create.content.logistics.trains.management.schedule;
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.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber
public class ScheduleItemRetrieval {
@SubscribeEvent
public static void removeScheduleFromConductor(EntityInteract event) {
Entity entity = event.getTarget();
Player player = event.getPlayer();
if (player == null || entity == null)
return;
Entity rootVehicle = entity.getRootVehicle();
if (!(rootVehicle instanceof CarriageContraptionEntity))
return;
if (player.level.isClientSide)
return;
if (event.getHand() == InteractionHand.OFF_HAND)
return;
CarriageContraptionEntity cce = (CarriageContraptionEntity) rootVehicle;
Contraption contraption = cce.getContraption();
if (!(contraption instanceof CarriageContraption cc))
return;
Train train = cce.getCarriage().train;
if (train == null)
return;
if (train.runtime.getSchedule() == null)
return;
Integer seatIndex = contraption.getSeatMapping()
.get(entity.getUUID());
if (seatIndex == null)
return;
BlockPos seatPos = contraption.getSeats()
.get(seatIndex);
Couple<Boolean> directions = cc.conductorSeats.get(seatPos);
if (directions == null)
return;
ItemStack itemInHand = player.getItemInHand(event.getHand());
if (!itemInHand.isEmpty()) {
AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1);
player.displayClientMessage(Lang.translate("schedule.remove_with_empty_hand"), true);
event.setCanceled(true);
return;
}
AllSoundEvents.playItemPickup(player);
player.displayClientMessage(
Lang.translate(
train.runtime.isAutoSchedule ? "schedule.auto_removed_from_train" : "schedule.removed_from_train"),
true);
player.getInventory().placeItemBackInInventory(train.runtime.returnSchedule());
// player.setItemInHand(event.getHand(), train.runtime.returnSchedule());
event.setCanceled(true);
return;
}
}

View file

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.simibubi.create.AllItems;
import com.simibubi.create.content.logistics.trains.entity.Train;
import com.simibubi.create.content.logistics.trains.management.display.GlobalTrainDisplayData.TrainDeparturePrediction;
import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType;
@ -20,6 +21,7 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
public class ScheduleRuntime {
@ -31,7 +33,7 @@ public class ScheduleRuntime {
Train train;
Schedule schedule;
boolean isAutoSchedule;
public boolean isAutoSchedule;
public boolean paused;
public int currentEntry;
public State state;
@ -173,7 +175,7 @@ public class ScheduleRuntime {
public void setSchedule(Schedule schedule, boolean auto) {
reset();
this.schedule = schedule;
currentEntry = 0;
currentEntry = Mth.clamp(schedule.savedProgress, 0, schedule.entries.size() - 1);
paused = false;
isAutoSchedule = auto;
train.status.newSchedule();
@ -186,6 +188,7 @@ public class ScheduleRuntime {
}
public void discardSchedule() {
train.navigation.cancelNavigation();
reset();
}
@ -349,4 +352,20 @@ public class ScheduleRuntime {
}
}
public ItemStack returnSchedule() {
if (schedule == null)
return ItemStack.EMPTY;
ItemStack stack = AllItems.SCHEDULE.asStack();
CompoundTag nbt = stack.getOrCreateTag();
schedule.savedProgress = currentEntry;
nbt.put("Schedule", schedule.write());
stack = isAutoSchedule ? ItemStack.EMPTY : stack;
discardSchedule();
return stack;
}
public void setSchedulePresentClientside(boolean present) {
schedule = present ? new Schedule() : null;
}
}

View file

@ -72,6 +72,9 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
private IconButton cyclicButton;
private Indicator cyclicIndicator;
private IconButton resetProgress;
private IconButton skipProgress;
private ScheduleDestination editingDestination;
private ScheduleWaitCondition editingCondition;
private SelectionScrollInput scrollInput;
@ -112,6 +115,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
schedule.cyclic = !schedule.cyclic;
cyclicIndicator.state = schedule.cyclic ? State.ON : State.OFF;
});
List<Component> tip = cyclicButton.getToolTip();
tip.add(Lang.translate("schedule.loop"));
tip.add(Lang.translate("schedule.loop1")
@ -121,6 +125,25 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
addRenderableWidget(cyclicButton);
resetProgress = new IconButton(leftPos + 45, topPos + 202, AllIcons.I_PRIORITY_VERY_HIGH);
resetProgress.withCallback(() -> {
schedule.savedProgress = 0;
resetProgress.active = false;
});
resetProgress.active = schedule.savedProgress > 0 && !schedule.entries.isEmpty();
resetProgress.setToolTip(Lang.translate("schedule.reset"));
addRenderableWidget(resetProgress);
skipProgress = new IconButton(leftPos + 63, topPos + 202, AllIcons.I_PRIORITY_LOW);
skipProgress.withCallback(() -> {
schedule.savedProgress++;
schedule.savedProgress %= schedule.entries.size();
resetProgress.active = schedule.savedProgress > 0;
});
skipProgress.active = schedule.entries.size() > 1;
skipProgress.setToolTip(Lang.translate("schedule.skip"));
addRenderableWidget(skipProgress);
stopEditing();
extraAreas = ImmutableList.of(new Rect2i(leftPos + bg.width, topPos + bg.height - 56, 48, 48));
horizontalScrolls.clear();
@ -134,6 +157,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
confirmButton.visible = false;
cyclicButton.visible = false;
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);
@ -203,6 +228,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
confirmButton.visible = true;
cyclicButton.visible = true;
cyclicIndicator.visible = true;
skipProgress.visible = true;
resetProgress.visible = true;
if (editingCondition == null && editingDestination == null)
return;
removeWidget(scrollInput);
@ -248,6 +275,11 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
scroll.tickChaser();
for (LerpedFloat lerpedFloat : horizontalScrolls)
lerpedFloat.tickChaser();
schedule.savedProgress =
schedule.entries.isEmpty() ? 0 : Mth.clamp(schedule.savedProgress, 0, schedule.entries.size() - 1);
resetProgress.active = schedule.savedProgress > 0;
skipProgress.active = schedule.entries.size() > 1;
}
@Override
@ -275,6 +307,17 @@ 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;
float actualY = Mth.clamp(expectedY, 49, 197);
matrixStack.translate(0, actualY, 0);
(expectedY == actualY ? AllGuiTextures.SCHEDULE_POINTER : AllGuiTextures.SCHEDULE_POINTER_OFFSCREEN)
.render(matrixStack, leftPos, 0);
matrixStack.popPose();
}
startStencil(matrixStack, leftPos + 16, topPos + 16, 220, 173);
matrixStack.pushPose();
matrixStack.translate(0, scrollOffset, 0);
@ -431,7 +474,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
matrixStack.popPose();
if (xOffset + 16 > cardWidth - 26) {
TransformStack.cast(matrixStack).rotateZ(-90);
TransformStack.cast(matrixStack)
.rotateZ(-90);
Matrix4f m = matrixStack.last()
.pose();
GuiUtils.drawGradientRect(m, 200, -cardHeight + 2, 18, -2 - cardHeader, 28, 0x44000000, 0x00000000);
@ -854,7 +898,8 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
protected void renderForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) {
super.renderForeground(matrixStack, mouseX, mouseY, partialTicks);
GuiGameElement.of(menu.contentHolder).<GuiGameElement
.GuiRenderBuilder>at(leftPos + AllGuiTextures.SCHEDULE.width, topPos + AllGuiTextures.SCHEDULE.height - 56, -200)
.GuiRenderBuilder>at(leftPos + AllGuiTextures.SCHEDULE.width, topPos + AllGuiTextures.SCHEDULE.height - 56,
-200)
.scale(3)
.render(matrixStack);
action(matrixStack, mouseX, mouseY, -1);

View file

@ -114,6 +114,8 @@ public enum AllGuiTextures implements ScreenElement {
SCHEDULE_EDITOR_INACTIVE_SLOT("schedule_2", 0, 91, 18, 18),
SCHEDULE_EDITOR_SECOND_LINE("schedule_2", 20, 91, 124, 18),
SCHEDULE_EDITOR_DIVIDER("schedule_2", 145, 91, 4, 18),
SCHEDULE_POINTER("schedule", 185, 239, 21, 16),
SCHEDULE_POINTER_OFFSCREEN("schedule", 171, 239, 13, 16),
STATION("schedule_2", 0, 111, 200, 127),
STATION_ASSEMBLING("assemble", 200, 178),

View file

@ -604,9 +604,15 @@
"create.schedule.loop": "Loop Forever",
"create.schedule.loop1": "Schedule starts over",
"create.schedule.loop2": "when completed",
"create.schedule.reset": "Reset Progress",
"create.schedule.skip": "Skip current Stop",
"create.schedule.train_still_assembling": "Confirm Train Assembly in the Station UI first",
"create.schedule.applied_to_train": "Train is now following this Schedule",
"create.schedule.non_controlling_seat": "Conductor needs to sit in front of a Controls block",
"create.schedule.remove_with_empty_hand": "Remove current Schedule with an Empty Hand",
"create.schedule.auto_removed_from_train": "Auto-Schedule discarded",
"create.schedule.removed_from_train": "Schedule retrieved from Train",
"create.schedule.no_stops": "This Schedule does not have any Stops yet",
"create.track.selection_cleared": "Selection Cleared",
"create.track.valid_connection": "Can Connect \u2714",
@ -623,6 +629,11 @@
"create.track.leave_slope_descending": "Cannot leave this slope while descending",
"create.track.turn_90": "Can only turn up to 90 Degrees",
"create.station.create_train": "Create new Train",
"create.station.disassemble_train": "Disassemble Train",
"create.station.remove_schedule": "Retrieve Schedule",
"create.station.remove_auto_schedule": "Discard Auto-Schedule",
"create.train_assembly.too_many_bogeys": "Too many Bogeys attached: %1$s",
"create.train_assembly.frontmost_bogey_at_station": "Frontmost Bogey must be at Station Marker",
"create.train_assembly.no_bogeys": "No Bogeys Found",

View file

@ -1,12 +0,0 @@
# Made in Blockbench 4.1.1
newmtl dark_iron
map_Kd #dark_iron
newmtl bogey
map_Kd #bogey
newmtl wheels
map_Kd #wheels
newmtl shaft
map_Kd #shaft
newmtl shaft_end
map_Kd #shaft_end
newmtl none

View file

@ -1,120 +0,0 @@
# Blender MTL File: 'Bogey.blend'
# Material Count: 11
newmtl 00_Shaft
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Kd F:\\Create\\00 Bogey\\axis.png
newmtl 00_Shaft_end
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Kd F:\\Create\\00 Bogey\\axis_top.png
newmtl Belts
Ns 0.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.000000 0.000000 0.000000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 1
map_Kd F:\\Create\\00 Bogey\\Textures\\belt.png
newmtl Bogey_Body
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Kd F:\\Create\\00 Bogey\\Textures\\bogey.png
newmtl Bogey_Body_2
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Kd F:\\Create\\00 Bogey\\Textures\\Bogey2.png
newmtl Bogey_Piston
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Kd F:\\Create\\00 Bogey\\bogey_piston.png
newmtl Checker_Black
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Kd F:\\Create\\New Rails\\tuff_cut.png
newmtl Checker_White
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Kd F:\\Create\\New Rails\\limestone_cut.png
newmtl None
Ns 500
Ka 0.8 0.8 0.8
Kd 0.8 0.8 0.8
Ks 0.8 0.8 0.8
d 1
illum 2
newmtl m_0.001
Ns 0.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.000000 0.000000 0.000000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 1
map_Kd F:\\Create\\00 Bogey\\track.png
newmtl wheel_Large
Ns 0.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.000000 0.000000 0.000000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 1
map_Kd F:\\Create\\00 Bogey\\Wheel_Large.png

View file

@ -1,149 +0,0 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"particle": "create:block/axis",
"1_1": "create:block/axis_top"
},
"elements": [
{
"name": "bottom",
"from": [-2, 6, 0],
"to": [18, 13, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -8, -144]},
"faces": {
"north": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"east": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"south": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"west": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"up": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"down": {"uv": [6, 8, 7, 9], "texture": "#1_1"}
}
},
{
"name": "bottom",
"from": [-1, -10, 16],
"to": [6, 3, 26],
"rotation": {"angle": -45, "axis": "x", "origin": [8, -2, 8]},
"faces": {
"north": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"east": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"south": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"west": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"up": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"down": {"uv": [6, 9, 7, 10], "texture": "#1_1"}
}
},
{
"name": "bottom",
"from": [10, -10, 16],
"to": [17, 3, 26],
"rotation": {"angle": -45, "axis": "x", "origin": [8, -2, 8]},
"faces": {
"north": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"east": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"south": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"west": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"up": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"down": {"uv": [6, 9, 7, 10], "texture": "#1_1"}
}
},
{
"name": "bottom",
"from": [-1, 6, 0],
"to": [6, 16, 13],
"rotation": {"angle": -45, "axis": "x", "origin": [8, -2, 8]},
"faces": {
"north": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"east": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"south": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"west": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"up": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"down": {"uv": [6, 9, 7, 10], "texture": "#1_1"}
}
},
{
"name": "bottom",
"from": [10, 6, 0],
"to": [17, 16, 13],
"rotation": {"angle": -45, "axis": "x", "origin": [8, -2, 8]},
"faces": {
"north": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"east": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"south": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"west": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"up": {"uv": [6, 9, 7, 10], "texture": "#1_1"},
"down": {"uv": [6, 9, 7, 10], "texture": "#1_1"}
}
},
{
"name": "left",
"from": [-4, 2.1, -7],
"to": [0, 7.9, 23],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -8, -144]},
"faces": {
"north": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"east": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"south": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"west": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"up": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"down": {"uv": [6, 8, 7, 9], "texture": "#1_1"}
}
},
{
"name": "right",
"from": [16, 2.1, -7],
"to": [20, 7.9, 23],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -8, -144]},
"faces": {
"north": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"east": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"south": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"west": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"up": {"uv": [6, 8, 7, 9], "texture": "#1_1"},
"down": {"uv": [6, 8, 7, 9], "texture": "#1_1"}
}
}
],
"groups": [
{
"name": "group",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "boogy",
"origin": [0, 0, 0],
"color": 0,
"children": [
{
"name": "frame",
"origin": [0, 0, -144],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6]
},
{
"name": "wheelpair",
"origin": [0, 0, 0],
"color": 0,
"children": [
{
"name": "left",
"origin": [0, 0, 0],
"color": 0,
"children": []
},
{
"name": "right",
"origin": [0, 0, 0],
"color": 0,
"children": []
}
]
}
]
}
]
}
]
}

View file

@ -1,12 +0,0 @@
{
"loader": "forge:obj",
"flip-v": true,
"model": "create:models/block/track/bogey/kryppers_axle.obj",
"textures": {
"dark_iron": "create:block/bogey/dark_iron",
"wheels": "create:block/bogey/wheels",
"bogey": "create:block/bogey/bogey",
"shaft": "create:block/axis",
"shaft_end": "create:block/axis_top"
}
}

View file

@ -1,12 +0,0 @@
{
"loader": "forge:obj",
"flip-v": true,
"model": "create:models/block/track/bogey/kryppers_frame.obj",
"textures": {
"dark_iron": "create:block/bogey/dark_iron",
"wheels": "create:block/bogey/wheels",
"bogey": "create:block/bogey/bogey",
"shaft": "create:block/axis",
"shaft_end": "create:block/axis_top"
}
}

View file

@ -1,457 +0,0 @@
# Blender v3.0.0 Release Candidate OBJ File: 'Bogey.blend'
# www.blender.org
mtllib bogey.mtl
o Cube.012_Cube.004
v 0.562500 0.375000 -0.562500
v 0.562500 1.187500 -0.562500
v 0.562500 0.375000 0.562500
v 0.562500 1.187500 0.562500
v -0.562500 0.375000 -0.562500
v -0.562500 1.187500 -0.562500
v -0.562500 0.375000 0.562500
v -0.562500 1.187500 0.562500
v 0.562500 0.375000 0.125000
v 0.562500 1.187500 0.125000
v -0.562500 0.375000 0.125000
v -0.562500 1.187500 0.125000
v 0.562500 0.375000 -0.125000
v 0.562500 1.187500 -0.125000
v -0.562500 0.375000 -0.125000
v -0.562500 1.187500 -0.125000
v 0.250000 0.500000 -1.250000
v 0.250000 1.000000 -1.250000
v 0.250000 0.500000 -0.750000
v 0.250000 1.000000 -0.750000
v -0.250000 0.500000 -1.250000
v -0.250000 1.000000 -1.250000
v -0.250000 0.500000 -0.750000
v -0.250000 1.000000 -0.750000
v 0.250000 0.500000 1.250000
v 0.250000 1.000000 1.250000
v 0.250000 0.500000 0.750000
v 0.250000 1.000000 0.750000
v -0.250000 0.500000 1.250000
v -0.250000 1.000000 1.250000
v -0.250000 0.500000 0.750000
v -0.250000 1.000000 0.750000
v 1.000000 0.750000 -0.500000
v 1.000000 1.250000 -0.500000
v 1.000000 0.750000 0.500000
v 1.000000 1.250000 0.500000
v 0.562500 0.750000 -0.500000
v 0.562500 1.250000 -0.500000
v 0.562500 0.750000 0.500000
v 0.562500 1.250000 0.500000
v -1.000000 0.750000 -0.500000
v -1.000000 1.250000 -0.500000
v -1.000000 0.750000 0.500000
v -1.000000 1.250000 0.500000
v -0.562500 0.750000 -0.500000
v -0.562500 1.250000 -0.500000
v -0.562500 0.750000 0.500000
v -0.562500 1.250000 0.500000
v 0.687500 0.750000 -1.353553
v 0.687500 1.103553 -1.000000
v 0.687500 0.396447 -1.000000
v 0.687500 0.750000 -0.646447
v 0.312500 0.750000 -1.353553
v 0.312500 1.103553 -1.000000
v 0.312500 0.396447 -1.000000
v 0.312500 0.750000 -0.646447
v -0.687500 0.750000 -1.353553
v -0.687500 1.103553 -1.000000
v -0.687500 0.396447 -1.000000
v -0.687500 0.750000 -0.646447
v -0.312500 0.750000 -1.353553
v -0.312500 1.103553 -1.000000
v -0.312500 0.396447 -1.000000
v -0.312500 0.750000 -0.646447
v 0.687500 0.750000 1.353553
v 0.687500 1.103553 1.000000
v 0.687500 0.396447 1.000000
v 0.687500 0.750000 0.646446
v 0.312500 0.750000 1.353553
v 0.312500 1.103553 1.000000
v 0.312500 0.396447 1.000000
v 0.312500 0.750000 0.646446
v -0.687500 0.750000 1.353553
v -0.687500 1.103553 1.000000
v -0.687500 0.396447 1.000000
v -0.687500 0.750000 0.646446
v -0.312500 0.750000 1.353553
v -0.312500 1.103553 1.000000
v -0.312500 0.396447 1.000000
v -0.312500 0.750000 0.646446
v 0.375000 0.811872 -0.761351
v 0.375000 0.988649 -0.938128
v 0.625000 0.811872 -0.761351
v 0.625000 0.988649 -0.938128
v 0.375000 0.900260 -1.026516
v 0.375000 0.723484 -0.849740
v 0.625000 0.723484 -0.849740
v 0.625000 0.900260 -1.026516
v 0.375000 1.121231 -0.451992
v 0.375000 1.298008 -0.628769
v 0.625000 1.121231 -0.451992
v 0.625000 1.298008 -0.628769
v -0.375000 0.811872 -0.761351
v -0.375000 0.988649 -0.938128
v -0.625000 0.811872 -0.761351
v -0.625000 0.988649 -0.938128
v -0.375000 0.900260 -1.026516
v -0.375000 0.723484 -0.849740
v -0.625000 0.723484 -0.849740
v -0.625000 0.900260 -1.026516
v -0.375000 1.121231 -0.451992
v -0.375000 1.298008 -0.628769
v -0.625000 1.121231 -0.451992
v -0.625000 1.298008 -0.628769
v 0.375000 0.811872 0.761351
v 0.375000 0.988649 0.938128
v 0.625000 0.811872 0.761351
v 0.625000 0.988649 0.938128
v 0.375000 0.900260 1.026516
v 0.375000 0.723484 0.849740
v 0.625000 0.723484 0.849740
v 0.625000 0.900260 1.026516
v 0.375000 1.121231 0.451992
v 0.375000 1.298008 0.628769
v 0.625000 1.121231 0.451992
v 0.625000 1.298008 0.628769
v -0.375000 0.811872 0.761351
v -0.375000 0.988649 0.938128
v -0.625000 0.811872 0.761351
v -0.625000 0.988649 0.938128
v -0.375000 0.900260 1.026516
v -0.375000 0.723484 0.849740
v -0.625000 0.723484 0.849740
v -0.625000 0.900260 1.026516
v -0.375000 1.121231 0.451992
v -0.375000 1.298008 0.628769
v -0.625000 1.121231 0.451992
v -0.625000 1.298008 0.628769
vt 0.281250 0.234375
vt 0.281250 0.437500
vt 0.000000 0.437500
vt -0.000000 0.234375
vt 0.281250 0.031250
vt 0.281250 0.234375
vt 0.000000 0.234375
vt -0.000000 0.031250
vt 0.281250 0.234375
vt 0.281250 0.437500
vt 0.000000 0.437500
vt -0.000000 0.234375
vt 0.281250 0.031250
vt 0.281250 0.234375
vt 0.000000 0.234375
vt 0.000000 0.031250
vt 0.000000 0.718750
vt 0.000000 0.437500
vt 0.281250 0.437500
vt 0.281250 0.718750
vt 0.000000 0.718750
vt 0.281250 0.718750
vt 0.281250 1.000000
vt 0.000000 1.000000
vt 0.281250 0.031250
vt 0.000000 0.031250
vt 0.000000 0.234375
vt 0.281250 0.234375
vt 0.281250 0.031250
vt -0.000000 0.031250
vt 0.000000 0.234375
vt 0.281250 0.234375
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.625000 0.500000
vt 0.375000 0.500000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.375000 0.000000
vt 0.375000 0.250000
vt 0.625000 0.250000
vt 0.625000 0.000000
vt 0.375000 0.500000
vt 0.625000 0.500000
vt 0.375000 0.750000
vt 0.625000 0.750000
vt 0.375000 1.000000
vt 0.625000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.750000
vt 0.875000 0.500000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.625000 0.500000
vt 0.375000 0.500000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.375000 0.000000
vt 0.375000 0.250000
vt 0.625000 0.250000
vt 0.625000 0.000000
vt 0.375000 0.500000
vt 0.625000 0.500000
vt 0.375000 0.750000
vt 0.625000 0.750000
vt 0.375000 1.000000
vt 0.625000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.750000
vt 0.875000 0.500000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.625000 0.500000
vt 0.375000 0.500000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.375000 0.000000
vt 0.375000 0.250000
vt 0.625000 0.250000
vt 0.625000 0.000000
vt 0.375000 0.500000
vt 0.625000 0.500000
vt 0.375000 0.750000
vt 0.625000 0.750000
vt 0.375000 1.000000
vt 0.625000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.750000
vt 0.875000 0.500000
vt 0.375000 0.000000
vt 0.375000 0.250000
vt 0.625000 0.250000
vt 0.625000 0.000000
vt 0.375000 0.500000
vt 0.625000 0.500000
vt 0.375000 0.750000
vt 0.625000 0.750000
vt 0.375000 1.000000
vt 0.625000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.750000
vt 0.875000 0.500000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.625000 0.500000
vt 0.375000 0.500000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.625000 0.612500
vt 0.375000 0.612500
vt 0.375000 0.612500
vt 0.625000 0.612500
vt 0.375000 0.137500
vt 0.625000 0.137500
vt 0.125000 0.612500
vt 0.125000 0.612500
vt 0.875000 0.612500
vt 0.875000 0.612500
vt 0.375000 0.137500
vt 0.625000 0.137500
vt 0.375000 0.612500
vt 0.125000 0.612500
vt 0.625000 0.612500
vt 0.875000 0.612500
vt 0.375000 0.137500
vt 0.625000 0.137500
vt 0.625000 0.612500
vt 0.625000 0.612500
vt 0.375000 0.612500
vt 0.375000 0.612500
vt 0.375000 0.137500
vt 0.625000 0.137500
vt 0.125000 0.612500
vt 0.125000 0.612500
vt 0.875000 0.612500
vt 0.875000 0.612500
vt 0.375000 0.137500
vt 0.625000 0.137500
vt 0.125000 0.612500
vt 0.375000 0.612500
vt 0.875000 0.612500
vt 0.625000 0.612500
vt 0.625000 0.137500
vt 0.375000 0.137500
vt 0.625000 0.612500
vt 0.625000 0.612500
vt 0.375000 0.612500
vt 0.375000 0.612500
vt 0.375000 0.137500
vt 0.625000 0.137500
vt 0.125000 0.612500
vt 0.125000 0.612500
vt 0.875000 0.612500
vt 0.875000 0.612500
vt 0.375000 0.137500
vt 0.625000 0.137500
vt 0.125000 0.612500
vt 0.375000 0.612500
vt 0.875000 0.612500
vt 0.625000 0.612500
vt 0.625000 0.137500
vt 0.375000 0.137500
vt 0.625000 0.612500
vt 0.375000 0.612500
vt 0.375000 0.612500
vt 0.625000 0.612500
vt 0.375000 0.137500
vt 0.625000 0.137500
vt 0.125000 0.612500
vt 0.125000 0.612500
vt 0.875000 0.612500
vt 0.875000 0.612500
vt 0.375000 0.137500
vt 0.625000 0.137500
vt 0.375000 0.612500
vt 0.125000 0.612500
vt 0.625000 0.612500
vt 0.875000 0.612500
vt 0.375000 0.137500
vt 0.625000 0.137500
vn 1.0000 0.0000 -0.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn -0.0000 0.0000 -1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -0.7071 0.7071
vn 0.0000 0.7071 -0.7071
vn 0.0000 -0.7071 -0.7071
vn 0.0000 0.7071 0.7071
usemtl bogey
s off
f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/5/2 4/6/2 8/7/2 7/8/2
f 7/9/3 8/10/3 6/11/3 5/12/3
f 5/13/4 6/14/4 2/15/4 1/16/4
f 3/17/5 7/18/5 5/19/5 1/20/5
f 8/21/6 4/22/6 2/23/6 6/24/6
f 11/25/2 9/26/2 10/27/2 12/28/2
f 13/29/4 15/30/4 16/31/4 14/32/4
usemtl dark_iron
f 17/33/1 18/34/1 20/35/1 19/36/1
f 19/36/2 20/35/2 24/37/2 23/38/2
f 23/38/3 24/37/3 22/39/3 21/40/3
f 21/40/4 22/39/4 18/41/4 17/42/4
f 19/43/5 23/38/5 21/40/5 17/44/5
f 24/37/6 20/45/6 18/46/6 22/39/6
f 25/47/1 27/48/1 28/49/1 26/50/1
f 27/48/4 31/51/4 32/52/4 28/49/4
f 31/51/3 29/53/3 30/54/3 32/52/3
f 29/53/2 25/55/2 26/56/2 30/54/2
f 27/57/5 25/58/5 29/53/5 31/51/5
f 32/52/6 30/54/6 26/59/6 28/60/6
f 33/61/1 34/62/1 36/63/1 35/64/1
f 35/64/2 36/63/2 40/65/2 39/66/2
f 39/66/3 40/65/3 38/67/3 37/68/3
f 37/68/4 38/67/4 34/69/4 33/70/4
f 35/71/5 39/66/5 37/68/5 33/72/5
f 40/65/6 36/73/6 34/74/6 38/67/6
f 41/75/3 43/76/3 44/77/3 42/78/3
f 43/76/2 47/79/2 48/80/2 44/77/2
f 47/79/1 45/81/1 46/82/1 48/80/1
f 45/81/4 41/83/4 42/84/4 46/82/4
f 43/85/5 41/86/5 45/81/5 47/79/5
f 48/80/6 46/82/6 42/87/6 44/88/6
f 49/89/1 50/90/1 52/91/1 51/92/1
f 51/92/7 52/91/7 56/93/7 55/94/7
f 55/94/3 56/93/3 54/95/3 53/96/3
f 53/96/8 54/95/8 50/97/8 49/98/8
f 51/99/9 55/94/9 53/96/9 49/100/9
f 56/93/10 52/101/10 50/102/10 54/95/10
f 57/103/3 59/104/3 60/105/3 58/106/3
f 59/104/7 63/107/7 64/108/7 60/105/7
f 63/107/1 61/109/1 62/110/1 64/108/1
f 61/109/8 57/111/8 58/112/8 62/110/8
f 59/113/9 57/114/9 61/109/9 63/107/9
f 64/108/10 62/110/10 58/115/10 60/116/10
f 65/117/1 67/118/1 68/119/1 66/120/1
f 67/118/9 71/121/9 72/122/9 68/119/9
f 71/121/3 69/123/3 70/124/3 72/122/3
f 69/123/10 65/125/10 66/126/10 70/124/10
f 67/127/7 65/128/7 69/123/7 71/121/7
f 72/122/8 70/124/8 66/129/8 68/130/8
f 73/131/3 74/132/3 76/133/3 75/134/3
f 75/134/9 76/133/9 80/135/9 79/136/9
f 79/136/1 80/135/1 78/137/1 77/138/1
f 77/138/10 78/137/10 74/139/10 73/140/10
f 75/141/7 79/136/7 77/138/7 73/142/7
f 80/135/8 76/143/8 74/144/8 78/137/8
f 84/145/1 83/146/1 87/147/1 88/148/1
f 86/149/9 85/150/9 88/148/9 87/147/9
f 83/146/7 81/151/7 86/152/7 87/147/7
f 82/153/8 84/145/8 88/148/8 85/154/8
f 81/155/3 82/156/3 85/150/3 86/149/3
f 81/151/7 83/146/7 91/157/7 89/158/7
f 89/158/10 91/157/10 92/159/10 90/160/10
f 84/145/8 82/153/8 90/160/8 92/159/8
f 82/156/3 81/155/3 89/161/3 90/162/3
f 83/146/1 84/145/1 92/159/1 91/157/1
f 96/163/3 100/164/3 99/165/3 95/166/3
f 98/167/9 99/165/9 100/164/9 97/168/9
f 95/166/7 99/165/7 98/169/7 93/170/7
f 94/171/8 97/172/8 100/164/8 96/163/8
f 93/173/1 98/167/1 97/168/1 94/174/1
f 93/170/7 101/175/7 103/176/7 95/166/7
f 101/175/10 102/177/10 104/178/10 103/176/10
f 96/163/8 104/178/8 102/177/8 94/171/8
f 94/174/1 102/179/1 101/180/1 93/173/1
f 95/166/3 103/176/3 104/178/3 96/163/3
f 108/181/1 112/182/1 111/183/1 107/184/1
f 110/185/7 111/183/7 112/182/7 109/186/7
f 107/184/9 111/183/9 110/187/9 105/188/9
f 106/189/10 109/190/10 112/182/10 108/181/10
f 105/191/3 110/185/3 109/186/3 106/192/3
f 105/188/9 113/193/9 115/194/9 107/184/9
f 113/193/8 114/195/8 116/196/8 115/194/8
f 108/181/10 116/196/10 114/195/10 106/189/10
f 106/192/3 114/197/3 113/198/3 105/191/3
f 107/184/1 115/194/1 116/196/1 108/181/1
f 120/199/3 119/200/3 123/201/3 124/202/3
f 122/203/7 121/204/7 124/202/7 123/201/7
f 119/200/9 117/205/9 122/206/9 123/201/9
f 118/207/10 120/199/10 124/202/10 121/208/10
f 117/209/1 118/210/1 121/204/1 122/203/1
f 117/205/9 119/200/9 127/211/9 125/212/9
f 125/212/8 127/211/8 128/213/8 126/214/8
f 120/199/10 118/207/10 126/214/10 128/213/10
f 118/210/1 117/209/1 125/215/1 126/216/1
f 119/200/3 120/199/3 128/213/3 127/211/3

View file

@ -1,12 +0,0 @@
{
"loader": "forge:obj",
"flip-v": true,
"model": "create:models/block/track/bogey/kryppers_wheels.obj",
"textures": {
"dark_iron": "create:block/bogey/dark_iron",
"wheels": "create:block/bogey/wheels",
"bogey": "create:block/bogey/bogey",
"shaft": "create:block/axis",
"shaft_end": "create:block/axis_top"
}
}

View file

@ -1,306 +0,0 @@
# Blender v3.0.0 Release Candidate OBJ File: 'Bogey.blend'
# www.blender.org
mtllib bogey.mtl
o Cube.011_Cube.002
v 1.187500 -0.125000 -0.125000
v 1.187500 0.125000 -0.125000
v 1.187500 -0.125000 0.125000
v 1.187500 0.125000 0.125000
v 0.187500 -0.125000 0.125000
v 0.187500 0.125000 0.125000
v 0.187500 -0.125000 -0.125000
v 0.187500 0.125000 -0.125000
v -1.187499 -0.125000 -0.125000
v -1.187499 0.125000 -0.125000
v -1.187500 -0.125000 0.125000
v -1.187500 0.125000 0.125000
v -0.187499 -0.125000 0.125000
v -0.187499 0.125000 0.125000
v -0.187499 -0.125000 -0.125000
v -0.187499 0.125000 -0.125000
v 0.875000 0.402831 0.167846
v 0.875000 -0.402831 0.167846
v 0.875000 -0.402831 -0.167846
v 0.875000 -0.167846 -0.402831
v 1.062500 0.402831 -0.167846
v 1.062500 0.402831 0.167846
v 1.062500 0.167846 0.402831
v 1.062500 -0.167846 0.402831
v 1.062500 -0.402831 0.167846
v 1.062500 -0.402831 -0.167846
v 1.062500 -0.167846 -0.402831
v 1.062500 0.167846 -0.402831
v 0.875000 0.167846 -0.402831
v 0.875000 -0.167846 0.402831
v 0.875000 0.167846 0.402831
v 0.875000 0.402831 -0.167846
v 1.062500 -0.000000 0.000000
v 0.750000 0.201415 -0.483397
v 0.750000 -0.201415 -0.483397
v 0.750000 -0.483397 -0.201415
v 0.750000 -0.483397 0.201415
v 0.875000 0.483397 -0.201415
v 0.875000 0.483397 0.201415
v 0.875000 0.201415 0.483397
v 0.875000 -0.201415 0.483397
v 0.875000 -0.483397 0.201415
v 0.875000 -0.483397 -0.201415
v 0.875000 -0.201415 -0.483397
v 0.875000 0.201415 -0.483397
v 0.750000 -0.201415 0.483397
v 0.750000 0.201415 0.483397
v 0.750000 0.483397 0.201415
v 0.750000 0.483397 -0.201415
v 0.875000 0.000000 0.000000
v 0.750000 0.000000 0.000000
v -0.875000 0.402831 0.167846
v -0.875000 -0.402831 0.167846
v -0.875000 -0.402831 -0.167846
v -0.875000 -0.167846 -0.402831
v -1.062500 0.402831 -0.167846
v -1.062500 0.402831 0.167846
v -1.062500 0.167846 0.402831
v -1.062500 -0.167846 0.402831
v -1.062500 -0.402831 0.167846
v -1.062500 -0.402831 -0.167846
v -1.062500 -0.167846 -0.402831
v -1.062500 0.167846 -0.402831
v -0.875000 0.167846 -0.402831
v -0.875000 -0.167846 0.402831
v -0.875000 0.167846 0.402831
v -0.875000 0.402831 -0.167846
v -1.062500 -0.000000 0.000000
v -0.750000 0.201415 -0.483397
v -0.750000 -0.201415 -0.483397
v -0.750000 -0.483397 -0.201415
v -0.750000 -0.483397 0.201415
v -0.875000 0.483397 -0.201415
v -0.875000 0.483397 0.201415
v -0.875000 0.201415 0.483397
v -0.875000 -0.201415 0.483397
v -0.875000 -0.483397 0.201415
v -0.875000 -0.483397 -0.201415
v -0.875000 -0.201415 -0.483397
v -0.875000 0.201415 -0.483397
v -0.750000 -0.201415 0.483397
v -0.750000 0.201415 0.483397
v -0.750000 0.483397 0.201415
v -0.750000 0.483397 -0.201415
v -0.875000 0.000000 0.000000
v -0.750000 0.000000 0.000000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.375000 1.000000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 1.000000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 1.000000
vt 0.625000 0.000000
vt 0.375000 0.000000
vt 0.375000 1.000000
vt 0.375000 1.000000
vt 0.625000 1.000000
vt 0.625000 0.000000
vt 0.375000 0.000000
vt 0.375000 1.000000
vt 0.625000 1.000000
vt 0.625000 0.000000
vt 0.375000 0.000000
vt 0.625000 1.000000
vt 0.625000 0.000000
vt 0.375000 0.000000
vt 0.375000 1.000000
vt 0.375000 0.375000
vt 0.625000 0.375000
vt 0.625000 0.625000
vt 0.375000 0.625000
vt 0.375000 0.375000
vt 0.375000 0.625000
vt 0.625000 0.625000
vt 0.625000 0.375000
vt 0.000000 0.500000
vt 0.146447 0.146447
vt 0.146447 0.146447
vt 0.000000 0.500000
vt 0.500000 0.500000
vt 0.500000 0.000000
vt 0.853553 0.146447
vt 0.500000 1.000000
vt 0.146447 0.853553
vt 0.146447 0.853553
vt 0.500000 1.000000
vt 0.853554 0.853553
vt 0.853554 0.853553
vt 0.853553 0.146447
vt 1.000000 0.500000
vt 1.000000 0.500000
vt 0.500000 0.000000
vt 0.500000 0.500000
vt 0.500000 0.000000
vt 0.146447 0.146447
vt 0.500000 0.500000
vt 0.500000 0.000000
vt 0.853553 0.146447
vt 0.000000 0.500000
vt 0.000000 0.500000
vt 0.146447 0.146447
vt 0.853554 0.853553
vt 0.853554 0.853553
vt 0.500000 1.000000
vt 0.500000 1.000000
vt 0.146447 0.853553
vt 0.146447 0.853553
vt 0.853553 0.146447
vt 1.000000 0.500000
vt 1.000000 0.500000
vt 0.000000 0.500000
vt 0.000000 0.500000
vt 0.146447 0.146447
vt 0.146447 0.146447
vt 0.500000 0.500000
vt 0.853553 0.146447
vt 0.500000 0.000000
vt 0.500000 1.000000
vt 0.500000 1.000000
vt 0.146447 0.853553
vt 0.146447 0.853553
vt 0.853554 0.853553
vt 0.853554 0.853553
vt 0.853553 0.146447
vt 1.000000 0.500000
vt 1.000000 0.500000
vt 0.500000 0.000000
vt 0.500000 0.500000
vt 0.146447 0.146447
vt 0.500000 0.000000
vt 0.500000 0.500000
vt 0.853553 0.146447
vt 0.500000 0.000000
vt 0.000000 0.500000
vt 0.146447 0.146447
vt 0.000000 0.500000
vt 0.853554 0.853553
vt 0.500000 1.000000
vt 0.500000 1.000000
vt 0.853554 0.853553
vt 0.146447 0.853553
vt 0.146447 0.853553
vt 1.000000 0.500000
vt 1.000000 0.500000
vt 0.853553 0.146447
vn -0.0000 0.0000 -1.0000
vn 0.0000 1.0000 -0.0000
vn 0.0000 -1.0000 -0.0000
vn 0.0000 0.0000 1.0000
vn 1.0000 0.0000 -0.0000
vn -1.0000 0.0000 -0.0000
vn 0.0000 0.7071 -0.7071
vn 0.0000 -0.7071 -0.7071
vn 0.0000 -0.7071 0.7071
vn 0.0000 0.7071 0.7071
usemtl shaft
s off
f 7/1/1 8/2/1 2/3/1 1/4/1
f 6/5/2 4/6/2 2/7/2 8/8/2
f 3/9/3 5/10/3 7/11/3 1/12/3
f 3/13/4 4/14/4 6/15/4 5/16/4
f 15/17/1 9/18/1 10/19/1 16/20/1
f 14/21/2 16/22/2 10/23/2 12/24/2
f 11/25/3 9/26/3 15/27/3 13/28/3
f 11/29/4 13/30/4 14/31/4 12/32/4
usemtl shaft_end
f 1/33/5 2/34/5 4/35/5 3/36/5
f 9/37/6 11/38/6 12/39/6 10/40/6
usemtl wheels
f 31/41/4 30/42/4 24/43/4 23/44/4
f 33/45/5 25/46/5 26/47/5
f 32/48/2 17/49/2 22/50/2 21/51/2
f 29/52/7 32/48/7 21/51/7 28/53/7
f 19/54/8 20/55/8 27/56/8 26/47/8
f 30/42/9 18/57/9 25/46/9 24/43/9
f 17/49/10 31/41/10 23/44/10 22/50/10
f 20/55/1 29/52/1 28/53/1 27/56/1
f 18/57/3 19/54/3 26/47/3 25/46/3
f 19/54/6 18/57/6 30/42/6 31/41/6 17/49/6 32/48/6 29/52/6 20/55/6
f 21/51/5 22/50/5 33/45/5
f 33/45/5 24/43/5 25/46/5
f 28/53/5 21/51/5 33/45/5
f 27/56/5 28/53/5 33/45/5
f 23/44/5 24/43/5 33/45/5
f 26/47/5 27/56/5 33/45/5
f 22/50/5 23/44/5 33/45/5
f 51/58/6 37/59/6 46/60/6
f 50/61/5 42/62/5 43/63/5
f 40/64/4 47/65/4 46/60/4 41/66/4
f 45/67/7 34/68/7 49/69/7 38/70/7
f 41/66/9 46/60/9 37/59/9 42/62/9
f 39/71/10 48/72/10 47/65/10 40/64/10
f 38/70/2 49/69/2 48/72/2 39/71/2
f 43/63/8 36/73/8 35/74/8 44/75/8
f 44/75/1 35/74/1 34/68/1 45/67/1
f 42/62/3 37/59/3 36/73/3 43/63/3
f 44/75/5 50/61/5 43/63/5
f 50/61/5 41/66/5 42/62/5
f 39/71/5 50/61/5 38/70/5
f 38/70/5 50/61/5 45/67/5
f 50/61/5 40/64/5 41/66/5
f 45/67/5 50/61/5 44/75/5
f 39/71/5 40/64/5 50/61/5
f 47/65/6 51/58/6 46/60/6
f 34/68/6 51/58/6 49/69/6
f 51/58/6 36/73/6 37/59/6
f 49/69/6 51/58/6 48/72/6
f 51/58/6 35/74/6 36/73/6
f 48/72/6 51/58/6 47/65/6
f 34/68/6 35/74/6 51/58/6
f 66/76/4 58/77/4 59/78/4 65/79/4
f 68/80/6 61/81/6 60/82/6
f 67/83/2 56/84/2 57/85/2 52/86/2
f 64/87/7 63/88/7 56/84/7 67/83/7
f 54/89/8 61/81/8 62/90/8 55/91/8
f 65/79/9 59/78/9 60/82/9 53/92/9
f 52/86/10 57/85/10 58/77/10 66/76/10
f 55/91/1 62/90/1 63/88/1 64/87/1
f 53/92/3 60/82/3 61/81/3 54/89/3
f 54/89/5 55/91/5 64/87/5 67/83/5 52/86/5 66/76/5 65/79/5 53/92/5
f 56/84/6 68/80/6 57/85/6
f 68/80/6 60/82/6 59/78/6
f 63/88/6 68/80/6 56/84/6
f 62/90/6 68/80/6 63/88/6
f 58/77/6 68/80/6 59/78/6
f 61/81/6 68/80/6 62/90/6
f 57/85/6 68/80/6 58/77/6
f 86/93/5 81/94/5 72/95/5
f 85/96/6 78/97/6 77/98/6
f 75/99/4 76/100/4 81/94/4 82/101/4
f 80/102/7 73/103/7 84/104/7 69/105/7
f 76/100/9 77/98/9 72/95/9 81/94/9
f 74/106/10 75/99/10 82/101/10 83/107/10
f 73/103/2 74/106/2 83/107/2 84/104/2
f 78/97/8 79/108/8 70/109/8 71/110/8
f 79/108/1 80/102/1 69/105/1 70/109/1
f 77/98/3 78/97/3 71/110/3 72/95/3
f 79/108/6 78/97/6 85/96/6
f 85/96/6 77/98/6 76/100/6
f 74/106/6 73/103/6 85/96/6
f 73/103/6 80/102/6 85/96/6
f 85/96/6 76/100/6 75/99/6
f 80/102/6 79/108/6 85/96/6
f 74/106/6 85/96/6 75/99/6
f 82/101/5 81/94/5 86/93/5
f 69/105/5 84/104/5 86/93/5
f 86/93/5 72/95/5 71/110/5
f 84/104/5 83/107/5 86/93/5
f 86/93/5 71/110/5 70/109/5
f 83/107/5 82/101/5 86/93/5
f 69/105/5 86/93/5 70/109/5

View file

@ -1,210 +0,0 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "create:block/track",
"particle": "create:block/axis",
"1_0": "create:block/axis",
"1_1": "create:block/axis_top"
},
"elements": [
{
"name": "smallcircle",
"from": [-7, -8, -8],
"to": [23, 8, 8],
"rotation": {"angle": 0, "axis": "y", "origin": [3, -12, -18]},
"faces": {
"east": {"uv": [11.375, 11.625, 13.875, 14.125], "texture": "#0"},
"west": {"uv": [11.375, 11.625, 13.875, 14.125], "texture": "#0"}
}
},
{
"name": "Axis",
"from": [-12, -2, -2],
"to": [28, 2, 2],
"shade": false,
"rotation": {"angle": -45, "axis": "x", "origin": [9, 0, 0]},
"faces": {
"north": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#1_0"},
"east": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1_1"},
"south": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#1_0"},
"west": {"uv": [6, 6, 10, 10], "texture": "#1_1"},
"up": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#1_0"},
"down": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#1_0"}
}
},
{
"name": "bigcircleout",
"from": [-8, -10, -10],
"to": [-7.9, 10, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [1, -12, -18]},
"faces": {
"east": {"uv": [11.375, 11.625, 13.875, 14.125], "texture": "#0"},
"west": {"uv": [11.375, 11.625, 13.875, 14.125], "texture": "#0"}
}
},
{
"name": "bigcirclein",
"from": [-4.1, -10, -10],
"to": [-4, 10, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [1, -12, -18]},
"faces": {
"east": {"uv": [11.375, 11.625, 13.875, 14.125], "texture": "#0"},
"west": {"uv": [11.375, 11.625, 13.875, 14.125], "texture": "#0"}
}
},
{
"name": "wheel3d",
"from": [-7.9, -9, -3],
"to": [-4, 9, 3],
"rotation": {"angle": -45, "axis": "x", "origin": [-6, 0, 0]},
"faces": {
"north": {"uv": [10.75, 13.125, 10.75, 13.125], "rotation": 180, "texture": "#0"},
"south": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"up": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"down": {"uv": [10.75, 13.125, 10.75, 13.125], "rotation": 180, "texture": "#0"}
}
},
{
"name": "wheel3d",
"from": [-7.9, -9, -3],
"to": [-4, 9, 3],
"rotation": {"angle": 45, "axis": "x", "origin": [-6, 0, 0]},
"faces": {
"north": {"uv": [10.75, 13.125, 10.75, 13.125], "rotation": 180, "texture": "#0"},
"south": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"up": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"down": {"uv": [10.75, 13.125, 10.75, 13.125], "rotation": 180, "texture": "#0"}
}
},
{
"name": "wheel3d",
"from": [-7.9, -3, -9],
"to": [-4, 3, 9],
"rotation": {"angle": 0, "axis": "y", "origin": [2, -12, -162]},
"faces": {
"north": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"south": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"up": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"down": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"}
}
},
{
"name": "wheel3d",
"from": [-7.9, -9, -3],
"to": [-4, 9, 3],
"rotation": {"angle": 0, "axis": "y", "origin": [2, -12, -162]},
"faces": {
"north": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"south": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"up": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"down": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"}
}
},
{
"name": "bigcircleout",
"from": [23.9, -10, -10],
"to": [24, 10, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [10, -12, -18]},
"faces": {
"east": {"uv": [13.875, 11.625, 11.375, 14.125], "texture": "#0"},
"west": {"uv": [13.875, 11.625, 11.375, 14.125], "texture": "#0"}
}
},
{
"name": "bigcirclein",
"from": [20, -10, -10],
"to": [20.1, 10, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [10, -12, -18]},
"faces": {
"east": {"uv": [13.875, 11.625, 11.375, 14.125], "texture": "#0"},
"west": {"uv": [13.875, 11.625, 11.375, 14.125], "texture": "#0"}
}
},
{
"name": "wheel3d",
"from": [20, -9, -3],
"to": [23.9, 9, 3],
"rotation": {"angle": -45, "axis": "x", "origin": [10, 0, 0]},
"faces": {
"north": {"uv": [10.75, 13.125, 10.75, 13.125], "rotation": 180, "texture": "#0"},
"south": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"up": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"down": {"uv": [10.75, 13.125, 10.75, 13.125], "rotation": 180, "texture": "#0"}
}
},
{
"name": "wheel3d",
"from": [20, -9, -3],
"to": [23.9, 9, 3],
"rotation": {"angle": 45, "axis": "x", "origin": [10, 0, 0]},
"faces": {
"north": {"uv": [10.75, 13.125, 10.75, 13.125], "rotation": 180, "texture": "#0"},
"south": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"up": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"down": {"uv": [10.75, 13.125, 10.75, 13.125], "rotation": 180, "texture": "#0"}
}
},
{
"name": "wheel3d",
"from": [20, -3, -9],
"to": [23.9, 3, 9],
"rotation": {"angle": 0, "axis": "y", "origin": [10, -12, -162]},
"faces": {
"north": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"south": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"up": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"down": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"}
}
},
{
"name": "wheel3d",
"from": [20, -9, -3],
"to": [23.9, 9, 3],
"rotation": {"angle": 0, "axis": "y", "origin": [10, -12, -162]},
"faces": {
"north": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"south": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"up": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"},
"down": {"uv": [10.75, 13.125, 10.75, 13.125], "texture": "#0"}
}
}
],
"groups": [
{
"name": "group",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "boogy",
"origin": [0, 0, 0],
"color": 0,
"children": [
{
"name": "wheelpair",
"origin": [0, 0, 0],
"color": 0,
"children": [
0,
1,
{
"name": "left",
"origin": [0, 0, 0],
"color": 0,
"children": [2, 3, 4, 5, 6, 7]
},
{
"name": "right",
"origin": [0, 0, 0],
"color": 0,
"children": [8, 9, 10, 11, 12, 13]
}
]
}
]
}
]
}
]
}

View file

@ -2,8 +2,8 @@
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "create:block/track",
"3": "create:block/brass_block",
"4": "create:block/bogey/top",
"particle": "create:block/bogey/particle"
},
"elements": [
@ -13,12 +13,12 @@
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, -2, 8]},
"faces": {
"north": {"uv": [2.25, 13.875, 4.25, 15], "texture": "#0"},
"east": {"uv": [4.375, 13.875, 6.375, 15], "texture": "#0"},
"south": {"uv": [2.25, 13.875, 4.25, 15], "texture": "#0"},
"west": {"uv": [4.375, 13.875, 6.375, 15], "texture": "#0"},
"up": {"uv": [0.125, 13.875, 2.125, 15.875], "texture": "#0"},
"down": {"uv": [0.125, 13.875, 2.125, 15.875], "texture": "#0"}
"north": {"uv": [8, 8, 16, 12.5], "texture": "#4"},
"east": {"uv": [0, 8, 8, 12.5], "texture": "#4"},
"south": {"uv": [8, 8, 16, 12.5], "texture": "#4"},
"west": {"uv": [0, 8, 8, 12.5], "texture": "#4"},
"up": {"uv": [0, 0, 8, 8], "rotation": 90, "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#3"}
}
},
{
@ -27,12 +27,11 @@
"to": [14, 7, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [0, -16, -144]},
"faces": {
"north": {"uv": [2, 14, 14, 16], "texture": "#3"},
"east": {"uv": [2, 14, 14, 16], "texture": "#3"},
"south": {"uv": [2, 14, 14, 16], "texture": "#3"},
"west": {"uv": [2, 14, 14, 16], "texture": "#3"},
"up": {"uv": [6, 8, 7, 10], "texture": "#missing"},
"down": {"uv": [2, 2, 14, 14], "texture": "#3"}
"north": {"uv": [2, 2, 14, 4], "texture": "#particle"},
"east": {"uv": [2, 2, 14, 4], "texture": "#particle"},
"south": {"uv": [2, 2, 14, 4], "texture": "#particle"},
"west": {"uv": [2, 2, 14, 4], "texture": "#particle"},
"down": {"uv": [4, 4, 12, 12], "texture": "#particle"}
}
}
]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB