diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index a1855cc4f..40cdc73e4 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -49,6 +49,7 @@ b59324f051f21d8ce1a48a08f4721a61a3c414d6 assets/create/blockstates/chute.json e5e3757e99c139d67b2a70288466d8a74d818841 assets/create/blockstates/cogwheel.json 36f54136a7756c97f71bc6b47ef4e8e575e72879 assets/create/blockstates/content_observer.json 7d11142092c89ccba3e74e0a3bdd0ccb446d63b5 assets/create/blockstates/controller_rail.json +f292ffa3bc036947b655c0a0ce26a91615c3d40b assets/create/blockstates/controls.json 961b615124ea9a5a5735e8a79f81a702de7da2cf assets/create/blockstates/copper_backtank.json cabf6b8c59eb0e3d56a0a5a856ca058bb3200882 assets/create/blockstates/copper_casing.json b3d0dee8f6e14fa6c637e98cc1c6f1ea55b5f0d5 assets/create/blockstates/copper_shingle_slab.json @@ -235,6 +236,7 @@ be3bef7e091d8b50bfc1c6b7275946d1f636aefd assets/create/blockstates/horizontal_fr 10ef455fd61ed1ca831d27bf2b533d05dec9c67d assets/create/blockstates/item_vault.json 5d851c90d23de5087ce546d4bbe509e112b84c49 assets/create/blockstates/jungle_window.json b15bea757ef981e0ca60f740ca234ee2014eb7b7 assets/create/blockstates/jungle_window_pane.json +f8982f0241f33b2cd55d6261ab6ee38cb83b6d8d assets/create/blockstates/large_bogey.json f651091db216b009b3379b2f48d56d03481c8675 assets/create/blockstates/large_cogwheel.json a38184e035c2ebca7471e1714494fea213af259e assets/create/blockstates/layered_andesite.json 2409f04042380a8ad086f9c4f98032e85771c3f3 assets/create/blockstates/layered_asurine.json @@ -416,6 +418,7 @@ e05f2e98984127aa6b601c4e4909e4c8207b5407 assets/create/blockstates/small_asurine 636028cb348cf9a0f060b4232cdb5dc4d26a4d40 assets/create/blockstates/small_asurine_brick_stairs.json d9b5e23652ca70b29a9142ff8f2efd33dfe74904 assets/create/blockstates/small_asurine_brick_wall.json 6fc5be0d465faa59aebe016d4ecb4d5284507bef assets/create/blockstates/small_asurine_bricks.json +f8982f0241f33b2cd55d6261ab6ee38cb83b6d8d assets/create/blockstates/small_bogey.json 2371c092ecbefa9a844889e0a471714d070569dd assets/create/blockstates/small_calcite_brick_slab.json 134ba0452fc721333177695882c8cef3cb7eca8e assets/create/blockstates/small_calcite_brick_stairs.json 7112ac7498acdd196b05af977e7e12cbab29df14 assets/create/blockstates/small_calcite_brick_wall.json @@ -476,6 +479,8 @@ f385988cb6fa9c48b5d59a6942ec50ed2b60c8bf assets/create/blockstates/stockpile_swi e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/stressometer.json 8b0c2c7ac72529565b3339aa8df7565858100afa assets/create/blockstates/tiled_glass.json a2454400b1cf9889f70aebdc89c52a1be25f543c assets/create/blockstates/tiled_glass_pane.json +180ab07fdae2bedcf66005c572c8e5c220e6bba2 assets/create/blockstates/track.json +aa08785f906d41933e0dd1086ea7b08f5b93aa24 assets/create/blockstates/track_station.json 29af21c8d82891139d48d69f0393f612f2b6f8f1 assets/create/blockstates/tuff_pillar.json a8094531617e27a545c4815ab2062bf0ffca3633 assets/create/blockstates/turntable.json c9bf881ea71aa274b2803142456f1bbed9539076 assets/create/blockstates/veridium.json @@ -530,22 +535,22 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -64a8442735a333c7444cac12cfb22c454ca06b6b assets/create/lang/en_ud.json -7f4222143f17e12d1e89a08d91ff97555f3c945e assets/create/lang/en_us.json -b375c968109083d7839b80ad347a43b8861a45ac assets/create/lang/unfinished/de_de.json -a8b0d479a7817127bc52569167f32378e11420ce assets/create/lang/unfinished/es_cl.json -dda7983a065205140c8092b47ed7d4111c4c28a2 assets/create/lang/unfinished/es_es.json -8c4ff5b38bae4c8bcc2fec698be98ca26fe09145 assets/create/lang/unfinished/fr_fr.json -42281c85374f9583bfb714cc2a634bf59e5cec19 assets/create/lang/unfinished/it_it.json -2a5261a51c544bd30fed6124fb39e386779b589b assets/create/lang/unfinished/ja_jp.json -69f32419986e38bad60fe437f6ea5c07a3a61cf1 assets/create/lang/unfinished/ko_kr.json -f0c2e7e2cdf82a9e8d1ce2d256982bf2050aa63c assets/create/lang/unfinished/nl_nl.json -c3f46417c4b5e3c0a83f5a1affcf21ecd2d4694f assets/create/lang/unfinished/pl_pl.json -9bdaf0b9b51b35fd10934be46954932d58199a21 assets/create/lang/unfinished/pt_br.json -f96ba0f96eb04753ef4431bdda63049174792d12 assets/create/lang/unfinished/pt_pt.json -34f8b480a8af8e449a3dfb8c978bbceeb934824f assets/create/lang/unfinished/ru_ru.json -78690f57ef5d7dfa40026c6a7558df34203a59b5 assets/create/lang/unfinished/zh_cn.json -1116935a6b993de72ec7e15a8f44d06a7de3ebe7 assets/create/lang/unfinished/zh_tw.json +edf2d5f68bb6fc51fb2a1614c42b2b788fd857e2 assets/create/lang/en_ud.json +1b63bdac0063bbc60ef3c93d8b3f97f40d648ee6 assets/create/lang/en_us.json +9f10830c508416004fe2a745eda7e3b4adf10cf8 assets/create/lang/unfinished/de_de.json +9f83f6ce12ee18acfb3c29591ff79adb4986d1d6 assets/create/lang/unfinished/es_cl.json +58885e0c74b14a186d70b2f5167dfee36a7fbb51 assets/create/lang/unfinished/es_es.json +a0f9aec0a4072fda5fd3768003b8b1038be90bb6 assets/create/lang/unfinished/fr_fr.json +6eae75c25b1c10433d8a14d68a90454a2f2f3f6a assets/create/lang/unfinished/it_it.json +66f7cc9e7976f4c917f4b489878c5ee658ab64a0 assets/create/lang/unfinished/ja_jp.json +775a183ea22a2e209d6c7e752c5b0ae438c1d893 assets/create/lang/unfinished/ko_kr.json +40dbedf8545dd976f6f84eb62ef621d399e7bdea assets/create/lang/unfinished/nl_nl.json +3e7f5a1530cc7fd429229150fb956a2357647542 assets/create/lang/unfinished/pl_pl.json +4aa73bd608ae220216abd601b6875ad5bf16974d assets/create/lang/unfinished/pt_br.json +81e4b0e807cd1754c4c3a05c2797f9a1e78ab757 assets/create/lang/unfinished/pt_pt.json +434eea7907c9b816c293f24172d7424747b4c7b8 assets/create/lang/unfinished/ru_ru.json +82d92da2a6e4cab32086f8872387f8a723294d13 assets/create/lang/unfinished/zh_cn.json +3813edf0e800083810ea4d51af2faa5d81ac7a98 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 @@ -1618,6 +1623,7 @@ c1da21be9f1af4f7a2ef4ec9cd92195d65ada316 assets/create/models/item/clockwork_bea dcb09deae110077bcddf090996b51cc66e9a7de3 assets/create/models/item/cogwheel.json 7717e3b21cff39f497f07687c70c1fa40eaa756d assets/create/models/item/content_observer.json 9dbd63c9e1b09a663fd4b83d76e3ab5967086167 assets/create/models/item/controller_rail.json +9a93b3ccef02cd0abd8106edec954dc0f2269229 assets/create/models/item/controls.json 10397036fc0bb1e18a767cfd7b19b10d805a83fe assets/create/models/item/copper_backtank.json 759bcb5fe7dfdd628716f9b4ff19a5ab00393381 assets/create/models/item/copper_casing.json 751324b03f657f4166460eb10a64dae47cb97bd4 assets/create/models/item/copper_nugget.json @@ -1983,6 +1989,7 @@ ef52b3734a47e96c5f83d60da73110e925737933 assets/create/models/item/refined_radia acfbf487ee65c2c58d89cb2644e33fda75751fde assets/create/models/item/rotation_speed_controller.json 171c343f7f536008f79ea1d63e0a443d064e9ef1 assets/create/models/item/sail_frame.json 5fa0bfe8642e2614a7e97d27af1a95dd2e012097 assets/create/models/item/sand_paper.json +98a33e62ab6ef0d1f7eec886ce56f9b4bd01ce1c assets/create/models/item/schedule.json 3202829de06e9c532dc8a61c955458648b70d645 assets/create/models/item/schematic.json 3f07bc7d4587d78de463ae2ce236e4f363b923cd assets/create/models/item/schematic_and_quill.json 8dd5caa4d7a0ee45bd9b39e09c4503159933d089 assets/create/models/item/schematic_table.json @@ -2066,6 +2073,8 @@ bab8f78c319b2a79ed55c5d2a94b521ddaa44996 assets/create/models/item/stressometer. 088af343cda8a949f1d950e15e72b51ffca20a1d assets/create/models/item/sweet_roll.json b1d3d00ff05908feacad06a86800da96cc9bc65d assets/create/models/item/tiled_glass.json a7d0b746637897209bd86b1a6501ecbfb46d8270 assets/create/models/item/tiled_glass_pane.json +6b5569f25fa2d905729a3f18deb56b6c67c5dfa4 assets/create/models/item/track.json +d6364e9d11915e53dafd8761f016e4b23c7703c8 assets/create/models/item/track_station.json f8a4fa1ccecb16a3941cc46db7481ed8e8429a5e assets/create/models/item/tree_fertilizer.json 3f6810da54724de551591b46cd5b47a98a4737ef assets/create/models/item/tuff_pillar.json fb24881c4e92bbb7ffa54a71e0af6b1c66d84829 assets/create/models/item/turntable.json @@ -3322,6 +3331,7 @@ bd4ed53c029fcd6e5da7e43ebe4d15030d3fd9de data/create/loot_tables/blocks/clockwor 982a41e1bccd9a130a2874aff995d4f7da0f0316 data/create/loot_tables/blocks/cogwheel.json c2b075008849e152f20e8da946e89c9722325df6 data/create/loot_tables/blocks/content_observer.json 28856dc862efc6bcc421d035d26386740458f868 data/create/loot_tables/blocks/controller_rail.json +2c2785e39e1891dff2c50cba93e814b56d935154 data/create/loot_tables/blocks/controls.json 3abf04f6132955275ad490668cd28f481afb4ec2 data/create/loot_tables/blocks/copper_backtank.json 8010db6b2427536c74312c85425b3ba83abc363c data/create/loot_tables/blocks/copper_casing.json 31b3e00f6ab3e593a0d6abd42961b3e5e03fc888 data/create/loot_tables/blocks/copper_shingle_slab.json @@ -3507,6 +3517,7 @@ feed1cd9639de957c9b34212d1c4aef2044d1e31 data/create/loot_tables/blocks/item_dra af3042824de4aff38e27657ebb084077a7d4f925 data/create/loot_tables/blocks/item_vault.json db23fee08abdb61fe2f200a5016e41523159feef data/create/loot_tables/blocks/jungle_window.json 67f7d9162d3b86e198ab7faa1ddcfdfce605d10c data/create/loot_tables/blocks/jungle_window_pane.json +5c1df8443043b3fe3b665dba348e2ff188bcbe31 data/create/loot_tables/blocks/large_bogey.json a70fcfe474ba023adc9c326218c5664fbd7b58f8 data/create/loot_tables/blocks/large_cogwheel.json 81013913c3cc88e2390608420a2911d57414bd2c data/create/loot_tables/blocks/layered_andesite.json a89d357d3b8d7633bffe12a4197ab19cba891005 data/create/loot_tables/blocks/layered_asurine.json @@ -3688,6 +3699,7 @@ af9c104f3d5863191aedf25c83c647de439c215f data/create/loot_tables/blocks/small_as 56aa727f02da49231e52593f4904eff3a93475ab data/create/loot_tables/blocks/small_asurine_brick_stairs.json 172dc3a9a866895035553e6ff166755a24afd0ff data/create/loot_tables/blocks/small_asurine_brick_wall.json db97cf328010da9b5f643dbfde12660e9f8a33f8 data/create/loot_tables/blocks/small_asurine_bricks.json +5c1df8443043b3fe3b665dba348e2ff188bcbe31 data/create/loot_tables/blocks/small_bogey.json 9a48f87a53b61188cfddbcf217b251ba13ee08df data/create/loot_tables/blocks/small_calcite_brick_slab.json 542fb74a3b02b5f947dbe9bd9d919b631ffd3ff3 data/create/loot_tables/blocks/small_calcite_brick_stairs.json 8b03b9773f2be01cf639c0fedcf69bb05f9a0f7d data/create/loot_tables/blocks/small_calcite_brick_wall.json @@ -3748,6 +3760,8 @@ ad771358ecd71e2f0c4b71f7244947fc2dc2a1c9 data/create/loot_tables/blocks/spruce_w da3ceb80799d349b91781b0dd43a02e548045c66 data/create/loot_tables/blocks/stressometer.json 811674fd816503cd78fc4df267dc23f760940e8f data/create/loot_tables/blocks/tiled_glass.json 313344ef4ee67ffd0f7fd44adcb3ad08de571c92 data/create/loot_tables/blocks/tiled_glass_pane.json +e2846b8823918bce402eb361f703ecdc14251ccc data/create/loot_tables/blocks/track.json +4617a11e220dcd0094c29d204fe90c01495c4e9b data/create/loot_tables/blocks/track_station.json 8fbe59bc77b029b802c43fb8a930778dede440ea data/create/loot_tables/blocks/tuff_pillar.json 2419d50b6086e92ab05624fdf38ef2b55c0b0944 data/create/loot_tables/blocks/turntable.json 2706ebca18074fe8d7a988d2c0002c857bff5c2b data/create/loot_tables/blocks/veridium.json @@ -5259,8 +5273,8 @@ ff1900963bc4cd8ceffa78d58ef1952ceacb2fb7 data/forge/tags/items/storage_blocks/br 2db7759fe036160c14c6ed19a68604ca16f4de60 data/minecraft/tags/blocks/dripstone_replaceable_blocks.json 69f596fcb065e26b02ce246760432b5174191b76 data/minecraft/tags/blocks/impermeable.json 2db7759fe036160c14c6ed19a68604ca16f4de60 data/minecraft/tags/blocks/lush_ground_replaceable.json -59681910c06f8b7385c6641a409d352056235506 data/minecraft/tags/blocks/mineable/axe.json -f8c66b3808efb61d2d928748783bb7eb8a1357f9 data/minecraft/tags/blocks/mineable/pickaxe.json +02f7a9df2f9e154749266e7ac59c37aa076a3390 data/minecraft/tags/blocks/mineable/axe.json +b52748d3d434dd40ba10db8e97fa2102d7acb638 data/minecraft/tags/blocks/mineable/pickaxe.json 2db7759fe036160c14c6ed19a68604ca16f4de60 data/minecraft/tags/blocks/moss_replaceable.json e157c1d3af30e409e34bbefbe15a037e6e1c8daa data/minecraft/tags/blocks/needs_iron_tool.json a08f67865337f62601c5e333b4011382d10020e4 data/minecraft/tags/blocks/needs_stone_tool.json diff --git a/src/generated/resources/assets/create/blockstates/controls.json b/src/generated/resources/assets/create/blockstates/controls.json new file mode 100644 index 000000000..d1e6fccff --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/controls.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=north,open=false": { + "model": "create:block/controls/block_closed" + }, + "facing=south,open=false": { + "model": "create:block/controls/block_closed", + "y": 180 + }, + "facing=west,open=false": { + "model": "create:block/controls/block_closed", + "y": 270 + }, + "facing=east,open=false": { + "model": "create:block/controls/block_closed", + "y": 90 + }, + "facing=north,open=true": { + "model": "create:block/controls/block_open" + }, + "facing=south,open=true": { + "model": "create:block/controls/block_open", + "y": 180 + }, + "facing=west,open=true": { + "model": "create:block/controls/block_open", + "y": 270 + }, + "facing=east,open=true": { + "model": "create:block/controls/block_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/large_bogey.json b/src/generated/resources/assets/create/blockstates/large_bogey.json new file mode 100644 index 000000000..f78f19c47 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/large_bogey.json @@ -0,0 +1,11 @@ +{ + "variants": { + "axis=x": { + "model": "create:block/track/bogey/top", + "y": 90 + }, + "axis=z": { + "model": "create:block/track/bogey/top" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/small_bogey.json b/src/generated/resources/assets/create/blockstates/small_bogey.json new file mode 100644 index 000000000..f78f19c47 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/small_bogey.json @@ -0,0 +1,11 @@ +{ + "variants": { + "axis=x": { + "model": "create:block/track/bogey/top", + "y": 90 + }, + "axis=z": { + "model": "create:block/track/bogey/top" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/track.json b/src/generated/resources/assets/create/blockstates/track.json new file mode 100644 index 000000000..7f63f475f --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/track.json @@ -0,0 +1,64 @@ +{ + "variants": { + "shape=none,turn=false": { + "model": "minecraft:block/air" + }, + "shape=zo,turn=false": { + "model": "create:block/track/z_ortho" + }, + "shape=xo,turn=false": { + "model": "create:block/track/x_ortho" + }, + "shape=pd,turn=false": { + "model": "create:block/track/pos_diag" + }, + "shape=nd,turn=false": { + "model": "create:block/track/neg_diag" + }, + "shape=an,turn=false": { + "model": "create:block/track/ascending", + "y": 180 + }, + "shape=as,turn=false": { + "model": "create:block/track/ascending" + }, + "shape=ae,turn=false": { + "model": "create:block/track/ascending", + "y": 270 + }, + "shape=aw,turn=false": { + "model": "create:block/track/ascending", + "y": 90 + }, + "shape=none,turn=true": { + "model": "minecraft:block/air" + }, + "shape=zo,turn=true": { + "model": "create:block/track/z_ortho" + }, + "shape=xo,turn=true": { + "model": "create:block/track/x_ortho" + }, + "shape=pd,turn=true": { + "model": "create:block/track/pos_diag" + }, + "shape=nd,turn=true": { + "model": "create:block/track/neg_diag" + }, + "shape=an,turn=true": { + "model": "create:block/track/ascending", + "y": 180 + }, + "shape=as,turn=true": { + "model": "create:block/track/ascending" + }, + "shape=ae,turn=true": { + "model": "create:block/track/ascending", + "y": 270 + }, + "shape=aw,turn=true": { + "model": "create:block/track/ascending", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/track_station.json b/src/generated/resources/assets/create/blockstates/track_station.json new file mode 100644 index 000000000..17018ce71 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/track_station.json @@ -0,0 +1,34 @@ +{ + "variants": { + "assembling=false,facing=north": { + "model": "create:block/track_station/block" + }, + "assembling=true,facing=north": { + "model": "create:block/track_station/block_assembling" + }, + "assembling=false,facing=south": { + "model": "create:block/track_station/block", + "y": 180 + }, + "assembling=true,facing=south": { + "model": "create:block/track_station/block_assembling", + "y": 180 + }, + "assembling=false,facing=west": { + "model": "create:block/track_station/block", + "y": 270 + }, + "assembling=true,facing=west": { + "model": "create:block/track_station/block_assembling", + "y": 270 + }, + "assembling=false,facing=east": { + "model": "create:block/track_station/block", + "y": 90 + }, + "assembling=true,facing=east": { + "model": "create:block/track_station/block_assembling", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 2ed4baaf7..28db28f49 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -50,6 +50,7 @@ "block.create.cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186", "block.create.content_observer": "\u0279\u01DD\u028C\u0279\u01DDsqO \u0287u\u01DD\u0287uo\u0186", "block.create.controller_rail": "\u05DF\u0131\u0250\u1D1A \u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186", + "block.create.controls": "s\u05DFo\u0279\u0287uo\u0186", "block.create.copper_backtank": "\u029Eu\u0250\u0287\u029E\u0254\u0250\u15FA \u0279\u01DDddo\u0186", "block.create.copper_casing": "bu\u0131s\u0250\u0186 \u0279\u01DDddo\u0186", "block.create.copper_shingle_slab": "q\u0250\u05DFS \u01DD\u05DFbu\u0131\u0265S \u0279\u01DDddo\u0186", @@ -236,6 +237,7 @@ "block.create.item_vault": "\u0287\u05DFn\u0250\u039B \u026F\u01DD\u0287I", "block.create.jungle_window": "\u028Dopu\u0131M \u01DD\u05DFbun\u017F", "block.create.jungle_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u01DD\u05DFbun\u017F", + "block.create.large_bogey": "\u028E\u01DDbo\u15FA \u01DDb\u0279\u0250\uA780", "block.create.large_cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186 \u01DDb\u0279\u0250\uA780", "block.create.layered_andesite": "\u01DD\u0287\u0131s\u01DDpu\u2C6F p\u01DD\u0279\u01DD\u028E\u0250\uA780", "block.create.layered_asurine": "\u01DDu\u0131\u0279ns\u2C6F p\u01DD\u0279\u01DD\u028E\u0250\uA780", @@ -417,6 +419,7 @@ "block.create.small_asurine_brick_stairs": "s\u0279\u0131\u0250\u0287S \u029E\u0254\u0131\u0279\u15FA \u01DDu\u0131\u0279ns\u2C6F \u05DF\u05DF\u0250\u026FS", "block.create.small_asurine_brick_wall": "\u05DF\u05DF\u0250M \u029E\u0254\u0131\u0279\u15FA \u01DDu\u0131\u0279ns\u2C6F \u05DF\u05DF\u0250\u026FS", "block.create.small_asurine_bricks": "s\u029E\u0254\u0131\u0279\u15FA \u01DDu\u0131\u0279ns\u2C6F \u05DF\u05DF\u0250\u026FS", + "block.create.small_bogey": "\u028E\u01DDbo\u15FA \u05DF\u05DF\u0250\u026FS", "block.create.small_calcite_brick_slab": "q\u0250\u05DFS \u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131\u0254\u05DF\u0250\u0186 \u05DF\u05DF\u0250\u026FS", "block.create.small_calcite_brick_stairs": "s\u0279\u0131\u0250\u0287S \u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131\u0254\u05DF\u0250\u0186 \u05DF\u05DF\u0250\u026FS", "block.create.small_calcite_brick_wall": "\u05DF\u05DF\u0250M \u029E\u0254\u0131\u0279\u15FA \u01DD\u0287\u0131\u0254\u05DF\u0250\u0186 \u05DF\u05DF\u0250\u026FS", @@ -477,6 +480,8 @@ "block.create.stressometer": "\u0279\u01DD\u0287\u01DD\u026Foss\u01DD\u0279\u0287S", "block.create.tiled_glass": "ss\u0250\u05DF\u2141 p\u01DD\u05DF\u0131\u27D8", "block.create.tiled_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u05DF\u0131\u27D8", + "block.create.track": "\u029E\u0254\u0250\u0279\u27D8", + "block.create.track_station": "uo\u0131\u0287\u0250\u0287S \u029E\u0254\u0250\u0279\u27D8", "block.create.tuff_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u025F\u025Fn\u27D8", "block.create.turntable": "\u01DD\u05DFq\u0250\u0287u\u0279n\u27D8", "block.create.veridium": "\u026Fn\u0131p\u0131\u0279\u01DD\u039B", @@ -533,6 +538,7 @@ "block.create.zinc_ore": "\u01DD\u0279O \u0254u\u0131Z", "enchantment.create.capacity": "\u028E\u0287\u0131\u0254\u0250d\u0250\u0186", "enchantment.create.potato_recovery": "\u028E\u0279\u01DD\u028Co\u0254\u01DD\u1D1A o\u0287\u0250\u0287o\u0500", + "entity.create.carriage_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u01DDb\u0250\u0131\u0279\u0279\u0250\u0186", "entity.create.contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186", "entity.create.crafting_blueprint": "\u0287u\u0131\u0279d\u01DDn\u05DF\u15FA bu\u0131\u0287\u025F\u0250\u0279\u0186", "entity.create.gantry_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0287u\u0250\u2141", @@ -609,6 +615,7 @@ "item.create.refined_radiance": "\u01DD\u0254u\u0250\u0131p\u0250\u1D1A p\u01DDu\u0131\u025F\u01DD\u1D1A", "item.create.rose_quartz": "z\u0287\u0279\u0250n\u1F49 \u01DDso\u1D1A", "item.create.sand_paper": "\u0279\u01DDd\u0250\u0500 pu\u0250S", + "item.create.schedule": "\u01DD\u05DFnp\u01DD\u0265\u0254S", "item.create.schematic": "\u0254\u0131\u0287\u0250\u026F\u01DD\u0265\u0254S", "item.create.schematic_and_quill": "\u05DF\u05DF\u0131n\u1F49 pu\u2C6F \u0254\u0131\u0287\u0250\u026F\u01DD\u0265\u0254S", "item.create.shadow_steel": "\u05DF\u01DD\u01DD\u0287S \u028Dop\u0250\u0265S", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 3711a2713..0cadcda19 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -53,6 +53,7 @@ "block.create.cogwheel": "Cogwheel", "block.create.content_observer": "Content Observer", "block.create.controller_rail": "Controller Rail", + "block.create.controls": "Controls", "block.create.copper_backtank": "Copper Backtank", "block.create.copper_casing": "Copper Casing", "block.create.copper_shingle_slab": "Copper Shingle Slab", @@ -239,6 +240,7 @@ "block.create.item_vault": "Item Vault", "block.create.jungle_window": "Jungle Window", "block.create.jungle_window_pane": "Jungle Window Pane", + "block.create.large_bogey": "Large Bogey", "block.create.large_cogwheel": "Large Cogwheel", "block.create.layered_andesite": "Layered Andesite", "block.create.layered_asurine": "Layered Asurine", @@ -420,6 +422,7 @@ "block.create.small_asurine_brick_stairs": "Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "Small Asurine Brick Wall", "block.create.small_asurine_bricks": "Small Asurine Bricks", + "block.create.small_bogey": "Small Bogey", "block.create.small_calcite_brick_slab": "Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "Small Calcite Brick Wall", @@ -480,6 +483,8 @@ "block.create.stressometer": "Stressometer", "block.create.tiled_glass": "Tiled Glass", "block.create.tiled_glass_pane": "Tiled Glass Pane", + "block.create.track": "Track", + "block.create.track_station": "Track Station", "block.create.tuff_pillar": "Tuff Pillar", "block.create.turntable": "Turntable", "block.create.veridium": "Veridium", @@ -538,6 +543,7 @@ "enchantment.create.capacity": "Capacity", "enchantment.create.potato_recovery": "Potato Recovery", + "entity.create.carriage_contraption": "Carriage Contraption", "entity.create.contraption": "Contraption", "entity.create.crafting_blueprint": "Crafting Blueprint", "entity.create.gantry_contraption": "Gantry Contraption", @@ -616,6 +622,7 @@ "item.create.refined_radiance": "Refined Radiance", "item.create.rose_quartz": "Rose Quartz", "item.create.sand_paper": "Sand Paper", + "item.create.schedule": "Schedule", "item.create.schematic": "Schematic", "item.create.schematic_and_quill": "Schematic And Quill", "item.create.shadow_steel": "Shadow Steel", @@ -863,9 +870,15 @@ "create.generic.length": "Length", "create.generic.speed": "Speed", "create.generic.delay": "Delay", + "create.generic.duration": "Duration", + "create.generic.timeUnit": "Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Seconds", "create.generic.unit.minutes": "Minutes", + "create.generic.daytime.hour": "Hour", + "create.generic.daytime.minute": "Minute", + "create.generic.daytime.pm": "pm", + "create.generic.daytime.am": "am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", @@ -1309,6 +1322,60 @@ "create.hint.full_deployer.title": "Deployer Item Overflow", "create.hint.full_deployer": "It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.gui.schedule.lmb_edit": "Left-Click to Edit", + "create.gui.schedule.rmb_remove": "Right-Click to Remove", + "create.gui.schedule.duplicate": "Duplicate", + "create.gui.schedule.remove_entry": "Remove Stop", + "create.gui.schedule.add_entry": "Add Stop", + "create.gui.schedule.move_up": "Move up", + "create.gui.schedule.move_down": "Move down", + "create.gui.schedule.add_condition": "Add Condition", + "create.gui.schedule.alternative_condition": "Alternative Condition", + + "create.schedule.destination_type": "Next Stop:", + "create.schedule.destination.editor": "Destination Editor", + "create.schedule.destination.filtered": "Specific Station", + "create.schedule.destination.filtered_matching": "Station: %1$s", + "create.schedule.destination.filter": "Station Name", + "create.schedule.destination.filter_2": "Use * as a text wildcard", + "create.schedule.destination.filter_3": "Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "Nearest Station", + "create.schedule.destination.redstone": "Station with Redstone Pulse", + "create.schedule.condition_type": "Continue when:", + "create.schedule.condition.editor": "Condition Editor", + "create.schedule.condition.delay": "Scheduled Delay", + "create.schedule.condition.delay_short": "Wait: %1$s", + "create.schedule.condition.idle": "Cargo Inactivity", + "create.schedule.condition.idle_short": "Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "for %1$s", + "create.schedule.condition.unloaded": "Chunk Unloaded", + "create.schedule.condition.powered": "Station Powered", + "create.schedule.condition.time_of_day": "Time of Day", + "create.schedule.condition.time_of_day.scheduled": "Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "%1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "+%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "Train Holds %1$s", + "create.schedule.condition.threshold.greater": "More than", + "create.schedule.condition.threshold.less": "Less than", + "create.schedule.condition.threshold.equal": "Exactly", + "create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "Matching Content", + "create.schedule.condition.threshold.item_measure": "Item Measure", + "create.schedule.condition.threshold.items": "Items", + "create.schedule.condition.threshold.stacks": "Stacks", + "create.schedule.condition.threshold.buckets": "Buckets", + "create.schedule.condition.threshold.place_item": "Reference Item", + "create.schedule.condition.threshold.place_item_2": "Filters can be used", + "create.schedule.condition.fluid_threshold": "Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "Item Cargo Condition", + "create.schedule.loop": "Loop Forever", + "create.schedule.loop1": "Schedule starts over", + "create.schedule.loop2": "when completed", + + "create.train.unnamed": "Unnamed Train", + "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "This is a sample overlay", "create.gui.config.overlay3": "Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 9ee21426d..2829d0edb 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1323", + "_": "Missing Localizations: 1387", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "Zahnrad", "block.create.content_observer": "Inhaltsbeobachter", "block.create.controller_rail": "Steuerungsschiene", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", "block.create.copper_casing": "Kupferrahmen", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "UNLOCALIZED: Item Vault", "block.create.jungle_window": "Tropenholzfenster", "block.create.jungle_window_pane": "Tropenholzfensterscheibe", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "Großes Zahnrad", "block.create.layered_andesite": "Geschichteter Andesit", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "Stressometer", "block.create.tiled_glass": "Glasfliesen", "block.create.tiled_glass_pane": "Glasfliesenscheibe", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "Drehtisch", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "UNLOCALIZED: Capacity", "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "Vorrichtung", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "Portalkran Vorrichtung", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "Raffinierter Glanz", "item.create.rose_quartz": "Rosenquarz", "item.create.sand_paper": "Schmirgelpapier", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "Bauplan", "item.create.schematic_and_quill": "Bauplan und Feder", "item.create.shadow_steel": "Schattenstahl", @@ -864,9 +871,15 @@ "create.generic.length": "Länge", "create.generic.speed": "Geschwindigkeit", "create.generic.delay": "Verzögerung", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Sekunden", "create.generic.unit.minutes": "Minuten", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "Einsatzgerät Gegenstand Überlauf", "create.hint.full_deployer": "Es scheint, dieses _Einsatzgerät_ enthält _überflüssige_ _Gegenstände_ die _extrahiert_ werden müssen. Nutze _Trichter_ oder anderes um ihn von seinem Überfluss zu befreien.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "Dies ist ein Beispiel Overlay", "create.gui.config.overlay3": "Klicke oder ziehe mit deiner Maus", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_cl.json b/src/generated/resources/assets/create/lang/unfinished/es_cl.json index 1c1611ee1..25f031fa9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_cl.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_cl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 334", + "_": "Missing Localizations: 398", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "Engranaje", "block.create.content_observer": "Observador de Contenidos", "block.create.controller_rail": "Raíl Controlador", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "Tanque-Mochila de Cobre", "block.create.copper_casing": "Cubierta de Cobre", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "UNLOCALIZED: Item Vault", "block.create.jungle_window": "Ventana de Jungla", "block.create.jungle_window_pane": "Panel de Ventana de Jungla", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "Engranaje Grande", "block.create.layered_andesite": "Capa de Andesita", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "Estresómetro", "block.create.tiled_glass": "Vidrio Baldosa", "block.create.tiled_glass_pane": "Panel de Vidrio Baldosa", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "Plato Giratorio", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "Capacidad", "enchantment.create.potato_recovery": "Recuperación de papas", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "Artefacto", "entity.create.crafting_blueprint": "Crafteando Planos", "entity.create.gantry_contraption": "Artefacto de Grúa", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "Radiancia Refinada", "item.create.rose_quartz": "Cuarzo Rosa", "item.create.sand_paper": "Papel de Arena", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "Esquema", "item.create.schematic_and_quill": "Esquema con Pluma", "item.create.shadow_steel": "Acero Sombrío", @@ -864,9 +871,15 @@ "create.generic.length": "Largo", "create.generic.speed": "Velocidad", "create.generic.delay": "Retraso", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Segundos", "create.generic.unit.minutes": "Minutos", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "us", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "Desbordamiento de objetos del Desplegador", "create.hint.full_deployer": "Parece que este _Desplegador_ contiene _objetos_ de _exceso_ que requieren ser _extraídos._ Usa una _tolva,_ _tolvogán_ u otros parecidos para librarlo del sobreflujo.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "Hola :)", "create.gui.config.overlay2": "Este es un overlay de ejemplo", "create.gui.config.overlay3": "Haz clic o arrastra con el mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index b27861f0c..1fae1c80b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 334", + "_": "Missing Localizations: 398", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "Engranaje pequeño", "block.create.content_observer": "Observador de contenidos", "block.create.controller_rail": "Raíl de control", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "Depósito trasero de cobre", "block.create.copper_casing": "Revestidor de caliza", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "UNLOCALIZED: Item Vault", "block.create.jungle_window": "Ventana de jungla", "block.create.jungle_window_pane": "Panel de ventana de jungla", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "Engranaje grande", "block.create.layered_andesite": "Andesita estratificada", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "Estresómetro", "block.create.tiled_glass": "Vidrio esmaltado", "block.create.tiled_glass_pane": "Panel de vidrio esmaltado", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "Plataforma giratoria mecánica", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "Capacidad", "enchantment.create.potato_recovery": "Recuperación de patatas", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "Artilugio", "entity.create.crafting_blueprint": "Plano de elaboración", "entity.create.gantry_contraption": "Artilugio de grúa", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "Resplandor refinado", "item.create.rose_quartz": "Cuarzo rosado", "item.create.sand_paper": "Papel de lija", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "Esquema", "item.create.schematic_and_quill": "Esquema y pluma", "item.create.shadow_steel": "Acero sombrío", @@ -864,9 +871,15 @@ "create.generic.length": "Largo", "create.generic.speed": "Velocidad", "create.generic.delay": "Retraso", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Segundos", "create.generic.unit.minutes": "Minutos", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "SU(unidades de estrés)", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "Exceso de objetos en el desplegador", "create.hint.full_deployer": "Parece que este _desplegador_ contiene _exceso_ de objetos que necesitan ser _extraídos._ Usa una _tolva_, _embudo_ u otro medio para liberarlo de su excedente.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "Hola :)", "create.gui.config.overlay2": "Esta es una muestra de la superposición", "create.gui.config.overlay3": "Haga clic o arrastre con el ratón", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 6c38fc26f..c63e340e4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1585", + "_": "Missing Localizations: 1649", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "Roue dentée", "block.create.content_observer": "Observateur de contenu", "block.create.controller_rail": "Rails controlleurs", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", "block.create.copper_casing": "Revêtement en cuivre", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "UNLOCALIZED: Item Vault", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "Grande roue dentée", "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "Stressomètre", "block.create.tiled_glass": "Verre carrelé", "block.create.tiled_glass_pane": "Vitre carrelé", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "Plaque tournante", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "UNLOCALIZED: Capacity", "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "Engin", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "Éclat raffiné", "item.create.rose_quartz": "Quartz rose", "item.create.sand_paper": "Papier de verre", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "Schéma", "item.create.schematic_and_quill": "Schéma et plume", "item.create.shadow_steel": "Acier sombre", @@ -864,9 +871,15 @@ "create.generic.length": "Longueur", "create.generic.speed": "Vitesse", "create.generic.delay": "Delai", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Secondes", "create.generic.unit.minutes": "Minutes", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "tr/min", "create.generic.unit.stress": "us", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 31fd96277..2a6f54cb1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1274", + "_": "Missing Localizations: 1338", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "Ruota dentata", "block.create.content_observer": "Osservatore dei contenuti", "block.create.controller_rail": "Binario di controllo", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", "block.create.copper_casing": "Involucro di rame", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "UNLOCALIZED: Item Vault", "block.create.jungle_window": "Finestra della giungla", "block.create.jungle_window_pane": "Pannello di finestra della giungla", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "Ruota dentata grande", "block.create.layered_andesite": "Andesite stratificata", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "Stressometro", "block.create.tiled_glass": "Vetro piastrellato", "block.create.tiled_glass_pane": "Pannello di vetro piastrellato", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "Piatto", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "UNLOCALIZED: Capacity", "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "Contrazione", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "Radiance raffinata", "item.create.rose_quartz": "Quarzo rosa", "item.create.sand_paper": "Carta vetrata", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "Schematica", "item.create.schematic_and_quill": "Schematica e penna d'oca", "item.create.shadow_steel": "Acciaio oscuro", @@ -864,9 +871,15 @@ "create.generic.length": "Lunghezza", "create.generic.speed": "Velocità", "create.generic.delay": "Ritardo", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Tick", "create.generic.unit.seconds": "Secondi", "create.generic.unit.minutes": "Minuti", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "Overflow di oggetti dell'installatore", "create.hint.full_deployer": "Sembra che questo _installatore_ contenga _oggetti_ _eccessivi_ che necessitano di essere _estratti_. Usa una _tramoggia_, un _imbuto_ o altro per liberarlo dall'overflow.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "Ciao :)", "create.gui.config.overlay2": "Questo overlay è di esempio", "create.gui.config.overlay3": "Cliccalo o trascinalo col mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 3353e1e11..644238b35 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 4", + "_": "Missing Localizations: 68", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "歯車", "block.create.content_observer": "コンテンツオブザーバー", "block.create.controller_rail": "コントローラーレール", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "銅のバックタンク", "block.create.copper_casing": "銅ケーシング", "block.create.copper_shingle_slab": "銅の屋根板のハーフブロック", @@ -240,6 +241,7 @@ "block.create.item_vault": "アイテム保管庫", "block.create.jungle_window": "ジャングルの窓", "block.create.jungle_window_pane": "ジャングルの板窓", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "大きな歯車", "block.create.layered_andesite": "安山岩の組石", "block.create.layered_asurine": "瑠璃岩の組石", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "小さな瑠璃岩レンガの階段", "block.create.small_asurine_brick_wall": "小さな瑠璃岩レンガの塀", "block.create.small_asurine_bricks": "小さな瑠璃岩レンガ", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "小さな方解石レンガのハーフブロック", "block.create.small_calcite_brick_stairs": "小さな方解石レンガの階段", "block.create.small_calcite_brick_wall": "小さな方解石レンガの塀", @@ -481,6 +484,8 @@ "block.create.stressometer": "応力メーター", "block.create.tiled_glass": "タイルガラス", "block.create.tiled_glass_pane": "タイル板ガラス", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "凝灰岩の柱", "block.create.turntable": "ターンテーブル", "block.create.veridium": "翡翠岩", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "容量増加", "enchantment.create.potato_recovery": "ポテト回収", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "からくり", "entity.create.crafting_blueprint": "クラフトブループリント", "entity.create.gantry_contraption": "ガントリーからくり", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "高貴な光輝", "item.create.rose_quartz": "ローズクォーツ", "item.create.sand_paper": "紙やすり", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "概略図", "item.create.schematic_and_quill": "概略図と羽根ペン", "item.create.shadow_steel": "シャドウスチール", @@ -864,9 +871,15 @@ "create.generic.length": "長さ", "create.generic.speed": "回転速度", "create.generic.delay": "遅延", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "ティック", "create.generic.unit.seconds": "秒", "create.generic.unit.minutes": "分", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "度", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "デプロイヤーのアイテムが溢れています", "create.hint.full_deployer": "この_デプロイヤー_には、_搬出_する必要がある余分なアイテムが含まれています。_ ホッパー_や_漏斗_などの手段を利用して、溢れないようにしてください。", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "やぁ(・∀・)", "create.gui.config.overlay2": "これはオーバーレイのサンプルです", "create.gui.config.overlay3": "マウスでクリックまたはドラッグしてください", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 6fad5c422..ac1e75587 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 6", + "_": "Missing Localizations: 70", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "톱니바퀴", "block.create.content_observer": "정보 감지기", "block.create.controller_rail": "방향 레일", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "구리 산소통", "block.create.copper_casing": "구리 케이스", "block.create.copper_shingle_slab": "구리 판자 반 블록", @@ -240,6 +241,7 @@ "block.create.item_vault": "아이템 금고", "block.create.jungle_window": "정글나무 유리창", "block.create.jungle_window_pane": "정글나무 유리판", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "큰 톱니바퀴", "block.create.layered_andesite": "이어지는 안산암", "block.create.layered_asurine": "이어지는 유리암", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "작은 유리암 벽돌 계단", "block.create.small_asurine_brick_wall": "작은 유리암 벽돌 담장", "block.create.small_asurine_bricks": "작은 유리암 벽돌", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "작은 방해석 벽돌 반 블록", "block.create.small_calcite_brick_stairs": "작은 방해석 벽돌 계단", "block.create.small_calcite_brick_wall": "작은 방해석 벽돌 담장", @@ -481,6 +484,8 @@ "block.create.stressometer": "피로도 계측기", "block.create.tiled_glass": "타일 유리", "block.create.tiled_glass_pane": "타일 유리판", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "응회암 기둥", "block.create.turntable": "돌림판", "block.create.veridium": "심록암", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "저장량", "enchantment.create.potato_recovery": "대포알 회수", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "구조물", "entity.create.crafting_blueprint": "조합 청사진", "entity.create.gantry_contraption": "갠트리 구조물", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "정제된 광채", "item.create.rose_quartz": "장밋빛 석영", "item.create.sand_paper": "사포", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "청사진", "item.create.schematic_and_quill": "청사진과 깃펜", "item.create.shadow_steel": "그림자 강철", @@ -864,9 +871,15 @@ "create.generic.length": "길이", "create.generic.speed": "속도", "create.generic.delay": "딜레이", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "틱", "create.generic.unit.seconds": "초", "create.generic.unit.minutes": "분", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "기계 손 아이템 과적", "create.hint.full_deployer": "이 _기계 손_은 _배출_할 아이템을 가지고 있습니다. 호퍼 , 퍼널 등을 이용해 아이템을 빼내세요.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "This is a sample overlay", "create.gui.config.overlay3": "Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 5c267462e..e6ce9b0ed 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1938", + "_": "Missing Localizations: 2002", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "Tandwiel", "block.create.content_observer": "UNLOCALIZED: Content Observer", "block.create.controller_rail": "UNLOCALIZED: Controller Rail", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", "block.create.copper_casing": "UNLOCALIZED: Copper Casing", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "UNLOCALIZED: Item Vault", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "Groot Tandwiel", "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "Stressmeter", "block.create.tiled_glass": "Getegeld Glas", "block.create.tiled_glass_pane": "Getegeld Glazen Paneel", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "Draaischijf", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "UNLOCALIZED: Capacity", "enchantment.create.potato_recovery": "UNLOCALIZED: Potato Recovery", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "UNLOCALIZED: Contraption", "entity.create.crafting_blueprint": "UNLOCALIZED: Crafting Blueprint", "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "UNLOCALIZED: Refined Radiance", "item.create.rose_quartz": "Roze Kwarts", "item.create.sand_paper": "UNLOCALIZED: Sand Paper", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "Bouwtekening", "item.create.schematic_and_quill": "Bouwtekening en Veer", "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", @@ -864,9 +871,15 @@ "create.generic.length": "UNLOCALIZED: Length", "create.generic.speed": "Snelheid", "create.generic.delay": "Vertraging", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Seconden", "create.generic.unit.minutes": "Minuten", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "UNLOCALIZED: RPM", "create.generic.unit.stress": "UNLOCALIZED: su", "create.generic.unit.degrees": "UNLOCALIZED: °", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index cd35cc35b..0418732c2 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 373", + "_": "Missing Localizations: 437", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "Koło zębate", "block.create.content_observer": "Detektor zawartości", "block.create.controller_rail": "Tory sterujące", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "Miedziany zbiornik w plecaku", "block.create.copper_casing": "Miedziana Obudowa", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "UNLOCALIZED: Item Vault", "block.create.jungle_window": "Dżunglowe okno", "block.create.jungle_window_pane": "Dżunglowa szyba okienna", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "Duże koło zębate", "block.create.layered_andesite": "Warstwowy andezyt", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "Miernik obciążenia", "block.create.tiled_glass": "Kafelkowane szkło", "block.create.tiled_glass_pane": "Kafelkowana szyba", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "Talerz obrotowy", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "Pojameność", "enchantment.create.potato_recovery": "Odzyskiwanie", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "Maszyna", "entity.create.crafting_blueprint": "Szablon konstruowania", "entity.create.gantry_contraption": "Maszyna suwnicowa", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "Świetlisty materiał", "item.create.rose_quartz": "Różowy kwarc", "item.create.sand_paper": "Papier ścierny", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "Schemat", "item.create.schematic_and_quill": "Schemat z piórem", "item.create.shadow_steel": "Mroczna stal", @@ -864,9 +871,15 @@ "create.generic.length": "Długość", "create.generic.speed": "Prędkość", "create.generic.delay": "Opóźnienie", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Tiki", "create.generic.unit.seconds": "Sekundy", "create.generic.unit.minutes": "Minuty", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "Ob/min", "create.generic.unit.stress": "JO", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "Nadmiar przedmiotów w aplikatorze", "create.hint.full_deployer": "Wygląda na to, że ten _aplikator_ zawiera _nadmiar_ _przedmiotów_, które muszą zostać _wyciągnięte_. Użyj _leji_, _lejków_ lub innych sposobów, aby uwolnić od przepełnienia.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "Cześć :)", "create.gui.config.overlay2": "To jest przykładowa nakładka", "create.gui.config.overlay3": "Kliknij lub przeciągnij myszką", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index dc306c28f..4883a9451 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1557", + "_": "Missing Localizations: 1621", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "Roda Dentada", "block.create.content_observer": "Observador de Conteúdo", "block.create.controller_rail": "Trilho Controlador", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "Tanque Traseiro de Cobre", "block.create.copper_casing": "Revestimento de Cobre", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "Cofre de itens", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "UNLOCALIZED: Large Cogwheel", "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "Estressómetro", "block.create.tiled_glass": "Vidro Entalhado", "block.create.tiled_glass_pane": "Vidraça Entalhada", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "Mesa giratória", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "Capacidade", "enchantment.create.potato_recovery": "Recuperação de Batata", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "Engenhoca", "entity.create.crafting_blueprint": "Esquema de Fabricação", "entity.create.gantry_contraption": "Engenhoca de Pórticolo", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "Luz Refinada", "item.create.rose_quartz": "Quartzo Rosa", "item.create.sand_paper": "Lixa", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "Esquema", "item.create.schematic_and_quill": "Esquema e pena", "item.create.shadow_steel": "Aço sombrio", @@ -864,9 +871,15 @@ "create.generic.length": "Comprimento", "create.generic.speed": "Velocidade", "create.generic.delay": "Demorada", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Segundos", "create.generic.unit.minutes": "Minutos", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "us", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json index e18538a93..8145ae7df 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1557", + "_": "Missing Localizations: 1621", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "Roda Dentada", "block.create.content_observer": "Observador de Conteúdo", "block.create.controller_rail": "Trilho Controlador", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "Tanque Traseiro de Cobre", "block.create.copper_casing": "Revestimento de Cobre", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "Cofre de itens", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "UNLOCALIZED: Large Cogwheel", "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "Estressómetro", "block.create.tiled_glass": "Vidro Entalhado", "block.create.tiled_glass_pane": "Vidraça Entalhada", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "Mesa giratória", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "Capacidade", "enchantment.create.potato_recovery": "Recuperação de Batata", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "Engenhoca", "entity.create.crafting_blueprint": "Esquema de Fabricação", "entity.create.gantry_contraption": "Engenhoca de Pórticolo", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "Luz Refinada", "item.create.rose_quartz": "Quartzo Rosa", "item.create.sand_paper": "Lixa", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "Esquema", "item.create.schematic_and_quill": "Esquema e pena", "item.create.shadow_steel": "Aço sombrio", @@ -864,9 +871,15 @@ "create.generic.length": "Comprimento", "create.generic.speed": "Velocidade", "create.generic.delay": "Demorada", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Segundos", "create.generic.unit.minutes": "Minutos", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "us", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "UNLOCALIZED: Deployer Item Overflow", "create.hint.full_deployer": "UNLOCALIZED: It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index e12ca6f84..25bc6d56e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 378", + "_": "Missing Localizations: 442", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "Шестерня", "block.create.content_observer": "Наблюдатель за содержимым", "block.create.controller_rail": "Контролирующая рельса", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "Медный баллон", "block.create.copper_casing": "Медный корпус", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "UNLOCALIZED: Item Vault", "block.create.jungle_window": "Окно из тропического дерева", "block.create.jungle_window_pane": "Панель окна из тропического дерева", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "Большая шестерня", "block.create.layered_andesite": "Слоистый андезит", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "Стрессометр", "block.create.tiled_glass": "Плиточное стекло", "block.create.tiled_glass_pane": "Плиточная стеклянная панель", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "Поворотный стол", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "Вместимость", "enchantment.create.potato_recovery": "Возобновление картофеля", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "Штуковина", "entity.create.crafting_blueprint": "Создание чертежа", "entity.create.gantry_contraption": "Крановая штуковина", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "Изысканное сияние", "item.create.rose_quartz": "Розовый кварц", "item.create.sand_paper": "Наждачная бумага", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "Схематика", "item.create.schematic_and_quill": "Схематика и перо", "item.create.shadow_steel": "Призрачная сталь", @@ -864,9 +871,15 @@ "create.generic.length": "Длина", "create.generic.speed": "Скорость", "create.generic.delay": "Задержка", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "тиков", "create.generic.unit.seconds": "секунд", "create.generic.unit.minutes": "минут", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "об./мин.", "create.generic.unit.stress": "ен", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "Переполнение автономного активатора", "create.hint.full_deployer": "Похоже, этот _автономный активатор_ содержит _лишние_ _предметы_, которые необходимо _извлечь_. Используйте _воронку_ или _другие способы_, чтобы освободить его от переполнения.", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "Привет :)", "create.gui.config.overlay2": "Это образец оверлея", "create.gui.config.overlay3": "Кликни и тащи с помощью мыши", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index fb7c9b73f..2e28f7fd6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 4", + "_": "Missing Localizations: 68", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "齿轮", "block.create.content_observer": "物品侦测器", "block.create.controller_rail": "控制铁轨", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "铜制背罐", "block.create.copper_casing": "铜机壳", "block.create.copper_shingle_slab": "铜砖块台阶", @@ -240,6 +241,7 @@ "block.create.item_vault": "物品保险库", "block.create.jungle_window": "丛林木窗户", "block.create.jungle_window_pane": "丛林木窗户板", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "大齿轮", "block.create.layered_andesite": "层叠安山岩", "block.create.layered_asurine": "层叠皓蓝石", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "皓蓝石小砖块楼梯", "block.create.small_asurine_brick_wall": "皓蓝石小砖块墙", "block.create.small_asurine_bricks": "皓蓝石小砖块", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "方解石小砖块台阶", "block.create.small_calcite_brick_stairs": "方解石小砖块楼梯", "block.create.small_calcite_brick_wall": "方解石小砖块墙", @@ -481,6 +484,8 @@ "block.create.stressometer": "应力表", "block.create.tiled_glass": "十字玻璃窗", "block.create.tiled_glass_pane": "十字玻璃窗户板", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "凝灰岩柱", "block.create.turntable": "转盘", "block.create.veridium": "辉绿矿", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "扩容", "enchantment.create.potato_recovery": "土豆回收", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "装置", "entity.create.crafting_blueprint": "合成蓝图", "entity.create.gantry_contraption": "起重机装置", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "光辉石", "item.create.rose_quartz": "玫瑰石英", "item.create.sand_paper": "砂纸", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "蓝图", "item.create.schematic_and_quill": "蓝图与笔", "item.create.shadow_steel": "暗影钢", @@ -864,9 +871,15 @@ "create.generic.length": "长度", "create.generic.speed": "速度", "create.generic.delay": "延时", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "秒", "create.generic.unit.minutes": "分钟", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "机械手物品溢出", "create.hint.full_deployer": "_机械手_包含_过剩的物品,_需要被_提取。你需要_使用_料斗,__漏斗_或其他方法将溢出释放出来。", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "这是一个实例层", "create.gui.config.overlay3": "点击拖拽你的鼠标", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 184e4e13e..1b0a7f866 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 392", + "_": "Missing Localizations: 456", "_": "->------------------------] Game Elements [------------------------<-", @@ -54,6 +54,7 @@ "block.create.cogwheel": "齒輪", "block.create.content_observer": "物品偵測器", "block.create.controller_rail": "控制鐵軌", + "block.create.controls": "UNLOCALIZED: Controls", "block.create.copper_backtank": "銅製後背包", "block.create.copper_casing": "銅機殼", "block.create.copper_shingle_slab": "UNLOCALIZED: Copper Shingle Slab", @@ -240,6 +241,7 @@ "block.create.item_vault": "UNLOCALIZED: Item Vault", "block.create.jungle_window": "叢林木窗戶", "block.create.jungle_window_pane": "叢林木窗戶片", + "block.create.large_bogey": "UNLOCALIZED: Large Bogey", "block.create.large_cogwheel": "大齒輪", "block.create.layered_andesite": "疊層安山岩", "block.create.layered_asurine": "UNLOCALIZED: Layered Asurine", @@ -421,6 +423,7 @@ "block.create.small_asurine_brick_stairs": "UNLOCALIZED: Small Asurine Brick Stairs", "block.create.small_asurine_brick_wall": "UNLOCALIZED: Small Asurine Brick Wall", "block.create.small_asurine_bricks": "UNLOCALIZED: Small Asurine Bricks", + "block.create.small_bogey": "UNLOCALIZED: Small Bogey", "block.create.small_calcite_brick_slab": "UNLOCALIZED: Small Calcite Brick Slab", "block.create.small_calcite_brick_stairs": "UNLOCALIZED: Small Calcite Brick Stairs", "block.create.small_calcite_brick_wall": "UNLOCALIZED: Small Calcite Brick Wall", @@ -481,6 +484,8 @@ "block.create.stressometer": "動能錶", "block.create.tiled_glass": "十字玻璃窗", "block.create.tiled_glass_pane": "十字玻璃窗戶片", + "block.create.track": "UNLOCALIZED: Track", + "block.create.track_station": "UNLOCALIZED: Track Station", "block.create.tuff_pillar": "UNLOCALIZED: Tuff Pillar", "block.create.turntable": "轉盤", "block.create.veridium": "UNLOCALIZED: Veridium", @@ -539,6 +544,7 @@ "enchantment.create.capacity": "容量", "enchantment.create.potato_recovery": "馬鈴薯恢復", + "entity.create.carriage_contraption": "UNLOCALIZED: Carriage Contraption", "entity.create.contraption": "結構", "entity.create.crafting_blueprint": "合成藍圖", "entity.create.gantry_contraption": "門式結構", @@ -617,6 +623,7 @@ "item.create.refined_radiance": "光輝石", "item.create.rose_quartz": "玫瑰石英", "item.create.sand_paper": "砂紙", + "item.create.schedule": "UNLOCALIZED: Schedule", "item.create.schematic": "藍圖", "item.create.schematic_and_quill": "藍圖與筆", "item.create.shadow_steel": "暗影鋼", @@ -864,9 +871,15 @@ "create.generic.length": "長", "create.generic.speed": "速度", "create.generic.delay": "延時", + "create.generic.duration": "UNLOCALIZED: Duration", + "create.generic.timeUnit": "UNLOCALIZED: Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "秒", "create.generic.unit.minutes": "分", + "create.generic.daytime.hour": "UNLOCALIZED: Hour", + "create.generic.daytime.minute": "UNLOCALIZED: Minute", + "create.generic.daytime.pm": "UNLOCALIZED: pm", + "create.generic.daytime.am": "UNLOCALIZED: am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "度", @@ -1310,6 +1323,60 @@ "create.hint.full_deployer.title": "機械手物品溢出", "create.hint.full_deployer": "_機械手_包含_過剩的物品_需要被_取出._使用漏斗_或其他方法將溢出解決。", + "create.gui.schedule.lmb_edit": "UNLOCALIZED: Left-Click to Edit", + "create.gui.schedule.rmb_remove": "UNLOCALIZED: Right-Click to Remove", + "create.gui.schedule.duplicate": "UNLOCALIZED: Duplicate", + "create.gui.schedule.remove_entry": "UNLOCALIZED: Remove Stop", + "create.gui.schedule.add_entry": "UNLOCALIZED: Add Stop", + "create.gui.schedule.move_up": "UNLOCALIZED: Move up", + "create.gui.schedule.move_down": "UNLOCALIZED: Move down", + "create.gui.schedule.add_condition": "UNLOCALIZED: Add Condition", + "create.gui.schedule.alternative_condition": "UNLOCALIZED: Alternative Condition", + + "create.schedule.destination_type": "UNLOCALIZED: Next Stop:", + "create.schedule.destination.editor": "UNLOCALIZED: Destination Editor", + "create.schedule.destination.filtered": "UNLOCALIZED: Specific Station", + "create.schedule.destination.filtered_matching": "UNLOCALIZED: Station: %1$s", + "create.schedule.destination.filter": "UNLOCALIZED: Station Name", + "create.schedule.destination.filter_2": "UNLOCALIZED: Use * as a text wildcard", + "create.schedule.destination.filter_3": "UNLOCALIZED: Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "UNLOCALIZED: Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "UNLOCALIZED: Nearest Station", + "create.schedule.destination.redstone": "UNLOCALIZED: Station with Redstone Pulse", + "create.schedule.condition_type": "UNLOCALIZED: Continue when:", + "create.schedule.condition.editor": "UNLOCALIZED: Condition Editor", + "create.schedule.condition.delay": "UNLOCALIZED: Scheduled Delay", + "create.schedule.condition.delay_short": "UNLOCALIZED: Wait: %1$s", + "create.schedule.condition.idle": "UNLOCALIZED: Cargo Inactivity", + "create.schedule.condition.idle_short": "UNLOCALIZED: Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "UNLOCALIZED: for %1$s", + "create.schedule.condition.unloaded": "UNLOCALIZED: Chunk Unloaded", + "create.schedule.condition.powered": "UNLOCALIZED: Station Powered", + "create.schedule.condition.time_of_day": "UNLOCALIZED: Time of Day", + "create.schedule.condition.time_of_day.scheduled": "UNLOCALIZED: Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "UNLOCALIZED: %1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "UNLOCALIZED: Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "UNLOCALIZED: +%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "UNLOCALIZED: Train Holds %1$s", + "create.schedule.condition.threshold.greater": "UNLOCALIZED: More than", + "create.schedule.condition.threshold.less": "UNLOCALIZED: Less than", + "create.schedule.condition.threshold.equal": "UNLOCALIZED: Exactly", + "create.schedule.condition.threshold.x_units_of_item": "UNLOCALIZED: %1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "UNLOCALIZED: Matching Content", + "create.schedule.condition.threshold.item_measure": "UNLOCALIZED: Item Measure", + "create.schedule.condition.threshold.items": "UNLOCALIZED: Items", + "create.schedule.condition.threshold.stacks": "UNLOCALIZED: Stacks", + "create.schedule.condition.threshold.buckets": "UNLOCALIZED: Buckets", + "create.schedule.condition.threshold.place_item": "UNLOCALIZED: Reference Item", + "create.schedule.condition.threshold.place_item_2": "UNLOCALIZED: Filters can be used", + "create.schedule.condition.fluid_threshold": "UNLOCALIZED: Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "UNLOCALIZED: Item Cargo Condition", + "create.schedule.loop": "UNLOCALIZED: Loop Forever", + "create.schedule.loop1": "UNLOCALIZED: Schedule starts over", + "create.schedule.loop2": "UNLOCALIZED: when completed", + + "create.train.unnamed": "UNLOCALIZED: Unnamed Train", + "create.gui.config.overlay1": "嗨 :)", "create.gui.config.overlay2": "這是一個實例層", "create.gui.config.overlay3": "點擊拖拽你的滑鼠", diff --git a/src/generated/resources/assets/create/models/item/controls.json b/src/generated/resources/assets/create/models/item/controls.json new file mode 100644 index 000000000..fcea35ce7 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/controls.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/controls/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/schedule.json b/src/generated/resources/assets/create/models/item/schedule.json new file mode 100644 index 000000000..bfdfb4830 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/schedule.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/schedule" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/track.json b/src/generated/resources/assets/create/models/item/track.json new file mode 100644 index 000000000..0d51cfdfc --- /dev/null +++ b/src/generated/resources/assets/create/models/item/track.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "create:item/track" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/track_station.json b/src/generated/resources/assets/create/models/item/track_station.json new file mode 100644 index 000000000..2f68ee80d --- /dev/null +++ b/src/generated/resources/assets/create/models/item/track_station.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/track_station/block" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/controls.json b/src/generated/resources/data/create/loot_tables/blocks/controls.json new file mode 100644 index 000000000..f575fb716 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/controls.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "create:controls" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/large_bogey.json b/src/generated/resources/data/create/loot_tables/blocks/large_bogey.json new file mode 100644 index 000000000..3da3a59b4 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/large_bogey.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:air" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/small_bogey.json b/src/generated/resources/data/create/loot_tables/blocks/small_bogey.json new file mode 100644 index 000000000..3da3a59b4 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/small_bogey.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:air" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/track.json b/src/generated/resources/data/create/loot_tables/blocks/track.json new file mode 100644 index 000000000..7e86fd307 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/track.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "create:track" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/track_station.json b/src/generated/resources/data/create/loot_tables/blocks/track_station.json new file mode 100644 index 000000000..971866fe6 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/track_station.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "create:track_station" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index 4faa45ffa..ce669ef2f 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -96,6 +96,7 @@ "create:flywheel", "create:rotation_speed_controller", "create:mechanical_arm", + "create:track_station", "create:content_observer", "create:stockpile_switch", "create:creative_crate", diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json index 25adc0293..032cbf9b1 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -104,6 +104,8 @@ "create:furnace_engine", "create:rotation_speed_controller", "create:mechanical_arm", + "create:track", + "create:track_station", "create:item_vault", "create:andesite_funnel", "create:andesite_belt_funnel", diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index fb4ea5e54..9552f26d7 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -17,8 +17,7 @@ public class AllBlockPartials { public static final PartialModel - SCHEMATICANNON_CONNECTOR = block("schematicannon/connector"), - SCHEMATICANNON_PIPE = block("schematicannon/pipe"), + SCHEMATICANNON_CONNECTOR = block("schematicannon/connector"), SCHEMATICANNON_PIPE = block("schematicannon/pipe"), SHAFTLESS_COGWHEEL = block("cogwheel_shaftless"), SHAFTLESS_LARGE_COGWHEEL = block("large_cogwheel_shaftless"), COGWHEEL_SHAFT = block("cogwheel_shaft"), SHAFT_HALF = block("shaft_half"), @@ -31,7 +30,8 @@ public class AllBlockPartials { ENCASED_FAN_INNER = block("encased_fan/propeller"), HAND_CRANK_HANDLE = block("hand_crank/handle"), MECHANICAL_PRESS_HEAD = block("mechanical_press/head"), MECHANICAL_MIXER_POLE = block("mechanical_mixer/pole"), - MECHANICAL_MIXER_HEAD = block("mechanical_mixer/head"), MECHANICAL_CRAFTER_LID = block("mechanical_crafter/lid"), + MECHANICAL_MIXER_HEAD = block("mechanical_mixer/head"), + MECHANICAL_CRAFTER_LID = block("mechanical_crafter/lid"), MECHANICAL_CRAFTER_ARROW = block("mechanical_crafter/arrow"), MECHANICAL_CRAFTER_BELT_FRAME = block("mechanical_crafter/belt"), MECHANICAL_CRAFTER_BELT = block("mechanical_crafter/belt_animated"), @@ -45,7 +45,8 @@ public class AllBlockPartials { GAUGE_HEAD_STRESS = block("gauge/stressometer/head"), BEARING_TOP = block("bearing/top"), BEARING_TOP_WOODEN = block("bearing/top_wooden"), DRILL_HEAD = block("mechanical_drill/head"), HARVESTER_BLADE = block("mechanical_harvester/blade"), DEPLOYER_POLE = block("deployer/pole"), - DEPLOYER_HAND_POINTING = block("deployer/hand_pointing"), DEPLOYER_HAND_PUNCHING = block("deployer/hand_punching"), + DEPLOYER_HAND_POINTING = block("deployer/hand_pointing"), + DEPLOYER_HAND_PUNCHING = block("deployer/hand_punching"), DEPLOYER_HAND_HOLDING = block("deployer/hand_holding"), ANALOG_LEVER_HANDLE = block("analog_lever/handle"), ANALOG_LEVER_INDICATOR = block("analog_lever/indicator"), FUNNEL_FLAP = block("funnel/flap"), BELT_FUNNEL_FLAP = block("belt_funnel/flap"), BELT_TUNNEL_FLAP = block("belt_tunnel/flap"), @@ -109,20 +110,43 @@ public class AllBlockPartials { COPPER_BACKTANK_SHAFT = block("copper_backtank/block_shaft_input"), COPPER_BACKTANK_COGS = block("copper_backtank/block_cogs"), + + TRACK_SEGMENT_LEFT = block("track/segment_left"), + TRACK_SEGMENT_RIGHT = block("track/segment_right"), + TRACK_TIE = block("track/tie"), + + TRACK_STATION_OVERLAY = block("track/station_overlay"), + TRACK_STATION_OVERLAY_DIAGONAL = block("track/station_overlay_diagonal"), + TRACK_STATION_OVERLAY_ASCENDING = block("track/station_overlay_ascending"), + TRACK_ASSEMBLY_OVERLAY = block("track/assembly_overlay"), + + BOGEY_FRAME = block("track/bogey/bogey_frame"), + SMALL_BOGEY_WHEELS = block("track/bogey/bogey_wheel"), + BOGEY_PIN = block("track/bogey/bogey_drive_wheel_pin"), + BOGEY_PISTON = block("track/bogey/bogey_drive_piston"), + BOGEY_DRIVE = block("track/bogey/bogey_drive"), + LARGE_BOGEY_WHEELS = block("track/bogey/bogey_drive_wheel"), + + TRAIN_COUPLING_HEAD = block("track/bogey/coupling_head"), + TRAIN_COUPLING_CABLE = block("track/bogey/coupling_cable"), + + TRAIN_CONTROLS_COVER = block("controls/train/cover"), + TRAIN_CONTROLS_LEVER = block("controls/train/lever"), CRAFTING_BLUEPRINT_1x1 = entity("crafting_blueprint_small"), CRAFTING_BLUEPRINT_2x2 = entity("crafting_blueprint_medium"), CRAFTING_BLUEPRINT_3x3 = entity("crafting_blueprint_large"), - - COUPLING_ATTACHMENT = entity("minecart_coupling/attachment"), - COUPLING_RING = entity("minecart_coupling/ring"), + + COUPLING_ATTACHMENT = entity("minecart_coupling/attachment"), COUPLING_RING = entity("minecart_coupling/ring"), COUPLING_CONNECTOR = entity("minecart_coupling/connector") ; public static final Map> PIPE_ATTACHMENTS = new EnumMap<>(FluidTransportBehaviour.AttachmentTypes.class); - public static final Map BLAZES = new EnumMap<>(BlazeBurnerBlock.HeatLevel.class); + + public static final Map BLAZES = + new EnumMap<>(BlazeBurnerBlock.HeatLevel.class); public static final Map TOOLBOX_LIDS = new EnumMap<>(DyeColor.class); static { diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 60f0bb6fc..c98f3da1e 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -58,6 +58,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.cha import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.ControlsBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.ControlsMovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.MinecartAnchorBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlockItem; @@ -161,6 +163,13 @@ import com.simibubi.create.content.logistics.block.vault.ItemVaultBlock; import com.simibubi.create.content.logistics.block.vault.ItemVaultCTBehaviour; import com.simibubi.create.content.logistics.block.vault.ItemVaultItem; import com.simibubi.create.content.logistics.item.LecternControllerBlock; +import com.simibubi.create.content.logistics.trains.IBogeyBlock; +import com.simibubi.create.content.logistics.trains.management.StationBlock; +import com.simibubi.create.content.logistics.trains.management.TrackTargetingBlockItem; +import com.simibubi.create.content.logistics.trains.track.StandardBogeyBlock; +import com.simibubi.create.content.logistics.trains.track.TrackBlock; +import com.simibubi.create.content.logistics.trains.track.TrackBlockItem; +import com.simibubi.create.content.logistics.trains.track.TrackBlockStateGenerator; import com.simibubi.create.content.schematics.block.SchematicTableBlock; import com.simibubi.create.content.schematics.block.SchematicannonBlock; import com.simibubi.create.foundation.block.BlockStressDefaults; @@ -304,14 +313,14 @@ public class AllBlocks { .transform(axeOrPickaxe()) .register(); - public static final BlockEntry ANDESITE_ENCASED_COGWHEEL = - REGISTRATE.block("andesite_encased_cogwheel", p -> EncasedCogwheelBlock.andesite(false, p)) - .transform(BuilderTransformers.encasedCogwheel("andesite", () -> AllSpriteShifts.ANDESITE_CASING)) - .onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCogCTBehaviour(AllSpriteShifts.ANDESITE_CASING, - Couple.create(AllSpriteShifts.ANDESITE_ENCASED_COGWHEEL_SIDE, - AllSpriteShifts.ANDESITE_ENCASED_COGWHEEL_OTHERSIDE)))) - .transform(axeOrPickaxe()) - .register(); + public static final BlockEntry ANDESITE_ENCASED_COGWHEEL = REGISTRATE + .block("andesite_encased_cogwheel", p -> EncasedCogwheelBlock.andesite(false, p)) + .transform(BuilderTransformers.encasedCogwheel("andesite", () -> AllSpriteShifts.ANDESITE_CASING)) + .onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCogCTBehaviour(AllSpriteShifts.ANDESITE_CASING, + Couple.create(AllSpriteShifts.ANDESITE_ENCASED_COGWHEEL_SIDE, + AllSpriteShifts.ANDESITE_ENCASED_COGWHEEL_OTHERSIDE)))) + .transform(axeOrPickaxe()) + .register(); public static final BlockEntry BRASS_ENCASED_COGWHEEL = REGISTRATE.block("brass_encased_cogwheel", p -> EncasedCogwheelBlock.brass(false, p)) @@ -1247,6 +1256,53 @@ public class AllBlocks { .transform(customItemModel()) .register(); + public static final BlockEntry TRACK = REGISTRATE.block("track", TrackBlock::new) + .initialProperties(() -> Blocks.RAIL) + .addLayer(() -> RenderType::cutoutMipped) + .transform(pickaxeOnly()) + .blockstate(new TrackBlockStateGenerator()::generate) + .item(TrackBlockItem::new) + .model((c, p) -> p.generated(c, Create.asResource("item/" + c.getName()))) + .build() + .register(); + + public static final BlockEntry TRACK_STATION = REGISTRATE.block("track_station", StationBlock::new) + .initialProperties(SharedProperties::wooden) + .transform(axeOrPickaxe()) + .blockstate((c, p) -> p.horizontalBlock(c.get(), + s -> s.getValue(StationBlock.ASSEMBLING) ? AssetLookup.partialBaseModel(c, p, "assembling") + : AssetLookup.partialBaseModel(c, p))) + .item(TrackTargetingBlockItem::new) + .transform(customItemModel("_", "block")) + .register(); + + public static final BlockEntry SMALL_BOGEY = + REGISTRATE.block("small_bogey", p -> new StandardBogeyBlock(p, false)) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.noOcclusion()) + .blockstate((c, p) -> BlockStateGen.horizontalAxisBlock(c, p, s -> p.models() + .getExistingFile(p.modLoc("block/track/bogey/top")))) + .onRegister(b -> IBogeyBlock.register(b.getRegistryName())) + .register(); + + public static final BlockEntry LARGE_BOGEY = + REGISTRATE.block("large_bogey", p -> new StandardBogeyBlock(p, true)) + .initialProperties(SharedProperties::softMetal) + .properties(p -> p.noOcclusion()) + .blockstate((c, p) -> BlockStateGen.horizontalAxisBlock(c, p, s -> p.models() + .getExistingFile(p.modLoc("block/track/bogey/top")))) + .onRegister(b -> IBogeyBlock.register(b.getRegistryName())) + .register(); + + public static final BlockEntry CONTROLS = REGISTRATE.block("controls", ControlsBlock::new) + .initialProperties(SharedProperties::softMetal) + .blockstate((c, p) -> p.horizontalBlock(c.get(), + s -> AssetLookup.partialBaseModel(c, p, s.getValue(ControlsBlock.OPEN) ? "open" : "closed"))) + .onRegister(addMovementBehaviour(new ControlsMovementBehaviour())) + .item() + .transform(customItemModel()) + .register(); + public static final BlockEntry ITEM_VAULT = REGISTRATE.block("item_vault", ItemVaultBlock::new) .initialProperties(SharedProperties::softMetal) .properties(p -> p.sound(SoundType.NETHERITE_BLOCK) diff --git a/src/main/java/com/simibubi/create/AllContainerTypes.java b/src/main/java/com/simibubi/create/AllContainerTypes.java index 47a866b56..7477bfcae 100644 --- a/src/main/java/com/simibubi/create/AllContainerTypes.java +++ b/src/main/java/com/simibubi/create/AllContainerTypes.java @@ -10,6 +10,8 @@ import com.simibubi.create.content.logistics.item.filter.AttributeFilterContaine import com.simibubi.create.content.logistics.item.filter.AttributeFilterScreen; import com.simibubi.create.content.logistics.item.filter.FilterContainer; import com.simibubi.create.content.logistics.item.filter.FilterScreen; +import com.simibubi.create.content.logistics.trains.management.ScheduleContainer; +import com.simibubi.create.content.logistics.trains.management.ScheduleScreen; import com.simibubi.create.content.schematics.block.SchematicTableContainer; import com.simibubi.create.content.schematics.block.SchematicTableScreen; import com.simibubi.create.content.schematics.block.SchematicannonContainer; @@ -45,6 +47,9 @@ public class AllContainerTypes { public static final MenuEntry TOOLBOX = register("toolbox", ToolboxContainer::new, () -> ToolboxScreen::new); + + public static final MenuEntry SCHEDULE = + register("schedule", ScheduleContainer::new, () -> ScheduleScreen::new); private static > MenuEntry register( String name, ForgeMenuFactory factory, NonNullSupplier> screenFactory) { diff --git a/src/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index 85e64ed4e..825acef8d 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -14,6 +14,8 @@ import com.simibubi.create.content.curiosities.tools.BlueprintEntity; import com.simibubi.create.content.curiosities.tools.BlueprintRenderer; import com.simibubi.create.content.curiosities.weapons.PotatoProjectileEntity; import com.simibubi.create.content.curiosities.weapons.PotatoProjectileRenderer; +import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity; +import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntityRenderer; import com.simibubi.create.foundation.data.CreateEntityBuilder; import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.util.entry.EntityEntry; @@ -37,6 +39,9 @@ public class AllEntityTypes { 20, 40, false); public static final EntityEntry GANTRY_CONTRAPTION = contraption("gantry_contraption", GantryContraptionEntity::new, () -> ContraptionEntityRenderer::new, 10, 40, false); + public static final EntityEntry CARRIAGE_CONTRAPTION = + contraption("carriage_contraption", CarriageContraptionEntity::new, + () -> CarriageContraptionEntityRenderer::new, 5, 100, true); public static final EntityEntry SUPER_GLUE = register("super_glue", SuperGlueEntity::new, () -> SuperGlueRenderer::new, MobCategory.MISC, 10, @@ -44,8 +49,8 @@ public class AllEntityTypes { .register(); public static final EntityEntry CRAFTING_BLUEPRINT = - register("crafting_blueprint", BlueprintEntity::new, () -> BlueprintRenderer::new, MobCategory.MISC, - 10, Integer.MAX_VALUE, false, true, BlueprintEntity::build).register(); + register("crafting_blueprint", BlueprintEntity::new, () -> BlueprintRenderer::new, MobCategory.MISC, 10, + Integer.MAX_VALUE, false, true, BlueprintEntity::build).register(); public static final EntityEntry POTATO_PROJECTILE = register("potato_projectile", PotatoProjectileEntity::new, () -> PotatoProjectileRenderer::new, @@ -57,16 +62,16 @@ public class AllEntityTypes { // private static EntityEntry contraption(String name, EntityFactory factory, - NonNullSupplier>> renderer, - int range, int updateFrequency, boolean sendVelocity) { + NonNullSupplier>> renderer, int range, + int updateFrequency, boolean sendVelocity) { return register(name, factory, renderer, MobCategory.MISC, range, updateFrequency, sendVelocity, true, AbstractContraptionEntity::build).register(); } private static CreateEntityBuilder register(String name, EntityFactory factory, - NonNullSupplier>> renderer, - MobCategory group, int range, int updateFrequency, boolean sendVelocity, boolean immuneToFire, - NonNullConsumer> propertyBuilder) { + NonNullSupplier>> renderer, + MobCategory group, int range, int updateFrequency, boolean sendVelocity, boolean immuneToFire, + NonNullConsumer> propertyBuilder) { String id = Lang.asId(name); return (CreateEntityBuilder) Create.registrate() .entity(id, factory, group) diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 255cb1a9a..b4fa5e2d3 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -41,6 +41,7 @@ import com.simibubi.create.content.curiosities.weapons.PotatoCannonItem; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperItem; import com.simibubi.create.content.logistics.item.LinkedControllerItem; import com.simibubi.create.content.logistics.item.filter.FilterItem; +import com.simibubi.create.content.logistics.trains.management.ScheduleItem; import com.simibubi.create.content.schematics.item.SchematicAndQuillItem; import com.simibubi.create.content.schematics.item.SchematicItem; import com.simibubi.create.foundation.data.AssetLookup; @@ -327,6 +328,9 @@ public class AllItems { .model(AssetLookup.existingItemModel()) .register(); + public static final ItemEntry SCHEDULE = REGISTRATE.item("schedule", ScheduleItem::new) + .register(); + // Schematics static { diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 3853559d8..0db46167d 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -29,6 +29,7 @@ public class AllShapes { CASING_12PX = shape(0, 0, 0, 16, 12, 16).forDirectional(), CASING_11PX = shape(0, 0, 0, 16, 11, 16).forDirectional(), MOTOR_BLOCK = shape(3, 0, 3, 13, 14, 13).forDirectional(), + TRACK = shape(0, 0, 0, 16, 4, 16).forDirectional(), FOUR_VOXEL_POLE = shape(6, 0, 6, 10, 16, 10).forAxis(), SIX_VOXEL_POLE = shape(5, 0, 5, 11, 16, 11).forAxis(), EIGHT_VOXEL_POLE = shape(4, 0, 4, 12, 16, 12).forAxis(), FURNACE_ENGINE = shape(1, 1, 0, 15, 15, 16).add(0, 0, 9, 16, 16, 14) @@ -118,7 +119,12 @@ public class AllShapes { BELL_DOUBLE_WALL = shape(5, 5, 0, 11, 11, 16).add(3, 1, 3, 13, 13, 13) .forHorizontal(SOUTH), BELL_CEILING = shape(0, 5, 5, 16, 16, 11).add(3, 1, 3, 13, 13, 13) - .forHorizontal(SOUTH) + .forHorizontal(SOUTH), + + STATION = shape(0, 0, 0, 16, 5, 16).add(2, 4, 0, 14, 16, 4) + .forHorizontal(NORTH), + CONTROLS = shape(0, 0, 4, 16, 8, 16).add(0, 0, 6, 16, 14, 16) + .forHorizontal(NORTH) ; diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index cfc775bb3..9e1dc3d54 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -167,6 +167,12 @@ import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileE import com.simibubi.create.content.logistics.block.vault.ItemVaultTileEntity; import com.simibubi.create.content.logistics.item.LecternControllerRenderer; import com.simibubi.create.content.logistics.item.LecternControllerTileEntity; +import com.simibubi.create.content.logistics.trains.IBogeyTileEntityRenderer; +import com.simibubi.create.content.logistics.trains.management.StationRenderer; +import com.simibubi.create.content.logistics.trains.management.StationTileEntity; +import com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity; +import com.simibubi.create.content.logistics.trains.track.TrackRenderer; +import com.simibubi.create.content.logistics.trains.track.TrackTileEntity; import com.simibubi.create.content.schematics.block.SchematicTableTileEntity; import com.simibubi.create.content.schematics.block.SchematicannonInstance; import com.simibubi.create.content.schematics.block.SchematicannonRenderer; @@ -722,5 +728,23 @@ public class AllTileEntities { .renderer(() -> ToolboxRenderer::new) .register(); + public static final BlockEntityEntry TRACK = Create.registrate() + .tileEntity("track", TrackTileEntity::new) + .renderer(() -> TrackRenderer::new) + .validBlocks(AllBlocks.TRACK) + .register(); + + public static final BlockEntityEntry BOGEY = Create.registrate() + .tileEntity("bogey", StandardBogeyTileEntity::new) + .renderer(() -> IBogeyTileEntityRenderer::new) + .validBlocks(AllBlocks.SMALL_BOGEY, AllBlocks.LARGE_BOGEY) + .register(); + + public static final BlockEntityEntry TRACK_STATION = Create.registrate() + .tileEntity("track_station", StationTileEntity::new) + .renderer(() -> StationRenderer::new) + .validBlocks(AllBlocks.TRACK_STATION) + .register(); + public static void register() {} } diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 5aa61c54c..16eef1566 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.contraptions.TorquePropagator; import com.simibubi.create.content.contraptions.components.flywheel.engine.FurnaceEngineInteractions; import com.simibubi.create.content.curiosities.weapons.BuiltinPotatoProjectileTypes; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler; +import com.simibubi.create.content.logistics.trains.GlobalRailwayManager; import com.simibubi.create.content.palettes.AllPaletteBlocks; import com.simibubi.create.content.palettes.PalettesItemGroup; import com.simibubi.create.content.schematics.SchematicProcessor; @@ -71,6 +72,7 @@ public class Create { public static final ServerSchematicLoader SCHEMATIC_RECEIVER = new ServerSchematicLoader(); public static final RedstoneLinkNetworkHandler REDSTONE_LINK_NETWORK_HANDLER = new RedstoneLinkNetworkHandler(); public static final TorquePropagator TORQUE_PROPAGATOR = new TorquePropagator(); + public static final GlobalRailwayManager RAILWAYS = new GlobalRailwayManager(); public static final ServerLagger LAGGER = new ServerLagger(); public static final Random RANDOM = new Random(); @@ -115,8 +117,7 @@ public class Create { modEventBus.addGenericListener(ParticleType.class, AllParticleTypes::register); modEventBus.addGenericListener(SoundEvent.class, AllSoundEvents::register); - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, - () -> () -> CreateClient.onCtorClient(modEventBus, forgeEventBus)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.onCtorClient(modEventBus, forgeEventBus)); } public static void init(final FMLCommonSetupEvent event) { diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 235db054c..b0e466564 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.curiosities.tools.BlueprintOverlayRenderer; import com.simibubi.create.content.curiosities.weapons.PotatoCannonRenderHandler; import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler; import com.simibubi.create.content.logistics.item.LinkedControllerClientHandler; +import com.simibubi.create.content.logistics.trains.GlobalRailwayManager; import com.simibubi.create.content.schematics.ClientSchematicLoader; import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler; import com.simibubi.create.content.schematics.client.SchematicHandler; @@ -57,6 +58,7 @@ public class CreateClient { public static final ZapperRenderHandler ZAPPER_RENDER_HANDLER = new ZapperRenderHandler(); public static final PotatoCannonRenderHandler POTATO_CANNON_RENDER_HANDLER = new PotatoCannonRenderHandler(); public static final SoulPulseEffectHandler SOUL_PULSE_EFFECT_HANDLER = new SoulPulseEffectHandler(); + public static final GlobalRailwayManager RAILWAYS = new GlobalRailwayManager(); public static final ClientResourceReloadListener RESOURCE_RELOAD_LISTENER = new ClientResourceReloadListener(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java index 2ce17d1e2..25663a20a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java @@ -73,6 +73,10 @@ public class AssemblyException extends Exception { public static AssemblyException noPistonPoles() { return new AssemblyException("noPistonPoles"); } + + public static AssemblyException invalidBogeyCount() { + return new AssemblyException("invalidBogeyCount"); + } public static AssemblyException notEnoughSails(int sails) { return new AssemblyException("not_enough_sails", sails, AllConfigs.SERVER.kinetics.minimumWindmillSails.get()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java index eee909ddb..6a7811788 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java @@ -32,6 +32,7 @@ import com.simibubi.create.content.contraptions.fluids.tank.FluidTankConnectivit import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock; import com.simibubi.create.content.logistics.block.vault.ItemVaultBlock; import com.simibubi.create.content.logistics.block.vault.ItemVaultConnectivityHandler; +import com.simibubi.create.content.logistics.trains.IBogeyBlock; import com.simibubi.create.foundation.config.ContraptionMovementSetting; import net.minecraft.core.BlockPos; @@ -340,6 +341,9 @@ public class BlockMovementChecks { return direction == state.getValue(StickerBlock.FACING) && !isNotSupportive(world.getBlockState(pos.relative(direction)), direction.getOpposite()); } + if (block instanceof IBogeyBlock bogey) + return bogey.getStickySurfaces(world, pos, state) + .contains(direction); return false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 088ee19de..080b4b266 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -41,6 +41,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.cha import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageBlock; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueHandler; +import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.ControlsBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonHeadBlock; @@ -56,6 +57,7 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.logistics.block.inventories.CreativeCrateTileEntity; import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock; import com.simibubi.create.content.logistics.block.vault.ItemVaultTileEntity; +import com.simibubi.create.content.logistics.trains.IBogeyBlock; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.tileEntity.IMultiTileContainer; @@ -345,6 +347,12 @@ public abstract class Contraption { frontier.add(attached); } + // Bogeys tend to have sticky sides + if (state.getBlock() instanceof IBogeyBlock bogey) + for (Direction d : bogey.getStickySurfaces(world, pos, state)) + if (!visited.contains(pos.relative(d))) + frontier.add(pos.relative(d)); + // Bearings potentially create stabilized sub-contraptions if (AllBlocks.MECHANICAL_BEARING.has(state)) moveBearing(pos, frontier, visited, state); @@ -603,6 +611,8 @@ public abstract class Contraption { BlockState blockstate = world.getBlockState(pos); if (AllBlocks.REDSTONE_CONTACT.has(blockstate)) blockstate = blockstate.setValue(RedstoneContactBlock.POWERED, true); + if (AllBlocks.CONTROLS.has(blockstate)) + blockstate = blockstate.setValue(ControlsBlock.OPEN, true); if (blockstate.getBlock() instanceof ButtonBlock) { blockstate = blockstate.setValue(ButtonBlock.POWERED, false); world.scheduleTick(pos, blockstate.getBlock(), -1); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionType.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionType.java index 5ddf9e9bf..4b5d8fcd0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionType.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionType.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.gan import com.simibubi.create.content.contraptions.components.structureMovement.mounted.MountedContraption; import com.simibubi.create.content.contraptions.components.structureMovement.piston.PistonContraption; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyContraption; +import com.simibubi.create.content.logistics.trains.entity.CarriageContraption; public class ContraptionType { @@ -23,7 +24,8 @@ public class ContraptionType { CLOCKWORK = register("clockwork", ClockworkContraption::new), MOUNTED = register("mounted", MountedContraption::new), STABILIZED = register("stabilized", StabilizedContraption::new), - GANTRY = register("gantry", GantryContraption::new); + GANTRY = register("gantry", GantryContraption::new), + CARRIAGE = register("carriage", CarriageContraption::new); Supplier factory; String id; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsBlock.java new file mode 100644 index 000000000..6a2783d44 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsBlock.java @@ -0,0 +1,58 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls; + +import com.simibubi.create.AllShapes; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionWorld; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class ControlsBlock extends HorizontalDirectionalBlock { + + public static final BooleanProperty OPEN = BooleanProperty.create("open"); + + public ControlsBlock(Properties p_54120_) { + super(p_54120_); + registerDefaultState(defaultBlockState().setValue(OPEN, false)); + } + + @Override + protected void createBlockStateDefinition(Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(FACING, OPEN)); + } + + @Override + public BlockState updateShape(BlockState pState, Direction pDirection, BlockState pNeighborState, + LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pNeighborPos) { + return pState.setValue(OPEN, pLevel instanceof ContraptionWorld); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + BlockState state = super.getStateForPlacement(pContext); + Direction horizontalDirection = pContext.getHorizontalDirection(); + Player player = pContext.getPlayer(); + + state = state.setValue(FACING, horizontalDirection.getOpposite()); + if (player != null && player.isSteppingCarefully()) + state = state.setValue(FACING, horizontalDirection); + + return state; + } + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return AllShapes.CONTROLS.get(pState.getValue(FACING)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsMovementBehaviour.java new file mode 100644 index 000000000..8b5f9eede --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsMovementBehaviour.java @@ -0,0 +1,21 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls; + +import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class ControlsMovementBehaviour extends MovementBehaviour { + + @Override + @OnlyIn(Dist.CLIENT) + public void renderInContraption(MovementContext context, VirtualRenderWorld renderWorld, + ContraptionMatrices matrices, MultiBufferSource buffer) { + ControlsRenderer.render(context, renderWorld, matrices, buffer); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java new file mode 100644 index 000000000..c1906fe2f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/ControlsRenderer.java @@ -0,0 +1,47 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls; + +import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.state.BlockState; + +public class ControlsRenderer { + + public static void render(MovementContext context, VirtualRenderWorld renderWorld, ContraptionMatrices matrices, + MultiBufferSource buffer) { + BlockState state = context.state; + Direction facing = state.getValue(ControlsBlock.FACING); + + SuperByteBuffer cover = CachedBufferer.partial(AllBlockPartials.TRAIN_CONTROLS_COVER, state); + float hAngle = 180 + AngleHelper.horizontalAngle(facing); + cover.transform(matrices.getModel()) + .centre() + .rotateY(hAngle) + .unCentre() + .light(matrices.getWorld(), ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld)) + .renderInto(matrices.getViewProjection(), buffer.getBuffer(RenderType.solid())); + + for (boolean first : Iterate.trueAndFalse) { + SuperByteBuffer lever = CachedBufferer.partial(AllBlockPartials.TRAIN_CONTROLS_LEVER, state); + lever.transform(matrices.getModel()) + .centre() + .rotateY(hAngle) + .unCentre() + .translate(first ? 0 : 6 / 16f, 0, 0) + .light(matrices.getWorld(), ContraptionRenderDispatcher.getContraptionWorldLight(context, renderWorld)) + .renderInto(matrices.getViewProjection(), buffer.getBuffer(RenderType.solid())); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java b/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java new file mode 100644 index 000000000..f030c5182 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java @@ -0,0 +1,253 @@ +package com.simibubi.create.content.logistics.trains; + +import com.jozufozu.flywheel.repack.joml.Math; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; + +public class BezierConnection { + + public Couple tePositions; + public Couple trackEnds; + public Couple starts; + public Couple axes; + public Couple normals; + public boolean primary; + + // runtime + + Vec3 finish1; + Vec3 finish2; + private boolean resolved; + private double length; + private float[] stepLUT; + private int segments; + + private double radius; + private double handleLength; + + public BezierConnection(Couple positions, Couple starts, Couple axes, Couple normals, + Couple targets, boolean primary) { + tePositions = positions; + this.starts = starts; + this.axes = axes; + this.normals = normals; + this.trackEnds = targets; + this.primary = primary; + resolved = false; + } + + public BezierConnection secondary() { + return new BezierConnection(tePositions.swap(), starts.swap(), axes.swap(), normals.swap(), trackEnds.swap(), + false); + } + + public BezierConnection(CompoundTag compound) { + this(Couple.deserializeEach(compound.getList("Positions", Tag.TAG_COMPOUND), NbtUtils::readBlockPos), + Couple.deserializeEach(compound.getList("Starts", Tag.TAG_COMPOUND), VecHelper::readNBTCompound), + Couple.deserializeEach(compound.getList("Axes", Tag.TAG_COMPOUND), VecHelper::readNBTCompound), + Couple.deserializeEach(compound.getList("Normals", Tag.TAG_COMPOUND), VecHelper::readNBTCompound), + Couple.create(compound.getBoolean("TrackEnd1"), compound.getBoolean("TrackEnd2")), + compound.getBoolean("Primary")); + } + + public CompoundTag write() { + CompoundTag compound = new CompoundTag(); + compound.putBoolean("Primary", primary); + compound.putBoolean("TrackEnd1", trackEnds.getFirst()); + compound.putBoolean("TrackEnd2", trackEnds.getSecond()); + compound.put("Positions", tePositions.serializeEach(NbtUtils::writeBlockPos)); + compound.put("Starts", starts.serializeEach(VecHelper::writeNBTCompound)); + compound.put("Axes", axes.serializeEach(VecHelper::writeNBTCompound)); + compound.put("Normals", normals.serializeEach(VecHelper::writeNBTCompound)); + return compound; + } + + public BezierConnection(FriendlyByteBuf buffer) { + this(Couple.create(buffer::readBlockPos), Couple.create(() -> VecHelper.read(buffer)), + Couple.create(() -> VecHelper.read(buffer)), Couple.create(() -> VecHelper.read(buffer)), + Couple.create(buffer::readBoolean), buffer.readBoolean()); + } + + public void write(FriendlyByteBuf buffer) { + tePositions.forEach(buffer::writeBlockPos); + starts.forEach(v -> VecHelper.write(v, buffer)); + axes.forEach(v -> VecHelper.write(v, buffer)); + normals.forEach(v -> VecHelper.write(v, buffer)); + trackEnds.forEach(buffer::writeBoolean); + buffer.writeBoolean(primary); + } + + public BlockPos getKey() { + return tePositions.getSecond(); + } + + public boolean isPrimary() { + return primary; + } + + // Runtime information + + public double getLength() { + resolve(); + return length; + } + + public float[] getStepLUT() { + resolve(); + return stepLUT; + } + + public int getSegmentCount() { + resolve(); + return segments; + } + + public Vec3 getPosition(double t) { + resolve(); + return VecHelper.bezier(starts.getFirst(), starts.getSecond(), finish1, finish2, (float) t); + } + + public double getRadius() { + resolve(); + return radius; + } + + public double getHandleLength() { + resolve(); + return handleLength; + } + + public double incrementT(double currentT, double distance) { + resolve(); + double dx = + VecHelper.bezierDerivative(starts.getFirst(), starts.getSecond(), finish1, finish2, (float) currentT) + .length() / getLength(); + return currentT + distance / dx; + + } + + public Vec3 getNormal(double t) { + resolve(); + Vec3 end1 = starts.getFirst(); + Vec3 end2 = starts.getSecond(); + Vec3 fn1 = normals.getFirst(); + Vec3 fn2 = normals.getSecond(); + + Vec3 derivative = VecHelper.bezierDerivative(end1, end2, finish1, finish2, (float) t) + .normalize(); + Vec3 faceNormal = fn1.equals(fn2) ? fn1 : VecHelper.slerp((float) t, fn1, fn2); + Vec3 normal = faceNormal.cross(derivative) + .normalize(); + return derivative.cross(normal); + } + + private void resolve() { + if (resolved) + return; + resolved = true; + + Vec3 end1 = starts.getFirst(); + Vec3 end2 = starts.getSecond(); + Vec3 axis1 = axes.getFirst() + .normalize(); + Vec3 axis2 = axes.getSecond() + .normalize(); + + determineHandles(end1, end2, axis1, axis2); + + finish1 = axis1.scale(handleLength) + .add(end1); + finish2 = axis2.scale(handleLength) + .add(end2); + + int scanCount = 16; + length = 0; + + { + Vec3 previous = end1; + for (int i = 0; i <= scanCount; i++) { + float t = i / (float) scanCount; + Vec3 result = VecHelper.bezier(end1, end2, finish1, finish2, t); + if (previous != null) + length += result.distanceTo(previous); + previous = result; + } + } + + segments = (int) (length * 2); + stepLUT = new float[segments + 1]; + stepLUT[0] = 1; + float combinedDistance = 0; + + // determine step lut + { + Vec3 previous = end1; + for (int i = 0; i <= segments; i++) { + float t = i / (float) segments; + Vec3 result = VecHelper.bezier(end1, end2, finish1, finish2, t); + if (i > 0) { + combinedDistance += result.distanceTo(previous) / length; + stepLUT[i] = (float) (t / combinedDistance); + } + previous = result; + } + } + } + + private void determineHandles(Vec3 end1, Vec3 end2, Vec3 axis1, Vec3 axis2) { + Vec3 cross1 = axis1.cross(new Vec3(0, 1, 0)); + Vec3 cross2 = axis2.cross(new Vec3(0, 1, 0)); + + radius = 0; + double a1 = Mth.atan2(-axis2.z, -axis2.x); + double a2 = Mth.atan2(axis1.z, axis1.x); + double angle = a1 - a2; + + float circle = 2 * Mth.PI; + angle = (angle + circle) % circle; + if (Math.abs(circle - angle) < Math.abs(angle)) + angle = circle - angle; + + if (Mth.equal(angle, 0)) { + double[] intersect = VecHelper.intersect(end1, end2, axis1, cross2, Axis.Y); + if (intersect != null) { + double t = Math.abs(intersect[0]); + double u = Math.abs(intersect[1]); + double min = Math.min(t, u); + double max = Math.max(t, u); + + if (min > 1.2 && max / min > 1 && max / min < 3) { + handleLength = (max - min); + return; + } + } + + handleLength = end2.distanceTo(end1) / 3; + return; + } + + double n = circle / angle; + double factor = 4 / 3d * Math.tan(Math.PI / (2 * n)); + double[] intersect = VecHelper.intersect(end1, end2, cross1, cross2, Axis.Y); + + if (intersect == null) { + handleLength = end2.distanceTo(end1) / 3; + return; + } + + radius = Math.abs(intersect[1]); + handleLength = radius * factor; + if (Mth.equal(handleLength, 0)) + handleLength = 1; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/GlobalRailwayManager.java b/src/main/java/com/simibubi/create/content/logistics/trains/GlobalRailwayManager.java new file mode 100644 index 000000000..35a34d402 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/GlobalRailwayManager.java @@ -0,0 +1,134 @@ +package com.simibubi.create.content.logistics.trains; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import javax.annotation.Nullable; + +import com.simibubi.create.content.contraptions.KineticDebugger; +import com.simibubi.create.content.logistics.trains.entity.Carriage; +import com.simibubi.create.content.logistics.trains.entity.Train; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.dimension.DimensionType; + +public class GlobalRailwayManager { + + public Map trackNetworks; + private TrackSavedData trackData; + + public Map trains; + public Map carriageById; + + public TrackGraphSync sync; + + // + + public GlobalRailwayManager() { + cleanUp(); + } + + public void playerLogin(Player player) { + if (player instanceof ServerPlayer serverPlayer) { + loadTrackData(serverPlayer.getServer()); + trackNetworks.values() + .forEach(g -> sync.sendFullGraphTo(g, serverPlayer)); + } + } + + public void levelLoaded(LevelAccessor level) { + MinecraftServer server = level.getServer(); + if (server == null || server.overworld() != level) + return; + cleanUp(); + trackData = null; + loadTrackData(server); + } + + private void loadTrackData(MinecraftServer server) { + if (trackData != null) + return; + trackData = TrackSavedData.load(server); + trackNetworks = trackData.getTrackNetworks(); + } + + public void levelUnloaded(LevelAccessor level) { +// MinecraftServer server = level.getServer(); +// if (server == null || server.overworld() != level) +// return; +// cleanUp(); + } + + public void cleanUp() { + trackNetworks = new HashMap<>(); + trains = new HashMap<>(); + carriageById = new HashMap<>(); + sync = new TrackGraphSync(); + } + + public void markTracksDirty() { + if (trackData != null) + trackData.setDirty(); + } + + // + + public TrackGraph getOrCreateGraph(UUID graphID) { + return trackNetworks.computeIfAbsent(graphID, uid -> new TrackGraph(graphID)); + } + + public void putGraph(TrackGraph graph) { + trackNetworks.put(graph.id, graph); + markTracksDirty(); + } + + public void removeGraph(TrackGraph railGraph) { + trackNetworks.remove(railGraph.id); + markTracksDirty(); + } + + public void updateSplitGraph(TrackGraph graph) { + Set disconnected = graph.findDisconnectedGraphs(null); + disconnected.forEach(this::putGraph); + if (!disconnected.isEmpty()) { + sync.graphSplit(graph, disconnected); + markTracksDirty(); + } + } + + @Nullable + public TrackGraph getGraph(LevelAccessor level, TrackNodeLocation vertex) { + if (trackNetworks == null) + return null; + for (TrackGraph railGraph : trackNetworks.values()) + if (railGraph.locateNode(vertex) != null) + return railGraph; + return null; + } + + public void tick(Level level) { + ResourceLocation location2 = DimensionType.OVERWORLD_LOCATION.location(); + ResourceLocation location = level.dimension() + .location(); + if (!location.equals(location2)) + return; + + for (Train train : trains.values()) + train.tick(level); + } + + public void clientTick() { + if (KineticDebugger.isActive()) { + trackNetworks.values() + .forEach(TrackGraph::debugViewNodes); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java new file mode 100644 index 000000000..5663162dc --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java @@ -0,0 +1,80 @@ +package com.simibubi.create.content.logistics.trains; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + +import javax.annotation.Nullable; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.registries.ForgeRegistries; + +public interface IBogeyBlock extends IWrenchable { + + static final List BOGEYS = new ArrayList<>(); + + public static void register(ResourceLocation block) { + BOGEYS.add(block); + } + + public EnumSet getStickySurfaces(BlockGetter world, BlockPos pos, BlockState state); + + public double getWheelPointSpacing(); + + public double getWheelRadius(); + + public boolean allowsSingleBogeyCarriage(); + + public Vec3 getConnectorAnchorOffset(); + + @OnlyIn(Dist.CLIENT) + public void render(@Nullable BlockState state, float wheelAngle, PoseStack ms, float partialTicks, + MultiBufferSource buffers, int light, int overlay); + + public default Direction getBogeyUpDirection() { + return Direction.UP; + } + + public boolean isTrackAxisAlongFirstCoordinate(BlockState state); + + @Nullable + public BlockState getMatchingBogey(Direction upDirection, boolean axisAlongFirst); + + @Override + default BlockState getRotatedBlockState(BlockState state, Direction targetedFace) { + Block block = state.getBlock(); + int indexOf = BOGEYS.indexOf(block.getRegistryName()); + if (indexOf == -1) + return state; + + int index = (indexOf + 1) % BOGEYS.size(); + Direction bogeyUpDirection = getBogeyUpDirection(); + boolean trackAxisAlongFirstCoordinate = isTrackAxisAlongFirstCoordinate(state); + + while (index != indexOf) { + ResourceLocation id = BOGEYS.get(index); + Block newBlock = ForgeRegistries.BLOCKS.getValue(id); + if (newBlock instanceof IBogeyBlock bogey) { + BlockState matchingBogey = bogey.getMatchingBogey(bogeyUpDirection, trackAxisAlongFirstCoordinate); + if (matchingBogey != null) + return matchingBogey; + } + index = (index + 1) % BOGEYS.size(); + } + + return state; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyTileEntityRenderer.java new file mode 100644 index 000000000..df8ccafca --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyTileEntityRenderer.java @@ -0,0 +1,23 @@ +package com.simibubi.create.content.logistics.trains; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class IBogeyTileEntityRenderer extends SafeTileEntityRenderer { + + public IBogeyTileEntityRenderer(BlockEntityRendererProvider.Context context) {} + + @Override + protected void renderSafe(T te, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, + int overlay) { + BlockState blockState = te.getBlockState(); + if (blockState.getBlock()instanceof IBogeyBlock bogey) + bogey.render(blockState, 0, ms, partialTicks, buffer, light, overlay); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/ITrackBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/ITrackBlock.java new file mode 100644 index 000000000..b77733ad0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/ITrackBlock.java @@ -0,0 +1,35 @@ +package com.simibubi.create.content.logistics.trains; + +import com.jozufozu.flywheel.core.PartialModel; +import com.mojang.blaze3d.vertex.PoseStack; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public interface ITrackBlock { + + public Vec3 getUpNormal(BlockGetter world, BlockPos pos, BlockState state); + + public Vec3 getTrackAxis(BlockGetter world, BlockPos pos, BlockState state); + + public Vec3 getCurveStart(BlockGetter world, BlockPos pos, BlockState state, Vec3 axis); + + public BlockState getBogeyAnchor(BlockGetter world, BlockPos pos, BlockState state); // should be on bogey side + + public boolean trackEquals(BlockState state1, BlockState state2); + + @OnlyIn(Dist.CLIENT) + public PartialModel prepareStationOverlay(BlockGetter world, BlockPos pos, BlockState state, + AxisDirection direction, PoseStack transform); + + @OnlyIn(Dist.CLIENT) + public PartialModel prepareAssemblyOverlay(BlockGetter world, BlockPos pos, BlockState state, Direction direction, + PoseStack ms); + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackEdge.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackEdge.java new file mode 100644 index 000000000..b1044d578 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackEdge.java @@ -0,0 +1,70 @@ +package com.simibubi.create.content.logistics.trains; + +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; + +public class TrackEdge { + + BezierConnection turn; + + public TrackEdge(BezierConnection turn) { + this.turn = turn; + } + + public boolean isTurn() { + return turn != null; + } + + public BezierConnection getTurn() { + return turn; + } + + public Vec3 getDirection(TrackNode node1, TrackNode node2, boolean fromFirst) { + return getPosition(node1, node2, fromFirst ? 0.25f : 1) + .subtract(getPosition(node1, node2, fromFirst ? 0 : 0.75f)) + .normalize(); + } + + public double getLength(TrackNode node1, TrackNode node2) { + return isTurn() ? turn.getLength() + : node1.location.getLocation() + .distanceTo(node2.location.getLocation()); + } + + public double incrementT(TrackNode node1, TrackNode node2, double currentT, double distance) { + distance = distance / getLength(node1, node2); + return isTurn() ? turn.incrementT(currentT, distance) : currentT + distance; + } + + public Vec3 getPosition(TrackNode node1, TrackNode node2, double t) { + return isTurn() ? turn.getPosition(Mth.clamp(t, 0, 1)) + : VecHelper.lerp((float) t, node1.location.getLocation(), node2.location.getLocation()); + } + + public Vec3 getNormal(TrackNode node1, TrackNode node2, double t) { + return isTurn() ? turn.getNormal(Mth.clamp(t, 0, 1)) : node1.getNormal(); + } + + public void write(FriendlyByteBuf buffer) { + buffer.writeBoolean(isTurn()); + if (isTurn()) + turn.write(buffer); + } + + public static TrackEdge read(FriendlyByteBuf buffer) { + return new TrackEdge(buffer.readBoolean() ? new BezierConnection(buffer) : null); + } + + public CompoundTag write() { + return isTurn() ? turn.write() : new CompoundTag(); + } + + public static TrackEdge read(CompoundTag tag) { + return new TrackEdge(tag.contains("Positions") ? new BezierConnection(tag) : null); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java new file mode 100644 index 000000000..cf926de65 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraph.java @@ -0,0 +1,375 @@ +package com.simibubi.create.content.logistics.trains; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Random; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.annotation.Nullable; + +import com.simibubi.create.Create; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.logistics.trains.TrackNodeLocation.DiscoveredLocation; +import com.simibubi.create.content.logistics.trains.management.GlobalStation; +import com.simibubi.create.foundation.utility.Color; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; + +public class TrackGraph { + + public static final AtomicInteger netIdGenerator = new AtomicInteger(); + + UUID id; + Color color; + + Map nodes; + Map nodesById; + Map> connectionsByNode; + + Map stations; + + public TrackGraph() { + this(UUID.randomUUID()); + } + + public TrackGraph(UUID graphID) { + id = graphID; + nodes = new HashMap<>(); + nodesById = new HashMap<>(); + connectionsByNode = new IdentityHashMap<>(); + color = Color.rainbowColor(new Random().nextInt()); + stations = new HashMap<>(); + } + + // + + @Nullable + public GlobalStation getStation(UUID id) { + return stations.get(id); + } + + public Collection getStations() { + return stations.values(); + } + + public void removeStation(UUID id) { + stations.remove(id); + markDirty(); + } + + public void addStation(GlobalStation station) { + stations.put(station.id, station); + markDirty(); + } + + // + + public TrackNode locateNode(Vec3 position) { + return locateNode(new TrackNodeLocation(position)); + } + + public TrackNode locateNode(TrackNodeLocation position) { + return nodes.get(position); + } + + public TrackNode getNode(int netId) { + return nodesById.get(netId); + } + + public boolean createNode(DiscoveredLocation location) { + if (!createSpecificNode(location, nextNodeId(), location.normal)) + return false; + Create.RAILWAYS.sync.nodeAdded(this, nodes.get(location)); + markDirty(); + return true; + } + + public boolean createSpecificNode(TrackNodeLocation location, int netId, Vec3 normal) { + return addNode(new TrackNode(location, netId, normal)); + } + + public boolean addNode(TrackNode node) { + if (nodes.putIfAbsent(node.getLocation(), node) != null) + return false; + nodesById.put(node.getNetId(), node); + return true; + } + + public boolean removeNode(TrackNodeLocation location) { + TrackNode removed = nodes.remove(location); + if (removed == null) + return false; + + nodesById.remove(removed.netId); + if (!connectionsByNode.containsKey(removed)) + return true; + + Map connections = connectionsByNode.remove(removed); + for (TrackNode railNode : connections.keySet()) + if (connectionsByNode.containsKey(railNode)) + connectionsByNode.get(railNode) + .remove(removed); + return true; + } + + public static int nextNodeId() { + return netIdGenerator.incrementAndGet(); + } + + public void transferAll(TrackGraph toOther) { + toOther.nodes.putAll(nodes); + toOther.nodesById.putAll(nodesById); + toOther.connectionsByNode.putAll(connectionsByNode); + + nodesById.forEach((id, node) -> Create.RAILWAYS.sync.nodeAdded(toOther, node)); + connectionsByNode.forEach( + (node1, map) -> map.forEach((node2, edge) -> Create.RAILWAYS.sync.edgeAdded(toOther, node1, node2, edge))); + markDirty(); + + nodes.clear(); + nodesById.clear(); + connectionsByNode.clear(); + } + + public Set findDisconnectedGraphs(@Nullable Map preAssignedIds) { + Set dicovered = new HashSet<>(); + Set vertices = new HashSet<>(nodes.keySet()); + List frontier = new ArrayList<>(); + TrackGraph target = null; + + while (!vertices.isEmpty()) { + if (target != null) + dicovered.add(target); + + TrackNodeLocation start = vertices.stream() + .findFirst() + .get(); + frontier.add(start); + vertices.remove(start); + + while (!frontier.isEmpty()) { + TrackNodeLocation current = frontier.remove(0); + TrackNode currentNode = locateNode(current); + + Map connections = getConnectionsFrom(currentNode); + for (TrackNode connected : connections.keySet()) + if (vertices.remove(connected.getLocation())) + frontier.add(connected.getLocation()); + + if (target != null) { + transfer(currentNode, target); + if (preAssignedIds != null && preAssignedIds.containsKey(currentNode.getNetId())) + target.id = preAssignedIds.get(currentNode.getNetId()); + } + } + + frontier.clear(); + target = new TrackGraph(); + } + + return dicovered; + } + + public void transfer(TrackNode node, TrackGraph target) { + target.addNode(node); + + Map connections = getConnectionsFrom(node); + if (!connections.isEmpty()) + target.connectionsByNode.put(node, connections); + + nodes.remove(node.getLocation()); + nodesById.remove(node.getNetId()); + connectionsByNode.remove(node); + } + + public boolean isEmpty() { + return nodes.isEmpty(); + } + + public Map getConnectionsFrom(TrackNode node) { + return connectionsByNode.getOrDefault(node, new HashMap<>()); + } + + public void connectNodes(TrackNodeLocation location, TrackNodeLocation location2, TrackEdge edge) { + TrackNode node1 = nodes.get(location); + TrackNode node2 = nodes.get(location2); + TrackEdge edge2 = new TrackEdge(edge.turn != null ? edge.turn.secondary() : null); + + putConnection(node1, node2, edge); + putConnection(node2, node1, edge2); + + Create.RAILWAYS.sync.edgeAdded(this, node1, node2, edge); + Create.RAILWAYS.sync.edgeAdded(this, node2, node1, edge2); + markDirty(); + } + + public void disconnectNodes(TrackNode node1, TrackNode node2) { + Map map1 = connectionsByNode.get(node1); + Map map2 = connectionsByNode.get(node2); + if (map1 != null) + map1.remove(node2); + if (map2 != null) + map2.remove(node1); + } + + public void putConnection(TrackNode node1, TrackNode node2, TrackEdge edge) { + connectionsByNode.computeIfAbsent(node1, n -> new IdentityHashMap<>()) + .put(node2, edge); + } + + public void markDirty() { + Create.RAILWAYS.markTracksDirty(); + } + + public CompoundTag write() { + CompoundTag tag = new CompoundTag(); + tag.putUUID("Id", id); + tag.putInt("Color", color.getRGB()); + + Map indexTracker = new HashMap<>(); + ListTag nodesList = new ListTag(); + + int i = 0; + for (TrackNode railNode : nodes.values()) { + indexTracker.put(railNode, i); + CompoundTag nodeTag = new CompoundTag(); + nodeTag.put("Location", NbtUtils.writeBlockPos(new BlockPos(railNode.getLocation()))); + nodeTag.put("Normal", VecHelper.writeNBT(railNode.getNormal())); + nodesList.add(nodeTag); + i++; + } + + connectionsByNode.forEach((node1, map) -> { + Integer index1 = indexTracker.get(node1); + if (index1 == null) + return; + CompoundTag nodeTag = (CompoundTag) nodesList.get(index1); + ListTag connectionsList = new ListTag(); + map.forEach((node2, edge) -> { + CompoundTag connectionTag = new CompoundTag(); + Integer index2 = indexTracker.get(node2); + if (index2 == null) + return; + connectionTag.putInt("To", index2); + connectionTag.put("EdgeData", edge.write()); + connectionsList.add(connectionTag); + }); + nodeTag.put("Connections", connectionsList); + }); + + tag.put("Nodes", nodesList); + tag.put("Stations", NBTHelper.writeCompoundList(stations.values(), GlobalStation::write)); + return tag; + } + + public static TrackGraph read(CompoundTag tag) { + TrackGraph graph = new TrackGraph(tag.getUUID("Id")); + graph.color = new Color(tag.getInt("Color")); + + Map indexTracker = new HashMap<>(); + ListTag nodesList = tag.getList("Nodes", Tag.TAG_COMPOUND); + + int i = 0; + for (Tag t : nodesList) { + CompoundTag nodeTag = (CompoundTag) t; + TrackNodeLocation location = + TrackNodeLocation.fromPackedPos(NbtUtils.readBlockPos(nodeTag.getCompound("Location"))); + Vec3 normal = VecHelper.readNBT(nodeTag.getList("Normal", Tag.TAG_DOUBLE)); + graph.createSpecificNode(location, nextNodeId(), normal); + indexTracker.put(i, graph.locateNode(location)); + i++; + } + + i = 0; + for (Tag t : nodesList) { + CompoundTag nodeTag = (CompoundTag) t; + TrackNode node1 = indexTracker.get(i); + i++; + + if (!nodeTag.contains("Connections")) + continue; + NBTHelper.iterateCompoundList(nodeTag.getList("Connections", Tag.TAG_COMPOUND), c -> { + TrackNode node2 = indexTracker.get(c.getInt("To")); + TrackEdge edge = TrackEdge.read(c.getCompound("EdgeData")); + graph.putConnection(node1, node2, edge); + }); + } + + NBTHelper.readCompoundList(tag.getList("Stations", Tag.TAG_COMPOUND), GlobalStation::new) + .forEach(s -> graph.stations.put(s.id, s)); + return graph; + } + + public void debugViewNodes() { + Entity cameraEntity = Minecraft.getInstance().cameraEntity; + if (cameraEntity == null) + return; + Vec3 camera = cameraEntity.getEyePosition(); + for (Entry nodeEntry : nodes.entrySet()) { + TrackNodeLocation nodeLocation = nodeEntry.getKey(); + TrackNode node = nodeEntry.getValue(); + if (nodeLocation == null) + continue; + + Vec3 location = nodeLocation.getLocation(); + if (location.distanceTo(camera) > 50) + continue; + + Vec3 v1 = location.add(0, 3 / 16f, 0); + Vec3 v2 = v1.add(node.normal.scale(0.75f)); + CreateClient.OUTLINER.showLine(Integer.valueOf(node.netId), v1, v2) + .colored(Color.mixColors(Color.WHITE, color, .5f)) + .lineWidth(1 / 8f); + + Map map = connectionsByNode.get(node); + if (map == null) + continue; + + int hashCode = node.hashCode(); + for (Entry entry : map.entrySet()) { + TrackNode other = entry.getKey(); + + if (other.hashCode() > hashCode) + continue; + + TrackEdge edge = entry.getValue(); + if (!edge.isTurn()) { + CreateClient.OUTLINER + .showLine(edge, edge.getPosition(node, other, 0), edge.getPosition(node, other, 1)) + .colored(color) + .lineWidth(1 / 16f); + continue; + } + + Vec3 previous = null; + BezierConnection turn = edge.getTurn(); + for (int i = 0; i <= turn.getSegmentCount(); i++) { + Vec3 current = edge.getPosition(node, other, i * 1f / turn.getSegmentCount()); + if (previous != null) + CreateClient.OUTLINER.showLine(previous, previous, current) + .colored(color) + .lineWidth(1 / 16f); + previous = current; + } + } + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSync.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSync.java new file mode 100644 index 000000000..d2e3c3da8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackGraphSync.java @@ -0,0 +1,221 @@ +package com.simibubi.create.content.logistics.trains; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.UUID; +import java.util.function.Supplier; + +import javax.annotation.Nullable; + +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.networking.SimplePacketBase; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Pair; +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.phys.Vec3; +import net.minecraftforge.network.NetworkEvent.Context; +import net.minecraftforge.network.PacketDistributor; + +public class TrackGraphSync { + + // + + public void nodeAdded(TrackGraph graph, TrackNode node) { + flushPacket(graph.id); + currentPacket.addedNodes.put(node.getNetId(), Pair.of(node.getLocation(), node.getNormal())); + } + + public void edgeAdded(TrackGraph graph, TrackNode node1, TrackNode node2, TrackEdge edge) { + flushPacket(graph.id); + currentPacket.addedEdges.add(Pair.of(Couple.create(node1.getNetId(), node2.getNetId()), edge)); + } + + public void nodeRemoved(TrackGraph graph, TrackNode node) { + flushPacket(graph.id); + if (currentPacket.addedNodes.remove(node.getNetId()) == null) + currentPacket.removedNodes.add(node.getNetId()); + } + + public void graphSplit(TrackGraph graph, Set additional) { + flushPacket(graph.id); + additional.forEach(rg -> currentPacket.splitSubGraphs.put(rg.nodesById.keySet() + .stream() + .findFirst() + .get(), rg.id)); + } + + public void graphRemoved(TrackGraph graph) { + flushPacket(graph.id); + currentPacket.delete = true; + } + + public void finish() { + flushPacket(null); + } + + // + + private RailGraphSyncPacket currentPacket; + + public void sendFullGraphTo(TrackGraph graph, ServerPlayer player) { + // TODO ensure packet size limit + + RailGraphSyncPacket packet = new RailGraphSyncPacket(graph.id); + for (TrackNode node : graph.nodes.values()) { + packet.addedNodes.put(node.getNetId(), Pair.of(node.getLocation(), node.getNormal())); + if (!graph.connectionsByNode.containsKey(node)) + continue; + graph.connectionsByNode.get(node) + .forEach((node2, edge) -> packet.addedEdges + .add(Pair.of(Couple.create(node.getNetId(), node2.getNetId()), edge))); + } + + AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> player), packet); + } + + private void flushPacket(@Nullable UUID graphId) { + if (currentPacket != null) { + if (currentPacket.graphId.equals(graphId)) + return; + AllPackets.channel.send(PacketDistributor.ALL.noArg(), currentPacket); + currentPacket = null; + } + + if (graphId != null) + currentPacket = new RailGraphSyncPacket(graphId); + } + + public static class RailGraphSyncPacket extends SimplePacketBase { + + UUID graphId; + Map> addedNodes; + List, TrackEdge>> addedEdges; + List removedNodes; + Map splitSubGraphs; + boolean delete; + + public RailGraphSyncPacket(UUID graphId) { + this.graphId = graphId; + addedNodes = new HashMap<>(); + addedEdges = new ArrayList<>(); + removedNodes = new ArrayList<>(); + splitSubGraphs = new HashMap<>(); + delete = false; + } + + public RailGraphSyncPacket(FriendlyByteBuf buffer) { + int size; + + graphId = buffer.readUUID(); + delete = buffer.readBoolean(); + + if (delete) + return; + + addedNodes = new HashMap<>(); + addedEdges = new ArrayList<>(); + removedNodes = new ArrayList<>(); + splitSubGraphs = new HashMap<>(); + + size = buffer.readVarInt(); + for (int i = 0; i < size; i++) + removedNodes.add(buffer.readVarInt()); + + size = buffer.readVarInt(); + for (int i = 0; i < size; i++) + addedNodes.put(buffer.readVarInt(), + Pair.of(TrackNodeLocation.fromPackedPos(buffer.readBlockPos()), VecHelper.read(buffer))); + + size = buffer.readVarInt(); + for (int i = 0; i < size; i++) + addedEdges.add(Pair.of(Couple.create(buffer::readVarInt), TrackEdge.read(buffer))); + + size = buffer.readVarInt(); + for (int i = 0; i < size; i++) + splitSubGraphs.put(buffer.readVarInt(), buffer.readUUID()); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeUUID(graphId); + buffer.writeBoolean(delete); + if (delete) + return; + + buffer.writeVarInt(removedNodes.size()); + removedNodes.forEach(buffer::writeVarInt); + + buffer.writeVarInt(addedNodes.size()); + addedNodes.forEach((node, loc) -> { + buffer.writeVarInt(node); + buffer.writeBlockPos(new BlockPos(loc.getFirst())); + VecHelper.write(loc.getSecond(), buffer); + }); + + buffer.writeVarInt(addedEdges.size()); + addedEdges.forEach(pair -> { + pair.getFirst() + .forEach(buffer::writeVarInt); + pair.getSecond() + .write(buffer); + }); + + buffer.writeVarInt(splitSubGraphs.size()); + splitSubGraphs.forEach((node, uuid) -> { + buffer.writeVarInt(node); + buffer.writeUUID(uuid); + }); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + GlobalRailwayManager manager = CreateClient.RAILWAYS; + TrackGraph railGraph = manager.getOrCreateGraph(graphId); + + if (delete) { + manager.removeGraph(railGraph); + return; + } + + for (int nodeId : removedNodes) { + TrackNode node = railGraph.getNode(nodeId); + if (node != null) + railGraph.removeNode(node.getLocation()); + } + + for (Entry> entry : addedNodes.entrySet()) + railGraph.createSpecificNode(entry.getValue() + .getFirst(), entry.getKey(), + entry.getValue() + .getSecond()); + + for (Pair, TrackEdge> pair : addedEdges) { + Couple nodes = pair.getFirst() + .map(railGraph::getNode); + if (nodes.getFirst() != null && nodes.getSecond() != null) + railGraph.putConnection(nodes.getFirst(), nodes.getSecond(), pair.getSecond()); + } + + if (!splitSubGraphs.isEmpty()) + railGraph.findDisconnectedGraphs(splitSubGraphs) + .forEach(manager::putGraph); + + }); + context.get() + .setPacketHandled(true); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackNode.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackNode.java new file mode 100644 index 000000000..0944aaf64 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackNode.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.logistics.trains; + +import net.minecraft.world.phys.Vec3; + +public class TrackNode { + + int netId; + Vec3 normal; + TrackNodeLocation location; + + public TrackNode(TrackNodeLocation location, int netId, Vec3 normal) { + this.location = location; + this.netId = netId; + this.normal = normal; + } + + public TrackNodeLocation getLocation() { + return location; + } + + public int getNetId() { + return netId; + } + + public Vec3 getNormal() { + return normal; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackNodeLocation.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackNodeLocation.java new file mode 100644 index 000000000..a23dbdc32 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackNodeLocation.java @@ -0,0 +1,72 @@ +package com.simibubi.create.content.logistics.trains; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.world.phys.Vec3; + +public class TrackNodeLocation extends Vec3i { + + public TrackNodeLocation(Vec3 vec) { + this(vec.x, vec.y, vec.z); + } + + public TrackNodeLocation(double p_121865_, double p_121866_, double p_121867_) { + super(Math.round(p_121865_ * 2), Math.floor(p_121866_ * 2), Math.round(p_121867_ * 2)); + } + + public static TrackNodeLocation fromPackedPos(BlockPos bufferPos) { + return new TrackNodeLocation(bufferPos); + } + + private TrackNodeLocation(BlockPos readBlockPos) { + super(readBlockPos.getX(), readBlockPos.getY(), readBlockPos.getZ()); + } + + public Vec3 getLocation() { + return new Vec3(getX() / 2f, getY() / 2f, getZ() / 2f); + } + + @Override + public boolean equals(Object pOther) { + return super.equals(pOther); + } + + @Override + public int hashCode() { + return (this.getY() + this.getZ() * 31) * 31 + this.getX(); + } + + public static class DiscoveredLocation extends TrackNodeLocation { + + BezierConnection turn = null; + Vec3 normal; + + public DiscoveredLocation(double p_121865_, double p_121866_, double p_121867_) { + super(p_121865_, p_121866_, p_121867_); + } + + public DiscoveredLocation(Vec3 vec) { + super(vec); + } + + public DiscoveredLocation viaTurn(BezierConnection turn) { + this.turn = turn; + return this; + } + + public DiscoveredLocation withNormal(Vec3 normal) { + this.normal = normal; + return this; + } + + public boolean connectedViaTurn() { + return turn != null; + } + + public BezierConnection getTurn() { + return turn; + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackPropagator.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackPropagator.java new file mode 100644 index 000000000..37eb6c78a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackPropagator.java @@ -0,0 +1,374 @@ +package com.simibubi.create.content.logistics.trains; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.function.Function; + +import javax.annotation.Nullable; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.TrackNodeLocation.DiscoveredLocation; +import com.simibubi.create.content.logistics.trains.track.TrackBlock; +import com.simibubi.create.content.logistics.trains.track.TrackBlock.TrackShape; +import com.simibubi.create.content.logistics.trains.track.TrackTileEntity; +import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class TrackPropagator { + + static class FrontierEntry { + BlockPos prevPos; + DiscoveredLocation prevNode; + BlockPos currentPos; + DiscoveredLocation currentNode; + DiscoveredLocation parentNode; + + public FrontierEntry(BlockPos previousPos, BlockPos pos, DiscoveredLocation location) { + this(null, previousPos, null, pos, location); + } + + public FrontierEntry(DiscoveredLocation parent, BlockPos previousPos, DiscoveredLocation previousNode, + BlockPos pos, DiscoveredLocation location) { + parentNode = parent; + prevPos = previousPos; + prevNode = previousNode; + currentPos = pos; + currentNode = location; + } + + } + + public static void onRailRemoved(LevelAccessor reader, BlockPos pos, BlockState state) { + List> ends = getEnds(reader, pos, state, null, false); + TrackGraph foundGraph = null; + GlobalRailwayManager manager = Create.RAILWAYS; + TrackGraphSync sync = manager.sync; + + for (Pair removedEnd : ends) { + DiscoveredLocation removedLocation = removedEnd.getSecond(); + if (foundGraph == null) + foundGraph = manager.getGraph(reader, removedLocation); + if (foundGraph != null) { + TrackNode removedNode = foundGraph.locateNode(removedLocation); + if (removedNode != null) { + foundGraph.removeNode(removedLocation); + sync.nodeRemoved(foundGraph, removedNode); + } + } + } + + if (foundGraph != null && foundGraph.isEmpty()) { + manager.removeGraph(foundGraph); + sync.graphRemoved(foundGraph); + } + + Set toUpdate = new HashSet<>(); + for (Pair removedEnd : ends) { + BlockPos adjPos = removedEnd.getFirst(); + BlockState adjState = reader.getBlockState(adjPos); + + if (!getEnds(reader, adjPos, adjState, removedEnd.getSecond(), true).isEmpty()) + toUpdate.add(onRailAdded(reader, adjPos, adjState)); + } + + for (TrackGraph railGraph : toUpdate) + manager.updateSplitGraph(railGraph); + + sync.finish(); + manager.markTracksDirty(); + } + + public static TrackGraph onRailAdded(LevelAccessor reader, BlockPos pos, BlockState state) { + // 1. Remove all immediately reachable node locations + + GlobalRailwayManager manager = Create.RAILWAYS; + TrackGraphSync sync = manager.sync; + List frontier = new ArrayList<>(); + Set visited = new HashSet<>(); + Set connectedGraphs = new HashSet<>(); + addInitialEndsOf(reader, pos, state, frontier, false); + + int emergencyExit = 1000; + while (!frontier.isEmpty()) { + if (emergencyExit-- == 0) + break; + + FrontierEntry entry = frontier.remove(0); + List> ends = findReachableEnds(reader, entry); + TrackGraph graph = manager.getGraph(reader, entry.currentNode); + if (graph != null) { + TrackNode node = graph.locateNode(entry.currentNode); + graph.removeNode(entry.currentNode); + sync.nodeRemoved(graph, node); + connectedGraphs.add(graph); + continue; + } + + continueSearch(frontier, visited, entry, ends); + } + + frontier.clear(); + visited.clear(); + + TrackGraph graph = null; + + // Remove empty graphs + for (Iterator iterator = connectedGraphs.iterator(); iterator.hasNext();) { + TrackGraph railGraph = iterator.next(); + if (!railGraph.isEmpty() || connectedGraphs.size() == 1) + continue; + manager.removeGraph(railGraph); + sync.graphRemoved(railGraph); + iterator.remove(); + } + + // Merge graphs if more than 1 + if (connectedGraphs.size() > 1) { + for (TrackGraph other : connectedGraphs) + if (graph == null) + graph = other; + else { + other.transferAll(graph); + manager.removeGraph(other); + sync.graphRemoved(other); + } + } else if (connectedGraphs.size() == 1) { + graph = connectedGraphs.stream() + .findFirst() + .get(); + } else + manager.putGraph(graph = new TrackGraph()); + + DiscoveredLocation startNode = null; + List startPositions = new ArrayList<>(); + + // 2. Find the first graph node candidate nearby + + addInitialEndsOf(reader, pos, state, frontier, true); + + emergencyExit = 1000; + while (!frontier.isEmpty()) { + if (emergencyExit-- == 0) + break; + + FrontierEntry entry = frontier.remove(0); + +// CreateClient.OUTLINER +// .showAABB(entry.currentNode, new AABB(entry.currentNode.getLocation(), entry.currentNode.getLocation() +// .add(0, 2, 0)), 120) +// .colored(Color.GREEN) +// .lineWidth(1 / 16f); +// CreateClient.OUTLINER.showAABB(entry.currentPos, new AABB(entry.currentPos).contract(0, 1, 0), 120) +// .colored(0x7777ff) +// .lineWidth(1 / 16f); +// if (entry.prevPos != null) { +// CreateClient.OUTLINER.showAABB(entry.prevPos, new AABB(entry.prevPos).contract(0, 1, 0), 120) +// .colored(0x3333aa) +// .lineWidth(1 / 16f); +// } + + List> ends = findReachableEnds(reader, entry); + if (isValidGraphNodeLocation(entry.currentNode, ends)) { + startNode = entry.currentNode; + startPositions.add(entry.prevPos); + startPositions.add(entry.currentPos); + break; + } + + continueSearch(frontier, visited, entry, ends); + } + + frontier.clear(); + if (graph.createNode(startNode)) + sync.nodeAdded(graph, graph.locateNode(startNode)); + +// CreateClient.OUTLINER.showAABB(graph, new AABB(startNode.getLocation(), startNode.getLocation() +// .add(0, 2, 0)), 20) +// .lineWidth(1 / 32f); + + for (BlockPos position : startPositions) + frontier.add(new FrontierEntry(startNode, null, null, position, startNode)); + + // 3. Build up the graph via all connected nodes + + emergencyExit = 1000; + while (!frontier.isEmpty()) { + if (emergencyExit-- == 0) + break; + + FrontierEntry entry = frontier.remove(0); + DiscoveredLocation parentNode = entry.parentNode; + List> ends = findReachableEnds(reader, entry); + + if (isValidGraphNodeLocation(entry.currentNode, ends) && entry.currentNode != startNode) { + boolean nodeIsNew = graph.createNode(entry.currentNode); + if (nodeIsNew) + sync.nodeAdded(graph, graph.locateNode(entry.currentNode)); + graph.connectNodes(parentNode, entry.currentNode, new TrackEdge(entry.currentNode.getTurn())); + parentNode = entry.currentNode; + if (!nodeIsNew) + continue; + } + + continueSearchWithParent(frontier, entry, parentNode, ends); + } + + sync.finish(); + manager.markTracksDirty(); + return graph; + } + + private static void addInitialEndsOf(LevelAccessor reader, BlockPos pos, BlockState state, + List frontier, boolean ignoreTurns) { + for (Pair initial : getEnds(reader, pos, state, null, ignoreTurns)) + frontier.add(new FrontierEntry(initial.getFirst(), pos, initial.getSecond())); + } + + private static List> findReachableEnds(LevelAccessor reader, + FrontierEntry entry) { + BlockState currentState = reader.getBlockState(entry.currentPos); + List> ends = new ArrayList<>(); + + if (entry.prevNode != null) { + BlockPos prevPos = entry.prevPos; + + // PrevPos correction after a turn + if (entry.currentNode.connectedViaTurn()) { + boolean slope = false; + if (currentState.getBlock() instanceof ITrackBlock track) + slope = track.getTrackAxis(reader, entry.currentPos, currentState).y != 0; + BlockPos offset = new BlockPos(VecHelper.getCenterOf(entry.currentPos) + .subtract(entry.currentNode.getLocation() + .add(0, slope ? 0 : .5f, 0)) + .scale(-2)); + prevPos = entry.currentPos.offset(offset); + } + + for (Pair pair : getEnds(reader, prevPos, reader.getBlockState(prevPos), + entry.currentNode, false)) + if (!pair.getSecond() + .equals(entry.prevNode)) + ends.add(pair); + } + + ends.addAll(getEnds(reader, entry.currentPos, currentState, entry.currentNode, false)); + return ends; + } + + private static void continueSearch(List frontier, Set visited, + FrontierEntry entry, List> ends) { + for (Pair pair : ends) + if (visited.add(pair.getSecond())) + frontier.add( + new FrontierEntry(null, entry.currentPos, entry.currentNode, pair.getFirst(), pair.getSecond())); + } + + private static void continueSearchWithParent(List frontier, FrontierEntry entry, + DiscoveredLocation parentNode, List> ends) { + for (Pair pair : ends) + frontier.add( + new FrontierEntry(parentNode, entry.currentPos, entry.currentNode, pair.getFirst(), pair.getSecond())); + } + + public static boolean isValidGraphNodeLocation(DiscoveredLocation location, + List> next) { + if (next.size() != 1) + return true; + if (location.connectedViaTurn()) + return true; + + DiscoveredLocation nextLocation = next.iterator() + .next() + .getSecond(); + + if (nextLocation.connectedViaTurn()) + return true; + + Vec3 vec = location.getLocation(); + boolean centeredX = !Mth.equal(vec.x, Math.round(vec.x)); + boolean centeredZ = !Mth.equal(vec.z, Math.round(vec.z)); + if (centeredX && !centeredZ) + return ((int) Math.round(vec.z)) % 16 == 0; + return ((int) Math.round(vec.x)) % 16 == 0; + } + + // TODO ITrackBlock + public static List> getEnds(LevelReader reader, BlockPos pos, BlockState state, + @Nullable DiscoveredLocation fromEnd, boolean ignoreTurns) { + Vec3 center = VecHelper.getCenterOf(pos); + List> list = new ArrayList<>(); + + if (!(state.getBlock() instanceof TrackBlock)) + return list; + + BlockEntity blockEntity = reader.getBlockEntity(pos); + if (state.getValue(TrackBlock.HAS_TURN) && blockEntity instanceof TrackTileEntity && !ignoreTurns) { + TrackTileEntity trackTileEntity = (TrackTileEntity) blockEntity; + trackTileEntity.getConnections() + .forEach(map -> map.forEach((connectedPos, bc) -> addToSet(fromEnd, list, + (d, b) -> d == 1 ? Vec3.atLowerCornerOf(bc.tePositions.get(b)) : bc.starts.get(b), bc.normals::get, + bc))); + } + + TrackShape shape = state.getValue(TrackBlock.SHAPE); + if (shape != TrackShape.NONE) + addToSet(fromEnd, list, (d, b) -> shape.getAxis() + .scale(b ? d : -d) + .add(center) + .add(0, shape.getAxis().y == 0 ? -.5 : 0, 0), b -> shape.getNormal(), null); + + return list; + } + + private static void addToSet(DiscoveredLocation fromEnd, List> list, + BiFunction offsetFactory, Function normalFactory, + BezierConnection viaTurn) { + + DiscoveredLocation firstLocation = new DiscoveredLocation(offsetFactory.apply(0.5d, true)); + DiscoveredLocation secondLocation = new DiscoveredLocation(offsetFactory.apply(0.5d, false)); + + Pair firstNode = + Pair.of(new BlockPos(offsetFactory.apply(1.0d, true)), firstLocation.viaTurn(viaTurn) + .withNormal(normalFactory.apply(true))); + Pair secondNode = + Pair.of(new BlockPos(offsetFactory.apply(1.0d, false)), secondLocation.viaTurn(viaTurn) + .withNormal(normalFactory.apply(false))); + + boolean skipFirst = false; + boolean skipSecond = false; + + if (fromEnd != null) { + boolean equalsFirst = firstNode.getSecond() + .equals(fromEnd); + boolean equalsSecond = secondNode.getSecond() + .equals(fromEnd); + + // not reachable from this end, crossover rail + if (!equalsFirst && !equalsSecond) + return; + + if (equalsFirst) + skipFirst = true; + if (equalsSecond) + skipSecond = true; + } + + if (!skipFirst) + list.add(firstNode); + if (!skipSecond) + list.add(secondNode); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackSavedData.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackSavedData.java new file mode 100644 index 000000000..f92ce5120 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackSavedData.java @@ -0,0 +1,47 @@ +package com.simibubi.create.content.logistics.trains; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.saveddata.SavedData; + +public class TrackSavedData extends SavedData { + + private Map trackNetworks = new HashMap<>(); + + @Override + public CompoundTag save(CompoundTag nbt) { + nbt.put("RailGraphs", NBTHelper.writeCompoundList(Create.RAILWAYS.trackNetworks.values(), TrackGraph::write)); + return nbt; + } + + private static TrackSavedData load(CompoundTag nbt) { + TrackSavedData sd = new TrackSavedData(); + sd.trackNetworks = new HashMap<>(); + NBTHelper.iterateCompoundList(nbt.getList("RailGraphs", Tag.TAG_COMPOUND), c -> { + TrackGraph graph = TrackGraph.read(c); + sd.trackNetworks.put(graph.id, graph); + }); + return sd; + } + + public Map getTrackNetworks() { + return trackNetworks; + } + + private TrackSavedData() {} + + public static TrackSavedData load(MinecraftServer server) { + return server.overworld() + .getDataStorage() + .computeIfAbsent(TrackSavedData::load, TrackSavedData::new, "create_tracks"); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java new file mode 100644 index 000000000..f5b6338ee --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Carriage.java @@ -0,0 +1,272 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import java.lang.ref.WeakReference; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.mutable.MutableDouble; +import org.apache.commons.lang3.mutable.MutableObject; + +import com.simibubi.create.content.logistics.trains.IBogeyBlock; +import com.simibubi.create.content.logistics.trains.entity.MovingPoint.ITrackSelector; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public class Carriage { + + public static final AtomicInteger netIdGenerator = new AtomicInteger(); + + public Train train; + public CarriageContraption contraption; + public int bogeySpacing; + public int id; + + WeakReference entity; + Couple bogeys; + + public Carriage(CarriageBogey bogey1, @Nullable CarriageBogey bogey2, int bogeySpacing) { + this.bogeySpacing = bogeySpacing; + this.bogeys = Couple.create(bogey1, bogey2); + this.entity = new WeakReference<>(null); + this.id = netIdGenerator.incrementAndGet(); + } + + public void setTrain(Train train) { + this.train = train; + } + + public void setContraption(CarriageContraption contraption) { + this.contraption = contraption; + contraption.setCarriage(this); + } + + public double travel(Level level, double distance, @Nullable Function control) { + Vec3 leadingAnchor = leadingBogey().anchorPosition; + Vec3 trailingAnchor = trailingBogey().anchorPosition; + boolean onTwoBogeys = isOnTwoBogeys(); + double stress = onTwoBogeys ? bogeySpacing - leadingAnchor.distanceTo(trailingAnchor) : 0; + + // positive stress: points should move apart + // negative stress: points should move closer + + double leadingBogeyModifier = 0.5d; + double trailingBogeyModifier = -0.5d; + double leadingPointModifier = 0.5d; + double trailingPointModifier = -0.5d; + + MutableObject previous = new MutableObject<>(); + MutableDouble distanceMoved = new MutableDouble(distance); + + bogeys.forEachWithContext((bogey, firstBogey) -> { + if (!firstBogey && !onTwoBogeys) + return; + + double bogeyCorrection = stress * (firstBogey ? leadingBogeyModifier : trailingBogeyModifier); + double bogeyStress = bogey.getStress(); + + bogey.points.forEachWithContext((point, first) -> { + MovingPoint prevPoint = previous.getValue(); + ITrackSelector trackSelector = + prevPoint == null ? control == null ? point.random() : control.apply(point) + : point.follow(prevPoint); + + double correction = bogeyStress * (first ? leadingPointModifier : trailingPointModifier); + double toMove = distanceMoved.getValue(); + double moved = point.travel(toMove, trackSelector); + point.travel(correction + bogeyCorrection, trackSelector); + + distanceMoved.setValue(moved); + previous.setValue(point); + }); + + bogey.updateAnchorPosition(); + }); + + tickEntity(level); + return distanceMoved.getValue(); + } + + public void createEntity(Level level) { + contraption.startMoving(level); + CarriageContraptionEntity entity = CarriageContraptionEntity.create(level, contraption); + Vec3 pos = leadingBogey().anchorPosition; + entity.setPos(pos); + entity.setInitialOrientation(contraption.getAssemblyDirection() + .getClockWise()); + level.addFreshEntity(entity); + this.entity = new WeakReference<>(entity); + } + + public ChunkPos getChunk() { + return new ChunkPos(new BlockPos(leadingBogey().anchorPosition)); + } + + protected void tickEntity(Level level) { + CarriageContraptionEntity entity = this.entity.get(); + if (entity == null) { + if (CarriageEntityHandler.isActiveChunk(level, getChunk())) + createEntity(level); + } else { + CarriageEntityHandler.validateCarriageEntity(entity); + if (!entity.isAlive()) { + this.entity.clear(); + return; + } + } + + entity = this.entity.get(); + if (entity == null) + return; + if (!entity.level.isClientSide) + moveEntity(entity); + } + + public void moveEntity(CarriageContraptionEntity entity) { + Vec3 positionVec = isOnTwoBogeys() ? leadingBogey().anchorPosition + : leadingBogey().leading() + .getPosition(); + Vec3 coupledVec = isOnTwoBogeys() ? trailingBogey().anchorPosition + : leadingBogey().trailing() + .getPosition(); + + double diffX = positionVec.x - coupledVec.x; + double diffY = positionVec.y - coupledVec.y; + double diffZ = positionVec.z - coupledVec.z; + + entity.setPos(leadingBogey().anchorPosition); + entity.prevYaw = entity.yaw; + entity.prevPitch = entity.pitch; + entity.yaw = (float) (Mth.atan2(diffZ, diffX) * 180 / Math.PI) + 180; + entity.pitch = (float) (Math.atan2(diffY, Math.sqrt(diffX * diffX + diffZ * diffZ)) * 180 / Math.PI) * -1; + } + + public void discardEntity() { + CarriageContraptionEntity entity = this.entity.get(); + if (entity == null) + return; + entity.discard(); + } + + public MovingPoint getLeadingPoint() { + return leadingBogey().leading(); + } + + public MovingPoint getTrailingPoint() { + return trailingBogey().trailing(); + } + + public CarriageBogey leadingBogey() { + return bogeys.getFirst(); + } + + public CarriageBogey trailingBogey() { + return isOnTwoBogeys() ? bogeys.getSecond() : leadingBogey(); + } + + public boolean isOnTwoBogeys() { + return bogeys.getSecond() != null; + } + + public static class CarriageBogey { + + IBogeyBlock type; + Couple points; + Vec3 anchorPosition; + + LerpedFloat wheelAngle; + LerpedFloat yaw; + LerpedFloat pitch; + + public Vec3 leadingCouplingAnchor; + public Vec3 trailingCouplingAnchor; + + public CarriageBogey(IBogeyBlock type, MovingPoint point, MovingPoint point2) { + this.type = type; + points = Couple.create(point, point2); + wheelAngle = LerpedFloat.angular(); + yaw = LerpedFloat.angular(); + pitch = LerpedFloat.angular(); + updateAnchorPosition(); + } + + public void updateAngles(double distanceMoved) { + double angleDiff = 360 * distanceMoved / (Math.PI * 2 * type.getWheelRadius()); + Vec3 positionVec = leading().getPosition(); + Vec3 coupledVec = trailing().getPosition(); + double diffX = positionVec.x - coupledVec.x; + double diffY = positionVec.y - coupledVec.y; + double diffZ = positionVec.z - coupledVec.z; + float yRot = AngleHelper.deg(Mth.atan2(diffZ, diffX)) + 90; + float xRot = AngleHelper.deg(Math.atan2(diffY, Math.sqrt(diffX * diffX + diffZ * diffZ))); + wheelAngle.setValue((wheelAngle.getValue() - angleDiff) % 360); + pitch.setValue(xRot); + yaw.setValue(-yRot); + } + + public MovingPoint leading() { + return points.getFirst(); + } + + public MovingPoint trailing() { + return points.getSecond(); + } + + public double getStress() { + return type.getWheelPointSpacing() - leading().getPosition() + .distanceTo(trailing().getPosition()); + } + + public void updateAnchorPosition() { + anchorPosition = points.getFirst() + .getPosition() + .add(points.getSecond() + .getPosition()) + .scale(.5); + } + + public void updateCouplingAnchor(Vec3 entityPos, float entityXRot, float entityYRot, int bogeySpacing, + float partialTicks, boolean leading) { + Vec3 thisOffset = type.getConnectorAnchorOffset(); + thisOffset = thisOffset.multiply(1, 1, leading ? -1 : 1); + +// msr.rotateY(viewYRot + 90) +// .rotateX(-viewXRot) +// .rotateY(180) +// .translate(0, 0, first ? 0 : -bogeySpacing) +// .rotateY(-180) +// .rotateX(viewXRot) +// .rotateY(-viewYRot - 90) +// .rotateY(bogey.yaw.getValue(partialTicks)) +// .rotateX(bogey.pitch.getValue(partialTicks)) + + thisOffset = VecHelper.rotate(thisOffset, pitch.getValue(partialTicks), Axis.X); + thisOffset = VecHelper.rotate(thisOffset, yaw.getValue(partialTicks), Axis.Y); + thisOffset = VecHelper.rotate(thisOffset, -entityYRot - 90, Axis.Y); + thisOffset = VecHelper.rotate(thisOffset, entityXRot, Axis.X); + thisOffset = VecHelper.rotate(thisOffset, -180, Axis.Y); + thisOffset = thisOffset.add(0, 0, leading ? 0 : -bogeySpacing); + thisOffset = VecHelper.rotate(thisOffset, 180, Axis.Y); + thisOffset = VecHelper.rotate(thisOffset, -entityXRot, Axis.X); + thisOffset = VecHelper.rotate(thisOffset, entityYRot + 90, Axis.Y); + + if (leading) + leadingCouplingAnchor = entityPos.add(thisOffset); + else { + trailingCouplingAnchor = entityPos.add(thisOffset); + } + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java new file mode 100644 index 000000000..91dbcd062 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java @@ -0,0 +1,128 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import org.apache.commons.lang3.tuple.Pair; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; +import com.simibubi.create.content.contraptions.components.structureMovement.NonStationaryLighter; +import com.simibubi.create.content.logistics.trains.IBogeyBlock; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; + +public class CarriageContraption extends Contraption { + + private Direction assemblyDirection; + + private boolean controls; + private int bogeys; + private BlockPos secondBogeyPos; + + private Carriage carriage; + public int temporaryCarriageIdHolder = -1; + + public CarriageContraption() {} + + public CarriageContraption(Direction assemblyDirection) { + this.assemblyDirection = assemblyDirection; + this.bogeys = 0; + } + + @Override + public boolean assemble(Level world, BlockPos pos) throws AssemblyException { + if (!searchMovedStructure(world, pos, null)) + return false; + if (blocks.size() == 0) + return false; + if (bogeys > 2 || bogeys == 0) + throw AssemblyException.invalidBogeyCount(); + return true; + } + + @Override + protected boolean isAnchoringBlockAt(BlockPos pos) { + return false; + } + + @Override + protected Pair capture(Level world, BlockPos pos) { + BlockState blockState = world.getBlockState(pos); + + if (blockState.getBlock() instanceof IBogeyBlock) { + bogeys++; + if (bogeys == 2) + secondBogeyPos = pos; + return Pair.of(new StructureBlockInfo(pos, blockState, null), null); + } + + if (AllBlocks.CONTROLS.has(blockState)) + controls = true; + + return super.capture(world, pos); + } + + @Override + public CompoundTag writeNBT(boolean spawnPacket) { + CompoundTag tag = super.writeNBT(spawnPacket); + NBTHelper.writeEnum(tag, "AssemblyDirection", getAssemblyDirection()); + if (spawnPacket) + tag.putInt("CarriageId", carriage.id); + tag.putBoolean("Controls", hasControls()); + return tag; + } + + @Override + public void readNBT(Level world, CompoundTag nbt, boolean spawnData) { + assemblyDirection = NBTHelper.readEnum(nbt, "AssemblyDirection", Direction.class); + if (spawnData) + temporaryCarriageIdHolder = nbt.getInt("CarriageId"); + controls = nbt.getBoolean("Controls"); + super.readNBT(world, nbt, spawnData); + } + + @Override + public boolean canBeStabilized(Direction facing, BlockPos localPos) { + return false; + } + + @Override + protected ContraptionType getType() { + return ContraptionType.CARRIAGE; + } + + @Override + public ContraptionLighter makeLighter() { + return new NonStationaryLighter<>(this); + } + + public Direction getAssemblyDirection() { + return assemblyDirection; + } + + public void setCarriage(Carriage carriage) { + this.carriage = carriage; + temporaryCarriageIdHolder = carriage.id; + } + + public Carriage getCarriage() { + return carriage; + } + + public boolean hasControls() { + return controls; + } + + public BlockPos getSecondBogeyPos() { + return secondBogeyPos; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java new file mode 100644 index 000000000..8924c0412 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntity.java @@ -0,0 +1,61 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import com.simibubi.create.AllEntityTypes; +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.components.structureMovement.OrientedContraptionEntity; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public class CarriageContraptionEntity extends OrientedContraptionEntity { + + public CarriageContraptionEntity(EntityType type, Level world) { + super(type, world); + } + + @Override + public boolean isControlledByLocalInstance() { + return true; + } + + public static CarriageContraptionEntity create(Level world, CarriageContraption contraption) { + CarriageContraptionEntity entity = + new CarriageContraptionEntity(AllEntityTypes.CARRIAGE_CONTRAPTION.get(), world); + entity.setContraption(contraption); + entity.setInitialOrientation(contraption.getAssemblyDirection()); + entity.startAtInitialYaw(); + return entity; + } + + @Override + protected void tickContraption() { + if (!(contraption instanceof CarriageContraption)) + return; + int id = ((CarriageContraption) contraption).temporaryCarriageIdHolder; + Carriage carriage = Create.RAILWAYS.carriageById.get(id); // TODO: thread breach + if (carriage == null) { + discard(); + return; + } + if (!level.isClientSide) + return; + + xo = getX(); + yo = getY(); + zo = getZ(); + carriage.moveEntity(this); + double distanceTo = position().distanceTo(new Vec3(xo, yo, zo)); + carriage.bogeys.getFirst() + .updateAngles(distanceTo); + if (carriage.isOnTwoBogeys()) + carriage.bogeys.getSecond() + .updateAngles(distanceTo); + } + + @Override + public boolean shouldBeSaved() { + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntityRenderer.java new file mode 100644 index 000000000..3e20c82f3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntityRenderer.java @@ -0,0 +1,72 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntityRenderer; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.world.phys.Vec3; + +public class CarriageContraptionEntityRenderer extends ContraptionEntityRenderer { + + public CarriageContraptionEntityRenderer(EntityRendererProvider.Context context) { + super(context); + } + + @Override + public boolean shouldRender(CarriageContraptionEntity entity, Frustum clippingHelper, double cameraX, + double cameraY, double cameraZ) { + if (!super.shouldRender(entity, clippingHelper, cameraX, cameraY, cameraZ)) + return false; + return ((CarriageContraption) entity.getContraption()).temporaryCarriageIdHolder != -1; + } + + @Override + public void render(CarriageContraptionEntity entity, float yaw, float partialTicks, PoseStack ms, + MultiBufferSource buffers, int overlay) { + super.render(entity, yaw, partialTicks, ms, buffers, overlay); + + int id = ((CarriageContraption) entity.getContraption()).temporaryCarriageIdHolder; + Carriage carriage = Create.RAILWAYS.carriageById.get(id); + if (carriage == null) + return; + + Vec3 position = entity.getPosition(partialTicks); + + ms.pushPose(); + carriage.bogeys.forEachWithContext((bogey, first) -> { + if (!first && !carriage.isOnTwoBogeys()) + return; + + ms.pushPose(); + MatrixTransformStack msr = new MatrixTransformStack(ms); + float viewYRot = entity.getViewYRot(partialTicks); + float viewXRot = entity.getViewXRot(partialTicks); + int bogeySpacing = carriage.bogeySpacing; + msr.rotateY(viewYRot + 90) + .rotateX(-viewXRot) + .rotateY(180) + .translate(0, 0, first ? 0 : -bogeySpacing) + .rotateY(-180) + .rotateX(viewXRot) + .rotateY(-viewYRot - 90) + .rotateY(bogey.yaw.getValue(partialTicks)) + .rotateX(bogey.pitch.getValue(partialTicks)) + .translate(0, .5f, 0); + + bogey.type.render(null, bogey.wheelAngle.getValue(partialTicks), ms, partialTicks, buffers, + getPackedLightCoords(entity, partialTicks), overlay); + bogey.updateCouplingAnchor(position, viewXRot, viewYRot, bogeySpacing, partialTicks, first); + if (!carriage.isOnTwoBogeys()) + bogey.updateCouplingAnchor(position, viewXRot, viewYRot, bogeySpacing, partialTicks, !first); + + ms.popPose(); + }); + ms.popPose(); + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java new file mode 100644 index 000000000..376fcfaab --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageCouplingRenderer.java @@ -0,0 +1,130 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import java.util.Collection; +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.entity.Carriage.CarriageBogey; +import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class CarriageCouplingRenderer { + + public static void renderAll(PoseStack ms, MultiBufferSource buffer) { + Collection trains = Create.RAILWAYS.trains.values(); // TODO: thread breach + VertexConsumer vb = buffer.getBuffer(RenderType.solid()); + BlockState air = Blocks.AIR.defaultBlockState(); + float partialTicks = AnimationTickHolder.getPartialTicks(); + Entity cameraEntity = Minecraft.getInstance().cameraEntity; + if (cameraEntity == null) + return; + + Vec3 camera = cameraEntity.getPosition(partialTicks); + + for (Train train : trains) { + List carriages = train.carriages; + for (int i = 0; i < carriages.size() - 1; i++) { + Carriage carriage = carriages.get(i); + CarriageContraptionEntity entity = carriage.entity.get(); + Carriage carriage2 = carriages.get(i + 1); + CarriageContraptionEntity entity2 = carriage.entity.get(); + + if (entity == null || entity2 == null) + continue; + + CarriageBogey bogey1 = carriage.trailingBogey(); + CarriageBogey bogey2 = carriage2.leadingBogey(); + Vec3 anchor = bogey1.trailingCouplingAnchor; + Vec3 anchor2 = bogey2.leadingCouplingAnchor; + + if (anchor == null || anchor2 == null) + continue; + if (!anchor.closerThan(camera, 64)) + continue; + + int lightCoords = getPackedLightCoords(entity, partialTicks); + int lightCoords2 = getPackedLightCoords(entity2, partialTicks); + + double diffX = anchor2.x - anchor.x; + double diffY = anchor2.y - anchor.y; + double diffZ = anchor2.z - anchor.z; + float yRot = AngleHelper.deg(Mth.atan2(diffZ, diffX)) + 90; + float xRot = AngleHelper.deg(Math.atan2(diffY, Math.sqrt(diffX * diffX + diffZ * diffZ))); + + Vec3 position = entity.getPosition(partialTicks); + Vec3 position2 = entity2.getPosition(partialTicks); + + ms.pushPose(); + ms.pushPose(); + ms.translate(anchor.x, anchor.y, anchor.z); + CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_HEAD, air) + .rotateY(-yRot) + .rotateX(xRot) + .light(lightCoords) + .renderInto(ms, vb); + + float margin = 3 / 16f; + double couplingDistance = train.carriageSpacing.get(i) - 2 * margin + - bogey1.type.getConnectorAnchorOffset().z - bogey2.type.getConnectorAnchorOffset().z; + int couplingSegments = (int) Math.round(couplingDistance * 4); + double stretch = ((anchor2.distanceTo(anchor) - 2 * margin) * 4) / couplingSegments; + for (int j = 0; j < couplingSegments; j++) { + CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_CABLE, air) + .rotateY(-yRot + 180) + .rotateX(-xRot) + .translate(0, 0, margin + 2 / 16f) + .scale(1, 1, (float) stretch) + .translate(0, 0, j / 4f) + .light(lightCoords) + .renderInto(ms, vb); + } + + ms.popPose(); + + ms.pushPose(); + ms.translate(-position.x, -position.y, -position.z); + ms.translate(position2.x, position2.y, position2.z); + ms.translate(anchor2.x, anchor2.y, anchor2.z); + CachedBufferer.partial(AllBlockPartials.TRAIN_COUPLING_HEAD, air) + .rotateY(-yRot + 180) + .rotateX(-xRot) + .light(lightCoords2) + .renderInto(ms, vb); + ms.popPose(); + ms.popPose(); + + } + } + + } + + public static int getPackedLightCoords(Entity pEntity, float pPartialTicks) { + BlockPos blockpos = new BlockPos(pEntity.getLightProbePosition(pPartialTicks)); + return LightTexture.pack(getBlockLightLevel(pEntity, blockpos), getSkyLightLevel(pEntity, blockpos)); + } + + protected static int getSkyLightLevel(Entity pEntity, BlockPos pPos) { + return pEntity.level.getBrightness(LightLayer.SKY, pPos); + } + + protected static int getBlockLightLevel(Entity pEntity, BlockPos pPos) { + return pEntity.isOnFire() ? 15 : pEntity.level.getBrightness(LightLayer.BLOCK, pPos); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageEntityHandler.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageEntityHandler.java new file mode 100644 index 000000000..be4eb4ff9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageEntityHandler.java @@ -0,0 +1,45 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import net.minecraft.core.SectionPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraftforge.event.entity.EntityEvent; + +/** + * Removes all Carriage entities in chunks that aren't ticking + */ +public class CarriageEntityHandler { + + public static void onEntityEnterSection(EntityEvent.EnteringSection event) { + if (!event.didChunkChange()) + return; + Entity entity = event.getEntity(); + if (!(entity instanceof CarriageContraptionEntity)) + return; + SectionPos newPos = event.getNewPos(); + Level level = entity.getLevel(); + if (level.isClientSide) + return; + if (!isActiveChunk(level, newPos.chunk())) + entity.discard(); + } + + public static void validateCarriageEntity(CarriageContraptionEntity entity) { + if (!entity.isAlive()) + return; + Level level = entity.getLevel(); + if (level.isClientSide) + return; + if (!isActiveChunk(level, entity.chunkPosition())) + entity.discard(); + } + + public static boolean isActiveChunk(Level level, ChunkPos chunk) { + if (level instanceof ServerLevel serverLevel) + return serverLevel.isPositionEntityTicking(chunk); + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/MovingPoint.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/MovingPoint.java new file mode 100644 index 000000000..3b78157fd --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/MovingPoint.java @@ -0,0 +1,194 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; +import java.util.Vector; +import java.util.function.Function; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.TrackEdge; +import com.simibubi.create.content.logistics.trains.TrackGraph; +import com.simibubi.create.content.logistics.trains.TrackNode; + +import net.minecraft.world.phys.Vec3; + +public class MovingPoint { + + TrackGraph graph; + TrackNode node1, node2; + TrackEdge edge; + double position; + + public static enum SteerDirection { + NONE(0), LEFT(-1), RIGHT(1); + + float targetDot; + + private SteerDirection(float targetDot) { + this.targetDot = targetDot; + } + } + + public static interface ITrackSelector + extends Function>, Entry> { + }; + + public MovingPoint(TrackGraph graph, TrackNode node1, TrackNode node2, TrackEdge edge, double position) { + this.graph = graph; + this.node1 = node1; + this.node2 = node2; + this.edge = edge; + this.position = position; + } + + public ITrackSelector random() { + return validTargets -> validTargets.get(Create.RANDOM.nextInt(validTargets.size())); + } + + public ITrackSelector follow(MovingPoint other) { + return validTargets -> { + TrackNode target = other.node1; + + for (Entry entry : validTargets) + if (entry.getKey() == target || entry.getKey() == other.node2) + return entry; + + Vector>> frontiers = new Vector<>(validTargets.size()); + Vector> visiteds = new Vector<>(validTargets.size()); + + for (int j = 0; j < validTargets.size(); j++) { + ArrayList> e = new ArrayList<>(); + Entry entry = validTargets.get(j); + e.add(entry); + frontiers.add(e); + HashSet e2 = new HashSet<>(); + e2.add(entry.getValue()); + visiteds.add(e2); + } + + for (int i = 0; i < 20; i++) { + for (int j = 0; j < validTargets.size(); j++) { + Entry entry = validTargets.get(j); + List> frontier = frontiers.get(j); + if (frontier.isEmpty()) + continue; + + Entry currentEntry = frontier.remove(0); + for (Entry nextEntry : graph.getConnectionsFrom(currentEntry.getKey()) + .entrySet()) { + TrackEdge nextEdge = nextEntry.getValue(); + if (!visiteds.get(j) + .add(nextEdge)) + continue; + + TrackNode nextNode = nextEntry.getKey(); + if (nextNode == target) + return entry; + + frontier.add(nextEntry); + } + } + } + + Create.LOGGER.warn("Couldn't find follow target, choosing first"); + return validTargets.get(0); + }; + } + + public ITrackSelector steer(SteerDirection direction, Vec3 upNormal) { + return validTargets -> { + double closest = Double.MAX_VALUE; + Entry best = null; + + for (Entry entry : validTargets) { + Vec3 trajectory = edge.getDirection(node1, node2, false); + Vec3 entryTrajectory = entry.getValue() + .getDirection(node2, entry.getKey(), true); + Vec3 normal = trajectory.cross(upNormal); + double dot = normal.dot(entryTrajectory); + double diff = Math.abs(direction.targetDot - dot); + if (diff > closest) + continue; + + closest = diff; + best = entry; + } + + if (best == null) { + Create.LOGGER.warn("Couldn't find steer target, choosing first"); + return validTargets.get(0); + } + + return best; + }; + } + + public double travel(double distance, ITrackSelector trackSelector) { + double edgeLength = edge.getLength(node1, node2); + if (distance == 0) + return 0; + + double traveled = distance; + + double currentT = position / edgeLength; + double incrementT = edge.incrementT(node1, node2, currentT, distance); + position = incrementT * edgeLength; + + List> validTargets = new ArrayList<>(); + while (position > edgeLength) { + validTargets.clear(); + + for (Entry entry : graph.getConnectionsFrom(node2) + .entrySet()) { + TrackNode newNode = entry.getKey(); + if (newNode == node1) + continue; + + TrackEdge newEdge = entry.getValue(); + Vec3 currentDirection = edge.getDirection(node1, node2, false); + Vec3 newDirection = newEdge.getDirection(node2, newNode, true); + if (currentDirection.dot(newDirection) < 0) + continue; + + validTargets.add(entry); + } + + if (validTargets.isEmpty()) { + traveled -= position - edgeLength; + position = edgeLength; + break; + } + + Entry entry = + validTargets.size() == 1 ? validTargets.get(0) : trackSelector.apply(validTargets); + + node1 = node2; + node2 = entry.getKey(); + edge = entry.getValue(); + position -= edgeLength; + edgeLength = edge.getLength(node1, node2); + } + + return traveled; + } + + public void reverse() { + TrackNode n = node1; + node1 = node2; + node2 = n; + position = edge.getLength(node1, node2) - position; + edge = graph.getConnectionsFrom(node1) + .get(node2); + } + + public Vec3 getPosition() { + double t = position / edge.getLength(node1, node2); + return edge.getPosition(node1, node2, t) + .add(edge.getNormal(node1, node2, t) + .scale(1)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java new file mode 100644 index 000000000..b61201d84 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Navigation.java @@ -0,0 +1,197 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.PriorityQueue; +import java.util.Set; + +import com.simibubi.create.content.logistics.trains.TrackEdge; +import com.simibubi.create.content.logistics.trains.TrackGraph; +import com.simibubi.create.content.logistics.trains.TrackNode; +import com.simibubi.create.content.logistics.trains.TrackNodeLocation; +import com.simibubi.create.content.logistics.trains.entity.MovingPoint.ITrackSelector; +import com.simibubi.create.content.logistics.trains.management.GlobalStation; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public class Navigation { + + TrackGraph graph; + Train train; + + public GlobalStation destination; + public double distanceToDestination; + + List path; + + public Navigation(Train train, TrackGraph graph) { + this.train = train; + this.graph = graph; + path = new ArrayList<>(); + } + + public void tick(Level level) { + if (destination == null) + return; + + destination.reserveFor(train); + + if (distanceToDestination < 1 / 32f) { + distanceToDestination = 0; + train.speed = 0; + path.clear(); + train.arriveAt(destination); + destination = null; + return; + } + + if (distanceToDestination - train.speed < 1 / 32f) { + train.speed = distanceToDestination; + return; + } + + if (distanceToDestination < 10) { + double target = Train.topSpeed * ((distanceToDestination) / 10); + if (target < train.speed) { + train.speed += (target - train.speed) * .5f; + return; + } + } + + double brakingDistance = (train.speed * train.speed) / (2 * Train.acceleration); + train.targetSpeed = distanceToDestination > brakingDistance ? Train.topSpeed : 0; + + if (Mth.equal(train.targetSpeed, train.speed)) + return; + + if (train.speed < train.targetSpeed) + train.speed = Math.min(train.speed + Train.acceleration, train.targetSpeed); + else if (train.speed > train.targetSpeed) + train.speed = Math.max(train.speed - Train.acceleration, train.targetSpeed); + + } + + public boolean isActive() { + return destination != null; + } + + public ITrackSelector control(MovingPoint mp) { + return list -> { + if (!path.isEmpty()) { + TrackEdge target = path.get(0); + for (Entry entry : list) { + if (entry.getValue() == target) { + path.remove(0); + return entry; + } + } + } + return list.get(0); + }; + } + + public void cancelNavigation() { + distanceToDestination = 0; + path.clear(); + if (destination == null) + return; + destination.cancelReservation(train); + } + + public void setDestination(GlobalStation destination) { + findPathTo(destination); + if (path.isEmpty()) + return; + train.leave(); + this.destination = destination; + } + + private void findPathTo(GlobalStation destination) { + path.clear(); + this.distanceToDestination = 0; + Couple target = destination.edgeLocation; + PriorityQueue, TrackEdge>>> frontier = + new PriorityQueue<>((p1, p2) -> Double.compare(p1.getFirst(), p2.getFirst())); + + MovingPoint leadingPoint = train.carriages.get(0) + .getLeadingPoint(); + Set visited = new HashSet<>(); + Map> reachedVia = new IdentityHashMap<>(); + + TrackEdge initialEdge = leadingPoint.edge; + TrackNode initialNode1 = leadingPoint.node1; + TrackNode initialNode2 = leadingPoint.node2; + double distanceToNode2 = initialEdge.getLength(initialNode1, initialNode2) - leadingPoint.position; + frontier.add(Pair.of(distanceToNode2, Pair.of(Couple.create(initialNode1, initialNode2), initialEdge))); + + while (!frontier.isEmpty()) { + Pair, TrackEdge>> poll = frontier.poll(); + double distance = poll.getFirst(); + Pair, TrackEdge> currentEntry = poll.getSecond(); + List> validTargets = new ArrayList<>(); + TrackEdge edge = currentEntry.getSecond(); + TrackNode node1 = currentEntry.getFirst() + .getFirst(); + TrackNode node2 = currentEntry.getFirst() + .getSecond(); + + TrackNodeLocation loc1 = node1.getLocation(); + TrackNodeLocation loc2 = node2.getLocation(); + boolean enteringBackward = loc2.equals(target.getFirst()) && loc1.equals(target.getSecond()); + boolean enteringForward = loc1.equals(target.getFirst()) && loc2.equals(target.getSecond()); + + if (enteringForward || train.doubleEnded && enteringBackward) { + Pair backTrack = reachedVia.get(edge); + TrackEdge toReach = edge; + while (backTrack != null && toReach != initialEdge) { + if (backTrack.getFirst()) + path.add(0, toReach); + toReach = backTrack.getSecond(); + backTrack = reachedVia.get(backTrack.getSecond()); + } + + distanceToDestination = distance; + double position = destination.position; + if (enteringForward) + position = edge.getLength(node1, node2) - position; + else + distanceToDestination += train.getTotalLength() + 2; + distanceToDestination -= position; + return; + } + + for (Entry entry : graph.getConnectionsFrom(node2) + .entrySet()) { + TrackNode newNode = entry.getKey(); + TrackEdge newEdge = entry.getValue(); + Vec3 currentDirection = edge.getDirection(node1, node2, false); + Vec3 newDirection = newEdge.getDirection(node2, newNode, true); + if (currentDirection.dot(newDirection) < 0) + continue; + if (!visited.add(entry.getValue())) + continue; + validTargets.add(entry); + } + + if (validTargets.isEmpty()) + continue; + + for (Entry entry : validTargets) { + TrackNode newNode = entry.getKey(); + TrackEdge newEdge = entry.getValue(); + reachedVia.put(newEdge, Pair.of(validTargets.size() > 1, edge)); + frontier.add(Pair.of(newEdge.getLength(node2, newNode) + distance, + Pair.of(Couple.create(node2, newNode), newEdge))); + } + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java new file mode 100644 index 000000000..74506d0cf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java @@ -0,0 +1,167 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import java.util.List; +import java.util.UUID; +import java.util.function.Function; + +import com.simibubi.create.Create; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.logistics.trains.TrackGraph; +import com.simibubi.create.content.logistics.trains.entity.MovingPoint.ITrackSelector; +import com.simibubi.create.content.logistics.trains.management.GlobalStation; +import com.simibubi.create.content.logistics.trains.management.ScheduleRuntime; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public class Train { + + public static final double acceleration = 0.005f; + public static final double topSpeed = 1.2f; + + public double speed = 0; + public double targetSpeed = 0; + + public UUID id; + public TrackGraph graph; + public Navigation navigation; + public GlobalStation currentStation; + public ScheduleRuntime runtime; + public TrainIconType icon; + public Component name; + + public boolean doubleEnded; + public List carriages; + public List carriageSpacing; + + double[] stress; + + public Train(UUID id, TrackGraph graph, List carriages, List carriageSpacing) { + this.id = id; + this.graph = graph; + this.carriages = carriages; + this.carriageSpacing = carriageSpacing; + this.icon = TrainIconType.getDefault(); + this.stress = new double[carriageSpacing.size()]; + this.name = Lang.translate("train.unnamed"); + + carriages.forEach(c -> { + c.setTrain(this); + Create.RAILWAYS.carriageById.put(c.id, c); + }); + + doubleEnded = carriages.size() > 1 && carriages.get(carriages.size() - 1).contraption.hasControls(); + navigation = new Navigation(this, graph); + runtime = new ScheduleRuntime(this); + } + + public void tick(Level level) { + runtime.tick(level); + navigation.tick(level); + + double distance = speed; + Carriage previousCarriage = null; + + for (int i = 0; i < carriages.size(); i++) { + Carriage carriage = carriages.get(i); + if (previousCarriage != null) { + int target = carriageSpacing.get(i - 1); + Vec3 leadingAnchor = carriage.leadingBogey().anchorPosition; + Vec3 trailingAnchor = previousCarriage.trailingBogey().anchorPosition; + double actual = leadingAnchor.distanceTo(trailingAnchor); + stress[i - 1] = target - actual; + } + previousCarriage = carriage; + } + + // positive stress: carriages should move apart + // negative stress: carriages should move closer + + boolean approachingStation = navigation.distanceToDestination < 5; + double leadingModifier = approachingStation ? -0.75d : -0.5d; + double trailingModifier = approachingStation ? 0d : 0.125d; + + MovingPoint previous = null; + for (int i = 0; i < carriages.size(); i++) { + double leadingStress = i == 0 ? 0 : stress[i - 1] * leadingModifier; + double trailingStress = i == stress.length ? 0 : stress[i] * trailingModifier; + + Carriage carriage = carriages.get(i); + MovingPoint toFollow = previous; + Function control = + previous == null ? navigation::control : mp -> mp.follow(toFollow); + double actualDistance = carriage.travel(level, distance + leadingStress + trailingStress, control); + + if (i == 0) + distance = actualDistance; + previous = carriage.getTrailingPoint(); + } + + if (navigation.destination != null) { + navigation.distanceToDestination -= distance; + } + } + + public boolean disassemble(Direction assemblyDirection, BlockPos pos) { + for (Carriage carriage : carriages) { + CarriageContraptionEntity entity = carriage.entity.get(); + if (entity == null) + return false; + if (!Mth.equal(entity.pitch, 0)) + return false; + if (!Mth.equal(((entity.yaw % 90) + 360) % 90, 0)) + return false; + } + + int offset = 1; + for (int i = 0; i < carriages.size(); i++) { + + Carriage carriage = carriages.get(i); + CarriageContraptionEntity entity = carriage.entity.get(); + if (entity == null) + return false; + + entity.setPos(Vec3.atLowerCornerOf(pos.relative(assemblyDirection, offset))); + entity.disassemble(); + Create.RAILWAYS.carriageById.remove(carriage.id); + CreateClient.RAILWAYS.carriageById.remove(carriage.id); + + offset += carriage.bogeySpacing; + if (i < carriageSpacing.size()) + offset += carriageSpacing.get(i); + } + + if (currentStation != null) + currentStation.cancelReservation(this); + + Create.RAILWAYS.trains.remove(id); + CreateClient.RAILWAYS.trains.remove(id); + return true; + } + + public int getTotalLength() { + int length = 0; + for (int i = 0; i < carriages.size(); i++) { + length += carriages.get(i).bogeySpacing; + if (i < carriageSpacing.size()) + length += carriageSpacing.get(i); + } + return length; + } + + public void leave() { + currentStation.trainDeparted(this); + currentStation = null; + } + + public void arriveAt(GlobalStation station) { + currentStation = station; + runtime.destinationReached(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainIconType.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainIconType.java new file mode 100644 index 000000000..3db2e3800 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainIconType.java @@ -0,0 +1,89 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import java.util.HashMap; +import java.util.Map; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.Create; + +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class TrainIconType { + + public static Map REGISTRY = new HashMap<>(); + + public static void register(ResourceLocation id, ResourceLocation sheet, int x, int y) { + REGISTRY.put(id, new TrainIconType(id, sheet, x, y)); + } + + static { + ResourceLocation sheet = Create.asResource("textures/gui/assemble.png"); + register(Create.asResource("traditional"), sheet, 2, 205); + register(Create.asResource("electric"), sheet, 2, 216); + register(Create.asResource("modern"), sheet, 2, 227); + } + + ResourceLocation sheet; + ResourceLocation id; + int x, y; + + public TrainIconType(ResourceLocation id, ResourceLocation sheet, int x, int y) { + this.id = id; + this.sheet = sheet; + this.x = x; + this.y = y; + } + + public static TrainIconType byId(ResourceLocation id) { + return REGISTRY.getOrDefault(id, getDefault()); + } + + public static TrainIconType getDefault() { + return REGISTRY.get(Create.asResource("traditional")); + } + + public ResourceLocation getId() { + return id; + } + + public static final int ENGINE = -1; + public static final int FLIPPED_ENGINE = -2; + + @OnlyIn(Dist.CLIENT) + public int render(int lengthOrEngine, PoseStack ms, int x, int y) { + int offset = getIconOffset(lengthOrEngine); + int width = getIconWidth(lengthOrEngine); + RenderSystem.setShaderTexture(0, sheet); + GuiComponent.blit(ms, x, y, 0, this.x + offset, this.y, width, 10, 256, 256); + return width; + } + + public int getIconWidth(int lengthOrEngine) { + if (lengthOrEngine == FLIPPED_ENGINE) + return 19; + if (lengthOrEngine == ENGINE) + return 19; + if (lengthOrEngine < 3) + return 7; + if (lengthOrEngine < 9) + return 13; + return 19; + } + + public int getIconOffset(int lengthOrEngine) { + if (lengthOrEngine == FLIPPED_ENGINE) + return 0; + if (lengthOrEngine == ENGINE) + return 62; + if (lengthOrEngine < 3) + return 34; + if (lengthOrEngine < 9) + return 20; + return 42; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/AbstractStationScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/AbstractStationScreen.java new file mode 100644 index 000000000..66d1037ac --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/AbstractStationScreen.java @@ -0,0 +1,91 @@ +package com.simibubi.create.content.logistics.trains.management; + +import java.lang.ref.WeakReference; +import java.util.List; + +import com.jozufozu.flywheel.util.transform.TransformStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.logistics.trains.entity.Carriage; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.entity.TrainIconType; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.element.GuiGameElement; +import com.simibubi.create.foundation.gui.widget.IconButton; + +import net.minecraft.core.Direction; +import net.minecraft.network.chat.TextComponent; + +public abstract class AbstractStationScreen extends AbstractSimiScreen { + + protected AllGuiTextures background; + protected StationTileEntity te; + protected GlobalStation station; + + protected WeakReference displayedTrain; + + private IconButton confirmButton; + + public AbstractStationScreen(StationTileEntity te, GlobalStation station) { + super(new TextComponent("Station")); + this.te = te; + this.station = station; + displayedTrain = new WeakReference<>(null); + } + + @Override + protected void init() { + setWindowSize(background.width, background.height); + setWindowOffset(-20, 0); + super.init(); + clearWidgets(); + + int x = guiLeft; + int y = guiTop; + + confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); + confirmButton.withCallback(this::onClose); + addRenderableWidget(confirmButton); + } + + public int getTrainIconWidth(Train train) { + TrainIconType icon = train.icon; + List carriages = train.carriages; + + int w = icon.getIconWidth(TrainIconType.ENGINE); + if (carriages.size() == 1) + return w; + + for (int i = 1; i < carriages.size(); i++) { + if (i == carriages.size() - 1 && train.doubleEnded) { + w += icon.getIconWidth(TrainIconType.FLIPPED_ENGINE) + 1; + break; + } + Carriage carriage = carriages.get(i); + w += icon.getIconWidth(carriage.bogeySpacing) + 1; + } + return w; + } + + @Override + protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + int x = guiLeft; + int y = guiTop; + + background.render(ms, x, y, this); + + ms.pushPose(); + TransformStack.cast(ms) + .pushPose() + .translate(x + 200, y + background.height + 20, 100) + .scale(40) + .rotateX(-22) + .rotateY(63); + GuiGameElement.of(te.getBlockState() + .setValue(StationBlock.FACING, Direction.EAST)) + .render(ms); + ms.popPose(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/AssemblyScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/AssemblyScreen.java new file mode 100644 index 000000000..25c446c17 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/AssemblyScreen.java @@ -0,0 +1,220 @@ +package com.simibubi.create.content.logistics.trains.management; + +import java.lang.ref.WeakReference; +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; +import com.simibubi.create.content.logistics.trains.entity.Carriage; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.entity.TrainIconType; +import com.simibubi.create.foundation.gui.AllGuiTextures; +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.gui.widget.ScrollInput; +import com.simibubi.create.foundation.networking.AllPackets; + +import net.minecraft.client.gui.components.Widget; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; + +public class AssemblyScreen extends AbstractStationScreen { + + private IconButton quitAssembly; + private IconButton toggleAssemblyButton; + private IconButton completeAssembly; + + private List iconTypes; + private ScrollInput iconTypeScroll; + + public AssemblyScreen(StationTileEntity te, GlobalStation station) { + super(te, station); + background = AllGuiTextures.STATION_ASSEMBLING; + } + + @Override + protected void init() { + super.init(); + int x = guiLeft; + int y = guiTop; + int by = y + background.height - 24; + + Widget widget = renderables.get(0); + if (widget instanceof IconButton ib) { + ib.setIcon(AllIcons.I_PRIORITY_VERY_LOW); + ib.setToolTip(new TextComponent("Close Window")); + } + + iconTypes = TrainIconType.REGISTRY.keySet() + .stream() + .toList(); + iconTypeScroll = new ScrollInput(x + 4, y + 17, 184, 14).titled(new TextComponent("Icon Type")); + iconTypeScroll.withRange(0, iconTypes.size()); + iconTypeScroll.withStepFunction(ctx -> -iconTypeScroll.standardStep() + .apply(ctx)); + iconTypeScroll.calling(s -> { + Train train = displayedTrain.get(); + if (train != null) + train.icon = TrainIconType.byId(iconTypes.get(s)); + }); + iconTypeScroll.active = iconTypeScroll.visible = false; + addRenderableWidget(iconTypeScroll); + + toggleAssemblyButton = new WideIconButton(x + 83, by, AllGuiTextures.I_ASSEMBLE_TRAIN); + toggleAssemblyButton.active = false; + toggleAssemblyButton.setToolTip(new TextComponent("Assemble Train")); + toggleAssemblyButton.withCallback(() -> { + AllPackets.channel.sendToServer(StationEditPacket.tryAssemble(te.getBlockPos())); + }); + + quitAssembly = new IconButton(x + 62, by, AllIcons.I_DISABLE); + quitAssembly.active = true; + quitAssembly.setToolTip(new TextComponent("Cancel Assembly")); + quitAssembly.withCallback(() -> { + AllPackets.channel.sendToServer(StationEditPacket.configure(te.getBlockPos(), false, station.name)); + minecraft.setScreen(new StationScreen(te, station)); + }); + + completeAssembly = new IconButton(x + 112, by, AllIcons.I_CONFIRM); + completeAssembly.active = false; + completeAssembly.setToolTip(new TextComponent("Complete Assembly")); + completeAssembly.withCallback(() -> { + AllPackets.channel.sendToServer(StationEditPacket.configure(te.getBlockPos(), false, station.name)); + minecraft.setScreen(new StationScreen(te, station)); + }); + + addRenderableWidget(toggleAssemblyButton); + addRenderableWidget(quitAssembly); + addRenderableWidget(completeAssembly); + + tickTrainDisplay(); + } + + @Override + public void tick() { + super.tick(); + tickTrainDisplay(); + Train train = displayedTrain.get(); + toggleAssemblyButton.active = te.bogeyCount > 0 || train != null; + } + + private void tickTrainDisplay() { + Train train = displayedTrain.get(); + Train imminentTrain = station.getPresentTrain(); + + if (train == null) { + if (imminentTrain != null) { + displayedTrain = new WeakReference<>(imminentTrain); + completeAssembly.active = true; + quitAssembly.active = false; + iconTypeScroll.active = iconTypeScroll.visible = true; + toggleAssemblyButton.setToolTip(new TextComponent("Disassemble Train")); + toggleAssemblyButton.setIcon(AllGuiTextures.I_DISASSEMBLE_TRAIN); + toggleAssemblyButton.withCallback(() -> { + AllPackets.channel.sendToServer(StationEditPacket.tryDisassemble(te.getBlockPos())); + }); + } + } else { + if (imminentTrain == null) { + displayedTrain = new WeakReference<>(null); + completeAssembly.active = false; + quitAssembly.active = true; + iconTypeScroll.active = iconTypeScroll.visible = false; + toggleAssemblyButton.setToolTip(new TextComponent("Assemble Train")); + toggleAssemblyButton.setIcon(AllGuiTextures.I_ASSEMBLE_TRAIN); + toggleAssemblyButton.withCallback(() -> { + AllPackets.channel.sendToServer(StationEditPacket.tryAssemble(te.getBlockPos())); + }); + } + } + } + + @Override + protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + super.renderWindow(ms, mouseX, mouseY, partialTicks); + int x = guiLeft; + int y = guiTop; + + TextComponent header = new TextComponent("Train Assembly"); + font.draw(ms, header, x + background.width / 2 - font.width(header) / 2, y + 4, 0x0E2233); + + Train train = displayedTrain.get(); + if (train != null) { + + TrainIconType icon = train.icon; + int offset = 0; + int position = background.width / 2 - getTrainIconWidth(train) / 2; + + List carriages = train.carriages; + for (int i = carriages.size() - 1; i > 0; i--) { + if (i == carriages.size() - 1 && train.doubleEnded) { + offset += icon.render(TrainIconType.FLIPPED_ENGINE, ms, x + offset + position, y + 20) + 1; + continue; + } + Carriage carriage = carriages.get(i); + offset += icon.render(carriage.bogeySpacing, ms, x + offset + position, y + 20) + 1; + } + offset += icon.render(TrainIconType.ENGINE, ms, x + offset + position, y + 20); + + UIRenderHelper.drawStretched(ms, x + 21, y + 43, 150, 96, -100, AllGuiTextures.STATION_TEXTBOX_MIDDLE); + AllGuiTextures.STATION_TEXTBOX_TOP.render(ms, x + 21, y + 42); + AllGuiTextures.STATION_TEXTBOX_BOTTOM.render(ms, x + 21, y + 136); + AllGuiTextures.STATION_TEXTBOX_SPEECH.render(ms, x + offset + position - 12, y + 38); + + TextComponent text = new TextComponent("Assembly Successful"); + font.drawShadow(ms, text, x + 97 - font.width(text) / 2, y + 47, 0xC6C6C6); + font.drawShadow(ms, + new TextComponent("-> " + train.carriages.size() + " Carriages, " + train.getTotalLength() + "m"), + x + 30, y + 67, 0xC6C6C6); + font.drawShadow(ms, new TextComponent("-> Fuel Type: NYI"), x + 30, y + 77, 0xC6C6C6); + + font.drawShadow(ms, new TextComponent("-> " + (train.doubleEnded ? "Dual Powered" : "Single Powered")), + x + 30, y + 92, 0xC6C6C6); + font.drawShadow(ms, + new TextComponent((train.doubleEnded ? "(Navigates both ways)" : "(Navigates forward only)")), x + 30, + y + 102, 0xACC4BC); + return; + } + + AssemblyException lastAssemblyException = te.getLastAssemblyException(); + if (lastAssemblyException != null) { + TextComponent text = new TextComponent("Assembly Failed"); + font.draw(ms, text, x + 97 - font.width(text) / 2, y + 47, 0x775B5B); + int offset = 0; + if (te.failedCarriageIndex != -1) { + font.draw(ms, new TextComponent("Carriage " + te.failedCarriageIndex + ":"), x + 30, y + 67, 0x7A7A7A); + offset += 10; + } + font.drawWordWrap(lastAssemblyException.component, x + 30, y + 67 + offset, 134, 0x775B5B); + offset += font.split(lastAssemblyException.component, 134) + .size() * 9 + 5; + font.drawWordWrap(new TextComponent("Resolve this and retry"), x + 30, y + 67 + offset, 134, 0x7A7A7A); + return; + } + + int bogeyCount = te.bogeyCount; + + TextComponent text = + new TextComponent(bogeyCount == 0 ? "No Bogeys" : bogeyCount + (bogeyCount == 1 ? " Bogey" : " Bogeys")); + font.draw(ms, text, x + 97 - font.width(text) / 2, y + 47, 0x7A7A7A); + + Component component = + new TextComponent("Right-click on highlighted Tracks to create bogeys. Use Wrench to cycle type." + + "\n\nAttach structures to one or between two bogeys to form carriages."); + font.drawWordWrap(component, x + 30, y + 67, 134, 0x7A7A7A); + } + + @Override + public void removed() { + super.removed(); + Train train = displayedTrain.get(); + if (train != null) { + ResourceLocation iconId = iconTypes.get(iconTypeScroll.getState()); + train.icon = TrainIconType.byId(iconId); + AllPackets.channel.sendToServer(new TrainEditPacket(train.id, "", iconId)); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/GlobalStation.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/GlobalStation.java new file mode 100644 index 000000000..f404fe8ca --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/GlobalStation.java @@ -0,0 +1,95 @@ +package com.simibubi.create.content.logistics.trains.management; + +import java.lang.ref.WeakReference; +import java.util.UUID; + +import javax.annotation.Nullable; + +import com.simibubi.create.content.logistics.trains.TrackNode; +import com.simibubi.create.content.logistics.trains.TrackNodeLocation; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.foundation.utility.Couple; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; + +public class GlobalStation { + + public UUID id; + public Couple edgeLocation; + public double position; + public String name; + public BlockPos stationPos; + + public WeakReference nearestTrain; + + public GlobalStation(UUID id, Couple nodes, double position, BlockPos stationPos) { + this.id = id; + this.stationPos = stationPos; + this.position = position; + name = "Track Station"; + edgeLocation = nodes.map(TrackNode::getLocation); + nearestTrain = new WeakReference(null); + } + + public GlobalStation(CompoundTag nbt) { + id = nbt.getUUID("Id"); + name = nbt.getString("Name"); + position = nbt.getDouble("Position"); + stationPos = NbtUtils.readBlockPos(nbt.getCompound("StationPos")); + nearestTrain = new WeakReference(null); + edgeLocation = Couple.deserializeEach(nbt.getList("Edge", Tag.TAG_COMPOUND), + tag -> TrackNodeLocation.fromPackedPos(NbtUtils.readBlockPos(tag))); + } + + public void reserveFor(Train train) { + Train nearestTrain = this.nearestTrain.get(); + if (nearestTrain == null + || nearestTrain.navigation.distanceToDestination > train.navigation.distanceToDestination) + this.nearestTrain = new WeakReference<>(train); + } + + public void cancelReservation(Train train) { + if (nearestTrain.get() == train) + nearestTrain = new WeakReference<>(null); + } + + public void trainDeparted(Train train) { + cancelReservation(train); + } + + @Nullable + public Train getPresentTrain() { + Train nearestTrain = this.nearestTrain.get(); + if (nearestTrain == null || nearestTrain.currentStation != this) + return null; + return nearestTrain; + } + + @Nullable + public Train getImminentTrain() { + Train nearestTrain = this.nearestTrain.get(); + if (nearestTrain == null) + return nearestTrain; + if (nearestTrain.currentStation == this) + return nearestTrain; + if (!nearestTrain.navigation.isActive()) + return null; + if (nearestTrain.navigation.distanceToDestination > 30) + return null; + return nearestTrain; + } + + public CompoundTag write() { + CompoundTag nbt = new CompoundTag(); + nbt.putUUID("Id", id); + nbt.putString("Name", name); + nbt.put("StationPos", NbtUtils.writeBlockPos(stationPos)); + nbt.putDouble("Position", position); + nbt.put("Edge", edgeLocation.serializeEach(loc -> NbtUtils.writeBlockPos(new BlockPos(loc)))); + return nbt; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/NoShadowFontWrapper.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/NoShadowFontWrapper.java new file mode 100644 index 000000000..107216bf2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/NoShadowFontWrapper.java @@ -0,0 +1,136 @@ +package com.simibubi.create.content.logistics.trains.management; + +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; + +import net.minecraft.client.StringSplitter; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.font.FontSet; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.FormattedText; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.FormattedCharSequence; + +public class NoShadowFontWrapper extends Font { + + private Font wrapped; + + public NoShadowFontWrapper(Font wrapped) { + super(null); + this.wrapped = wrapped; + } + + public FontSet getFontSet(ResourceLocation pFontLocation) { + return wrapped.getFontSet(pFontLocation); + } + + public int drawShadow(PoseStack pPoseStack, String pText, float pX, float pY, int pColor) { + return wrapped.draw(pPoseStack, pText, pX, pY, pColor); + } + + public int drawShadow(PoseStack pPoseStack, String pText, float pX, float pY, int pColor, boolean pTransparent) { + return wrapped.draw(pPoseStack, pText, pX, pY, pColor); + } + + public int draw(PoseStack pPoseStack, String pText, float pX, float pY, int pColor) { + return wrapped.draw(pPoseStack, pText, pX, pY, pColor); + } + + public int drawShadow(PoseStack pPoseStack, FormattedCharSequence pText, float pX, float pY, int pColor) { + return wrapped.draw(pPoseStack, pText, pX, pY, pColor); + } + + public int drawShadow(PoseStack pPoseStack, Component pText, float pX, float pY, int pColor) { + return wrapped.draw(pPoseStack, pText, pX, pY, pColor); + } + + public int draw(PoseStack pPoseStack, FormattedCharSequence pText, float pX, float pY, int pColor) { + return wrapped.draw(pPoseStack, pText, pX, pY, pColor); + + } + + public int draw(PoseStack pPoseStack, Component pText, float pX, float pY, int pColor) { + return wrapped.draw(pPoseStack, pText, pX, pY, pColor); + } + + public String bidirectionalShaping(String pText) { + return wrapped.bidirectionalShaping(pText); + } + + public int drawInBatch(String pText, float pX, float pY, int pColor, boolean pDropShadow, Matrix4f pMatrix, + MultiBufferSource pBuffer, boolean pTransparent, int pBackgroundColor, int pPackedLight) { + return wrapped.drawInBatch(pText, pX, pY, pColor, pDropShadow, pMatrix, pBuffer, pTransparent, pBackgroundColor, + pPackedLight); + } + + public int drawInBatch(String pText, float pX, float pY, int pColor, boolean pDropShadow, Matrix4f pMatrix, + MultiBufferSource pBuffer, boolean pTransparent, int pBackgroundColor, int pPackedLight, boolean pBidiFlag) { + return wrapped.drawInBatch(pText, pX, pY, pColor, pDropShadow, pMatrix, pBuffer, pTransparent, pBackgroundColor, + pPackedLight, pBidiFlag); + } + + public int drawInBatch(Component pText, float pX, float pY, int pColor, boolean pDropShadow, Matrix4f pMatrix, + MultiBufferSource pBuffer, boolean pTransparent, int pBackgroundColor, int pPackedLight) { + return wrapped.drawInBatch(pText, pX, pY, pColor, pDropShadow, pMatrix, pBuffer, pTransparent, pBackgroundColor, + pPackedLight); + } + + public int drawInBatch(FormattedCharSequence pText, float pX, float pY, int pColor, boolean pDropShadow, + Matrix4f pMatrix, MultiBufferSource pBuffer, boolean pTransparent, int pBackgroundColor, int pPackedLight) { + return wrapped.drawInBatch(pText, pX, pY, pColor, pDropShadow, pMatrix, pBuffer, pTransparent, pBackgroundColor, + pPackedLight); + } + + public void drawInBatch8xOutline(FormattedCharSequence pText, float pX, float pY, int pColor, int pBackgroundColor, + Matrix4f pMatrix, MultiBufferSource pBuffer, int pPackedLightCoords) { + wrapped.drawInBatch8xOutline(pText, pX, pY, pColor, pBackgroundColor, pMatrix, pBuffer, pPackedLightCoords); + } + + public int width(String pText) { + return wrapped.width(pText); + } + + public int width(FormattedText pText) { + return wrapped.width(pText); + } + + public int width(FormattedCharSequence pText) { + return wrapped.width(pText); + } + + public String plainSubstrByWidth(String p_92838_, int p_92839_, boolean p_92840_) { + return wrapped.plainSubstrByWidth(p_92838_, p_92839_, p_92840_); + } + + public String plainSubstrByWidth(String pText, int pMaxWidth) { + return wrapped.plainSubstrByWidth(pText, pMaxWidth); + } + + public FormattedText substrByWidth(FormattedText pText, int pMaxWidth) { + return wrapped.substrByWidth(pText, pMaxWidth); + } + + public void drawWordWrap(FormattedText pText, int pX, int pY, int pMaxWidth, int pColor) { + wrapped.drawWordWrap(pText, pX, pY, pMaxWidth, pColor); + } + + public int wordWrapHeight(String pStr, int pMaxWidth) { + return wrapped.wordWrapHeight(pStr, pMaxWidth); + } + + public List split(FormattedText pText, int pMaxWidth) { + return wrapped.split(pText, pMaxWidth); + } + + public boolean isBidirectional() { + return wrapped.isBidirectional(); + } + + public StringSplitter getSplitter() { + return wrapped.getSplitter(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/RunningScheduleScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/RunningScheduleScreen.java new file mode 100644 index 000000000..3ed0e3333 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/RunningScheduleScreen.java @@ -0,0 +1,10 @@ +package com.simibubi.create.content.logistics.trains.management; + +public class RunningScheduleScreen { + + /** + * use the same rendering and mouse handling from schedule screen but add + * progress of train based on ScheduleRuntime + */ + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleContainer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleContainer.java new file mode 100644 index 000000000..9adb11a56 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleContainer.java @@ -0,0 +1,100 @@ +package com.simibubi.create.content.logistics.trains.management; + +import com.simibubi.create.foundation.gui.container.GhostItemContainer; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; + +public class ScheduleContainer extends GhostItemContainer { + + public boolean slotsActive = true; + public boolean targetSlotActive = true; + + public ScheduleContainer(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + super(type, id, inv, extraData); + } + + public ScheduleContainer(MenuType type, int id, Inventory inv, ItemStack contentHolder) { + super(type, id, inv, contentHolder); + } + + @Override + protected ItemStackHandler createGhostInventory() { + return new ItemStackHandler(1); + } + + @Override + public void clicked(int slotId, int dragType, ClickType clickTypeIn, Player player) { + if (slotId != playerInventory.selected || clickTypeIn == ClickType.THROW) + super.clicked(slotId, dragType, clickTypeIn, player); + } + + @Override + protected boolean allowRepeats() { + return true; + } + + @Override + protected ItemStack createOnClient(FriendlyByteBuf extraData) { + return extraData.readItem(); + } + + @Override + protected void addSlots() { + addPlayerSlots(46, 140); + addSlot(new InactiveItemHandlerSlot(ghostInventory, 0, 54, 88)); + } + + @Override + protected void addPlayerSlots(int x, int y) { + for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) + this.addSlot(new InactiveSlot(playerInventory, hotbarSlot, x + hotbarSlot * 18, y + 58)); + for (int row = 0; row < 3; ++row) + for (int col = 0; col < 9; ++col) + this.addSlot(new InactiveSlot(playerInventory, col + row * 9 + 9, x + col * 18, y + row * 18)); + } + + @Override + protected void saveData(ItemStack contentHolder) {} + + @Override + public boolean stillValid(Player player) { + return playerInventory.getSelected() == contentHolder; + } + + class InactiveSlot extends Slot { + + public InactiveSlot(Container pContainer, int pIndex, int pX, int pY) { + super(pContainer, pIndex, pX, pY); + } + + @Override + public boolean isActive() { + return slotsActive; + } + + } + + class InactiveItemHandlerSlot extends SlotItemHandler { + + public InactiveItemHandlerSlot(IItemHandler itemHandler, int index, int xPosition, int yPosition) { + super(itemHandler, index, xPosition, yPosition); + } + + @Override + public boolean isActive() { + return slotsActive && targetSlotActive; + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleItem.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleItem.java new file mode 100644 index 000000000..e5a8a92f8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleItem.java @@ -0,0 +1,97 @@ +package com.simibubi.create.content.logistics.trains.management; + +import com.simibubi.create.AllContainerTypes; +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.management.schedule.Schedule; + +import net.minecraft.core.NonNullList; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraftforge.network.NetworkHooks; + +public class ScheduleItem extends Item implements MenuProvider { + + public ScheduleItem(Properties pProperties) { + super(pProperties); + } + + @Override + public InteractionResult useOn(UseOnContext context) { + if (context.getPlayer() == null) + return InteractionResult.PASS; + return use(context.getLevel(), context.getPlayer(), context.getHand()).getResult(); + } + + @Override + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + ItemStack heldItem = player.getItemInHand(hand); + + if (!player.isShiftKeyDown() && hand == InteractionHand.MAIN_HAND) { + if (!world.isClientSide && player instanceof ServerPlayer) + NetworkHooks.openGui((ServerPlayer) player, this, buf -> { + buf.writeItem(heldItem); + }); + return InteractionResultHolder.success(heldItem); + } + return InteractionResultHolder.pass(heldItem); + } + + @Override + public InteractionResult interactLivingEntity(ItemStack pStack, Player pPlayer, LivingEntity pInteractionTarget, + InteractionHand pUsedHand) { + InteractionResult pass = InteractionResult.PASS; + + if (!pStack.hasTag()) + return pass; + if (!pStack.getTag() + .contains("Schedule")) + return pass; + + Schedule schedule = Schedule.fromTag(pStack.getTagElement("Schedule")); + + if (pInteractionTarget == null) + return pass; + Entity rootVehicle = pInteractionTarget.getRootVehicle(); + if (!(rootVehicle instanceof CarriageContraptionEntity)) + return pass; + if (pPlayer.level.isClientSide) + return InteractionResult.SUCCESS; + CarriageContraptionEntity entity = (CarriageContraptionEntity) rootVehicle; + Contraption contraption = entity.getContraption(); + if (contraption instanceof CarriageContraption cc) + cc.getCarriage().train.runtime.setSchedule(schedule, false); + return InteractionResult.SUCCESS; + } + + @Override + public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) { + ItemStack heldItem = player.getMainHandItem(); + return new ScheduleContainer(AllContainerTypes.SCHEDULE.get(), id, inv, heldItem); + } + + @Override + public Component getDisplayName() { + return new TranslatableComponent(getDescriptionId()); + } + + @Override + public void fillItemCategory(CreativeModeTab pCategory, NonNullList pItems) {} + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleRuntime.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleRuntime.java new file mode 100644 index 000000000..c22e180da --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleRuntime.java @@ -0,0 +1,170 @@ +package com.simibubi.create.content.logistics.trains.management; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.management.schedule.FilteredDestination; +import com.simibubi.create.content.logistics.trains.management.schedule.Schedule; +import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleDestination; +import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleEntry; +import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleWaitCondition; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; + +public class ScheduleRuntime { + + enum State { + PRE_TRANSIT, IN_TRANSIT, POST_TRANSIT + } + + Train train; + Schedule schedule; + + boolean paused; + boolean isAutoSchedule; + int currentEntry; + State state; + + static final int INTERVAL = 40; + int cooldown; + List conditionProgress; + List conditionContext; + + public ScheduleRuntime(Train train) { + this.train = train; + reset(); + } + + public void destinationReached() { + if (state != State.IN_TRANSIT) + return; + state = State.POST_TRANSIT; + conditionProgress.clear(); + if (currentEntry >= schedule.entries.size()) + return; + List> conditions = schedule.entries.get(currentEntry).conditions; + for (int i = 0; i < conditions.size(); i++) { + conditionProgress.add(0); + conditionContext.add(new CompoundTag()); + } + } + + public void tick(Level level) { + if (schedule == null) + return; + if (paused) + return; + if (train.navigation.destination != null) + return; + if (currentEntry >= schedule.entries.size()) { + currentEntry = 0; + if (!schedule.cyclic) + paused = true; + return; + } + + if (cooldown-- > 0) + return; + if (state == State.IN_TRANSIT) + return; + if (state == State.POST_TRANSIT) { + tickConditions(level); + return; + } + + GlobalStation nextStation = findNextStation(); + if (nextStation == null) { + cooldown = INTERVAL; + return; + } + if (nextStation == train.currentStation) { + state = State.IN_TRANSIT; + destinationReached(); + return; + } + + train.navigation.setDestination(nextStation); + state = State.IN_TRANSIT; + } + + public void tickConditions(Level level) { + List> conditions = schedule.entries.get(currentEntry).conditions; + for (int i = 0; i < conditions.size(); i++) { + List list = conditions.get(i); + int progress = conditionProgress.get(i); + + if (progress >= list.size()) { + state = State.PRE_TRANSIT; + currentEntry++; + return; + } + + CompoundTag tag = conditionContext.get(i); + ScheduleWaitCondition condition = list.get(progress); + if (condition.tickCompletion(level, train, tag)) { + conditionContext.set(i, new CompoundTag()); + conditionProgress.set(i, progress + 1); + } + } + } + + public GlobalStation findNextStation() { + ScheduleEntry entry = schedule.entries.get(currentEntry); + ScheduleDestination destination = entry.destination; + if (destination instanceof FilteredDestination filtered) { + for (GlobalStation globalStation : train.graph.getStations()) { + if (globalStation.name.equals(filtered.nameFilter)) + return globalStation; + } + } + return null; + } + + public void setSchedule(Schedule schedule, boolean auto) { + reset(); + this.schedule = schedule; + currentEntry = 0; + paused = false; + isAutoSchedule = auto; + } + + public Schedule getSchedule() { + return schedule; + } + + public void discardSchedule() { + reset(); + } + + private void reset() { + paused = true; + isAutoSchedule = false; + currentEntry = 0; + schedule = null; + state = State.PRE_TRANSIT; + conditionProgress = new ArrayList<>(); + conditionContext = new ArrayList<>(); + } + + public CompoundTag write() { + CompoundTag tag = new CompoundTag(); + tag.putInt("CurrentEntry", currentEntry); + tag.putBoolean("AutoSchedule", isAutoSchedule); + tag.putBoolean("Paused", paused); + if (schedule != null) + tag.put("Schedule", schedule.write()); + return tag; + } + + public void read(CompoundTag tag) { + reset(); + paused = tag.getBoolean("Paused"); + isAutoSchedule = tag.getBoolean("AutoSchedule"); + currentEntry = tag.getInt("CurrentEntry"); + if (tag.contains("Schedule")) + schedule = Schedule.fromTag(tag.getCompound("Schedule")); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleScreen.java new file mode 100644 index 000000000..fa75d6acc --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/ScheduleScreen.java @@ -0,0 +1,941 @@ +package com.simibubi.create.content.logistics.trains.management; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL30; + +import com.google.common.collect.ImmutableList; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; +import com.mojang.blaze3d.platform.InputConstants; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; +import com.simibubi.create.content.logistics.trains.management.schedule.FilteredDestination; +import com.simibubi.create.content.logistics.trains.management.schedule.IScheduleInput; +import com.simibubi.create.content.logistics.trains.management.schedule.Schedule; +import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleDestination; +import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleEditPacket; +import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleEntry; +import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleWaitCondition; +import com.simibubi.create.content.logistics.trains.management.schedule.ScheduledDelay; +import com.simibubi.create.content.logistics.trains.management.schedule.TimedWaitCondition.TimeUnit; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.UIRenderHelper; +import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen; +import com.simibubi.create.foundation.gui.element.GuiGameElement; +import com.simibubi.create.foundation.gui.widget.AbstractSimiWidget; +import com.simibubi.create.foundation.gui.widget.IconButton; +import com.simibubi.create.foundation.gui.widget.Indicator; +import com.simibubi.create.foundation.gui.widget.Indicator.State; +import com.simibubi.create.foundation.gui.widget.Label; +import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.Widget; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.renderer.Rect2i; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraftforge.client.gui.GuiUtils; + +public class ScheduleScreen extends AbstractSimiContainerScreen { + + private static final int CARD_HEADER = 22; + private static final int CARD_WIDTH = 195; + + private List extraAreas = Collections.emptyList(); + + private List horizontalScrolls = new ArrayList<>(); + private LerpedFloat scroll = LerpedFloat.linear() + .startWithValue(0); + + Schedule schedule; + + private IconButton confirmButton; + private IconButton cyclicButton; + private Indicator cyclicIndicator; + + private ScheduleDestination editingDestination; + private ScheduleWaitCondition editingCondition; + private SelectionScrollInput scrollInput; + private Label scrollInputLabel; + private IconButton editorConfirm, editorDelete; + private Consumer onEditorClose; + private List>> editorSubWidgets; + private List editorDividers; + + public ScheduleScreen(ScheduleContainer container, Inventory inv, Component title) { + super(container, inv, title); + schedule = new Schedule(); + CompoundTag tag = container.contentHolder.getOrCreateTag() + .getCompound("Schedule"); + if (!tag.isEmpty()) + schedule = Schedule.fromTag(tag); + container.slotsActive = false; + editorSubWidgets = new ArrayList<>(); + } + + @Override + protected void init() { + AllGuiTextures bg = AllGuiTextures.SCHEDULE; + setWindowSize(bg.width, bg.height + 22); + super.init(); + clearWidgets(); + + confirmButton = new IconButton(leftPos + bg.width - 42, topPos + bg.height - 24, AllIcons.I_CONFIRM); + confirmButton.withCallback(() -> minecraft.player.closeContainer()); + addRenderableWidget(confirmButton); + + cyclicIndicator = new Indicator(leftPos + 21, topPos + 196, TextComponent.EMPTY); + cyclicIndicator.state = schedule.cyclic ? State.ON : State.OFF; + addRenderableWidget(cyclicIndicator); + + cyclicButton = new IconButton(leftPos + 21, topPos + 202, AllIcons.I_REFRESH); + cyclicButton.withCallback(() -> { + schedule.cyclic = !schedule.cyclic; + cyclicIndicator.state = schedule.cyclic ? State.ON : State.OFF; + }); + List tip = cyclicButton.getToolTip(); + tip.add(Lang.translate("schedule.loop")); + tip.add(Lang.translate("schedule.loop1") + .withStyle(ChatFormatting.GRAY)); + tip.add(Lang.translate("schedule.loop2") + .withStyle(ChatFormatting.GRAY)); + + addRenderableWidget(cyclicButton); + + stopEditing(); + extraAreas = ImmutableList.of(new Rect2i(leftPos + 255, topPos + 182, 45, 45)); + horizontalScrolls.clear(); + for (int i = 0; i < schedule.entries.size(); i++) + horizontalScrolls.add(LerpedFloat.linear() + .startWithValue(0)); + } + + protected void startEditing(IScheduleInput field, Consumer onClose, boolean allowDeletion) { + onEditorClose = onClose; + confirmButton.visible = false; + cyclicButton.visible = false; + cyclicIndicator.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); + if (allowDeletion) + editorDelete = new IconButton(leftPos + 56 - 45, topPos + 65 + 22, AllIcons.I_TRASH); + menu.slotsActive = true; + menu.targetSlotActive = field.needsSlot(); + + if (field instanceof ScheduleDestination dest) { + int startIndex = 0; + for (int i = 0; i < Schedule.DESTINATION_TYPES.size(); i++) + if (Schedule.DESTINATION_TYPES.get(i) + .getFirst() + .equals(dest.getId())) + startIndex = i; + editingDestination = dest; + updateEditorSubwidgets(editingDestination); + scrollInput.forOptions(Schedule.getTypeOptions(Schedule.DESTINATION_TYPES)) + .titled(Lang.translate("schedule.destination_type")) + .writingTo(scrollInputLabel) + .calling(index -> { + ScheduleDestination newlyCreated = Schedule.DESTINATION_TYPES.get(index) + .getSecond() + .get(); + if (editingDestination.getId() + .equals(newlyCreated.getId())) + return; + editingDestination = newlyCreated; + updateEditorSubwidgets(editingDestination); + }) + .setState(startIndex); + } + + if (field instanceof ScheduleWaitCondition cond) { + int startIndex = 0; + for (int i = 0; i < Schedule.CONDITION_TYPES.size(); i++) + if (Schedule.CONDITION_TYPES.get(i) + .getFirst() + .equals(cond.getId())) + startIndex = i; + editingCondition = cond; + updateEditorSubwidgets(editingCondition); + scrollInput.forOptions(Schedule.getTypeOptions(Schedule.CONDITION_TYPES)) + .titled(Lang.translate("schedule.condition_type")) + .writingTo(scrollInputLabel) + .calling(index -> { + ScheduleWaitCondition newlyCreated = Schedule.CONDITION_TYPES.get(index) + .getSecond() + .get(); + if (editingCondition.getId() + .equals(newlyCreated.getId())) + return; + editingCondition = newlyCreated; + updateEditorSubwidgets(editingCondition); + }) + .setState(startIndex); + } + + addRenderableWidget(scrollInput); + addRenderableWidget(scrollInputLabel); + addRenderableWidget(editorConfirm); + if (allowDeletion) + addRenderableWidget(editorDelete); + } + + protected void stopEditing() { + confirmButton.visible = true; + cyclicButton.visible = true; + cyclicIndicator.visible = true; + if (editingCondition == null && editingDestination == null) + return; + removeWidget(scrollInput); + removeWidget(scrollInputLabel); + removeWidget(editorConfirm); + removeWidget(editorDelete); + IScheduleInput editing = editingCondition == null ? editingDestination : editingCondition; + editing.setItem(menu.getSlot(36) + .getItem()); + editorSubWidgets.forEach(p -> p.getSecond() + .accept(editing, p.getFirst())); + editorSubWidgets.forEach(p -> removeWidget(p.getFirst())); + editorSubWidgets.clear(); + editorDividers = null; + editingCondition = null; + editingDestination = null; + editorConfirm = null; + editorDelete = null; + menu.slotsActive = false; + init(); + } + + protected void updateEditorSubwidgets(IScheduleInput field) { + menu.targetSlotActive = field.needsSlot(); + editorSubWidgets.forEach(p -> removeWidget(p.getFirst())); + editorSubWidgets.clear(); + editorDividers = new ArrayList<>(); + field.createWidgets(this, editorSubWidgets, editorDividers, leftPos - 2, topPos + 40); + if (editorSubWidgets.isEmpty()) + editorDividers = null; + editorSubWidgets.forEach(pair -> { + GuiEventListener e = pair.getFirst(); + if (e instanceof AbstractSimiWidget) + addRenderableWidget((AbstractSimiWidget) e); + if (e instanceof EditBox) + addRenderableWidget((EditBox) e); + }); + } + + @Override + protected void containerTick() { + super.containerTick(); + scroll.tickChaser(); + for (LerpedFloat lerpedFloat : horizontalScrolls) + lerpedFloat.tickChaser(); + } + + @Override + public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { + partialTicks = minecraft.getFrameTime(); + + if (menu.slotsActive) + super.render(matrixStack, mouseX, mouseY, partialTicks); + else { + renderBackground(matrixStack); + renderBg(matrixStack, partialTicks, mouseX, mouseY); + for (Widget widget : this.renderables) + widget.render(matrixStack, mouseX, mouseY, partialTicks); + renderForeground(matrixStack, mouseX, mouseY, partialTicks); + } + } + + protected void renderSchedule(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { + UIRenderHelper.swapAndBlitColor(minecraft.getMainRenderTarget(), UIRenderHelper.framebuffer); + UIRenderHelper.drawStretched(matrixStack, leftPos + 33, topPos + 16, 3, 173, -100, + AllGuiTextures.SCHEDULE_STRIP_DARK); + + int yOffset = 25; + List entries = schedule.entries; + float scrollOffset = -scroll.getValue(partialTicks); + + for (int i = 0; i <= entries.size(); i++) { + startStencil(matrixStack, leftPos + 16, topPos + 16, 220, 173); + matrixStack.pushPose(); + matrixStack.translate(0, scrollOffset, 0); + if (i == 0 || entries.size() == 0) + UIRenderHelper.drawStretched(matrixStack, leftPos + 33, topPos + 16, 3, 10, -100, + AllGuiTextures.SCHEDULE_STRIP_LIGHT); + + if (i == entries.size()) { + if (i > 0) + yOffset += 9; + AllGuiTextures.SCHEDULE_STRIP_END.render(matrixStack, leftPos + 29, topPos + yOffset); + AllGuiTextures.SCHEDULE_CARD_NEW.render(matrixStack, leftPos + 43, topPos + yOffset); + matrixStack.popPose(); + endStencil(); + break; + } + + ScheduleEntry scheduleEntry = entries.get(i); + int cardY = yOffset; + int cardHeight = renderScheduleEntry(matrixStack, scheduleEntry, cardY, mouseX, mouseY, partialTicks); + yOffset += cardHeight; + + if (i + 1 < entries.size()) { + AllGuiTextures.SCHEDULE_STRIP_DOTTED.render(matrixStack, leftPos + 29, topPos + yOffset - 3); + yOffset += 10; + } + + matrixStack.popPose(); + endStencil(); + + float h = cardHeight - 26; + float y1 = cardY + 24 + scrollOffset; + float y2 = y1 + h; + if (y2 > 189) + h -= y2 - 189; + if (y1 < 16) { + float correction = 16 - y1; + y1 += correction; + h -= correction; + } + + if (h <= 0) + continue; + + startStencil(matrixStack, leftPos + 43, topPos + y1, 161, h); + + matrixStack.pushPose(); + matrixStack.translate(0, scrollOffset, 0); + renderScheduleConditions(matrixStack, scheduleEntry, cardY, mouseX, mouseY, partialTicks, cardHeight, i); + matrixStack.popPose(); + endStencil(); + + if (isConditionAreaScrollable(scheduleEntry)) { + startStencil(matrixStack, leftPos + 16, topPos + 16, 220, 173); + matrixStack.pushPose(); + matrixStack.translate(0, scrollOffset, 0); + int center = (cardHeight - 8 + CARD_HEADER) / 2; + float chaseTarget = horizontalScrolls.get(i) + .getChaseTarget(); + if (!Mth.equal(chaseTarget, 0)) + AllGuiTextures.SCHEDULE_SCROLL_LEFT.render(matrixStack, leftPos + 40, topPos + cardY + center); + if (!Mth.equal(chaseTarget, scheduleEntry.conditions.size() - 1)) + AllGuiTextures.SCHEDULE_SCROLL_RIGHT.render(matrixStack, leftPos + 203, topPos + cardY + center); + matrixStack.popPose(); + endStencil(); + } + } + + int zLevel = 200; + Matrix4f mat = matrixStack.last() + .pose(); + GuiUtils.drawGradientRect(mat, zLevel, leftPos + 16, topPos + 16, leftPos + 16 + 220, topPos + 16 + 10, + 0x77000000, 0x00000000); + GuiUtils.drawGradientRect(mat, zLevel, leftPos + 16, topPos + 179, leftPos + 16 + 220, topPos + 179 + 10, + 0x00000000, 0x77000000); + UIRenderHelper.swapAndBlitColor(UIRenderHelper.framebuffer, minecraft.getMainRenderTarget()); + } + + public int renderScheduleEntry(PoseStack matrixStack, ScheduleEntry entry, int yOffset, int mouseX, int mouseY, + float partialTicks) { + int zLevel = -100; + + AllGuiTextures light = AllGuiTextures.SCHEDULE_CARD_LIGHT; + AllGuiTextures medium = AllGuiTextures.SCHEDULE_CARD_MEDIUM; + AllGuiTextures dark = AllGuiTextures.SCHEDULE_CARD_DARK; + + int cardWidth = CARD_WIDTH; + int cardHeader = CARD_HEADER; + int maxRows = 0; + for (List list : entry.conditions) + maxRows = Math.max(maxRows, list.size()); + int cardHeight = cardHeader + 24 + maxRows * 18; + + matrixStack.pushPose(); + matrixStack.translate(leftPos + 25, topPos + yOffset, 0); + + UIRenderHelper.drawStretched(matrixStack, 0, 1, cardWidth, cardHeight - 2, zLevel, light); + UIRenderHelper.drawStretched(matrixStack, 1, 0, cardWidth - 2, cardHeight, zLevel, light); + UIRenderHelper.drawStretched(matrixStack, 1, 1, cardWidth - 2, cardHeight - 2, zLevel, dark); + UIRenderHelper.drawStretched(matrixStack, 2, 2, cardWidth - 4, cardHeight - 4, zLevel, medium); + UIRenderHelper.drawStretched(matrixStack, 2, 2, cardWidth - 4, cardHeader, zLevel, light); + + AllGuiTextures.SCHEDULE_CARD_REMOVE.render(matrixStack, cardWidth - 14, 2); + AllGuiTextures.SCHEDULE_CARD_DUPLICATE.render(matrixStack, cardWidth - 14, cardHeight - 14); + + int i = schedule.entries.indexOf(entry); + if (i > 0) + AllGuiTextures.SCHEDULE_CARD_MOVE_UP.render(matrixStack, cardWidth, cardHeader - 14); + if (i < schedule.entries.size() - 1) + AllGuiTextures.SCHEDULE_CARD_MOVE_DOWN.render(matrixStack, cardWidth, cardHeader); + + UIRenderHelper.drawStretched(matrixStack, 8, 0, 3, cardHeight + 10, zLevel, + AllGuiTextures.SCHEDULE_STRIP_LIGHT); + AllGuiTextures.SCHEDULE_STRIP_TRAVEL.render(matrixStack, 4, 6); + AllGuiTextures.SCHEDULE_STRIP_WAIT.render(matrixStack, 4, 28); + + Pair destination = entry.destination.getSummary(); + renderInput(matrixStack, destination, 26, 5, false, 100); + entry.destination.renderSpecialIcon(matrixStack, 30, 5); + + matrixStack.popPose(); + + return cardHeight; + } + + public void renderScheduleConditions(PoseStack matrixStack, ScheduleEntry entry, int yOffset, int mouseX, + int mouseY, float partialTicks, int cardHeight, int entryIndex) { + int cardWidth = CARD_WIDTH; + int cardHeader = CARD_HEADER; + + matrixStack.pushPose(); + matrixStack.translate(leftPos + 25, topPos + yOffset, 0); + int xOffset = 26; + float scrollOffset = getConditionScroll(entry, partialTicks, entryIndex); + + matrixStack.pushPose(); + matrixStack.translate(-scrollOffset, 0, 0); + + for (List list : entry.conditions) { + int maxWidth = getConditionColumnWidth(list); + for (int i = 0; i < list.size(); i++) { + ScheduleWaitCondition scheduleWaitCondition = list.get(i); + Math.max(maxWidth, renderInput(matrixStack, scheduleWaitCondition.getSummary(), xOffset, 29 + i * 18, + i != 0, maxWidth)); + scheduleWaitCondition.renderSpecialIcon(matrixStack, xOffset + 4, 29 + i * 18); + } + + AllGuiTextures.SCHEDULE_CONDITION_APPEND.render(matrixStack, xOffset + (maxWidth - 10) / 2, + 29 + list.size() * 18); + xOffset += maxWidth + 10; + } + + AllGuiTextures.SCHEDULE_CONDITION_NEW.render(matrixStack, xOffset - 3, 29); + matrixStack.popPose(); + + if (xOffset + 16 > cardWidth - 26) { + new MatrixTransformStack(matrixStack).rotateZ(-90); + Matrix4f m = matrixStack.last() + .pose(); + GuiUtils.drawGradientRect(m, 200, -cardHeight + 2, 18, -2 - cardHeader, 28, 0x44000000, 0x00000000); + GuiUtils.drawGradientRect(m, 200, -cardHeight + 2, cardWidth - 26, -2 - cardHeader, cardWidth - 16, + 0x00000000, 0x44000000); + } + + matrixStack.popPose(); + } + + private boolean isConditionAreaScrollable(ScheduleEntry entry) { + int xOffset = 26; + for (List list : entry.conditions) + xOffset += getConditionColumnWidth(list) + 10; + return xOffset + 16 > CARD_WIDTH - 26; + } + + private float getConditionScroll(ScheduleEntry entry, float partialTicks, int entryIndex) { + float scrollOffset = 0; + float scrollIndex = horizontalScrolls.get(entryIndex) + .getValue(partialTicks); + for (List list : entry.conditions) { + int maxWidth = getConditionColumnWidth(list); + float partialOfThisColumn = Math.min(1, scrollIndex); + scrollOffset += (maxWidth + 10) * partialOfThisColumn; + scrollIndex -= partialOfThisColumn; + } + return scrollOffset; + } + + private int getConditionColumnWidth(List list) { + int maxWidth = 0; + for (ScheduleWaitCondition scheduleWaitCondition : list) + maxWidth = Math.max(maxWidth, getFieldSize(32, scheduleWaitCondition.getSummary())); + return maxWidth; + } + + protected int renderInput(PoseStack matrixStack, Pair pair, int x, int y, boolean clean, + int minSize) { + ItemStack stack = pair.getFirst(); + Component text = pair.getSecond(); + boolean hasItem = !stack.isEmpty(); + int fieldSize = getFieldSize(minSize, pair); + matrixStack.pushPose(); + + AllGuiTextures left = + clean ? AllGuiTextures.SCHEDULE_CONDITION_LEFT_CLEAN : AllGuiTextures.SCHEDULE_CONDITION_LEFT; + AllGuiTextures middle = AllGuiTextures.SCHEDULE_CONDITION_MIDDLE; + AllGuiTextures item = AllGuiTextures.SCHEDULE_CONDITION_ITEM; + AllGuiTextures right = AllGuiTextures.SCHEDULE_CONDITION_RIGHT; + + matrixStack.translate(x, y, 0); + UIRenderHelper.drawStretched(matrixStack, 0, 0, fieldSize, 16, -100, middle); + left.render(matrixStack, clean ? 0 : -3, 0); + right.render(matrixStack, fieldSize - 2, 0); + if (hasItem) + item.render(matrixStack, 3, 0); + if (hasItem) { + item.render(matrixStack, 3, 0); + if (stack.getItem() != Items.STRUCTURE_VOID) + GuiGameElement.of(stack) + .at(4, 0) + .render(matrixStack); + } + + if (text != null) + font.drawShadow(matrixStack, text, hasItem ? 28 : 8, 4, 0xff_f2f2ee); + + matrixStack.popPose(); + return fieldSize; + } + + private Component clickToEdit = Lang.translate("gui.schedule.lmb_edit") + .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC); + private Component rClickToDelete = Lang.translate("gui.schedule.rmb_remove") + .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC); + + public boolean action(PoseStack ms, double mouseX, double mouseY, int click) { + if (editingCondition != null || editingDestination != null) + return false; + + Component empty = new TextComponent(""); + + int mx = (int) mouseX; + int my = (int) mouseY; + int x = mx - leftPos - 25; + int y = my - topPos - 25; + if (x < 0 || x >= 205) + return false; + if (y < 0 || y >= 173) + return false; + y += scroll.getValue(0); + + List entries = schedule.entries; + for (int i = 0; i < entries.size(); i++) { + ScheduleEntry entry = entries.get(i); + int maxRows = 0; + for (List list : entry.conditions) + maxRows = Math.max(maxRows, list.size()); + int cardHeight = CARD_HEADER + 24 + maxRows * 18; + + if (y >= cardHeight) { + y -= cardHeight + 10; + if (y < 0) + return false; + continue; + } + + int fieldSize = getFieldSize(100, entry.destination.getSummary()); + if (x > 25 && x <= 25 + fieldSize && y > 4 && y <= 20) { + List components = new ArrayList<>(); + components.add(Lang.translate("schedule.destination_type") + .withStyle(ChatFormatting.GOLD)); + components.addAll(entry.destination.getTitleAs("destination")); + components.add(empty); + components.add(clickToEdit); + renderTooltip(ms, components, Optional.empty(), mx, my); + if (click == 0) + startEditing(entry.destination, confirmed -> { + if (confirmed) + entry.destination = editingDestination; + }, false); + return true; + } + + if (x > 180 && x <= 192) { + if (y > 0 && y <= 14) { + renderTooltip(ms, ImmutableList.of(Lang.translate("gui.schedule.remove_entry")), Optional.empty(), + mx, my); + if (click == 0) { + entries.remove(entry); + init(); + } + return true; + } + if (y > cardHeight - 14) { + renderTooltip(ms, ImmutableList.of(Lang.translate("gui.schedule.duplicate")), Optional.empty(), mx, + my); + if (click == 0) { + entries.add(entries.indexOf(entry), entry.clone()); + init(); + } + return true; + } + } + + if (x > 194) { + if (y > 7 && y <= 20 && i > 0) { + renderTooltip(ms, ImmutableList.of(Lang.translate("gui.schedule.move_up")), Optional.empty(), mx, + my); + if (click == 0) { + entries.remove(entry); + entries.add(i - 1, entry); + init(); + } + return true; + } + if (y > 20 && y <= 33 && i < entries.size() - 1) { + renderTooltip(ms, ImmutableList.of(Lang.translate("gui.schedule.move_down")), Optional.empty(), mx, + my); + if (click == 0) { + entries.remove(entry); + entries.add(i + 1, entry); + init(); + } + return true; + } + } + + int center = (cardHeight - 8 + CARD_HEADER) / 2; + if (y > center - 1 && y <= center + 7 && isConditionAreaScrollable(entry)) { + float chaseTarget = horizontalScrolls.get(i) + .getChaseTarget(); + if (x > 12 && x <= 19 && !Mth.equal(chaseTarget, 0)) { + if (click == 0) + horizontalScrolls.get(i) + .chase(chaseTarget - 1, 0.5f, Chaser.EXP); + return true; + } + if (x > 177 && x <= 184 && !Mth.equal(chaseTarget, entry.conditions.size() - 1)) { + if (click == 0) + horizontalScrolls.get(i) + .chase(chaseTarget + 1, 0.5f, Chaser.EXP); + return true; + } + } + + x -= 18; + y -= 28; + if (x < 0 || y < 0 || x > 160) + return false; + x += getConditionScroll(entry, 0, i) - 8; + + List> columns = entry.conditions; + for (int j = 0; j < columns.size(); j++) { + List conditions = columns.get(j); + if (x < 0) + return false; + int w = getConditionColumnWidth(conditions); + if (x >= w) { + x -= w + 10; + continue; + } + + int row = y / 18; + if (row < conditions.size() && row >= 0) { + boolean canRemove = conditions.size() > 1 || columns.size() > 1; + List components = new ArrayList<>(); + components.add(Lang.translate("schedule.condition_type") + .withStyle(ChatFormatting.GRAY)); + ScheduleWaitCondition condition = conditions.get(row); + components.addAll(condition.getTitleAs("condition")); + components.add(empty); + components.add(clickToEdit); + if (canRemove) + components.add(rClickToDelete); + renderTooltip(ms, components, Optional.empty(), mx, my); + if (canRemove && click == 1) { + conditions.remove(row); + if (conditions.isEmpty()) + columns.remove(conditions); + } + if (click == 0) + startEditing(condition, confirmed -> { + conditions.remove(row); + if (confirmed) { + conditions.add(row, editingCondition); + return; + } + if (conditions.isEmpty()) + columns.remove(conditions); + }, canRemove); + return true; + } + + if (y > 18 * conditions.size() && y <= 18 * conditions.size() + 10 && x >= w / 2 - 5 && x < w / 2 + 5) { + renderTooltip(ms, ImmutableList.of(Lang.translate("gui.schedule.add_condition")), Optional.empty(), + mx, my); + if (click == 0) + startEditing(new ScheduledDelay(), confirmed -> { + if (confirmed) + conditions.add(editingCondition); + }, true); + return true; + } + + return false; + } + + if (x < 0 || x > 15 || y > 20) + return false; + + renderTooltip(ms, ImmutableList.of(Lang.translate("gui.schedule.alternative_condition")), Optional.empty(), + mx, my); + if (click == 0) + startEditing(new ScheduledDelay(), confirmed -> { + if (!confirmed) + return; + ArrayList conditions = new ArrayList<>(); + conditions.add(editingCondition); + columns.add(conditions); + }, true); + return true; + } + + if (x < 18 || x > 33 || y > 14) + return false; + + renderTooltip(ms, ImmutableList.of(Lang.translate("gui.schedule.add_entry")), Optional.empty(), mx, my); + if (click == 0) + startEditing(new FilteredDestination(), confirmed -> { + if (!confirmed) + return; + + ScheduleEntry entry = new ScheduleEntry(); + ScheduledDelay delay = new ScheduledDelay(); + ArrayList initialConditions = new ArrayList<>(); + initialConditions.add(delay); + entry.destination = editingDestination; + delay.value = 5; + delay.timeUnit = TimeUnit.SECONDS; + entry.conditions.add(initialConditions); + schedule.entries.add(entry); + }, true); + return true; + } + + private int getFieldSize(int minSize, Pair pair) { + ItemStack stack = pair.getFirst(); + Component text = pair.getSecond(); + boolean hasItem = !stack.isEmpty(); + return Math.max((text == null ? 0 : font.width(text)) + (hasItem ? 20 : 0) + 16, minSize); + } + + protected void startStencil(PoseStack matrixStack, float x, float y, float w, float h) { + RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); + + GL11.glDisable(GL11.GL_STENCIL_TEST); + RenderSystem.stencilMask(~0); + RenderSystem.clear(GL11.GL_STENCIL_BUFFER_BIT, Minecraft.ON_OSX); + GL11.glEnable(GL11.GL_STENCIL_TEST); + RenderSystem.stencilOp(GL11.GL_REPLACE, GL11.GL_KEEP, GL11.GL_KEEP); + RenderSystem.stencilMask(0xFF); + RenderSystem.stencilFunc(GL11.GL_NEVER, 1, 0xFF); + + matrixStack.pushPose(); + matrixStack.translate(x, y, 0); + matrixStack.scale(w, h, 1); + GuiUtils.drawGradientRect(matrixStack.last() + .pose(), -100, 0, 0, 1, 1, 0xff000000, 0xff000000); + matrixStack.popPose(); + + GL11.glEnable(GL11.GL_STENCIL_TEST); + RenderSystem.stencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); + RenderSystem.stencilFunc(GL11.GL_EQUAL, 1, 0xFF); + } + + protected void endStencil() { + GL11.glDisable(GL11.GL_STENCIL_TEST); + } + + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + if (editorConfirm != null && editorConfirm.isMouseOver(pMouseX, pMouseY) && onEditorClose != null) { + onEditorClose.accept(true); + stopEditing(); + return true; + } + if (editorDelete != null && editorDelete.isMouseOver(pMouseX, pMouseY) && onEditorClose != null) { + onEditorClose.accept(false); + stopEditing(); + return true; + } + if (action(new PoseStack(), pMouseX, pMouseY, pButton)) + return true; + + return super.mouseClicked(pMouseX, pMouseY, pButton); + } + + @Override + public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { + if (editingCondition == null && editingDestination == null) + return super.keyPressed(pKeyCode, pScanCode, pModifiers); + InputConstants.Key mouseKey = InputConstants.getKey(pKeyCode, pScanCode); + boolean hitEnter = getFocused() instanceof EditBox && (pKeyCode == 257 || pKeyCode == 335); + boolean hitE = getFocused() == null && minecraft.options.keyInventory.isActiveAndMatches(mouseKey); + if (hitE || hitEnter) { + onEditorClose.accept(true); + stopEditing(); + return true; + } + return super.keyPressed(pKeyCode, pScanCode, pModifiers); + } + + @Override + public boolean mouseScrolled(double pMouseX, double pMouseY, double pDelta) { + if (editingCondition != null || editingDestination != null) + return super.mouseScrolled(pMouseX, pMouseY, pDelta); + + if (hasShiftDown()) { + List entries = schedule.entries; + int y = (int) (pMouseY - topPos - 25 + scroll.getValue()); + for (int i = 0; i < entries.size(); i++) { + ScheduleEntry entry = entries.get(i); + int maxRows = 0; + for (List list : entry.conditions) + maxRows = Math.max(maxRows, list.size()); + int cardHeight = CARD_HEADER + 24 + maxRows * 18; + + if (y >= cardHeight) { + y -= cardHeight + 9; + if (y < 0) + break; + continue; + } + + if (!isConditionAreaScrollable(entry)) + break; + if (y < 24) + break; + if (pMouseX < leftPos + 25) + break; + if (pMouseX > leftPos + 205) + break; + float chaseTarget = horizontalScrolls.get(i) + .getChaseTarget(); + if (pDelta > 0 && !Mth.equal(chaseTarget, 0)) { + horizontalScrolls.get(i) + .chase(chaseTarget - 1, 0.5f, Chaser.EXP); + return true; + } + if (pDelta < 0 && !Mth.equal(chaseTarget, entry.conditions.size() - 1)) { + horizontalScrolls.get(i) + .chase(chaseTarget + 1, 0.5f, Chaser.EXP); + return true; + } + return false; + } + } + + float chaseTarget = scroll.getChaseTarget(); + float max = 40 - 173; + for (ScheduleEntry scheduleEntry : schedule.entries) { + int maxRows = 0; + for (List list : scheduleEntry.conditions) + maxRows = Math.max(maxRows, list.size()); + max += CARD_HEADER + 24 + maxRows * 18 + 10; + } + if (max > 0) { + chaseTarget -= pDelta * 12; + chaseTarget = Mth.clamp(chaseTarget, 0, max); + scroll.chase((int) chaseTarget, 0.7f, Chaser.EXP); + } else + scroll.chase(0, 0.7f, Chaser.EXP); + + return super.mouseScrolled(pMouseX, pMouseY, pDelta); + } + + @Override + protected void renderForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { + super.renderForeground(matrixStack, mouseX, mouseY, partialTicks); + GuiGameElement.of(menu.contentHolder).at(leftPos + 251, topPos + 187, -200) + .scale(3) + .render(matrixStack); + action(matrixStack, mouseX, mouseY, -1); + + if (editingCondition == null && editingDestination == null) + return; + int x = leftPos + 53; + int y = topPos + 87; + if (mouseX < x || mouseY < y || mouseX >= x + 18 || mouseY >= y + 18) + return; + IScheduleInput rendered = editingCondition == null ? editingDestination : editingCondition; + List secondLineTooltip = rendered.getSecondLineTooltip(); + if (secondLineTooltip == null || (hoveredSlot != null && !hoveredSlot.getItem() + .isEmpty())) + return; + renderTooltip(matrixStack, secondLineTooltip, Optional.empty(), mouseX, mouseY); + } + + @Override + protected void renderBg(PoseStack pPoseStack, float pPartialTick, int pMouseX, int pMouseY) { + AllGuiTextures.SCHEDULE.render(pPoseStack, leftPos, topPos); + FormattedCharSequence formattedcharsequence = title.getVisualOrderText(); + int center = leftPos + (AllGuiTextures.SCHEDULE.width - 8) / 2; + font.draw(pPoseStack, formattedcharsequence, (float) (center - font.width(formattedcharsequence) / 2), + (float) topPos + 4, 0x505050); + renderSchedule(pPoseStack, pMouseX, pMouseY, pPartialTick); + + if (editingCondition == null && editingDestination == null) + return; + + this.fillGradient(pPoseStack, 0, 0, this.width, this.height, -1072689136, -804253680); + AllGuiTextures.SCHEDULE_EDITOR.render(pPoseStack, leftPos - 2, topPos + 40); + AllGuiTextures.PLAYER_INVENTORY.render(pPoseStack, leftPos + 38, topPos + 122); + font.draw(pPoseStack, playerInventoryTitle, leftPos + 46, topPos + 128, 0x505050); + + formattedcharsequence = editingCondition == null ? Lang.translate("schedule.destination.editor") + .getVisualOrderText() + : Lang.translate("schedule.condition.editor") + .getVisualOrderText(); + font.draw(pPoseStack, formattedcharsequence, (float) (center - font.width(formattedcharsequence) / 2), + (float) topPos + 44, 0x505050); + + IScheduleInput rendered = editingCondition == null ? editingDestination : editingCondition; + if (!rendered.needsSlot() && !rendered.renderSpecialIcon(pPoseStack, leftPos + 54, topPos + 88)) { + Pair summary = rendered.getSummary(); + ItemStack icon = summary.getFirst(); + if (icon.isEmpty()) + icon = rendered.getSecondLineIcon(); + if (icon.isEmpty()) + AllGuiTextures.SCHEDULE_EDITOR_INACTIVE_SLOT.render(pPoseStack, leftPos + 53, topPos + 87); + else + GuiGameElement.of(icon) + .at(leftPos + 54, topPos + 88) + .render(pPoseStack); + } + + if (editorDividers == null) + return; + + AllGuiTextures.SCHEDULE_EDITOR_SECOND_LINE.render(pPoseStack, leftPos + 74, topPos + 87); + for (Integer integer : editorDividers) + AllGuiTextures.SCHEDULE_EDITOR_DIVIDER.render(pPoseStack, leftPos + 74 + integer, topPos + 87); + } + + @Override + public void removed() { + super.removed(); + AllPackets.channel.sendToServer(new ScheduleEditPacket(schedule)); + } + + @Override + public List getExtraAreas() { + return extraAreas; + } + + public Font getFont() { + return font; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/StationBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/StationBlock.java new file mode 100644 index 000000000..b63091e02 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/StationBlock.java @@ -0,0 +1,99 @@ +package com.simibubi.create.content.logistics.trains.management; + +import com.simibubi.create.AllItems; +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.gui.ScreenOpener; + +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.world.InteractionHand; +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.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; + +public class StationBlock extends HorizontalDirectionalBlock implements ITE { + + public static final BooleanProperty ASSEMBLING = BooleanProperty.create("assembling"); + + public StationBlock(Properties p_54120_) { + super(p_54120_); + registerDefaultState(defaultBlockState().setValue(ASSEMBLING, false)); + } + + @Override + protected void createBlockStateDefinition(Builder pBuilder) { + super.createBlockStateDefinition(pBuilder.add(FACING, ASSEMBLING)); + } + + @Override + public void fillItemCategory(CreativeModeTab pTab, NonNullList pItems) { + super.fillItemCategory(pTab, pItems); + pItems.add(AllItems.SCHEDULE.asStack()); + } + + @Override + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, + BlockHitResult pHit) { + + if (pPlayer == null) + return InteractionResult.PASS; + ItemStack itemInHand = pPlayer.getItemInHand(pHand); + if (AllItems.WRENCH.isIn(itemInHand)) + return InteractionResult.PASS; + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, + () -> () -> withTileEntityDo(pLevel, pPos, te -> this.displayScreen(te, pPlayer))); + return InteractionResult.SUCCESS; + } + + @OnlyIn(value = Dist.CLIENT) + protected void displayScreen(StationTileEntity te, Player player) { + if (!(player instanceof LocalPlayer)) + return; + GlobalStation station = te.getOrCreateGlobalStation(); + if (station == null) + return; + BlockState blockState = te.getBlockState(); + boolean assembling = blockState.getBlock() == this && blockState.getValue(ASSEMBLING); + ScreenOpener.open(assembling ? new AssemblyScreen(te, station) : new StationScreen(te, station)); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + return super.getStateForPlacement(pContext).setValue(FACING, pContext.getHorizontalDirection()); + } + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return AllShapes.STATION.get(pState.getValue(FACING)); + } + + @Override + public Class getTileEntityClass() { + return StationTileEntity.class; + } + + @Override + public BlockEntityType getTileEntityType() { + return AllTileEntities.TRACK_STATION.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/StationEditPacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/StationEditPacket.java new file mode 100644 index 000000000..d2bef36e3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/StationEditPacket.java @@ -0,0 +1,126 @@ +package com.simibubi.create.content.logistics.trains.management; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.foundation.networking.TileEntityConfigurationPacket; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; + +public class StationEditPacket extends TileEntityConfigurationPacket { + + boolean assemblyMode; + Boolean tryAssemble; + String name; + + public static StationEditPacket tryAssemble(BlockPos pos) { + StationEditPacket packet = new StationEditPacket(pos); + packet.tryAssemble = true; + return packet; + } + + public static StationEditPacket tryDisassemble(BlockPos pos) { + StationEditPacket packet = new StationEditPacket(pos); + packet.tryAssemble = false; + return packet; + } + + public static StationEditPacket configure(BlockPos pos, boolean assemble, String name) { + StationEditPacket packet = new StationEditPacket(pos); + packet.assemblyMode = assemble; + packet.tryAssemble = null; + packet.name = name; + return packet; + } + + public StationEditPacket(FriendlyByteBuf buffer) { + super(buffer); + } + + public StationEditPacket(BlockPos pos) { + super(pos); + } + + @Override + protected void writeSettings(FriendlyByteBuf buffer) { + buffer.writeBoolean(tryAssemble != null); + if (tryAssemble != null) { + buffer.writeBoolean(tryAssemble); + return; + } + buffer.writeBoolean(assemblyMode); + buffer.writeUtf(name); + } + + @Override + protected void readSettings(FriendlyByteBuf buffer) { + name = ""; + if (buffer.readBoolean()) { + tryAssemble = buffer.readBoolean(); + return; + } + assemblyMode = buffer.readBoolean(); + name = buffer.readUtf(256); + } + + @Override + protected void applySettings(StationTileEntity te) { + Level level = te.getLevel(); + BlockPos blockPos = te.getBlockPos(); + BlockState blockState = level.getBlockState(blockPos); + + if (!name.isBlank()) { + GlobalStation station = te.getOrCreateGlobalStation(); + if (station != null) + station.name = name; + Create.RAILWAYS.markTracksDirty(); + } + + if (!(blockState.getBlock() instanceof StationBlock)) + return; + Boolean isAssemblyMode = blockState.getValue(StationBlock.ASSEMBLING); + if (tryAssemble != null) { + if (!isAssemblyMode) + return; + if (tryAssemble) + te.assemble(); + else { + if (disassembleAndEnterMode(te)) + te.refreshAssemblyInfo(); + } + return; + } + if (isAssemblyMode == assemblyMode) + return; + + BlockState newState = blockState.cycle(StationBlock.ASSEMBLING); + Boolean nowAssembling = newState.getValue(StationBlock.ASSEMBLING); + if (nowAssembling) { + if (!disassembleAndEnterMode(te)) + return; + } else { + te.cancelAssembly(); + } + + level.setBlock(blockPos, newState, 3); + te.refreshBlockState(); + + if (nowAssembling) + te.refreshAssemblyInfo(); + } + + private boolean disassembleAndEnterMode(StationTileEntity te) { + GlobalStation station = te.getOrCreateGlobalStation(); + if (station != null) { + Train train = station.getPresentTrain(); + if (train != null && !train.disassemble(te.getAssemblyDirection(), te.getTarget() + .getGlobalPosition() + .above())) + return false; + } + return te.tryEnterAssemblyMode(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/StationRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/StationRenderer.java new file mode 100644 index 000000000..0ee19c83b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/StationRenderer.java @@ -0,0 +1,105 @@ +package com.simibubi.create.content.logistics.trains.management; + +import com.jozufozu.flywheel.core.PartialModel; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.content.logistics.trains.ITrackBlock; +import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; + +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +public class StationRenderer extends SafeTileEntityRenderer { + + public StationRenderer(BlockEntityRendererProvider.Context context) {} + + @Override + protected void renderSafe(StationTileEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffer, + int light, int overlay) { + + BlockPos pos = te.getBlockPos(); + TrackTargetingBehaviour target = te.getTarget(); + BlockPos targetPosition = target.getGlobalPosition(); + Level level = te.getLevel(); + + BlockState trackState = level.getBlockState(targetPosition); + Block block = trackState.getBlock(); + if (!(block instanceof ITrackBlock)) + return; + + GlobalStation station = te.getOrCreateGlobalStation(); + + if (!te.getBlockState() + .getValue(StationBlock.ASSEMBLING) || station == null || station.getPresentTrain() != null) { + ms.pushPose(); + ms.translate(-pos.getX(), -pos.getY(), -pos.getZ()); + TrackTargetingBehaviour.render(level, targetPosition, target.getTargetDirection(), 0xCC993B, ms, buffer, + light, overlay); + ms.popPose(); + return; + } + + ITrackBlock track = (ITrackBlock) block; + Direction direction = te.assemblyDirection; + + if (direction == null || te.assemblyLength == 0 || te.bogeyLocations == null) + return; + + ms.pushPose(); + BlockPos offset = targetPosition.subtract(pos); + ms.translate(offset.getX(), offset.getY(), offset.getZ()); + + MutableBlockPos currentPos = targetPosition.mutable(); + + PartialModel assemblyOverlay = track.prepareAssemblyOverlay(level, targetPosition, trackState, direction, ms); + int colorWhenValid = 0x7092F2; + int colorWhenCarriage = 0x70EF70; + VertexConsumer vb = buffer.getBuffer(RenderType.cutoutMipped()); + + currentPos.move(direction, 1); + ms.translate(0, 0, 1); + + for (int i = 0; i < te.assemblyLength; i++) { + int valid = te.isValidBogeyOffset(i) ? colorWhenValid : -1; + + for (int j : te.bogeyLocations) + if (i == j) { + valid = colorWhenCarriage; + break; + } + + if (valid != -1) { + int lightColor = LevelRenderer.getLightColor(level, currentPos); + SuperByteBuffer sbb = CachedBufferer.partial(assemblyOverlay, trackState); + sbb.color(valid); + sbb.light(lightColor); + sbb.renderInto(ms, vb); + } + ms.translate(0, 0, 1); + currentPos.move(direction); + } + + ms.popPose(); + } + + @Override + public boolean shouldRenderOffScreen(StationTileEntity pBlockEntity) { + return true; + } + + @Override + public int getViewDistance() { + return 96; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/StationScreen.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/StationScreen.java new file mode 100644 index 000000000..6c9ed3f6d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/StationScreen.java @@ -0,0 +1,309 @@ +package com.simibubi.create.content.logistics.trains.management; + +import java.lang.ref.WeakReference; +import java.util.List; +import java.util.function.Consumer; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.logistics.trains.entity.Carriage; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.entity.TrainIconType; +import com.simibubi.create.foundation.gui.AllGuiTextures; +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.animation.LerpedFloat; + +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.util.Mth; + +public class StationScreen extends AbstractStationScreen { + + private EditBox nameBox; + private EditBox trainNameBox; + private IconButton newTrainButton; + private IconButton disassembleTrainButton; + private IconButton openScheduleButton; + + private int leavingAnimation; + private LerpedFloat trainPosition; + + private boolean switchingToAssemblyMode; + + public StationScreen(StationTileEntity te, GlobalStation station) { + super(te, station); + background = AllGuiTextures.STATION; + leavingAnimation = 0; + trainPosition = LerpedFloat.linear() + .startWithValue(0); + switchingToAssemblyMode = false; + } + + @Override + protected void init() { + super.init(); + int x = guiLeft; + int y = guiTop; + + Consumer onTextChanged; + + onTextChanged = s -> nameBox.x = nameBoxX(s, nameBox); + nameBox = new EditBox(new NoShadowFontWrapper(font), x + 23, y + 4, background.width - 20, 10, + new TextComponent(station.name)); + nameBox.setBordered(false); + nameBox.setMaxLength(25); + nameBox.setTextColor(0x442000); + nameBox.setValue(station.name); + nameBox.changeFocus(false); + nameBox.mouseClicked(0, 0, 0); + nameBox.setResponder(onTextChanged); + nameBox.x = nameBoxX(nameBox.getValue(), nameBox); + addRenderableWidget(nameBox); + + Runnable assemblyCallback = () -> { + switchingToAssemblyMode = true; + minecraft.setScreen(new AssemblyScreen(te, station)); + }; + + newTrainButton = new WideIconButton(x + 84, y + 65, AllGuiTextures.I_NEW_TRAIN); + newTrainButton.setToolTip(new TextComponent("New Train")); + newTrainButton.withCallback(assemblyCallback); + addRenderableWidget(newTrainButton); + + disassembleTrainButton = new WideIconButton(x + 94, y + 65, AllGuiTextures.I_DISASSEMBLE_TRAIN); + disassembleTrainButton.active = false; + disassembleTrainButton.visible = false; + disassembleTrainButton.withCallback(assemblyCallback); + addRenderableWidget(disassembleTrainButton); + + openScheduleButton = new IconButton(x + 73, y + 65, AllIcons.I_VIEW_SCHEDULE); + openScheduleButton.active = false; + openScheduleButton.visible = false; + addRenderableWidget(openScheduleButton); + + onTextChanged = s -> trainNameBox.x = nameBoxX(s, trainNameBox); + trainNameBox = new EditBox(font, x + 23, y + 47, background.width - 20, 10, new TextComponent("")); + trainNameBox.setBordered(false); + trainNameBox.setMaxLength(15); + trainNameBox.setTextColor(0xC6C6C6); + trainNameBox.changeFocus(false); + trainNameBox.mouseClicked(0, 0, 0); + trainNameBox.setResponder(onTextChanged); + trainNameBox.active = false; + + tickTrainDisplay(); + } + + @Override + public void tick() { + tickTrainDisplay(); + if (getFocused() != nameBox) { + nameBox.setCursorPosition(nameBox.getValue() + .length()); + nameBox.setHighlightPos(nameBox.getCursorPosition()); + } + if (getFocused() != trainNameBox || trainNameBox.active == false) { + trainNameBox.setCursorPosition(trainNameBox.getValue() + .length()); + trainNameBox.setHighlightPos(trainNameBox.getCursorPosition()); + } + super.tick(); + } + + private void tickTrainDisplay() { + Train train = displayedTrain.get(); + + if (train == null) { + if (trainNameBox.active) { + trainNameBox.active = false; + removeWidget(trainNameBox); + } + + leavingAnimation = 0; + newTrainButton.active = true; + newTrainButton.visible = true; + Train imminentTrain = station.getImminentTrain(); + + if (imminentTrain != null) { + displayedTrain = new WeakReference<>(imminentTrain); + newTrainButton.active = false; + newTrainButton.visible = false; + disassembleTrainButton.active = false; + disassembleTrainButton.visible = true; + openScheduleButton.active = false; + openScheduleButton.visible = true; + + trainNameBox.active = true; + trainNameBox.setValue(imminentTrain.name.getString()); + trainNameBox.x = nameBoxX(trainNameBox.getValue(), trainNameBox); + addRenderableWidget(trainNameBox); + + int trainIconWidth = getTrainIconWidth(imminentTrain); + int targetPos = background.width / 2 - trainIconWidth / 2; + float f = (float) (imminentTrain.navigation.distanceToDestination / 15f); + trainPosition.startWithValue(targetPos - (targetPos + 5) * f); + } + return; + } + + int trainIconWidth = getTrainIconWidth(train); + int targetPos = background.width / 2 - trainIconWidth / 2; + + if (leavingAnimation > 0) { + disassembleTrainButton.active = false; + float f = 1 - (leavingAnimation / 80f); + trainPosition.setValue(targetPos + f * f * f * (background.width - targetPos + 5)); + leavingAnimation--; + if (leavingAnimation > 0) + return; + + displayedTrain = new WeakReference<>(null); + disassembleTrainButton.visible = false; + openScheduleButton.active = false; + openScheduleButton.visible = false; + return; + } + + if (train.navigation.destination != station && train.currentStation != station) { + leavingAnimation = 80; + return; + } + + disassembleTrainButton.active = train.currentStation == station; // TODO te.canAssemble + openScheduleButton.active = train.runtime.schedule != null; + + float f = (float) (train.navigation.distanceToDestination / 30f); + trainPosition.setValue(targetPos - (targetPos + trainIconWidth) * f); + } + + private int nameBoxX(String s, EditBox nameBox) { + return guiLeft + background.width / 2 - (Math.min(font.width(s), nameBox.getWidth()) + 10) / 2; + } + + @Override + protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + super.renderWindow(ms, mouseX, mouseY, partialTicks); + int x = guiLeft; + int y = guiTop; + + String text = nameBox.getValue(); + + if (!nameBox.isFocused()) + AllGuiTextures.STATION_EDIT_NAME.render(ms, nameBoxX(text, nameBox) + font.width(text) + 5, y + 1); + + Train train = displayedTrain.get(); + if (train == null) { + TextComponent header = new TextComponent("Station is Idle"); + font.draw(ms, header, x + 97 - font.width(header) / 2, y + 47, 0x7A7A7A); + return; + } + + float position = trainPosition.getValue(partialTicks); + + ms.pushPose(); + RenderSystem.enableBlend(); + ms.translate(position, 0, 0); + TrainIconType icon = train.icon; + int offset = 0; + + List carriages = train.carriages; + for (int i = carriages.size() - 1; i > 0; i--) { + RenderSystem.setShaderColor(1, 1, 1, Math.min(1f, + Math.min((position + offset - 10) / 30f, (background.width - 40 - position - offset) / 30f))); + + if (i == carriages.size() - 1 && train.doubleEnded) { + offset += icon.render(TrainIconType.FLIPPED_ENGINE, ms, x + offset, y + 20) + 1; + continue; + } + Carriage carriage = carriages.get(i); + offset += icon.render(carriage.bogeySpacing, ms, x + offset, y + 20) + 1; + } + + RenderSystem.setShaderColor(1, 1, 1, + Math.min(1f, Math.min((position + offset - 10) / 30f, (background.width - 40 - position - offset) / 30f))); + offset += icon.render(TrainIconType.ENGINE, ms, x + offset, y + 20); + RenderSystem.disableBlend(); + ms.popPose(); + + RenderSystem.setShaderColor(1, 1, 1, 1); + + UIRenderHelper.drawStretched(ms, x + 21, y + 43, 150, 46, -100, AllGuiTextures.STATION_TEXTBOX_MIDDLE); + AllGuiTextures.STATION_TEXTBOX_TOP.render(ms, x + 21, y + 42); + AllGuiTextures.STATION_TEXTBOX_BOTTOM.render(ms, x + 21, y + 86); + + ms.pushPose(); + ms.translate(Mth.clamp(position + offset - 13, 25, 159), 0, 0); + AllGuiTextures.STATION_TEXTBOX_SPEECH.render(ms, x, y + 38); + ms.popPose(); + + text = trainNameBox.getValue(); + if (!trainNameBox.isFocused()) + AllGuiTextures.STATION_EDIT_TRAIN_NAME.render(ms, nameBoxX(text, trainNameBox) + font.width(text) + 5, + y + 44); + } + + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + if (!nameBox.isFocused() && pMouseY > guiTop && pMouseY < guiTop + 14 && pMouseX > guiLeft + && pMouseX < guiLeft + background.width) { + nameBox.setFocus(true); + nameBox.setHighlightPos(0); + setFocused(nameBox); + return true; + } + if (trainNameBox.active && !trainNameBox.isFocused() && pMouseY > guiTop + 45 && pMouseY < guiTop + 58 + && pMouseX > guiLeft + 25 && pMouseX < guiLeft + 168) { + trainNameBox.setFocus(true); + trainNameBox.setHighlightPos(0); + setFocused(trainNameBox); + return true; + } + return super.mouseClicked(pMouseX, pMouseY, pButton); + } + + @Override + public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { + boolean hitEnter = getFocused() instanceof EditBox && (pKeyCode == 257 || pKeyCode == 335); + + if (hitEnter && nameBox.isFocused()) { + nameBox.setFocus(false); + syncStationName(); + return true; + } + + if (hitEnter && trainNameBox.isFocused()) { + trainNameBox.setFocus(false); + syncTrainName(); + return true; + } + + return super.keyPressed(pKeyCode, pScanCode, pModifiers); + } + + private void syncTrainName() { + Train train = displayedTrain.get(); + if (train != null && !trainNameBox.getValue() + .equals(train.name.getString())) + AllPackets.channel.sendToServer(new TrainEditPacket(train.id, trainNameBox.getValue(), train.icon.getId())); + } + + private void syncStationName() { + if (!nameBox.getValue() + .equals(station.name)) + AllPackets.channel.sendToServer(StationEditPacket.configure(te.getBlockPos(), false, nameBox.getValue())); + } + + @Override + public void removed() { + super.removed(); + AllPackets.channel + .sendToServer(StationEditPacket.configure(te.getBlockPos(), switchingToAssemblyMode, nameBox.getValue())); + Train train = displayedTrain.get(); + if (!switchingToAssemblyMode && train != null) + AllPackets.channel.sendToServer(new TrainEditPacket(train.id, trainNameBox.getValue(), train.icon.getId())); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/StationTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/StationTileEntity.java new file mode 100644 index 000000000..71429930d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/StationTileEntity.java @@ -0,0 +1,495 @@ +package com.simibubi.create.content.logistics.trains.management; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; + +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; +import com.simibubi.create.content.contraptions.components.structureMovement.IDisplayAssemblyExceptions; +import com.simibubi.create.content.logistics.trains.IBogeyBlock; +import com.simibubi.create.content.logistics.trains.ITrackBlock; +import com.simibubi.create.content.logistics.trains.TrackEdge; +import com.simibubi.create.content.logistics.trains.TrackGraph; +import com.simibubi.create.content.logistics.trains.TrackNode; +import com.simibubi.create.content.logistics.trains.TrackNodeLocation.DiscoveredLocation; +import com.simibubi.create.content.logistics.trains.TrackPropagator; +import com.simibubi.create.content.logistics.trains.entity.Carriage; +import com.simibubi.create.content.logistics.trains.entity.Carriage.CarriageBogey; +import com.simibubi.create.content.logistics.trains.entity.CarriageContraption; +import com.simibubi.create.content.logistics.trains.entity.MovingPoint; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.management.TrackTargetingBehaviour.GraphLocation; +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.Pair; +import com.simibubi.create.foundation.utility.WorldAttached; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public class StationTileEntity extends SmartTileEntity implements IDisplayAssemblyExceptions { + + UUID id; + + protected int failedCarriageIndex; + protected AssemblyException lastException; + + public StationTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + setLazyTickRate(20); + id = UUID.randomUUID(); + lastException = null; + failedCarriageIndex = -1; + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new TrackTargetingBehaviour(this)); + } + + public TrackTargetingBehaviour getTarget() { + return getBehaviour(TrackTargetingBehaviour.TYPE); + } + + @Override + public void initialize() { + if (!level.isClientSide) + getOrCreateGlobalStation(); + super.initialize(); + } + + public GlobalStation getOrCreateGlobalStation() { + for (TrackGraph trackGraph : Create.RAILWAYS.trackNetworks.values()) { + GlobalStation station = trackGraph.getStation(id); + if (station == null) + continue; + return station; + } + + GraphLocation loc = getTarget().determineGraphLocation(); + if (loc == null) + return null; + + GlobalStation globalStation = new GlobalStation(id, loc.edge, loc.position, worldPosition); + loc.graph.addStation(globalStation); + return globalStation; + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + id = tag.getUUID("Id"); + lastException = AssemblyException.read(tag); + failedCarriageIndex = tag.getInt("FailedCarriageIndex"); + super.read(tag, clientPacket); + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + tag.putUUID("Id", id); + AssemblyException.write(tag, lastException); + tag.putInt("FailedCarriageIndex", failedCarriageIndex); + super.write(tag, clientPacket); + } + + // Train Assembly + + public static WorldAttached> assemblyAreas = new WorldAttached<>(w -> new HashMap<>()); + + Direction assemblyDirection; + int assemblyLength; + int[] bogeyLocations; + IBogeyBlock[] bogeyTypes; + int bogeyCount; + + @Override + public void lazyTick() { + if (isAssembling() && !level.isClientSide) + refreshAssemblyInfo(); + super.lazyTick(); + } + + @Override + public void tick() { + if (isAssembling() && level.isClientSide) + refreshAssemblyInfo(); + super.tick(); + } + + public void trackClicked(Player player, ITrackBlock track, BlockState state, BlockPos pos) { + refreshAssemblyInfo(); + BoundingBox bb = assemblyAreas.get(level) + .get(worldPosition); + if (bb == null || !bb.isInside(pos)) + return; + + int bogeyOffset = pos.distManhattan(getTarget().getGlobalPosition()) - 1; + if (!isValidBogeyOffset(bogeyOffset)) + return; + + Vec3 upNormal = track.getUpNormal(level, pos, state); + BlockState bogeyAnchor = track.getBogeyAnchor(level, pos, state); + level.setBlock(pos.offset(new BlockPos(upNormal)), bogeyAnchor, 3); + } + + public boolean isAssembling() { + BlockState state = getBlockState(); + return state.hasProperty(StationBlock.ASSEMBLING) && state.getValue(StationBlock.ASSEMBLING); + } + + public boolean tryEnterAssemblyMode() { + TrackTargetingBehaviour target = getTarget(); + if (!target.hasValidTrack()) + return false; + + BlockPos targetPosition = target.getGlobalPosition(); + BlockState trackState = target.getTrackBlockState(); + ITrackBlock track = target.getTrack(); + Vec3 trackAxis = track.getTrackAxis(level, targetPosition, trackState); + + boolean axisFound = false; + for (Axis axis : Iterate.axes) { + if (trackAxis.get(axis) == 0) + continue; + if (axisFound) + return false; + axisFound = true; + } + + Create.RAILWAYS.trains.clear(); + Create.RAILWAYS.carriageById.clear(); + + return true; + } + + public void refreshAssemblyInfo() { + TrackTargetingBehaviour target = getTarget(); + if (!target.hasValidTrack()) + return; + + GlobalStation station = getOrCreateGlobalStation(); + if (station == null || station.getPresentTrain() != null) + return; + + int prevLength = assemblyLength; + BlockPos targetPosition = target.getGlobalPosition(); + BlockState trackState = target.getTrackBlockState(); + ITrackBlock track = target.getTrack(); + getAssemblyDirection(); + + MutableBlockPos currentPos = targetPosition.mutable(); + currentPos.move(assemblyDirection); + + BlockPos bogeyOffset = new BlockPos(track.getUpNormal(level, targetPosition, trackState)); + + int MAX_LENGTH = 48; + int MAX_BOGEY_COUNT = 20; + + int bogeyIndex = 0; + int maxBogeyCount = MAX_BOGEY_COUNT; + if (bogeyLocations == null) + bogeyLocations = new int[maxBogeyCount]; + if (bogeyTypes == null) + bogeyTypes = new IBogeyBlock[maxBogeyCount]; + Arrays.fill(bogeyLocations, -1); + Arrays.fill(bogeyTypes, null); + + for (int i = 0; i < MAX_LENGTH; i++) { + if (i == MAX_LENGTH - 1 || !track.trackEquals(trackState, level.getBlockState(currentPos))) { + assemblyLength = i; + break; + } + + BlockState potentialBogeyState = level.getBlockState(bogeyOffset.offset(currentPos)); + if (potentialBogeyState.getBlock()instanceof IBogeyBlock bogey && bogeyIndex < bogeyLocations.length) { + bogeyTypes[bogeyIndex] = bogey; + bogeyLocations[bogeyIndex] = i; + bogeyIndex++; + } + + currentPos.move(assemblyDirection); + } + + bogeyCount = bogeyIndex; + + if (level.isClientSide) + return; + if (prevLength == assemblyLength) + return; + + Map map = assemblyAreas.get(level); + BlockPos startPosition = targetPosition.relative(assemblyDirection); + BlockPos trackEnd = startPosition.relative(assemblyDirection, assemblyLength - 1); + map.put(worldPosition, BoundingBox.fromCorners(startPosition, trackEnd)); + } + + public boolean isValidBogeyOffset(int i) { + if ((i < 4 || bogeyCount == 0) && i != 0) + return false; + for (int j : bogeyLocations) { + if (j == -1) + break; + if (i >= j - 3 && i <= j + 3) + return false; + } + return true; + } + + public Direction getAssemblyDirection() { + if (assemblyDirection != null) + return assemblyDirection; + TrackTargetingBehaviour target = getTarget(); + if (!target.hasValidTrack()) + return null; + BlockPos targetPosition = target.getGlobalPosition(); + BlockState trackState = target.getTrackBlockState(); + ITrackBlock track = target.getTrack(); + AxisDirection axisDirection = target.getTargetDirection(); + Vec3 axis = track.getTrackAxis(level, targetPosition, trackState) + .normalize() + .scale(axisDirection.getStep()); + return assemblyDirection = Direction.getNearest(axis.x, axis.y, axis.z); + } + + @Override + protected void setRemovedNotDueToChunkUnload() { + assemblyAreas.get(level) + .remove(worldPosition); + for (TrackGraph trackGraph : Create.RAILWAYS.trackNetworks.values()) + trackGraph.removeStation(id); + super.setRemovedNotDueToChunkUnload(); + } + + public void assemble() { + refreshAssemblyInfo(); + + if (bogeyLocations[0] != 0) { + exception(new AssemblyException(new TextComponent("Frontmost Bogey must be at Station Marker")), -1); + return; + } + + TrackTargetingBehaviour target = getTarget(); + if (!target.hasValidTrack()) + return; + + BlockPos trackPosition = target.getGlobalPosition(); + BlockState trackState = target.getTrackBlockState(); + ITrackBlock track = target.getTrack(); + BlockPos bogeyOffset = new BlockPos(track.getUpNormal(level, trackPosition, trackState)); + + DiscoveredLocation location = null; + List> ends = + TrackPropagator.getEnds(level, trackPosition, trackState, null, true); + for (Pair pair : ends) + if (trackPosition.relative(assemblyDirection) + .equals(pair.getFirst())) + location = pair.getSecond(); + if (location == null) + return; + + List pointOffsets = new ArrayList<>(); + for (int i = 0; i < bogeyLocations.length; i++) { + int loc = bogeyLocations[i]; + if (loc == -1) + break; + double bogeySize = bogeyTypes[i].getWheelPointSpacing(); + pointOffsets.add(Double.valueOf(loc + .5 - bogeySize / 2)); + pointOffsets.add(Double.valueOf(loc + .5 + bogeySize / 2)); + } + + List points = new ArrayList<>(); + Vec3 directionVec = Vec3.atLowerCornerOf(assemblyDirection.getNormal()); + TrackGraph graph = null; + TrackNode secondNode = null; + + for (int i = 0; i < assemblyLength + 20; i++) { + if (points.size() == pointOffsets.size()) + break; + + DiscoveredLocation currentLocation = location; + location = new DiscoveredLocation(location.getLocation() + .add(directionVec)); + + if (graph == null) + graph = Create.RAILWAYS.getGraph(level, currentLocation); + if (graph == null) + continue; + TrackNode node = graph.locateNode(currentLocation); + if (node == null) + continue; + + for (int pointIndex = points.size(); pointIndex < pointOffsets.size(); pointIndex++) { + double offset = pointOffsets.get(pointIndex); + if (offset > i) + break; + double positionOnEdge = i - offset; + + Map connectionsFromNode = graph.getConnectionsFrom(node); + + if (secondNode == null) + for (Entry entry : connectionsFromNode.entrySet()) { + TrackEdge edge = entry.getValue(); + TrackNode otherNode = entry.getKey(); + if (edge.isTurn()) + continue; + Vec3 edgeDirection = edge.getDirection(node, otherNode, true); + if (Mth.equal(edgeDirection.normalize() + .dot(directionVec), -1d)) + secondNode = otherNode; + } + + if (secondNode == null) { + Create.LOGGER.warn("Cannot assemble: No valid starting node found"); + return; + } + + TrackEdge edge = connectionsFromNode.get(secondNode); + + if (edge == null) { + Create.LOGGER.warn("Cannot assemble: Missing graph edge"); + return; + } + + points.add(new MovingPoint(graph, node, secondNode, edge, positionOnEdge)); + } + + secondNode = node; + } + + if (points.size() != pointOffsets.size()) { + Create.LOGGER.warn("Cannot assemble: Not all Points created"); + return; + } + + if (points.size() == 0) { + exception(new AssemblyException(new TextComponent("No Bogeys Found")), -1); + return; + } + + List contraptions = new ArrayList<>(); + List carriages = new ArrayList<>(); + List spacing = new ArrayList<>(); + + for (int bogeyIndex = 0; bogeyIndex < bogeyCount; bogeyIndex++) { + int pointIndex = bogeyIndex * 2; + if (bogeyIndex > 0) + spacing.add(bogeyLocations[bogeyIndex] - bogeyLocations[bogeyIndex - 1]); + CarriageContraption contraption = new CarriageContraption(assemblyDirection); + BlockPos bogeyPosOffset = trackPosition.offset(bogeyOffset); + + try { + boolean success = contraption.assemble(level, + bogeyPosOffset.relative(assemblyDirection, bogeyLocations[bogeyIndex] + 1)); + if (!success) { + exception(new AssemblyException(new TextComponent("Nothing attached to Bogey " + bogeyIndex)), -1); + return; + } + } catch (AssemblyException e) { + exception(e, contraptions.size() + 1); + return; + } + + IBogeyBlock typeOfFirstBogey = bogeyTypes[bogeyIndex]; + CarriageBogey firstBogey = + new CarriageBogey(typeOfFirstBogey, points.get(pointIndex), points.get(pointIndex + 1)); + CarriageBogey secondBogey = null; + BlockPos secondBogeyPos = contraption.getSecondBogeyPos(); + int bogeySpacing = 0; + + if (secondBogeyPos != null) { + if (bogeyIndex == bogeyCount - 1 || !secondBogeyPos + .equals(bogeyPosOffset.relative(assemblyDirection, bogeyLocations[bogeyIndex + 1] + 1))) { + exception(new AssemblyException(new TextComponent("Bogeys are not connected in order")), + contraptions.size() + 1); + return; + } + + bogeySpacing = bogeyLocations[bogeyIndex + 1] - bogeyLocations[bogeyIndex]; + secondBogey = new CarriageBogey(bogeyTypes[bogeyIndex + 1], points.get(pointIndex + 2), + points.get(pointIndex + 3)); + bogeyIndex++; + + } else if (!typeOfFirstBogey.allowsSingleBogeyCarriage()) { + exception( + new AssemblyException(new TextComponent("This bogey type cannot support a carriage on its own")), + contraptions.size() + 1); + return; + } + + contraptions.add(contraption); + Carriage carriage = new Carriage(firstBogey, secondBogey, bogeySpacing); + carriage.setContraption(contraption); + carriages.add(carriage); + } + + for (CarriageContraption contraption : contraptions) { + contraption.removeBlocksFromWorld(level, BlockPos.ZERO); + contraption.expandBoundsAroundAxis(Axis.Y); + } + + Create.RAILWAYS.carriageById.values() + .forEach(Carriage::discardEntity); + Create.RAILWAYS.carriageById.clear(); + + Train train = new Train(UUID.randomUUID(), graph, carriages, spacing); + GlobalStation station = getOrCreateGlobalStation(); + train.currentStation = station; + station.reserveFor(train); + + Create.RAILWAYS.trains.put(train.id, train); + clearException(); + } + + public void cancelAssembly() { + assemblyLength = 0; + assemblyAreas.get(level) + .remove(worldPosition); + clearException(); + } + + private void clearException() { + exception(null, -1); + } + + private void exception(AssemblyException exception, int carriage) { + failedCarriageIndex = carriage; + lastException = exception; + sendData(); + } + + // Render + + private AABB renderBounds = null; + + @Override + public AABB getRenderBoundingBox() { + if (isAssembling()) + return INFINITE_EXTENT_AABB; + if (renderBounds == null) + renderBounds = new AABB(worldPosition, getTarget().getGlobalPosition()); + return renderBounds; + } + + @Override + public AssemblyException getLastAssemblyException() { + return lastException; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/TrackTargetingBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/TrackTargetingBehaviour.java new file mode 100644 index 000000000..a02f9b7a4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/TrackTargetingBehaviour.java @@ -0,0 +1,182 @@ +package com.simibubi.create.content.logistics.trains.management; + +import java.util.List; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.ITrackBlock; +import com.simibubi.create.content.logistics.trains.TrackGraph; +import com.simibubi.create.content.logistics.trains.TrackNode; +import com.simibubi.create.content.logistics.trains.TrackNodeLocation.DiscoveredLocation; +import com.simibubi.create.content.logistics.trains.TrackPropagator; +import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class TrackTargetingBehaviour extends TileEntityBehaviour { + + public static final BehaviourType TYPE = new BehaviourType<>(); + + private BlockPos targetTrack; + private AxisDirection targetDirection; + + public TrackTargetingBehaviour(SmartTileEntity te) { + super(te); + targetDirection = AxisDirection.POSITIVE; + targetTrack = BlockPos.ZERO; + } + + @Override + public void write(CompoundTag nbt, boolean clientPacket) { + nbt.put("TargetTrack", NbtUtils.writeBlockPos(targetTrack)); + nbt.putBoolean("TargetDirection", targetDirection == AxisDirection.POSITIVE); + super.write(nbt, clientPacket); + } + + @Override + public void read(CompoundTag nbt, boolean clientPacket) { + targetTrack = NbtUtils.readBlockPos(nbt.getCompound("TargetTrack")); + targetDirection = nbt.getBoolean("TargetDirection") ? AxisDirection.POSITIVE : AxisDirection.NEGATIVE; + super.read(nbt, clientPacket); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + + public boolean hasValidTrack() { + return getTrackBlockState().getBlock() instanceof ITrackBlock; + } + + public ITrackBlock getTrack() { + return (ITrackBlock) getTrackBlockState().getBlock(); + } + + public BlockState getTrackBlockState() { + return getWorld().getBlockState(getGlobalPosition()); + } + + public BlockPos getGlobalPosition() { + return targetTrack.offset(tileEntity.getBlockPos()); + } + + public AxisDirection getTargetDirection() { + return targetDirection; + } + + static class GraphLocation { + public TrackGraph graph; + public Couple edge; + public double position; + } + + public GraphLocation determineGraphLocation() { + Level level = getWorld(); + BlockPos pos = getGlobalPosition(); + BlockState trackBlockState = getTrackBlockState(); + ITrackBlock track = getTrack(); + if (track == null) + return null; + + Vec3 axis = track.getTrackAxis(level, pos, trackBlockState) + .normalize() + .scale(getTargetDirection().getStep()); + + List> ends = + TrackPropagator.getEnds(level, pos, trackBlockState, null, true); + + TrackGraph graph = null; + TrackNode frontNode = null; + TrackNode backNode = null; + double position = 0; + + for (Pair pair : ends) { + DiscoveredLocation current = pair.getSecond(); + BlockPos currentPos = pair.getFirst(); + Vec3 offset = Vec3.atLowerCornerOf(currentPos.subtract(pos)); + boolean forward = offset.distanceToSqr(axis.scale(-1)) < 1 / 4096f; + boolean backwards = offset.distanceToSqr(axis) < 1 / 4096f; + + if (!forward && !backwards) + continue; + + for (int i = 0; i < 32; i++) { + DiscoveredLocation loc = current; + List> list = + TrackPropagator.getEnds(level, currentPos, level.getBlockState(currentPos), current, true); + if (!list.isEmpty()) { + currentPos = list.get(0) + .getFirst(); + current = list.get(0) + .getSecond(); + } + + if (graph == null) + graph = Create.RAILWAYS.getGraph(level, loc); + if (graph == null) + continue; + TrackNode node = graph.locateNode(loc); + if (node == null) + continue; + if (forward) + frontNode = node; + if (backwards) { + backNode = node; + position = i + .5; + } + break; + } + } + + if (frontNode == null || backNode == null) + return null; + + GraphLocation graphLocation = new GraphLocation(); + graphLocation.edge = Couple.create(backNode, frontNode); + graphLocation.position = position; + graphLocation.graph = graph; + return graphLocation; + } + + @OnlyIn(Dist.CLIENT) + public static void render(LevelAccessor level, BlockPos pos, AxisDirection direction, int tintColor, PoseStack ms, + MultiBufferSource buffer, int light, int overlay) { + BlockState trackState = level.getBlockState(pos); + Block block = trackState.getBlock(); + if (!(block instanceof ITrackBlock)) + return; + + ms.pushPose(); + ms.translate(pos.getX(), pos.getY(), pos.getZ()); + + ITrackBlock track = (ITrackBlock) block; + SuperByteBuffer sbb = + CachedBufferer.partial(track.prepareStationOverlay(level, pos, trackState, direction, ms), trackState); + sbb.color(tintColor); + sbb.light(LevelRenderer.getLightColor(level, pos)); + sbb.renderInto(ms, buffer.getBuffer(RenderType.cutoutMipped())); + + ms.popPose(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/TrackTargetingBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/TrackTargetingBlockItem.java new file mode 100644 index 000000000..fa5851172 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/TrackTargetingBlockItem.java @@ -0,0 +1,102 @@ +package com.simibubi.create.content.logistics.trains.management; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.logistics.trains.ITrackBlock; +import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +public class TrackTargetingBlockItem extends BlockItem { + + public TrackTargetingBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + public InteractionResult useOn(UseOnContext pContext) { + ItemStack stack = pContext.getItemInHand(); + BlockPos pos = pContext.getClickedPos(); + Level level = pContext.getLevel(); + BlockState state = level.getBlockState(pos); + Player player = pContext.getPlayer(); + + if (player == null) + return InteractionResult.FAIL; + + if (player.isSteppingCarefully() && stack.hasTag()) { + if (level.isClientSide) + return InteractionResult.SUCCESS; + player.displayClientMessage(Lang.translate("track_target.clear"), true); + stack.setTag(null); + return InteractionResult.SUCCESS; + } + + if (state.getBlock() instanceof ITrackBlock track) { + if (level.isClientSide) + return InteractionResult.SUCCESS; + CompoundTag stackTag = stack.getOrCreateTag(); + boolean front = player.getLookAngle() + .dot(track.getTrackAxis(level, pos, state)) < 0; + stackTag.put("SelectedPos", NbtUtils.writeBlockPos(pos)); + stackTag.putBoolean("SelectedDirection", front); + player.displayClientMessage(Lang.translate("track_target.set"), true); + stack.setTag(stackTag); + return InteractionResult.SUCCESS; + } + + if (!stack.hasTag()) { + player.displayClientMessage(Lang.translate("track_target.missing") + .withStyle(ChatFormatting.RED), true); + return InteractionResult.FAIL; + } + + CompoundTag tag = stack.getTag(); + CompoundTag teTag = new CompoundTag(); + teTag.putBoolean("TargetDirection", tag.getBoolean("SelectedDirection")); + + BlockPos selectedPos = NbtUtils.readBlockPos(tag.getCompound("SelectedPos")); + BlockPos placedPos = pos.relative(pContext.getClickedFace(), state.getMaterial() + .isReplaceable() ? 0 : 1); + + if (!selectedPos.closerThan(placedPos, 16)) { + player.displayClientMessage(Lang.translate("track_target.too_far") + .withStyle(ChatFormatting.RED), true); + return InteractionResult.FAIL; + } + + teTag.put("TargetTrack", NbtUtils.writeBlockPos(selectedPos.subtract(placedPos))); + tag.put("BlockEntityTag", teTag); + + InteractionResult useOn = super.useOn(pContext); + if (level.isClientSide || useOn == InteractionResult.FAIL) + return useOn; + + ItemStack itemInHand = player.getItemInHand(pContext.getHand()); + if (!itemInHand.isEmpty()) + itemInHand.setTag(null); + player.displayClientMessage(Lang.translate("track_target.success") + .withStyle(ChatFormatting.GREEN), true); + return useOn; + } + + public static void clientTick() { + + } + + public static void render(PoseStack ms, SuperRenderTypeBuffer buffer) { + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/TrainEditPacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/TrainEditPacket.java new file mode 100644 index 000000000..da51a36ef --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/TrainEditPacket.java @@ -0,0 +1,56 @@ +package com.simibubi.create.content.logistics.trains.management; + +import java.util.UUID; +import java.util.function.Supplier; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.entity.TrainIconType; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.network.NetworkEvent.Context; + +public class TrainEditPacket extends SimplePacketBase { + + private String name; + private UUID id; + private ResourceLocation iconType; + + public TrainEditPacket(UUID id, String name, ResourceLocation iconType) { + this.name = name; + this.id = id; + this.iconType = iconType; + } + + public TrainEditPacket(FriendlyByteBuf buffer) { + id = buffer.readUUID(); + name = buffer.readUtf(256); + iconType = buffer.readResourceLocation(); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeUUID(id); + buffer.writeUtf(name); + buffer.writeResourceLocation(iconType); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + Train train = Create.RAILWAYS.trains.get(id); + if (train == null) + return; + if (!name.isBlank()) + train.name = new TextComponent(name); + train.icon = TrainIconType.byId(iconType); + }); + context.get() + .setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/WideIconButton.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/WideIconButton.java new file mode 100644 index 000000000..432f11e30 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/WideIconButton.java @@ -0,0 +1,20 @@ +package com.simibubi.create.content.logistics.trains.management; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.element.ScreenElement; +import com.simibubi.create.foundation.gui.widget.IconButton; + +public class WideIconButton extends IconButton { + + public WideIconButton(int x, int y, ScreenElement icon) { + super(x, y, 26, 18, icon); + } + + @Override + protected void drawBg(PoseStack matrixStack, AllGuiTextures button) { + super.drawBg(matrixStack, button); + blit(matrixStack, x + 9, y, button.startX + 1, button.startY, button.width - 1, button.height); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/CargoThresholdCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/CargoThresholdCondition.java new file mode 100644 index 000000000..8bdb1748f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/CargoThresholdCondition.java @@ -0,0 +1,130 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.Arrays; +import java.util.List; +import java.util.function.BiConsumer; + +import com.google.common.collect.ImmutableList; +import com.simibubi.create.content.logistics.trains.management.ScheduleScreen; +import com.simibubi.create.foundation.gui.widget.Label; +import com.simibubi.create.foundation.gui.widget.ScrollInput; +import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public abstract class CargoThresholdCondition extends ScheduleWaitCondition { + public static enum Ops { + GREATER(">"), LESS("<"), EQUAL("="); + + public String formatted; + + private Ops(String formatted) { + this.formatted = formatted; + } + + public static List translatedOptions() { + return Arrays.stream(values()) + .map(op -> Lang.translate("schedule.condition.threshold." + Lang.asId(op.name()))) + .toList(); + } + } + + public CargoThresholdCondition.Ops ops = Ops.GREATER; + public int threshold; + + protected abstract Component getUnit(); + + protected abstract ItemStack getIcon(); + + @Override + public Pair getSummary() { + return Pair.of(getIcon(), new TextComponent(ops.formatted + " " + threshold).append(getUnit())); + } + + @Override + protected void write(CompoundTag tag) { + NBTHelper.writeEnum(tag, "Operator", ops); + tag.putInt("Threshold", threshold); + } + + @Override + protected void read(CompoundTag tag) { + ops = NBTHelper.readEnum(tag, "Operator", CargoThresholdCondition.Ops.class); + threshold = tag.getInt("Threshold"); + } + + @Override + public boolean needsSlot() { + return true; + } + + @Override + public List getSecondLineTooltip() { + return ImmutableList.of(Lang.translate("schedule.condition.threshold.place_item"), + Lang.translate("schedule.condition.threshold.place_item_2") + .withStyle(ChatFormatting.GRAY)); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void createWidgets(ScheduleScreen screen, + List>> editorSubWidgets, + List dividers, int x, int y) { + super.createWidgets(screen, editorSubWidgets, dividers, x, y); + + EditBox editBox = new EditBox(screen.getFont(), x + 109, y + 52, 35, 10, new TextComponent(threshold + "")); + editBox.setBordered(false); + editBox.setValue(threshold + ""); + editBox.setTextColor(0xFFFFFF); + editBox.changeFocus(false); + editBox.mouseClicked(0, 0, 0); + editBox.setFilter(s -> { + if (s.isEmpty()) + return true; + try { + Integer.parseInt(s); + return true; + } catch (NumberFormatException e) { + return false; + } + }); + + Label label = new Label(x + 87, y + 52, new TextComponent(ops.formatted)).withShadow(); + label.text = new TextComponent(ops.formatted); + ScrollInput scrollInput = new SelectionScrollInput(x + 76, y + 48, 24, 16).forOptions(Ops.translatedOptions()) + .titled(Lang.translate("schedule.condition.threshold.train_holds")) + .calling(state -> { + label.text = new TextComponent(Ops.values()[state].formatted); + }) + .setState(ops.ordinal()); + + editorSubWidgets.add(Pair.of(editBox, (dest, box) -> { + CargoThresholdCondition c = (CargoThresholdCondition) dest; + String text = ((EditBox) box).getValue(); + if (text.isEmpty()) + c.threshold = 0; + else + c.threshold = Integer.parseInt(text); + })); + editorSubWidgets.add(Pair.of(scrollInput, (dest, box) -> { + CargoThresholdCondition c = (CargoThresholdCondition) dest; + c.ops = Ops.values()[((ScrollInput) box).getState()]; + })); + editorSubWidgets.add(Pair.of(label, (d, l) -> { + })); + + dividers.add(24); + dividers.add(70); + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/FilteredDestination.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/FilteredDestination.java new file mode 100644 index 000000000..41e3c3101 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/FilteredDestination.java @@ -0,0 +1,85 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.List; +import java.util.function.BiConsumer; + +import com.google.common.collect.ImmutableList; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.management.ScheduleScreen; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class FilteredDestination extends ScheduleDestination { + public String nameFilter = ""; + + @Override + public Pair getSummary() { + return Pair.of(AllBlocks.TRACK_STATION.asStack(), new TextComponent(nameFilter)); + } + + @Override + protected void read(CompoundTag tag) { + nameFilter = tag.getString("Filter"); + } + + @Override + protected void write(CompoundTag tag) { + tag.putString("Filter", nameFilter); + } + + @Override + public ResourceLocation getId() { + return Create.asResource("filtered"); + } + + @Override + public ItemStack getSecondLineIcon() { + return AllBlocks.TRACK_STATION.asStack(); + } + + @Override + public List getTitleAs(String type) { + return ImmutableList.of(Lang.translate("schedule.destination.filtered_matching", + new TextComponent(nameFilter).withStyle(ChatFormatting.YELLOW))); + } + + @Override + public List getSecondLineTooltip() { + return ImmutableList.of(Lang.translate("schedule.destination.filter"), + Lang.translate("schedule.destination.filter_2") + .withStyle(ChatFormatting.GRAY), + Lang.translate("schedule.destination.filter_3") + .withStyle(ChatFormatting.DARK_GRAY), + Lang.translate("schedule.destination.filter_4") + .withStyle(ChatFormatting.DARK_GRAY)); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void createWidgets(ScheduleScreen screen, + List>> editorSubWidgets, + List dividers, int x, int y) { + super.createWidgets(screen, editorSubWidgets, dividers, x, y); + EditBox editBox = new EditBox(screen.getFont(), x + 84, y + 52, 112, 10, new TextComponent(nameFilter)); + editBox.setBordered(false); + editBox.setTextColor(0xFFFFFF); + editBox.setValue(nameFilter); + editBox.changeFocus(false); + editBox.mouseClicked(0, 0, 0); + editorSubWidgets + .add(Pair.of(editBox, (dest, box) -> ((FilteredDestination) dest).nameFilter = ((EditBox) box).getValue())); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/FluidThresholdCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/FluidThresholdCondition.java new file mode 100644 index 000000000..a34752b39 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/FluidThresholdCondition.java @@ -0,0 +1,104 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.List; +import java.util.function.BiConsumer; + +import com.google.common.collect.ImmutableList; +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; +import com.simibubi.create.content.logistics.item.filter.FilterItem; +import com.simibubi.create.content.logistics.trains.management.ScheduleScreen; +import com.simibubi.create.foundation.gui.widget.Label; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fluids.FluidStack; + +public class FluidThresholdCondition extends CargoThresholdCondition { + public ItemStack compareStack = ItemStack.EMPTY; + public FluidStack fluidStack = null; + + @Override + protected Component getUnit() { + return new TextComponent("b"); + } + + @Override + protected ItemStack getIcon() { + return compareStack; + } + + @Override + protected void write(CompoundTag tag) { + super.write(tag); + tag.put("Bucket", compareStack.serializeNBT()); + } + + @Override + protected void read(CompoundTag tag) { + super.read(tag); + compareStack = ItemStack.of(tag.getCompound("Bucket")); + } + + @OnlyIn(Dist.CLIENT) + private FluidStack loadFluid() { + if (fluidStack != null) + return fluidStack; + fluidStack = FluidStack.EMPTY; + if (!EmptyingByBasin.canItemBeEmptied(Minecraft.getInstance().level, compareStack)) + return fluidStack; + FluidStack fluidInFilter = EmptyingByBasin.emptyItem(Minecraft.getInstance().level, compareStack, true) + .getFirst(); + if (fluidInFilter == null) + return fluidStack; + return fluidStack = fluidInFilter; + } + + @Override + public List getTitleAs(String type) { + return ImmutableList.of( + Lang.translate("schedule.condition.threshold.train_holds", + Lang.translate("schedule.condition.threshold." + Lang.asId(ops.name()))), + Lang.translate("schedule.condition.threshold.x_units_of_item", threshold, + Lang.translate("schedule.condition.threshold.buckets"), + compareStack.getItem() instanceof FilterItem + ? Lang.translate("schedule.condition.threshold.matching_content") + : loadFluid().getDisplayName()) + .withStyle(ChatFormatting.DARK_AQUA)); + } + + @Override + public void setItem(ItemStack stack) { + compareStack = stack; + } + + @Override + public ResourceLocation getId() { + return Create.asResource("fluid_threshold"); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void createWidgets(ScheduleScreen screen, + List>> editorSubWidgets, + List dividers, int x, int y) { + super.createWidgets(screen, editorSubWidgets, dividers, x, y); + + TranslatableComponent buckets = Lang.translate("schedule.condition.threshold.buckets"); + Label label = new Label(x + 155, y + 52, buckets).withShadow(); + label.text = buckets; + editorSubWidgets.add(Pair.of(label, (d, l) -> { + })); + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/IScheduleInput.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/IScheduleInput.java new file mode 100644 index 000000000..924a1e18f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/IScheduleInput.java @@ -0,0 +1,57 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.List; +import java.util.function.BiConsumer; + +import javax.annotation.Nullable; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.content.logistics.trains.management.ScheduleScreen; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public interface IScheduleInput { + + public abstract Pair getSummary(); + + public abstract ResourceLocation getId(); + + public default boolean needsSlot() { + return false; + } + + @OnlyIn(Dist.CLIENT) + public default void createWidgets(ScheduleScreen screen, + List>> editorSubWidgets, + List dividers, int x, int y) {} + + public default List getTitleAs(String type) { + ResourceLocation id = getId(); + return ImmutableList.of(new TranslatableComponent(id.getNamespace() + ".schedule." + type + "." + id.getPath())); + } + + public default ItemStack getSecondLineIcon() { + return ItemStack.EMPTY; + } + + public default void setItem(ItemStack stack) {} + + @Nullable + public default List getSecondLineTooltip() { + return null; + } + + @OnlyIn(Dist.CLIENT) + public default boolean renderSpecialIcon(PoseStack ms, int x, int y) { + return false; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/IdleCargoCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/IdleCargoCondition.java new file mode 100644 index 000000000..5f56222fe --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/IdleCargoCondition.java @@ -0,0 +1,21 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +public class IdleCargoCondition extends TimedWaitCondition { + @Override + public Pair getSummary() { + return Pair.of(ItemStack.EMPTY, Lang.translate("schedule.condition.idle_short", formatTime(true))); + } + + @Override + public ResourceLocation getId() { + return Create.asResource("idle"); + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ItemThresholdCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ItemThresholdCondition.java new file mode 100644 index 000000000..e9e3817ba --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ItemThresholdCondition.java @@ -0,0 +1,98 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.List; +import java.util.function.BiConsumer; + +import com.google.common.collect.ImmutableList; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.item.filter.FilterItem; +import com.simibubi.create.content.logistics.trains.management.ScheduleScreen; +import com.simibubi.create.foundation.gui.widget.Label; +import com.simibubi.create.foundation.gui.widget.ScrollInput; +import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class ItemThresholdCondition extends CargoThresholdCondition { + public ItemStack stack = ItemStack.EMPTY; + public boolean stacks; + + @Override + protected Component getUnit() { + return new TextComponent(stacks ? "\u25A4" : ""); + } + + @Override + protected ItemStack getIcon() { + return stack; + } + + @Override + protected void write(CompoundTag tag) { + super.write(tag); + tag.put("Item", stack.serializeNBT()); + tag.putBoolean("Stacks", stacks); + } + + @Override + protected void read(CompoundTag tag) { + super.read(tag); + stack = ItemStack.of(tag.getCompound("Item")); + stacks = tag.getBoolean("Stacks"); + } + + @Override + public void setItem(ItemStack stack) { + this.stack = stack; + } + + @Override + public List getTitleAs(String type) { + return ImmutableList.of( + Lang.translate("schedule.condition.threshold.train_holds", + Lang.translate("schedule.condition.threshold." + Lang.asId(ops.name()))), + Lang.translate("schedule.condition.threshold.x_units_of_item", threshold, + Lang.translate("schedule.condition.threshold." + (stacks ? "stacks" : "items")), + stack.getItem() instanceof FilterItem ? Lang.translate("schedule.condition.threshold.matching_content") + : stack.getHoverName()) + .withStyle(ChatFormatting.DARK_AQUA)); + } + + @Override + public ResourceLocation getId() { + return Create.asResource("item_threshold"); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void createWidgets(ScheduleScreen screen, + List>> editorSubWidgets, + List dividers, int x, int y) { + super.createWidgets(screen, editorSubWidgets, dividers, x, y); + + Label label = new Label(x + 155, y + 52, new TextComponent(ops.formatted)).withShadow(); + ScrollInput scrollInput = new SelectionScrollInput(x + 150, y + 48, 49, 16) + .forOptions(ImmutableList.of(Lang.translate("schedule.condition.threshold.items"), + Lang.translate("schedule.condition.threshold.stacks"))) + .titled(Lang.translate("schedule.condition.threshold.item_measure")) + .writingTo(label) + .setState(stacks ? 1 : 0); + + editorSubWidgets.add(Pair.of(scrollInput, (dest, box) -> { + ItemThresholdCondition c = (ItemThresholdCondition) dest; + c.stacks = ((ScrollInput) box).getState() == 1; + })); + editorSubWidgets.add(Pair.of(label, (d, l) -> { + })); + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/NearestDestination.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/NearestDestination.java new file mode 100644 index 000000000..040a8ec16 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/NearestDestination.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +public class NearestDestination extends ScheduleDestination { + @Override + public Pair getSummary() { + return Pair.of(AllBlocks.TRACK_STATION.asStack(), Lang.translate("schedule.destination.nearest")); + } + + @Override + protected void write(CompoundTag tag) {} + + @Override + protected void read(CompoundTag tag) {} + + @Override + public ResourceLocation getId() { + return Create.asResource("nearest"); + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/RedstoneDestination.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/RedstoneDestination.java new file mode 100644 index 000000000..86615060e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/RedstoneDestination.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +public class RedstoneDestination extends ScheduleDestination { + @Override + public Pair getSummary() { + return Pair.of(AllBlocks.TRACK_STATION.asStack(), new TextComponent("Redstone Pulse")); + } + + @Override + protected void write(CompoundTag tag) {} + + @Override + protected void read(CompoundTag tag) {} + + @Override + public ResourceLocation getId() { + return Create.asResource("redstone"); + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/Schedule.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/Schedule.java new file mode 100644 index 000000000..1eeec12af --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/Schedule.java @@ -0,0 +1,78 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; + +public class Schedule { + + public static List>> DESTINATION_TYPES = + new ArrayList<>(); + public static List>> CONDITION_TYPES = + new ArrayList<>(); + + static { + registerDestination("filtered", FilteredDestination::new); + registerDestination("nearest", NearestDestination::new); + registerDestination("redstone", RedstoneDestination::new); + registerCondition("delay", ScheduledDelay::new); + registerCondition("time_of_day", TimeOfDayCondition::new); + registerCondition("fluid_threshold", FluidThresholdCondition::new); + registerCondition("item_threshold", ItemThresholdCondition::new); + registerCondition("idle", IdleCargoCondition::new); + registerCondition("unloaded", StationUnloadedCondition::new); + registerCondition("powered", StationPoweredCondition::new); + } + + private static void registerDestination(String name, Supplier factory) { + DESTINATION_TYPES.add(Pair.of(Create.asResource(name), factory)); + } + + private static void registerCondition(String name, Supplier factory) { + CONDITION_TYPES.add(Pair.of(Create.asResource(name), factory)); + } + + public static List getTypeOptions(List> list) { + String langSection = list.equals(DESTINATION_TYPES) ? "destination." : "condition."; + return list.stream() + .map(Pair::getFirst) + .map(rl -> rl.getNamespace() + ".schedule." + langSection + rl.getPath()) + .map(TranslatableComponent::new) + .toList(); + } + + public List entries; + public boolean cyclic; + + public Schedule() { + entries = new ArrayList<>(); + cyclic = true; + } + + public CompoundTag write() { + CompoundTag tag = new CompoundTag(); + ListTag list = NBTHelper.writeCompoundList(entries, ScheduleEntry::write); + tag.put("Entries", list); + tag.putBoolean("Cyclic", cyclic); + return tag; + } + + public static Schedule fromTag(CompoundTag tag) { + Schedule schedule = new Schedule(); + schedule.entries = NBTHelper.readCompoundList(tag.getList("Entries", Tag.TAG_COMPOUND), ScheduleEntry::fromTag); + schedule.cyclic = tag.getBoolean("Cyclic"); + return schedule; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleDestination.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleDestination.java new file mode 100644 index 000000000..246404daa --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleDestination.java @@ -0,0 +1,42 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.function.Supplier; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; + +public abstract class ScheduleDestination implements IScheduleInput { + + protected abstract void write(CompoundTag tag); + + protected abstract void read(CompoundTag tag); + + public final CompoundTag write() { + CompoundTag tag = new CompoundTag(); + tag.putString("Id", getId().toString()); + write(tag); + return tag; + } + + public static ScheduleDestination fromTag(CompoundTag tag) { + ResourceLocation location = new ResourceLocation(tag.getString("Id")); + Supplier supplier = null; + for (Pair> pair : Schedule.DESTINATION_TYPES) + if (pair.getFirst() + .equals(location)) + supplier = pair.getSecond(); + + if (supplier == null) { + Create.LOGGER.warn("Could not parse schedule destination type: " + location); + return null; + } + + ScheduleDestination scheduleDestination = supplier.get(); + scheduleDestination.read(tag); + return scheduleDestination; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleEditPacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleEditPacket.java new file mode 100644 index 000000000..ddd6537a2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleEditPacket.java @@ -0,0 +1,48 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.function.Supplier; + +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.network.NetworkEvent.Context; + +public class ScheduleEditPacket extends SimplePacketBase { + + private Schedule schedule; + + public ScheduleEditPacket(Schedule schedule) { + this.schedule = schedule; + } + + public ScheduleEditPacket(FriendlyByteBuf buffer) { + schedule = Schedule.fromTag(buffer.readNbt()); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeNbt(schedule.write()); + } + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + ServerPlayer sender = context.get() + .getSender(); + ItemStack mainHandItem = sender.getMainHandItem(); + if (!AllItems.SCHEDULE.isIn(mainHandItem)) + return; + mainHandItem.getOrCreateTag() + .put("Schedule", schedule.write()); + sender.getCooldowns() + .addCooldown(mainHandItem.getItem(), 5); + }); + context.get() + .setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleEntry.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleEntry.java new file mode 100644 index 000000000..89a9a6295 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleEntry.java @@ -0,0 +1,44 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; + +public class ScheduleEntry { + public ScheduleDestination destination; + public List> conditions; + + public ScheduleEntry() { + conditions = new ArrayList<>(); + } + + public ScheduleEntry clone() { + return fromTag(write()); + } + + public CompoundTag write() { + CompoundTag tag = new CompoundTag(); + ListTag outer = new ListTag(); + tag.put("Destination", destination.write()); + for (List column : conditions) + outer.add(NBTHelper.writeCompoundList(column, ScheduleWaitCondition::write)); + tag.put("WaitConditions", outer); + return tag; + } + + public static ScheduleEntry fromTag(CompoundTag tag) { + ScheduleEntry entry = new ScheduleEntry(); + entry.destination = ScheduleDestination.fromTag(tag.getCompound("Destination")); + entry.conditions = new ArrayList<>(); + for (Tag t : tag.getList("WaitConditions", Tag.TAG_LIST)) + if (t instanceof ListTag list) + entry.conditions.add(NBTHelper.readCompoundList(list, ScheduleWaitCondition::fromTag)); + return entry; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleWaitCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleWaitCondition.java new file mode 100644 index 000000000..e1e4819a4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduleWaitCondition.java @@ -0,0 +1,48 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.function.Supplier; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; + +public abstract class ScheduleWaitCondition implements IScheduleInput { + + protected abstract void write(CompoundTag tag); + + protected abstract void read(CompoundTag tag); + + public boolean tickCompletion(Level level, Train train, CompoundTag context) { + return false; // TODO: make abstract + } + + public final CompoundTag write() { + CompoundTag tag = new CompoundTag(); + tag.putString("Id", getId().toString()); + write(tag); + return tag; + } + + public static ScheduleWaitCondition fromTag(CompoundTag tag) { + ResourceLocation location = new ResourceLocation(tag.getString("Id")); + Supplier supplier = null; + for (Pair> pair : Schedule.CONDITION_TYPES) + if (pair.getFirst() + .equals(location)) + supplier = pair.getSecond(); + + if (supplier == null) { + Create.LOGGER.warn("Could not parse waiting condition type: " + location); + return null; + } + + ScheduleWaitCondition condition = supplier.get(); + condition.read(tag); + return condition; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduledDelay.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduledDelay.java new file mode 100644 index 000000000..f1ce3b0d1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/ScheduledDelay.java @@ -0,0 +1,34 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class ScheduledDelay extends TimedWaitCondition { + @Override + public Pair getSummary() { + return Pair.of(ItemStack.EMPTY, Lang.translate("schedule.condition.delay_short", formatTime(true))); + } + + @Override + public boolean tickCompletion(Level level, Train train, CompoundTag context) { + int time = context.getInt("Time"); + if (time >= value * timeUnit.ticksPer) + return true; + context.putInt("Time", time + 1); + return false; + } + + @Override + public ResourceLocation getId() { + return Create.asResource("delay"); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/StationPoweredCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/StationPoweredCondition.java new file mode 100644 index 000000000..795ba7d4a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/StationPoweredCondition.java @@ -0,0 +1,43 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.management.GlobalStation; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class StationPoweredCondition extends ScheduleWaitCondition { + @Override + public Pair getSummary() { + return Pair.of(ItemStack.EMPTY, Lang.translate("schedule.condition.powered")); + } + + @Override + public boolean tickCompletion(Level level, Train train, CompoundTag context) { + GlobalStation currentStation = train.currentStation; + if (currentStation == null) + return false; + BlockPos stationPos = currentStation.stationPos; + if (!level.isLoaded(stationPos)) + return false; + return level.hasNeighborSignal(stationPos); + } + + @Override + protected void write(CompoundTag tag) {} + + @Override + protected void read(CompoundTag tag) {} + + @Override + public ResourceLocation getId() { + return Create.asResource("powered"); + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/StationUnloadedCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/StationUnloadedCondition.java new file mode 100644 index 000000000..f93756075 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/StationUnloadedCondition.java @@ -0,0 +1,42 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.management.GlobalStation; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class StationUnloadedCondition extends ScheduleWaitCondition { + @Override + public Pair getSummary() { + return Pair.of(ItemStack.EMPTY, Lang.translate("schedule.condition.unloaded")); + } + + @Override + public boolean tickCompletion(Level level, Train train, CompoundTag context) { + GlobalStation currentStation = train.currentStation; + if (currentStation == null) + return false; + if (level instanceof ServerLevel serverLevel) + return !serverLevel.isPositionEntityTicking(currentStation.stationPos); + return false; + } + + @Override + protected void write(CompoundTag tag) {} + + @Override + protected void read(CompoundTag tag) {} + + @Override + public ResourceLocation getId() { + return Create.asResource("unloaded"); + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/TimeOfDayCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/TimeOfDayCondition.java new file mode 100644 index 000000000..8570f8ddf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/TimeOfDayCondition.java @@ -0,0 +1,164 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.List; +import java.util.function.BiConsumer; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.content.logistics.trains.management.ScheduleScreen; +import com.simibubi.create.foundation.gui.widget.Label; +import com.simibubi.create.foundation.gui.widget.ScrollInput; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class TimeOfDayCondition extends ScheduleWaitCondition { + + int hour; + int minute; + int gracePeriod; + + public TimeOfDayCondition() { + hour = 8; + minute = 0; + gracePeriod = 5; + } + + @Override + public boolean tickCompletion(Level level, Train train, CompoundTag context) { + int maxTickDiff = Math.max(20, gracePeriod * 60 * 20); + int dayTime = (int) (level.getDayTime() % 24000); + int targetTicks = (int) (((hour + 18) % 24) * 1000 + (minute / 60f) * 100); + int diff = dayTime - targetTicks; + return diff >= 0 && maxTickDiff >= diff; + } + + @Override + public Pair getSummary() { + return Pair.of(new ItemStack(Items.STRUCTURE_VOID), getDigitalDisplay(hour, minute, false)); + } + + public MutableComponent getDigitalDisplay(int hour, int minute, boolean doubleDigitHrs) { + int hour12raw = hour % 12 == 0 ? 12 : hour % 12; + String hr12 = doubleDigitHrs ? twoDigits(hour12raw) : ("" + hour12raw); + String hr24 = doubleDigitHrs ? twoDigits(hour) : ("" + hour); + return Lang.translate("schedule.condition.time_of_day.digital_format", hr12, hr24, twoDigits(minute), + hour > 11 ? Lang.translate("generic.daytime.pm") : Lang.translate("generic.daytime.am")); + } + + @Override + public List getSecondLineTooltip() { + return super.getSecondLineTooltip(); + } + + @Override + public List getTitleAs(String type) { + return ImmutableList.of(Lang.translate("schedule.condition.time_of_day.scheduled", + getDigitalDisplay(hour, minute, false).withStyle(ChatFormatting.DARK_AQUA))); + } + + public String twoDigits(int t) { + return t < 10 ? "0" + t : "" + t; + } + + @Override + public ResourceLocation getId() { + return Create.asResource("time_of_day"); + } + + @Override + protected void write(CompoundTag tag) { + tag.putInt("Hour", hour); + tag.putInt("Minute", minute); + tag.putInt("GracePeriod", gracePeriod); + } + + @Override + protected void read(CompoundTag tag) { + hour = tag.getInt("Hour"); + minute = tag.getInt("Minute"); + gracePeriod = tag.getInt("GracePeriod"); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean renderSpecialIcon(PoseStack ms, int x, int y) { + int displayHr = (hour + 12) % 24; + float progress = (displayHr * 60f + minute) / (24 * 60); + RenderSystem.setShaderTexture(0, + new ResourceLocation("textures/item/clock_" + twoDigits(Mth.clamp((int) (progress * 64), 0, 63)) + ".png")); + GuiComponent.blit(ms, x, y, 0, 0, 0, 16, 16, 16, 16); + return true; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void createWidgets(ScheduleScreen screen, + List>> editorSubWidgets, + List dividers, int x, int y) { + super.createWidgets(screen, editorSubWidgets, dividers, x, y); + + Label timeLabel = new Label(x + 87, y + 52, new TextComponent("")).withShadow(); + timeLabel.text = getDigitalDisplay(hour, minute, true); + ScrollInput hourInput = new ScrollInput(x + 82, y + 48, 16, 16).withRange(0, 24); + ScrollInput minuteInput = new ScrollInput(x + 82 + 18, y + 48, 16, 16).withRange(0, 60); + + hourInput.titled(Lang.translate("generic.daytime.hour")) + .calling(t -> { + hour = t; + timeLabel.text = getDigitalDisplay(hour, minute, true); + }) + .withShiftStep(6) + .setState(hour); + + minuteInput.titled(Lang.translate("generic.daytime.minute")) + .calling(t -> { + minute = t; + timeLabel.text = getDigitalDisplay(hour, minute, true); + }) + .withShiftStep(15) + .setState(minute); + + minuteInput.lockedTooltipX = hourInput.lockedTooltipX = x + 83 + 40; + minuteInput.lockedTooltipY = hourInput.lockedTooltipY = y + 55; + + dividers.add(70); + + Label graceLabel = new Label(x + 155, y + 52, new TextComponent("")).withShadow(); + graceLabel.text = Lang.translate("schedule.condition.time_of_day.grace_period.format", gracePeriod); + ScrollInput scrollInput = new ScrollInput(x + 150, y + 48, 49, 16).withRange(0, 12) + .titled(Lang.translate("schedule.condition.time_of_day.grace_period")) + .calling(t -> graceLabel.text = Lang.translate("schedule.condition.time_of_day.grace_period.format", t)) + .setState(gracePeriod); + + editorSubWidgets.add(Pair.of(scrollInput, + (dest, box) -> ((TimeOfDayCondition) dest).gracePeriod = ((ScrollInput) box).getState())); + editorSubWidgets + .add(Pair.of(hourInput, (dest, box) -> ((TimeOfDayCondition) dest).hour = ((ScrollInput) box).getState())); + editorSubWidgets.add( + Pair.of(minuteInput, (dest, box) -> ((TimeOfDayCondition) dest).minute = ((ScrollInput) box).getState())); + + editorSubWidgets.add(Pair.of(timeLabel, (d, l) -> { + })); + editorSubWidgets.add(Pair.of(graceLabel, (d, l) -> { + })); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/TimedWaitCondition.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/TimedWaitCondition.java new file mode 100644 index 000000000..31685e4f2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/schedule/TimedWaitCondition.java @@ -0,0 +1,134 @@ +package com.simibubi.create.content.logistics.trains.management.schedule; + +import java.util.List; +import java.util.function.BiConsumer; + +import com.google.common.collect.ImmutableList; +import com.simibubi.create.content.logistics.trains.management.ScheduleScreen; +import com.simibubi.create.foundation.gui.widget.Label; +import com.simibubi.create.foundation.gui.widget.ScrollInput; +import com.simibubi.create.foundation.gui.widget.SelectionScrollInput; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public abstract class TimedWaitCondition extends ScheduleWaitCondition { + public TimedWaitCondition.TimeUnit timeUnit = TimeUnit.TICKS; + public int value; + + public static enum TimeUnit { + TICKS(1, "t", "generic.unit.ticks"), + SECONDS(20, "s", "generic.unit.seconds"), + MINUTES(20 * 60, "min", "generic.unit.minutes"); + + public int ticksPer; + public String suffix; + public String key; + + private TimeUnit(int ticksPer, String suffix, String key) { + this.ticksPer = ticksPer; + this.suffix = suffix; + this.key = key; + } + + public static List translatedOptions() { + return Lang.translatedOptions(null, TICKS.key, SECONDS.key, MINUTES.key); + } + } + + protected Component formatTime(boolean compact) { + if (compact) + return new TextComponent(value + timeUnit.suffix); + return new TextComponent(value + " ").append(Lang.translate(timeUnit.key)); + } + + @Override + public List getTitleAs(String type) { + return ImmutableList.of( + new TranslatableComponent(getId().getNamespace() + ".schedule." + type + "." + getId().getPath()), + Lang.translate("schedule.condition.for_x_time", formatTime(false)) + .withStyle(ChatFormatting.DARK_AQUA)); + } + + @Override + protected void write(CompoundTag tag) { + tag.putInt("Value", value); + NBTHelper.writeEnum(tag, "Unit", timeUnit); + } + + @Override + protected void read(CompoundTag tag) { + value = tag.getInt("Value"); + timeUnit = NBTHelper.readEnum(tag, "Unit", TimedWaitCondition.TimeUnit.class); + } + + @Override + public ItemStack getSecondLineIcon() { + return new ItemStack(Items.REPEATER); + } + + @Override + public List getSecondLineTooltip() { + return ImmutableList.of(Lang.translate("generic.duration")); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void createWidgets(ScheduleScreen screen, + List>> editorSubWidgets, + List dividers, int x, int y) { + super.createWidgets(screen, editorSubWidgets, dividers, x, y); + + EditBox editBox = new EditBox(screen.getFont(), x + 84, y + 52, 31, 10, new TextComponent(value + "")); + editBox.setBordered(false); + editBox.setValue(value + ""); + editBox.setTextColor(0xFFFFFF); + editBox.changeFocus(false); + editBox.mouseClicked(0, 0, 0); + editBox.setFilter(s -> { + if (s.isEmpty()) + return true; + try { + Integer.parseInt(s); + return true; + } catch (NumberFormatException e) { + return false; + } + }); + dividers.add(40); + + Label label = new Label(x + 125, y + 52, Lang.translate(timeUnit.key)).withShadow(); + ScrollInput scrollInput = + new SelectionScrollInput(x + 120, y + 48, 79, 16).forOptions(TimeUnit.translatedOptions()) + .titled(Lang.translate("generic.timeUnit")) + .writingTo(label) + .setState(timeUnit.ordinal()); + + editorSubWidgets.add(Pair.of(editBox, (dest, box) -> { + TimedWaitCondition c = (TimedWaitCondition) dest; + String text = ((EditBox) box).getValue(); + if (text.isEmpty()) + c.value = 0; + else + c.value = Integer.parseInt(text); + })); + editorSubWidgets.add(Pair.of(scrollInput, (dest, box) -> { + TimedWaitCondition c = (TimedWaitCondition) dest; + c.timeUnit = TimeUnit.values()[((ScrollInput) box).getState()]; + })); + editorSubWidgets.add(Pair.of(label, (d, l) -> { + })); + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java new file mode 100644 index 000000000..6b7eacce3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java @@ -0,0 +1,168 @@ +package com.simibubi.create.content.logistics.trains.track; + +import java.util.EnumSet; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Vector3f; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.logistics.trains.IBogeyBlock; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class StandardBogeyBlock extends Block implements IBogeyBlock, ITE { + + public static final EnumProperty AXIS = BlockStateProperties.HORIZONTAL_AXIS; + private boolean large; + + public StandardBogeyBlock(Properties p_i48440_1_, boolean large) { + super(p_i48440_1_); + this.large = large; + } + + @Override + protected void createBlockStateDefinition(Builder builder) { + builder.add(AXIS); + super.createBlockStateDefinition(builder); + } + + static final EnumSet STICKY_X = EnumSet.of(Direction.EAST, Direction.WEST); + static final EnumSet STICKY_Z = EnumSet.of(Direction.SOUTH, Direction.NORTH); + + @Override + public EnumSet getStickySurfaces(BlockGetter world, BlockPos pos, BlockState state) { + return state.getValue(BlockStateProperties.HORIZONTAL_AXIS) == Axis.X ? STICKY_X : STICKY_Z; + } + + @Override + public double getWheelPointSpacing() { + return large ? .75f : 2; + } + + @Override + public double getWheelRadius() { + return (large ? 12.5 : 6.5) / 16d; + } + + @Override + public Vec3 getConnectorAnchorOffset() { + return new Vec3(0, 7 / 32f, 1); + } + + @Override + public boolean allowsSingleBogeyCarriage() { + return !large; + } + + @Override + public BlockState getMatchingBogey(Direction upDirection, boolean axisAlongFirst) { + if (upDirection != Direction.UP) + return null; + return defaultBlockState().setValue(AXIS, axisAlongFirst ? Axis.X : Axis.Z); + } + + @Override + public boolean isTrackAxisAlongFirstCoordinate(BlockState state) { + return state.getValue(AXIS) == Axis.X; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void render(BlockState state, float wheelAngle, PoseStack ms, float partialTicks, MultiBufferSource buffers, + int light, int overlay) { + if (state != null) { + ms.translate(.5f, .5f, .5f); + if (state.getValue(AXIS) == Axis.X) + ms.mulPose(Vector3f.YP.rotationDegrees(90)); + } + + ms.translate(0, -1.5, 0); + + VertexConsumer vb = buffers.getBuffer(RenderType.solid()); + BlockState air = Blocks.AIR.defaultBlockState(); + + if (!large) { + CachedBufferer.partial(AllBlockPartials.BOGEY_FRAME, air) + .light(light) + .renderInto(ms, vb); + + for (int side : Iterate.positiveAndNegative) { + ms.pushPose(); + CachedBufferer.partial(AllBlockPartials.SMALL_BOGEY_WHEELS, air) + .translate(0, 12 / 16f, side) + .rotateX(wheelAngle) + .light(light) + .renderInto(ms, vb); + ms.popPose(); + } + return; + } + + CachedBufferer.partial(AllBlockPartials.BOGEY_DRIVE, air) + .light(light) + .renderInto(ms, vb); + CachedBufferer.partial(AllBlockPartials.BOGEY_PISTON, air) + .translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle))) + .light(light) + .renderInto(ms, vb); + + ms.pushPose(); + CachedBufferer.partial(AllBlockPartials.LARGE_BOGEY_WHEELS, air) + .translate(0, 1, 0) + .rotateX(wheelAngle) + .light(light) + .renderInto(ms, vb); + CachedBufferer.partial(AllBlockPartials.BOGEY_PIN, air) + .translate(0, 1, 0) + .rotateX(wheelAngle) + .translate(0, 1 / 4f, 0) + .rotateX(-wheelAngle) + .light(light) + .renderInto(ms, vb); + ms.popPose(); + + } + + @Override + public BlockState rotate(BlockState pState, Rotation pRotation) { + switch (pRotation) { + case COUNTERCLOCKWISE_90: + case CLOCKWISE_90: + return pState.cycle(AXIS); + default: + return pState; + } + } + + @Override + public Class getTileEntityClass() { + return StandardBogeyTileEntity.class; + } + + @Override + public BlockEntityType getTileEntityType() { + return AllTileEntities.BOGEY.get(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java new file mode 100644 index 000000000..3e6b00783 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java @@ -0,0 +1,21 @@ +package com.simibubi.create.content.logistics.trains.track; + +import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; + +public class StandardBogeyTileEntity extends SyncedTileEntity { + + public StandardBogeyTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + } + + @Override + public AABB getRenderBoundingBox() { + return super.getRenderBoundingBox().inflate(2); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java new file mode 100644 index 000000000..2b628e8ac --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java @@ -0,0 +1,331 @@ +package com.simibubi.create.content.logistics.trains.track; + +import java.util.Map.Entry; +import java.util.Random; + +import com.jozufozu.flywheel.core.PartialModel; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.Create; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.content.logistics.trains.ITrackBlock; +import com.simibubi.create.content.logistics.trains.TrackPropagator; +import com.simibubi.create.content.logistics.trains.management.StationTileEntity; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition.Builder; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraft.world.ticks.LevelTickAccess; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class TrackBlock extends Block implements EntityBlock, IWrenchable, ITrackBlock { + + public static final EnumProperty SHAPE = EnumProperty.create("shape", TrackShape.class); + public static final BooleanProperty HAS_TURN = BooleanProperty.create("turn"); + + public enum TrackShape implements StringRepresentable { + NONE("", Vec3.ZERO), + ZO("z_ortho", new Vec3(0, 0, 1)), + XO("x_ortho", new Vec3(1, 0, 0)), + PD("pos_diag", new Vec3(1, 0, 1)), + ND("neg_diag", new Vec3(-1, 0, 1)), + AN("ascending", 180, new Vec3(0, 1, -1), new Vec3(0, 1, 1)), + AS("ascending", 0, new Vec3(0, 1, 1), new Vec3(0, 1, -1)), + AE("ascending", 270, new Vec3(1, 1, 0), new Vec3(-1, 1, 0)), + AW("ascending", 90, new Vec3(-1, 1, 0), new Vec3(1, 1, 0)); + + private String model; + private Vec3 axis; + private int modelRotation; + private Vec3 normal; + + private TrackShape(String model, Vec3 axis) { + this(model, 0, axis, new Vec3(0, 1, 0)); + } + + private TrackShape(String model, int modelRotation, Vec3 axis, Vec3 normal) { + this.model = model; + this.modelRotation = modelRotation; + this.normal = normal.normalize(); + this.axis = axis; + } + + @Override + public String getSerializedName() { + return Lang.asId(name()); + } + + public String getModel() { + return model; + } + + public Vec3 getAxis() { + return axis; + } + + public Vec3 getNormal() { + return normal; + } + + public int getModelRotation() { + return modelRotation; + } + + } + + public TrackBlock(Properties p_49795_) { + super(p_49795_); + registerDefaultState(defaultBlockState().setValue(SHAPE, TrackShape.ZO) + .setValue(HAS_TURN, false)); + } + + @Override + protected void createBlockStateDefinition(Builder p_49915_) { + super.createBlockStateDefinition(p_49915_.add(SHAPE, HAS_TURN)); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState stateForPlacement = super.getStateForPlacement(ctx); + if (ctx.getPlayer() == null) + return stateForPlacement; + + Vec3 lookAngle = ctx.getPlayer() + .getLookAngle(); + lookAngle = lookAngle.multiply(1, 0, 1); + if (Mth.equal(lookAngle.length(), 0)) + lookAngle = VecHelper.rotate(new Vec3(0, 0, 1), -ctx.getPlayer() + .getYRot(), Axis.Y); + + lookAngle = lookAngle.normalize(); + + TrackShape best = TrackShape.ZO; + double bestValue = Float.MAX_VALUE; + for (TrackShape shape : TrackShape.values()) { + double distance = Math.min(shape.getAxis() + .distanceToSqr(lookAngle), + shape.getAxis() + .normalize() + .scale(-1) + .distanceToSqr(lookAngle)); + if (distance > bestValue) + continue; + bestValue = distance; + best = shape; + } + + Level level = ctx.getLevel(); + if (best.getAxis() + .lengthSqr() == 1) + for (boolean neg : Iterate.trueAndFalse) { + BlockPos offset = ctx.getClickedPos() + .offset(new BlockPos(best.getAxis() + .scale(neg ? -1 : 1))); + + if (level.getBlockState(offset) + .isFaceSturdy(level, offset, Direction.UP)) { + if (best == TrackShape.XO) + best = neg ? TrackShape.AW : TrackShape.AE; + if (best == TrackShape.ZO) + best = neg ? TrackShape.AN : TrackShape.AS; + } + } + + return stateForPlacement.setValue(SHAPE, best); + } + + @Override + public void onPlace(BlockState pState, Level pLevel, BlockPos pPos, BlockState pOldState, boolean pIsMoving) { + if (pOldState.getBlock() == this && pState.setValue(HAS_TURN, true) == pOldState.setValue(HAS_TURN, true)) + return; + LevelTickAccess blockTicks = pLevel.getBlockTicks(); + if (!blockTicks.hasScheduledTick(pPos, this)) + pLevel.scheduleTick(pPos, this, 1); + } + + @Override + public void tick(BlockState p_60462_, ServerLevel p_60463_, BlockPos p_60464_, Random p_60465_) { + TrackPropagator.onRailAdded(p_60463_, p_60464_, p_60462_); + } + + @Override + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + boolean removeTE = false; + if (pState.getValue(HAS_TURN) && (!pState.is(pNewState.getBlock()) || !pNewState.getValue(HAS_TURN))) { + BlockEntity blockEntity = pLevel.getBlockEntity(pPos); + if (blockEntity instanceof TrackTileEntity) + ((TrackTileEntity) blockEntity).removeInboundConnections(); + removeTE = true; + } + + if (pNewState.getBlock() != this || pState.setValue(HAS_TURN, true) != pNewState.setValue(HAS_TURN, true)) + TrackPropagator.onRailRemoved(pLevel, pPos, pState); + if (removeTE) + pLevel.removeBlockEntity(pPos); + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit) { + ItemStack itemInHand = player.getItemInHand(hand); + + // debug remove all graphs + if (Blocks.SPONGE.asItem() == itemInHand.getItem()) { + Create.RAILWAYS.trackNetworks.clear(); + CreateClient.RAILWAYS.trackNetworks.clear(); + return InteractionResult.SUCCESS; + } + + if (itemInHand.isEmpty()) { + if (world.isClientSide) + return InteractionResult.SUCCESS; + for (Entry entry : StationTileEntity.assemblyAreas.get(world) + .entrySet()) { + if (!entry.getValue() + .isInside(pos)) + continue; + if (world.getBlockEntity(entry.getKey()) instanceof StationTileEntity station) + station.trackClicked(player, this, state, pos); + } + return InteractionResult.SUCCESS; + } + +// if (asItem() == itemInHand.getItem()) { +// TrackConnectionPlacementHandler.select(world, pos, player.getLookAngle(), itemInHand); +// return InteractionResult.SUCCESS; +// } + + return InteractionResult.PASS; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader reader, BlockPos pos) { + return reader.getBlockState(pos.below()) + .getBlock() != this; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter p_60556_, BlockPos p_60557_, CollisionContext p_60558_) { + return AllShapes.TRACK.get(Direction.UP); + } + + @Override + public BlockEntity newBlockEntity(BlockPos p_153215_, BlockState state) { + if (!state.getValue(HAS_TURN)) + return null; + return AllTileEntities.TRACK.create(p_153215_, state); + } + + @Override + public Vec3 getUpNormal(BlockGetter world, BlockPos pos, BlockState state) { + return state.getValue(SHAPE) + .getNormal(); + } + + @Override + public Vec3 getTrackAxis(BlockGetter world, BlockPos pos, BlockState state) { + return state.getValue(SHAPE) + .getAxis(); + } + + @Override + public Vec3 getCurveStart(BlockGetter world, BlockPos pos, BlockState state, Vec3 axis) { + boolean vertical = axis.y != 0; + return VecHelper.getCenterOf(pos) + .add(0, (vertical ? 0 : -.5f), 0) + .add(axis.scale(.5)); + } + + @Override + public BlockState getRotatedBlockState(BlockState state, Direction targetedFace) { + switch (state.getValue(SHAPE)) { + case ND: + return state.setValue(SHAPE, TrackShape.XO); + case PD: + return state.setValue(SHAPE, TrackShape.ZO); + case XO: + return state.setValue(SHAPE, TrackShape.PD); + case ZO: + return state.setValue(SHAPE, TrackShape.ND); + default: + return state; + } + } + + @Override + public BlockState getBogeyAnchor(BlockGetter world, BlockPos pos, BlockState state) { + return AllBlocks.SMALL_BOGEY.getDefaultState() + .setValue(BlockStateProperties.HORIZONTAL_AXIS, state.getValue(SHAPE) == TrackShape.XO ? Axis.X : Axis.Z); + } + + @Override + @OnlyIn(Dist.CLIENT) + public PartialModel prepareAssemblyOverlay(BlockGetter world, BlockPos pos, BlockState state, Direction direction, + PoseStack ms) { + new MatrixTransformStack(ms).rotateCentered(Direction.UP, + AngleHelper.rad(AngleHelper.horizontalAngle(direction))); + return AllBlockPartials.TRACK_ASSEMBLY_OVERLAY; + } + + @Override + @OnlyIn(Dist.CLIENT) + public PartialModel prepareStationOverlay(BlockGetter world, BlockPos pos, BlockState state, + AxisDirection direction, PoseStack ms) { + Vec3 axis = state.getValue(SHAPE) + .getAxis(); + Vec3 directionVec = axis.scale(direction.getStep()) + .normalize(); + Vec3 normal = getUpNormal(world, pos, state); + Vec3 angles = TrackRenderer.getModelAngles(normal, directionVec); + new MatrixTransformStack(ms).centre() + .rotateYRadians(angles.y + Math.PI) + .rotateXRadians(-angles.x) + .unCentre(); + + return axis.lengthSqr() > 1 ? axis.y != 0 ? AllBlockPartials.TRACK_STATION_OVERLAY_ASCENDING + : AllBlockPartials.TRACK_STATION_OVERLAY_DIAGONAL : AllBlockPartials.TRACK_STATION_OVERLAY; + } + + @Override + public boolean trackEquals(BlockState state1, BlockState state2) { + return state1.getBlock() == this && state2.getBlock() == this + && state1.setValue(HAS_TURN, false) == state2.setValue(HAS_TURN, false); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockItem.java new file mode 100644 index 000000000..bf46b0852 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockItem.java @@ -0,0 +1,136 @@ +package com.simibubi.create.content.logistics.trains.track; + +import com.simibubi.create.content.logistics.trains.ITrackBlock; +import com.simibubi.create.content.logistics.trains.track.TrackPlacement.PlacementInfo; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +public class TrackBlockItem extends BlockItem { + + public TrackBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + public InteractionResult useOn(UseOnContext pContext) { + ItemStack stack = pContext.getItemInHand(); + BlockPos pos = pContext.getClickedPos(); + Level level = pContext.getLevel(); + BlockState state = level.getBlockState(pos); + Player player = pContext.getPlayer(); + + if (player == null) + return super.useOn(pContext); + + Vec3 lookAngle = player.getLookAngle(); + + if (!isFoil(stack)) { + if (select(level, pos, lookAngle, stack)) + return InteractionResult.SUCCESS; + return super.useOn(pContext); + + } else if (player.isSteppingCarefully()) { + if (!level.isClientSide) { + player.displayClientMessage(Lang.translate("track.selection_cleared"), true); + stack.setTag(null); + } + return InteractionResult.SUCCESS; + } + + boolean placing = !(state.getBlock() instanceof ITrackBlock); + if (placing && !state.getMaterial() + .isReplaceable()) { + pos = pos.relative(pContext.getClickedFace()); + state = getPlacementState(pContext); + if (state == null) + return InteractionResult.FAIL; + } + + PlacementInfo info = TrackPlacement.tryConnect(level, pos, state, lookAngle, stack); + + if (info.message != null && !level.isClientSide) + player.displayClientMessage(new TextComponent(info.message), true); + if (!info.valid) + return InteractionResult.FAIL; + + stack.setTag(null); + + if (level.isClientSide) + return InteractionResult.SUCCESS; + + ItemStack offhandItem = player.getOffhandItem(); + if (offhandItem.getItem()instanceof BlockItem blockItem) { + Block block = blockItem.getBlock(); + if (block == null) + return InteractionResult.SUCCESS; + if (block instanceof EntityBlock) + return InteractionResult.SUCCESS; + + for (boolean first : Iterate.trueAndFalse) { + int extent = (first ? info.end1Extent : info.end2Extent) + (info.curve != null ? 1 : 0); + Vec3 axis = first ? info.axis1 : info.axis2; + BlockPos pavePos = first ? info.pos1 : info.pos2; + TrackPaver.paveStraight(level, pavePos.below(), axis, extent, block); + } + + if (info.curve != null) + TrackPaver.paveCurve(level, info.curve, block); + } + + return InteractionResult.SUCCESS; + } + + public BlockState getPlacementState(UseOnContext pContext) { + return getPlacementState(updatePlacementContext(new BlockPlaceContext(pContext))); + } + + public static boolean select(LevelAccessor world, BlockPos pos, Vec3 lookVec, ItemStack heldItem) { + BlockState blockState = world.getBlockState(pos); + Block block = blockState.getBlock(); + if (!(block instanceof ITrackBlock)) + return false; + + ITrackBlock track = (ITrackBlock) block; + Vec3 axis = track.getTrackAxis(world, pos, blockState); + Vec3 normal = track.getUpNormal(world, pos, blockState) + .normalize(); + + boolean front = lookVec.dot(axis.multiply(1, 0, 1) + .normalize()) < 0; + axis = axis.scale(front ? -1 : 1); + Vec3 end = track.getCurveStart(world, pos, blockState, axis); + + CompoundTag compoundTag = heldItem.getOrCreateTagElement("ConnectingFrom"); + compoundTag.put("Pos", NbtUtils.writeBlockPos(pos)); + compoundTag.put("Axis", VecHelper.writeNBT(axis)); + compoundTag.put("Normal", VecHelper.writeNBT(normal)); + compoundTag.put("End", VecHelper.writeNBT(end)); + compoundTag.putBoolean("Front", front); + return true; + } + + @Override + public boolean isFoil(ItemStack stack) { + return stack.hasTag() && stack.getTag() + .contains("ConnectingFrom"); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockStateGenerator.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockStateGenerator.java new file mode 100644 index 000000000..15b1f0dfb --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockStateGenerator.java @@ -0,0 +1,37 @@ +package com.simibubi.create.content.logistics.trains.track; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.track.TrackBlock.TrackShape; +import com.simibubi.create.foundation.data.SpecialBlockStateGen; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.generators.ModelFile; + +public class TrackBlockStateGenerator extends SpecialBlockStateGen { + + @Override + protected int getXRotation(BlockState state) { + return 0; + } + + @Override + protected int getYRotation(BlockState state) { + return state.getValue(TrackBlock.SHAPE) + .getModelRotation(); + } + + @Override + public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, + BlockState state) { + TrackShape value = state.getValue(TrackBlock.SHAPE); + if (value == TrackShape.NONE) + return prov.models() + .getExistingFile(prov.mcLoc("block/air")); + return prov.models() + .getExistingFile(Create.asResource("block/track/" + value.getModel())); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPaver.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPaver.java new file mode 100644 index 000000000..72e0978d7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPaver.java @@ -0,0 +1,139 @@ +package com.simibubi.create.content.logistics.trains.track; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.commons.lang3.tuple.Pair; + +import com.simibubi.create.content.logistics.trains.BezierConnection; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.SlabType; +import net.minecraft.world.phys.Vec3; + +public class TrackPaver { + + public static void paveStraight(Level level, BlockPos startPos, Vec3 direction, int extent, Block block) { + BlockState defaultBlockState = block.defaultBlockState(); + if (defaultBlockState.hasProperty(SlabBlock.TYPE)) + defaultBlockState = defaultBlockState.setValue(SlabBlock.TYPE, SlabType.DOUBLE); + + Set toPlaceOn = new HashSet<>(); + Vec3 start = VecHelper.getCenterOf(startPos); + Vec3 mainNormal = direction.cross(new Vec3(0, 1, 0)); + Vec3 normalizedNormal = mainNormal.normalize(); + Vec3 normalizedDirection = direction.normalize(); + + float diagFiller = 0.45f; + for (int i = 0; i < extent; i++) { + Vec3 offset = direction.scale(i); + Vec3 mainPos = start.add(offset.x, offset.y, offset.z); + toPlaceOn.add(new BlockPos(mainPos)); + toPlaceOn.add(new BlockPos(mainPos.add(mainNormal))); + toPlaceOn.add(new BlockPos(mainPos.subtract(mainNormal))); + if (i < extent - 1) + for (int x : Iterate.positiveAndNegative) + toPlaceOn.add(new BlockPos(mainPos.add(normalizedNormal.scale(x * diagFiller)) + .add(normalizedDirection.scale(diagFiller)))); + if (i > 0) + for (int x : Iterate.positiveAndNegative) + toPlaceOn.add(new BlockPos(mainPos.add(normalizedNormal.scale(x * diagFiller)) + .add(normalizedDirection.scale(-diagFiller)))); + } + + final BlockState state = defaultBlockState; + toPlaceOn.forEach(p -> placeBlockIfFree(level, p, state)); + } + + private static void placeBlockIfFree(Level level, BlockPos pos, BlockState state) { + BlockState stateAtPos = level.getBlockState(pos); + if (stateAtPos.getBlock() != state.getBlock() && stateAtPos.getMaterial() + .isReplaceable()) { + level.setBlock(pos, state, 3); + } + } + + public static void paveCurve(Level level, BezierConnection bc, Block block) { + BlockState defaultBlockState = block.defaultBlockState(); + boolean slab = defaultBlockState.hasProperty(SlabBlock.TYPE); + if (slab) + defaultBlockState = defaultBlockState.setValue(SlabBlock.TYPE, SlabType.DOUBLE); + + Map, Double> yLevels = new HashMap<>(); + BlockPos tePosition = bc.tePositions.getFirst(); + Vec3 end1 = bc.starts.getFirst() + .subtract(Vec3.atLowerCornerOf(tePosition)) + .add(0, 3 / 16f, 0); + Vec3 end2 = bc.starts.getSecond() + .subtract(Vec3.atLowerCornerOf(tePosition)) + .add(0, 3 / 16f, 0); + Vec3 axis1 = bc.axes.getFirst(); + Vec3 axis2 = bc.axes.getSecond(); + + double handleLength = bc.getHandleLength(); + + Vec3 finish1 = axis1.scale(handleLength) + .add(end1); + Vec3 finish2 = axis2.scale(handleLength) + .add(end2); + + Vec3 faceNormal1 = bc.normals.getFirst(); + Vec3 faceNormal2 = bc.normals.getSecond(); + + int segCount = bc.getSegmentCount(); + float[] lut = bc.getStepLUT(); + + for (int i = 0; i < segCount; i++) { + float t = i == segCount ? 1 : i * lut[i] / segCount; + t += 0.5f / segCount; + + Vec3 result = VecHelper.bezier(end1, end2, finish1, finish2, t); + Vec3 derivative = VecHelper.bezierDerivative(end1, end2, finish1, finish2, t) + .normalize(); + Vec3 faceNormal = + faceNormal1.equals(faceNormal2) ? faceNormal1 : VecHelper.slerp(t, faceNormal1, faceNormal2); + Vec3 normal = faceNormal.cross(derivative) + .normalize(); + Vec3 below = result.add(faceNormal.scale(-1.125f)); + Vec3 rail1 = below.add(normal.scale(.97f)); + Vec3 rail2 = below.subtract(normal.scale(.97f)); + Vec3 railMiddle = rail1.add(rail2) + .scale(.5); + + for (Vec3 vec : new Vec3[] { rail1, rail2, railMiddle }) { + BlockPos pos = new BlockPos(vec); + Pair key = Pair.of(pos.getX(), pos.getZ()); + if (!yLevels.containsKey(key) || yLevels.get(key) > vec.y) + yLevels.put(key, vec.y); + } + } + + for (Entry, Double> entry : yLevels.entrySet()) { + double yValue = entry.getValue(); + int floor = Mth.floor(yValue); + boolean placeSlab = slab && yValue - floor >= .5; + BlockPos targetPos = new BlockPos(entry.getKey() + .getKey(), floor, + entry.getKey() + .getValue()); + targetPos = targetPos.offset(tePosition) + .above(placeSlab ? 1 : 0); + BlockState stateToPlace = + placeSlab ? defaultBlockState.setValue(SlabBlock.TYPE, SlabType.BOTTOM) : defaultBlockState; + placeBlockIfFree(level, targetPos, stateToPlace); + if (placeSlab) + placeBlockIfFree(level, targetPos.below(), stateToPlace.setValue(SlabBlock.TYPE, SlabType.TOP)); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java new file mode 100644 index 000000000..81c27db69 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java @@ -0,0 +1,498 @@ +package com.simibubi.create.content.logistics.trains.track; + +import org.apache.commons.lang3.tuple.Pair; + +import com.jozufozu.flywheel.util.Color; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.logistics.trains.BezierConnection; +import com.simibubi.create.content.logistics.trains.ITrackBlock; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.HitResult.Type; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class TrackPlacement { + + static class PlacementInfo { + BezierConnection curve = null; + boolean valid = false; + int end1Extent = 0; + int end2Extent = 0; + String message = null; + + // for visualisation + Vec3 end1; + Vec3 end2; + Vec3 normal1; + Vec3 normal2; + Vec3 axis1; + Vec3 axis2; + BlockPos pos1; + BlockPos pos2; + + public PlacementInfo withMessage(String message) { + this.message = message; + return this; + } + + public PlacementInfo tooJumbly() { + curve = null; + return this; + } + } + + static PlacementInfo cached; + static BlockPos hoveringPos; + static ItemStack lastItem; + + public static PlacementInfo tryConnect(Level level, BlockPos pos2, BlockState state2, Vec3 lookVec, + ItemStack stack) { + + if (cached != null && pos2.equals(hoveringPos) && stack.equals(lastItem)) + return cached; + + PlacementInfo info = new PlacementInfo(); + hoveringPos = pos2; + lastItem = stack; + cached = info; + + ITrackBlock track = (ITrackBlock) state2.getBlock(); + Vec3 axis2 = track.getTrackAxis(level, pos2, state2); + Vec3 normal2 = track.getUpNormal(level, pos2, state2) + .normalize(); + boolean front2 = lookVec.dot(axis2.multiply(1, 0, 1) + .normalize()) < 0; + axis2 = axis2.scale(front2 ? -1 : 1); + Vec3 normedAxis2 = axis2.normalize(); + Vec3 end2 = track.getCurveStart(level, pos2, state2, axis2); + + CompoundTag itemTag = stack.getTag(); + CompoundTag selectionTag = itemTag.getCompound("ConnectingFrom"); + BlockPos pos1 = NbtUtils.readBlockPos(selectionTag.getCompound("Pos")); + Vec3 axis1 = VecHelper.readNBT(selectionTag.getList("Axis", Tag.TAG_DOUBLE)); + Vec3 normedAxis1 = axis1.normalize(); + Vec3 end1 = VecHelper.readNBT(selectionTag.getList("End", Tag.TAG_DOUBLE)); + Vec3 normal1 = VecHelper.readNBT(selectionTag.getList("Normal", Tag.TAG_DOUBLE)); + boolean front1 = selectionTag.getBoolean("Front"); + BlockState state1 = level.getBlockState(pos1); + + if (level.isClientSide) { + info.end1 = end1; + info.end2 = end2; + info.normal1 = normal1; + info.normal2 = normal2; + info.axis1 = axis1; + info.axis2 = axis2; + } + + if (pos1.equals(pos2)) + return info.withMessage("Place track or select a second point"); + if (pos1.distSqr(pos2) > 32 * 32) + return info.withMessage("Too far away") + .tooJumbly(); + if (!state1.hasProperty(TrackBlock.HAS_TURN)) + return info.withMessage("Original block removed"); + + if (axis1.dot(end2.subtract(end1)) < 0) { + axis1 = axis1.scale(-1); + normedAxis1 = normedAxis1.scale(-1); + front1 = !front1; + end1 = track.getCurveStart(level, pos1, state1, axis1); + if (level.isClientSide) { + info.end1 = end1; + info.axis1 = axis1; + } + } + + double[] intersect = VecHelper.intersect(end1, end2, normedAxis1, normedAxis2, Axis.Y); + boolean parallel = intersect == null; + boolean skipCurve = false; + + if ((parallel && normedAxis1.dot(normedAxis2) > 0) || (!parallel && (intersect[0] < 0 || intersect[1] < 0))) { + axis2 = axis2.scale(-1); + normedAxis2 = normedAxis2.scale(-1); + front2 = !front2; + end2 = track.getCurveStart(level, pos2, state2, axis2); + if (level.isClientSide) { + info.end2 = end2; + info.axis2 = axis2; + } + } + + Vec3 cross2 = normedAxis2.cross(new Vec3(0, 1, 0)); + + double a1 = Mth.atan2(normedAxis2.z, normedAxis2.x); + double a2 = Mth.atan2(normedAxis1.z, normedAxis1.x); + double angle = a1 - a2; + double ascend = end2.subtract(end1).y; + double absAscend = Math.abs(ascend); + boolean slope = !normal1.equals(normal2); + + if (level.isClientSide) { + Vec3 offset1 = axis1.scale(info.end1Extent); + Vec3 offset2 = axis2.scale(info.end2Extent); + BlockPos targetPos1 = pos1.offset(offset1.x, offset1.y, offset1.z); + BlockPos targetPos2 = pos2.offset(offset2.x, offset2.y, offset2.z); + info.curve = new BezierConnection(Couple.create(targetPos1, targetPos2), + Couple.create(end1.add(offset1), end2.add(offset2)), Couple.create(normedAxis1, normedAxis2), + Couple.create(normal1, normal2), Couple.create(front1, front2), true); + } + + // S curve or Straight + + if (parallel) { + double[] sTest = VecHelper.intersect(end1, end2, normedAxis1, cross2, Axis.Y); + double t = Math.abs(sTest[0]); + double u = Math.abs(sTest[1]); + + skipCurve = Mth.equal(u, 0); + + if (!skipCurve && sTest[0] < 0) + return info.withMessage("cannot connect perpendicularly") + .tooJumbly(); + + if (skipCurve) { + double dist = VecHelper.getCenterOf(pos1) + .distanceTo(VecHelper.getCenterOf(pos2)); + info.end1Extent = (int) Math.round((dist + 1) / axis1.length()); + + } else { + if (!Mth.equal(ascend, 0)) + return info.withMessage("Cannot ascend and s-curve"); + + double targetT = u <= 1 ? 3 : u * 2; + + if (t < targetT) + return info.withMessage("Turn too sharp"); + + // This is for standardising s curve sizes + if (t > targetT) { + int correction = (int) ((t - targetT) / axis1.length()); + info.end1Extent = correction / 2 + (correction % 2); + info.end2Extent = correction / 2; + } + } + } + + // Slope + + if (slope) { + if (!skipCurve) + return info.withMessage("Cannot enter or leave slope on a turn"); + if (Mth.equal(normal1.dot(normal2), 0)) + return info.withMessage("Cannot connect opposing slopes"); + if ((axis1.y < 0 || axis2.y > 0) && ascend > 0) + return info.withMessage("Cannot leave this slope while ascending"); + if ((axis1.y > 0 || axis2.y < 0) && ascend < 0) + return info.withMessage("Cannot leave this slope while descending"); + + skipCurve = false; + info.end1Extent = 0; + info.end2Extent = 0; + + Axis plane = Mth.equal(axis1.x, 0) ? Axis.X : Axis.Z; + intersect = VecHelper.intersect(end1, end2, normedAxis1, normedAxis2, plane); + double dist1 = Math.abs(intersect[0] / axis1.length()); + double dist2 = Math.abs(intersect[1] / axis2.length()); + + if (dist1 > dist2) + info.end1Extent = (int) Math.round(dist1 - dist2); + if (dist2 > dist1) + info.end2Extent = (int) Math.round(dist2 - dist1); + + double turnSize = Math.min(dist1, dist2); + if (intersect[0] < 0) + return info.withMessage("Turn too sharp") + .tooJumbly(); + if (turnSize < 2) + return info.withMessage("Turn too sharp"); + + // This is for standardising curve sizes + if (turnSize > 2) { + info.end1Extent += turnSize - 2; + info.end2Extent += turnSize - 2; + turnSize = 2; + } + } + + // Straight ascend + + if (skipCurve && !Mth.equal(ascend, 0)) { + int hDistance = info.end1Extent; + info.end1Extent = 0; + if (hDistance < absAscend * 3) + return info.withMessage("Too steep"); + if (hDistance > absAscend * 4) { + int correction = (int) (hDistance - absAscend * 4); + info.end1Extent = correction / 2 + (correction % 2); + info.end2Extent = correction / 2; + } + + skipCurve = false; + } + + // Turn + + if (!parallel) { + float absAngle = Math.abs(AngleHelper.deg(angle)); + if (absAngle < 60 || absAngle > 300) + return info.withMessage("90 degrees max") + .tooJumbly(); + + intersect = VecHelper.intersect(end1, end2, normedAxis1, normedAxis2, Axis.Y); + double dist1 = Math.abs(intersect[0] / axis1.length()); + double dist2 = Math.abs(intersect[1] / axis2.length()); + + if (dist1 > dist2) + info.end1Extent = (int) Math.round(dist1 - dist2); + if (dist2 > dist1) + info.end2Extent = (int) Math.round(dist2 - dist1); + + double turnSize = Math.min(dist1, dist2); + boolean ninety = absAngle % 90 < 1; + + if (intersect[0] < 0 || intersect[1] < 0) + return info.withMessage("Turn too sharp") + .tooJumbly(); + + if (turnSize < (ninety ? 7 : 2)) + return info.withMessage("Turn too sharp"); + if (absAscend > (ninety ? 3 : 2)) + return info.withMessage("Too steep"); + + // This is for standardising curve sizes + if (turnSize > (ninety ? 5 : 2)) { + info.end1Extent += turnSize - (ninety ? 7 : 2); + info.end2Extent += turnSize - (ninety ? 7 : 2); + turnSize = (ninety ? 7 : 2); + } + } + + Vec3 offset1 = axis1.scale(info.end1Extent); + Vec3 offset2 = axis2.scale(info.end2Extent); + BlockPos targetPos1 = pos1.offset(offset1.x, offset1.y, offset1.z); + BlockPos targetPos2 = pos2.offset(offset2.x, offset2.y, offset2.z); + + info.curve = skipCurve ? null + : new BezierConnection(Couple.create(targetPos1, targetPos2), + Couple.create(end1.add(offset1), end2.add(offset2)), Couple.create(normedAxis1, normedAxis2), + Couple.create(normal1, normal2), Couple.create(front1, front2), true); + + info.valid = true; + + if (level.isClientSide()) + return info; + + for (boolean first : Iterate.trueAndFalse) { + int extent = first ? info.end1Extent : info.end2Extent; + Vec3 axis = first ? axis1 : axis2; + BlockPos pos = first ? pos1 : pos2; + BlockState state = first ? state1 : state2; + + for (int i = 0; i < extent; i++) { + Vec3 offset = axis.scale(i); + BlockPos offsetPos = pos.offset(offset.x, offset.y, offset.z); + BlockState stateAtPos = level.getBlockState(offsetPos); + if (stateAtPos.getBlock() != state.getBlock() && stateAtPos.getMaterial() + .isReplaceable()) + level.setBlock(offsetPos, state, 3); + } + } + + info.pos1 = pos1; + info.pos2 = pos2; + info.axis1 = axis1; + info.axis2 = axis2; + + if (info.curve == null) + return info; + + level.setBlock(targetPos1, state1.setValue(TrackBlock.HAS_TURN, true), 3); + level.setBlock(targetPos2, state2.setValue(TrackBlock.HAS_TURN, true), 3); + BlockEntity te1 = level.getBlockEntity(targetPos1); + BlockEntity te2 = level.getBlockEntity(targetPos2); + + if (!(te1 instanceof TrackTileEntity) || !(te2 instanceof TrackTileEntity)) + return info; + + TrackTileEntity tte1 = (TrackTileEntity) te1; + TrackTileEntity tte2 = (TrackTileEntity) te2; + tte1.addConnection(front1, info.curve); + tte2.addConnection(front2, info.curve.secondary()); + return info; + } + + static LerpedFloat animation = LerpedFloat.linear() + .startWithValue(0); + + @OnlyIn(Dist.CLIENT) + public static void clientTick() { + LocalPlayer player = Minecraft.getInstance().player; + ItemStack stack = player.getMainHandItem(); + HitResult hitResult = Minecraft.getInstance().hitResult; + if (hitResult == null) + return; + if (hitResult.getType() != Type.BLOCK) + return; + + InteractionHand hand = InteractionHand.MAIN_HAND; + if (!AllBlocks.TRACK.isIn(stack)) { + stack = player.getOffhandItem(); + hand = InteractionHand.OFF_HAND; + if (!AllBlocks.TRACK.isIn(stack)) + return; + } + + if (!stack.hasFoil()) + return; + + TrackBlockItem blockItem = (TrackBlockItem) stack.getItem(); + Level level = player.level; + BlockHitResult bhr = (BlockHitResult) hitResult; + BlockPos pos = bhr.getBlockPos(); + BlockState hitState = level.getBlockState(pos); + if (!(hitState.getBlock() instanceof TrackBlock) && !hitState.getMaterial() + .isReplaceable()) { + pos = pos.relative(bhr.getDirection()); + hitState = blockItem.getPlacementState(new UseOnContext(player, hand, bhr)); + if (hitState == null) + return; + } + + if (!(hitState.getBlock() instanceof TrackBlock)) + return; + + PlacementInfo info = tryConnect(level, pos, hitState, player.getLookAngle(), stack); + if (info.valid) + player.displayClientMessage(new TextComponent("Valid Connection").withStyle(ChatFormatting.GREEN), true); + else if (info.message != null) + player.displayClientMessage(new TextComponent(info.message).withStyle(ChatFormatting.RED), true); + + animation.chase(info.valid ? 1 : 0, 0.25, Chaser.EXP); + animation.tickChaser(); + if (!info.valid) { + info.end1Extent = 0; + info.end2Extent = 0; + } + + int color = Color.mixColors(0xEA5C2B, 0x95CD41, animation.getValue()); + Vec3 up = new Vec3(0, 4 / 16f, 0); + + { + Vec3 v1 = info.end1; + Vec3 a1 = info.axis1.normalize(); + Vec3 n1 = info.normal1.cross(a1) + .scale(15 / 16f); + Vec3 o1 = a1.scale(0.125f); + Vec3 ex1 = + a1.scale((info.end1Extent - (info.curve == null && info.end1Extent > 0 ? 2 : 0)) * info.axis1.length()); + line(1, v1.add(n1) + .add(up), o1, ex1); + line(2, v1.subtract(n1) + .add(up), o1, ex1); + + Vec3 v2 = info.end2; + Vec3 a2 = info.axis2.normalize(); + Vec3 n2 = info.normal2.cross(a2) + .scale(15 / 16f); + Vec3 o2 = a2.scale(0.125f); + Vec3 ex2 = a2.scale(info.end2Extent * info.axis2.length()); + line(3, v2.add(n2) + .add(up), o2, ex2); + line(4, v2.subtract(n2) + .add(up), o2, ex2); + } + + BezierConnection bc = info.curve; + if (bc == null) + return; + + Vec3 previous1 = null; + Vec3 previous2 = null; + int railcolor = color; + int segCount = bc.getSegmentCount(); + + float s = animation.getValue() * 7 / 8f + 1 / 8f; + float lw = animation.getValue() * 1 / 16f + 1 / 16f; + Vec3 end1 = bc.starts.getFirst(); + Vec3 end2 = bc.starts.getSecond(); + Vec3 finish1 = end1.add(bc.axes.getFirst() + .scale(bc.getHandleLength())); + Vec3 finish2 = end2.add(bc.axes.getSecond() + .scale(bc.getHandleLength())); + String key = "curve"; + + for (int i = 0; i <= segCount; i++) { + float t = i / (float) segCount; + Vec3 result = VecHelper.bezier(end1, end2, finish1, finish2, t); + Vec3 derivative = VecHelper.bezierDerivative(end1, end2, finish1, finish2, t) + .normalize(); + Vec3 normal = bc.getNormal(t) + .cross(derivative) + .scale(15 / 16f); + Vec3 rail1 = result.add(normal) + .add(up); + Vec3 rail2 = result.subtract(normal) + .add(up); + + if (previous1 != null) { + Vec3 middle1 = rail1.add(previous1) + .scale(0.5f); + Vec3 middle2 = rail2.add(previous2) + .scale(0.5f); + CreateClient.OUTLINER + .showLine(Pair.of(key, i * 2), VecHelper.lerp(s, middle1, previous1), + VecHelper.lerp(s, middle1, rail1)) + .colored(railcolor) + .disableNormals() + .lineWidth(lw); + CreateClient.OUTLINER + .showLine(Pair.of(key, i * 2 + 1), VecHelper.lerp(s, middle2, previous2), + VecHelper.lerp(s, middle2, rail2)) + .colored(railcolor) + .disableNormals() + .lineWidth(lw); + } + + previous1 = rail1; + previous2 = rail2; + } + + } + + @OnlyIn(Dist.CLIENT) + private static void line(int id, Vec3 v1, Vec3 o1, Vec3 ex) { + int color = Color.mixColors(0xEA5C2B, 0x95CD41, animation.getValue()); + CreateClient.OUTLINER.showLine(Pair.of("start", id), v1.subtract(o1), v1.add(ex)) + .lineWidth(1 / 8f) + .disableNormals() + .colored(color); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java new file mode 100644 index 000000000..68a0b409d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java @@ -0,0 +1,174 @@ +package com.simibubi.create.content.logistics.trains.track; + +import com.jozufozu.flywheel.repack.joml.Math; +import com.jozufozu.flywheel.util.transform.MatrixTransformStack; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.logistics.trains.BezierConnection; +import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction.Axis; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; + +public class TrackRenderer extends SafeTileEntityRenderer { + + public TrackRenderer(BlockEntityRendererProvider.Context context) {} + + @Override + protected void renderSafe(TrackTileEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, + int overlay) { + VertexConsumer vb = buffer.getBuffer(RenderType.solid()); + te.connections.forEach(map -> map.values() + .forEach(bc -> renderBezierTurn(bc, ms, vb))); + } + + public static void renderBezierTurn(BezierConnection bc, PoseStack ms, VertexConsumer vb) { + if (!bc.isPrimary()) + return; + + ms.pushPose(); + + BlockPos tePosition = bc.tePositions.getFirst(); + Vec3 end1 = bc.starts.getFirst() + .subtract(Vec3.atLowerCornerOf(tePosition)) + .add(0, 3 / 16f, 0); + Vec3 end2 = bc.starts.getSecond() + .subtract(Vec3.atLowerCornerOf(tePosition)) + .add(0, 3 / 16f, 0); + Vec3 axis1 = bc.axes.getFirst(); + Vec3 axis2 = bc.axes.getSecond(); + + double handleLength = bc.getHandleLength(); + + Vec3 finish1 = axis1.scale(handleLength) + .add(end1); + Vec3 finish2 = axis2.scale(handleLength) + .add(end2); + + Vec3 faceNormal1 = bc.normals.getFirst(); + Vec3 faceNormal2 = bc.normals.getSecond(); + Vec3 previous1 = null; + Vec3 previous2 = null; + + int segCount = bc.getSegmentCount(); + float[] lut = bc.getStepLUT(); + + for (int i = 0; i <= segCount; i++) { + float t = i == segCount ? 1 : i * lut[i] / segCount; + + Vec3 result = VecHelper.bezier(end1, end2, finish1, finish2, t); + Vec3 derivative = VecHelper.bezierDerivative(end1, end2, finish1, finish2, t) + .normalize(); + Vec3 faceNormal = + faceNormal1.equals(faceNormal2) ? faceNormal1 : VecHelper.slerp(t, faceNormal1, faceNormal2); + Vec3 normal = faceNormal.cross(derivative) + .normalize(); + Vec3 rail1 = result.add(normal.scale(.97f)); + Vec3 rail2 = result.subtract(normal.scale(.97f)); + + if (previous1 != null) { + ms.pushPose(); + { + // Tie + Vec3 railMiddle = rail1.add(rail2) + .scale(.5); + Vec3 prevMiddle = previous1.add(previous2) + .scale(.5); + Vec3 diff = railMiddle.subtract(prevMiddle); + Vec3 angles = getModelAngles(normal, diff); + + new MatrixTransformStack(ms).translate(prevMiddle) + .rotateYRadians(angles.y) + .rotateXRadians(angles.x) + .rotateZRadians(angles.z) + .translate(-1 / 2f, -2 / 16f - 1 / 1024f, 0); + + SuperByteBuffer sbb = + CachedBufferer.partial(AllBlockPartials.TRACK_TIE, Blocks.AIR.defaultBlockState()); + sbb.light(LevelRenderer.getLightColor(Minecraft.getInstance().level, + new BlockPos(railMiddle).offset(tePosition))); + sbb.renderInto(ms, vb); + + } + ms.popPose(); + + // Rails + for (boolean first : Iterate.trueAndFalse) { + ms.pushPose(); + + Vec3 railI = first ? rail1 : rail2; + Vec3 prevI = first ? previous1 : previous2; + Vec3 diff = railI.subtract(prevI); + Vec3 angles = getModelAngles(normal, diff); + + new MatrixTransformStack(ms).translate(prevI) + .rotateYRadians(angles.y) + .rotateXRadians(angles.x) + .rotateZRadians(angles.z) + .translate(0, -2 / 16f + 1 / 1024f, 0) + .scale(1, 1, (float) diff.length() * 2.1f); + + SuperByteBuffer sbb = CachedBufferer.partial( + first ? AllBlockPartials.TRACK_SEGMENT_LEFT : AllBlockPartials.TRACK_SEGMENT_RIGHT, + Blocks.AIR.defaultBlockState()); + sbb.light(LevelRenderer.getLightColor(Minecraft.getInstance().level, + new BlockPos(prevI).offset(tePosition))); + sbb.renderInto(ms, vb); + + ms.popPose(); + } + } + + previous1 = rail1; + previous2 = rail2; + } + + ms.popPose(); + } + + public static Vec3 getModelAngles(Vec3 normal, Vec3 diff) { + double diffX = diff.x(); + double diffY = diff.y(); + double diffZ = diff.z(); + double len = Mth.sqrt((float) (diffX * diffX + diffZ * diffZ)); + double yaw = Mth.atan2(diffX, diffZ); + double pitch = Mth.atan2(len, diffY) - Math.PI * .5; + + Vec3 yawPitchNormal = VecHelper.rotate(VecHelper.rotate(new Vec3(0, 1, 0), AngleHelper.deg(pitch), Axis.X), + AngleHelper.deg(yaw), Axis.Y); + + double signum = Math.signum(yawPitchNormal.dot(normal)); + if (Math.abs(signum) < 0.5f) + signum = yawPitchNormal.distanceToSqr(normal) < 0.5f ? -1 : 1; + double dot = diff.cross(normal) + .normalize() + .dot(yawPitchNormal); + double roll = Math.acos(Mth.clamp(dot, -1, 1)) * signum; + return new Vec3(pitch, yaw, roll); + } + + @Override + public boolean shouldRenderOffScreen(TrackTileEntity pBlockEntity) { + return true; + } + + @Override + public int getViewDistance() { + return 96; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java new file mode 100644 index 000000000..de09acd17 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java @@ -0,0 +1,107 @@ +package com.simibubi.create.content.logistics.trains.track; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.simibubi.create.content.logistics.trains.BezierConnection; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.Couple; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; + +public class TrackTileEntity extends SmartTileEntity { + + Couple> connections; + + public TrackTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); + connections = Couple.create(HashMap::new); + } + + public Couple> getConnections() { + return connections; + } + + public void addConnection(boolean front, BezierConnection connection) { + connections.get(front) + .put(connection.getKey(), connection); + notifyUpdate(); + level.scheduleTick(worldPosition, getBlockState().getBlock(), 1); + } + + public void removeConnection(boolean front, BlockPos target) { + connections.get(front) + .remove(target); + notifyUpdate(); + + // TODO remove TE when all connections removed. seems tricky without a packet + // because level.removeBlockEntity apparently no longer syncs + +// if (connections.getFirst() +// .isEmpty() +// && connections.getSecond() +// .isEmpty()) { +// BlockState blockState = getBlockState(); +// if (!blockState.hasProperty(TrackBlock.HAS_TURN)) +// return; +// } + } + + public void removeInboundConnections() { + connections.forEach(map -> map.values() + .forEach(bc -> { + BlockEntity blockEntity = level.getBlockEntity(bc.getKey()); + if (!(blockEntity instanceof TrackTileEntity)) + return; + TrackTileEntity other = (TrackTileEntity) blockEntity; + other.removeConnection(bc.trackEnds.getSecond(), bc.tePositions.getFirst()); + })); + } + + @Override + protected void write(CompoundTag tag, boolean clientPacket) { + super.write(tag, clientPacket); + + CompoundTag connectionsTag = new CompoundTag(); + connections.forEachWithContext((map, first) -> { + ListTag listTag = new ListTag(); + map.values() + .forEach(e -> listTag.add(e.write())); + connectionsTag.put(first ? "Front" : "Back", listTag); + }); + + tag.put("Connections", connectionsTag); + } + + @Override + protected void read(CompoundTag tag, boolean clientPacket) { + super.read(tag, clientPacket); + + CompoundTag connectionsTag = tag.getCompound("Connections"); + connections.forEach(Map::clear); + connections.forEachWithContext((map, first) -> connectionsTag.getList(first ? "Front" : "Back", 10) + .forEach(t -> { + if (!(t instanceof CompoundTag)) + return; + BezierConnection connection = new BezierConnection((CompoundTag) t); + map.put(connection.getKey(), connection); + })); + } + + @Override + public AABB getRenderBoundingBox() { + return INFINITE_EXTENT_AABB; + } + + @Override + public void addBehaviours(List behaviours) {} + +} diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 25824347d..57c7faeec 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -32,6 +32,9 @@ import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperR import com.simibubi.create.content.logistics.block.depot.EjectorTargetHandler; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPointHandler; import com.simibubi.create.content.logistics.item.LinkedControllerClientHandler; +import com.simibubi.create.content.logistics.trains.entity.CarriageCouplingRenderer; +import com.simibubi.create.content.logistics.trains.management.TrackTargetingBlockItem; +import com.simibubi.create.content.logistics.trains.track.TrackPlacement; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.ui.BaseConfigScreen; import com.simibubi.create.foundation.fluid.FluidHelper; @@ -69,6 +72,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.ConfigGuiHandler; import net.minecraftforge.client.event.ClientPlayerNetworkEvent; +import net.minecraftforge.client.event.DrawSelectionEvent; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.EntityViewRenderEvent; import net.minecraftforge.client.event.RegisterClientReloadListenersEvent; @@ -114,6 +118,7 @@ public class ClientEvents { CreateClient.ZAPPER_RENDER_HANDLER.tick(); CreateClient.POTATO_CANNON_RENDER_HANDLER.tick(); CreateClient.SOUL_PULSE_EFFECT_HANDLER.tick(world); + CreateClient.RAILWAYS.clientTick(); ContraptionHandler.tick(world); CapabilityMinecartController.tick(world); @@ -143,12 +148,23 @@ public class ClientEvents { ContraptionRenderDispatcher.tick(world); BlueprintOverlayRenderer.tick(); ToolboxHandlerClient.clientTick(); + TrackTargetingBlockItem.clientTick(); + TrackPlacement.clientTick(); + } + + @SubscribeEvent + public static void onRenderSelection(DrawSelectionEvent event) { } @SubscribeEvent public static void onJoin(ClientPlayerNetworkEvent.LoggedInEvent event) { CreateClient.checkGraphicsFanciness(); } + + @SubscribeEvent + public static void onLeave(ClientPlayerNetworkEvent.LoggedOutEvent event) { + CreateClient.RAILWAYS.cleanUp(); + } @SubscribeEvent public static void onLoadWorld(WorldEvent.Load event) { @@ -180,7 +196,9 @@ public class ClientEvents { ms.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z()); SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); + TrackTargetingBlockItem.render(ms, buffer); CouplingRenderer.renderAll(ms, buffer); + CarriageCouplingRenderer.renderAll(ms, buffer); CreateClient.SCHEMATIC_HANDLER.render(ms, buffer); CreateClient.GHOST_BLOCKS.renderAll(ms, buffer); @@ -252,9 +270,9 @@ public class ClientEvents { Level level = Minecraft.getInstance().level; BlockPos blockPos = info.getBlockPosition(); FluidState fluidstate = level.getFluidState(blockPos); - if (info.getPosition().y > blockPos.getY() + fluidstate.getHeight(level, blockPos)) - return; - + if (info.getPosition().y > blockPos.getY() + fluidstate.getHeight(level, blockPos)) + return; + Fluid fluid = fluidstate.getType(); if (AllFluids.CHOCOLATE.get().isSame(fluid)) { @@ -319,7 +337,8 @@ public class ClientEvents { @SubscribeEvent public static void addEntityRendererLayers(EntityRenderersEvent.AddLayers event) { - EntityRenderDispatcher dispatcher = Minecraft.getInstance().getEntityRenderDispatcher(); + EntityRenderDispatcher dispatcher = Minecraft.getInstance() + .getEntityRenderDispatcher(); CopperBacktankArmorLayer.registerOnAll(dispatcher); } @@ -329,7 +348,8 @@ public class ClientEvents { .getModContainerById(Create.ID) .orElseThrow(() -> new IllegalStateException("Create Mod Container missing after loadCompleted")); createContainer.registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class, - () -> new ConfigGuiHandler.ConfigGuiFactory((mc, previousScreen) -> BaseConfigScreen.forCreate(previousScreen))); + () -> new ConfigGuiHandler.ConfigGuiFactory( + (mc, previousScreen) -> BaseConfigScreen.forCreate(previousScreen))); } } diff --git a/src/main/java/com/simibubi/create/events/CommonEvents.java b/src/main/java/com/simibubi/create/events/CommonEvents.java index b34db0aac..6844488ef 100644 --- a/src/main/java/com/simibubi/create/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/events/CommonEvents.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.curiosities.weapons.PotatoProjectileTypeManag import com.simibubi.create.content.curiosities.zapper.ZapperInteractionHandler; import com.simibubi.create.content.curiosities.zapper.ZapperItem; import com.simibubi.create.content.logistics.item.LinkedControllerServerHandler; +import com.simibubi.create.content.logistics.trains.entity.CarriageEntityHandler; import com.simibubi.create.foundation.command.AllCommands; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.utility.Iterate; @@ -41,6 +42,7 @@ import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.ServerTickEvent; import net.minecraftforge.event.TickEvent.WorldTickEvent; +import net.minecraftforge.event.entity.EntityEvent; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; @@ -76,6 +78,7 @@ public class CommonEvents { public static void playerLoggedIn(PlayerLoggedInEvent event) { Player player = event.getPlayer(); ToolboxHandler.playerLogin(player); + Create.RAILWAYS.playerLogin(player); } @SubscribeEvent @@ -110,6 +113,7 @@ public class CommonEvents { CapabilityMinecartController.tick(world); CouplingPhysics.tick(world); LinkedControllerServerHandler.tick(world); + Create.RAILWAYS.tick(world); } @SubscribeEvent @@ -139,6 +143,11 @@ public class CommonEvents { AllCommands.register(event.getDispatcher()); } + @SubscribeEvent + public static void onEntityEnterSection(EntityEvent.EnteringSection event) { + CarriageEntityHandler.onEntityEnterSection(event); + } + @SubscribeEvent public static void addReloadListeners(AddReloadListenerEvent event) { event.addListener(RecipeFinder.LISTENER); @@ -167,6 +176,7 @@ public class CommonEvents { LevelAccessor world = event.getWorld(); Create.REDSTONE_LINK_NETWORK_HANDLER.onLoadWorld(world); Create.TORQUE_PROPAGATOR.onLoadWorld(world); + Create.RAILWAYS.levelLoaded(world); } @SubscribeEvent @@ -175,6 +185,7 @@ public class CommonEvents { Create.REDSTONE_LINK_NETWORK_HANDLER.onUnloadWorld(world); Create.TORQUE_PROPAGATOR.onUnloadWorld(world); WorldAttached.invalidateWorld(world); + Create.RAILWAYS.levelUnloaded(world); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/events/InputEvents.java b/src/main/java/com/simibubi/create/events/InputEvents.java index 7464d78d6..a10f20add 100644 --- a/src/main/java/com/simibubi/create/events/InputEvents.java +++ b/src/main/java/com/simibubi/create/events/InputEvents.java @@ -65,7 +65,7 @@ public class InputEvents { event.setCanceled(true); return; } - + if (event.isUseItem()) LinkedControllerClientHandler.deactivateInLectern(); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java index a670c3e4d..14be06c52 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java @@ -7,6 +7,7 @@ import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.widget.AbstractSimiWidget; +import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Widget; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; @@ -125,8 +126,10 @@ public abstract class AbstractSimiScreen extends Screen { for (Widget widget : renderables) { if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isHoveredOrFocused()) { List tooltip = simiWidget.getToolTip(); + int ttx = simiWidget.lockedTooltipX; + int tty = simiWidget.lockedTooltipY; if (!tooltip.isEmpty()) - renderComponentTooltip(ms, tooltip, mouseX, mouseY); + renderComponentTooltip(ms, tooltip, ttx == -1 ? mouseX : ttx, tty == -1 ? mouseY : tty); } } } @@ -153,5 +156,14 @@ public abstract class AbstractSimiScreen extends Screen { return false; } + + @Override + public GuiEventListener getFocused() { + GuiEventListener focused = super.getFocused(); + if (focused instanceof AbstractWidget && !((AbstractWidget) focused).isFocused()) + focused = null; + setFocused(focused); + return focused; + } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 7bc493b5a..922655f5d 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -80,6 +80,47 @@ public enum AllGuiTextures implements ScreenElement { PROJECTOR_FILTER("projector", 0, 36, 162, 22), PROJECTOR_END("projector", 0, 58, 162, 22), PROJECTOR_EMPTY("projector", 0, 80, 162, 22), + + SCHEDULE("schedule", 256, 226), + SCHEDULE_CARD_DARK("schedule", 5, 233, 1, 1), + SCHEDULE_CARD_MEDIUM("schedule", 6, 233, 1, 1), + SCHEDULE_CARD_LIGHT("schedule", 7, 233, 1, 1), + SCHEDULE_CARD_MOVE_UP("schedule", 51, 230, 12, 12), + SCHEDULE_CARD_MOVE_DOWN("schedule", 65, 230, 12, 12), + SCHEDULE_CARD_REMOVE("schedule", 51, 243, 12, 12), + SCHEDULE_CARD_DUPLICATE("schedule", 65, 243, 12, 12), + SCHEDULE_CARD_NEW("schedule", 79, 239, 16, 16), + SCHEDULE_CONDITION_NEW("schedule", 96, 239, 19, 16), + SCHEDULE_CONDITION_LEFT("schedule", 116, 239, 6, 16), + SCHEDULE_CONDITION_LEFT_CLEAN("schedule", 147, 239, 2, 16), + SCHEDULE_CONDITION_MIDDLE("schedule", 123, 239, 1, 16), + SCHEDULE_CONDITION_ITEM("schedule", 125, 239, 18, 16), + SCHEDULE_CONDITION_RIGHT("schedule", 144, 239, 2, 16), + SCHEDULE_CONDITION_APPEND("schedule", 150, 245, 10, 10), + SCHEDULE_SCROLL_LEFT("schedule", 161, 247, 4, 8), + SCHEDULE_SCROLL_RIGHT("schedule", 166, 247, 4, 8), + SCHEDULE_STRIP_DARK("schedule", 5, 235, 3, 1), + SCHEDULE_STRIP_LIGHT("schedule", 5, 237, 3, 1), + SCHEDULE_STRIP_WAIT("schedule", 1, 239, 11, 16), + SCHEDULE_STRIP_TRAVEL("schedule", 12, 239, 11, 16), + SCHEDULE_STRIP_DOTTED("schedule", 23, 239, 11, 16), + SCHEDULE_STRIP_END("schedule", 34, 239, 11, 16), + SCHEDULE_EDITOR("schedule_2", 256, 89), + SCHEDULE_EDITOR_INACTIVE_SLOT("schedule_2", 0, 91, 18, 18), + SCHEDULE_EDITOR_SECOND_LINE("schedule_2", 20, 91, 124, 18), + SCHEDULE_EDITOR_DIVIDER("schedule_2", 145, 91, 4, 18), + + STATION("schedule_2", 0, 111, 200, 127), + STATION_ASSEMBLING("assemble", 200, 178), + STATION_TEXTBOX_TOP("assemble", 1, 179, 150, 18), + STATION_TEXTBOX_MIDDLE("assemble", 1, 198, 150, 1), + STATION_TEXTBOX_BOTTOM("assemble", 1, 200, 150, 4), + STATION_TEXTBOX_SPEECH("assemble", 152, 179, 8, 6), + STATION_EDIT_NAME("schedule_2", 0, 239, 13, 13), + STATION_EDIT_TRAIN_NAME("schedule_2", 89, 239, 13, 13), + I_NEW_TRAIN("schedule_2", 14, 239, 24, 16), + I_DISASSEMBLE_TRAIN("schedule_2", 39, 239, 24, 16), + I_ASSEMBLE_TRAIN("schedule_2", 64, 239, 24, 16), // JEI JEI_SLOT("jei/widgets", 18, 18), diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index b740e3cd0..0051e041e 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -92,6 +92,7 @@ public class AllIcons implements ScreenElement { I_TUNNEL_RANDOMIZE = next(), I_TUNNEL_SYNCHRONIZE = next(), I_TOOLBOX = next(), + I_VIEW_SCHEDULE = next(), I_TOOL_MOVE_XZ = newRow(), I_TOOL_MOVE_Y = next(), diff --git a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java index aa4143094..b59168cd0 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java @@ -245,6 +245,13 @@ public class UIRenderHelper { drawColoredTexture(ms, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height); } + public static void drawStretched(PoseStack ms, int left, int top, int w, int h, int z, AllGuiTextures tex) { + tex.bind(); + drawTexturedQuad(ms.last() + .pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + tex.width) / 256f, + tex.startY / 256f, (tex.startY + tex.height) / 256f); + } + private static void drawColoredTexture(PoseStack ms, Color c, int left, int right, int top, int bot, int z, int tex_width, int tex_height, float tex_left, float tex_top, int sheet_width, int sheet_height) { drawTexturedQuad(ms.last().pose(), c, left, right, top, bot, z, (tex_left + 0.0F) / (float) sheet_width, (tex_left + (float) tex_width) / (float) sheet_width, (tex_top + 0.0F) / (float) sheet_height, (tex_top + (float) tex_height) / (float) sheet_height); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/container/AbstractSimiContainerScreen.java b/src/main/java/com/simibubi/create/foundation/gui/container/AbstractSimiContainerScreen.java index cda1dbfd7..924f76c50 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/container/AbstractSimiContainerScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/container/AbstractSimiContainerScreen.java @@ -6,11 +6,13 @@ import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; +import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.TickableGuiEventListener; import com.simibubi.create.foundation.gui.widget.AbstractSimiWidget; +import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Widget; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; @@ -103,8 +105,10 @@ public abstract class AbstractSimiContainerScreen tooltip = simiWidget.getToolTip(); + int ttx = simiWidget.lockedTooltipX; + int tty = simiWidget.lockedTooltipY; if (!tooltip.isEmpty()) - renderComponentTooltip(matrixStack, tooltip, mouseX, mouseY); + renderComponentTooltip(matrixStack, tooltip, ttx == -1 ? mouseX : ttx, tty == -1 ? mouseY : tty); } } } @@ -127,10 +133,28 @@ public abstract class AbstractSimiContainerScreen getExtraAreas() { return Collections.emptyList(); @@ -144,7 +168,8 @@ public abstract class AbstractSimiContainerScreen toolTip = new LinkedList<>(); protected BiConsumer onClick = (_$, _$$) -> {}; + + public int lockedTooltipX = -1; + public int lockedTooltipY = -1; protected AbstractSimiWidget(int x, int y) { this(x, y, 16, 16); diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java b/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java index f01feac99..d85e75e70 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/IconButton.java @@ -6,15 +6,20 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.element.ScreenElement; import net.minecraft.network.chat.Component; public class IconButton extends AbstractSimiWidget { - private AllIcons icon; + protected ScreenElement icon; - public IconButton(int x, int y, AllIcons icon) { - super(x, y, 18, 18); + public IconButton(int x, int y, ScreenElement icon) { + this(x, y, 18, 18, icon); + } + + public IconButton(int x, int y, int w, int h, ScreenElement icon) { + super(x, y, w, h); this.icon = icon; } @@ -27,18 +32,22 @@ public class IconButton extends AbstractSimiWidget { : isHoveredOrFocused() ? AllGuiTextures.BUTTON_HOVER : AllGuiTextures.BUTTON; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - AllGuiTextures.BUTTON.bind(); - blit(matrixStack, x, y, button.startX, button.startY, button.width, button.height); - icon.render(matrixStack, x + 1, y + 1, this); + drawBg(matrixStack, button); + icon.render(matrixStack, x + 1, y + 1); } } + protected void drawBg(PoseStack matrixStack, AllGuiTextures button) { + AllGuiTextures.BUTTON.bind(); + blit(matrixStack, x, y, button.startX, button.startY, button.width, button.height); + } + public void setToolTip(Component text) { toolTip.clear(); toolTip.add(text); } - public void setIcon(AllIcons icon) { + public void setIcon(ScreenElement icon) { this.icon = icon; } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/Indicator.java b/src/main/java/com/simibubi/create/foundation/gui/widget/Indicator.java index a285379db..4589f9d9b 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/Indicator.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/Indicator.java @@ -20,6 +20,8 @@ public class Indicator extends AbstractSimiWidget { @Override public void render(@Nonnull PoseStack matrixStack, int mouseX, int mouseY, float partialTicks ) { + if (!visible) + return; AllGuiTextures toDraw; switch (state) { case ON: toDraw = AllGuiTextures.INDICATOR_WHITE; break; diff --git a/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java index d7091ca7e..940315f4e 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widget/SelectionScrollInput.java @@ -13,14 +13,14 @@ import net.minecraft.network.chat.TextComponent; public class SelectionScrollInput extends ScrollInput { private final MutableComponent scrollToSelect = Lang.translate("gui.scrollInput.scrollToSelect"); - protected List options; + protected List options; public SelectionScrollInput(int xIn, int yIn, int widthIn, int heightIn) { super(xIn, yIn, widthIn, heightIn); options = new ArrayList<>(); } - public ScrollInput forOptions(List options) { + public ScrollInput forOptions(List options) { this.options = options; this.max = options.size(); updateTooltip(); diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index 3b4db8139..c8a4169d2 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -43,6 +43,10 @@ import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket; import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; +import com.simibubi.create.content.logistics.trains.TrackGraphSync.RailGraphSyncPacket; +import com.simibubi.create.content.logistics.trains.management.StationEditPacket; +import com.simibubi.create.content.logistics.trains.management.TrainEditPacket; +import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleEditPacket; import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket; import com.simibubi.create.content.schematics.packet.InstantSchematicPacket; import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; @@ -102,6 +106,9 @@ public enum AllPackets { CONFIGURE_WORLDSHAPER(ConfigureWorldshaperPacket.class, ConfigureWorldshaperPacket::new, PLAY_TO_SERVER), TOOLBOX_EQUIP(ToolboxEquipPacket.class, ToolboxEquipPacket::new, PLAY_TO_SERVER), TOOLBOX_DISPOSE_ALL(ToolboxDisposeAllPacket.class, ToolboxDisposeAllPacket::new, PLAY_TO_SERVER), + CONFIGURE_SCHEDULE(ScheduleEditPacket.class, ScheduleEditPacket::new, PLAY_TO_SERVER), + CONFIGURE_STATION(StationEditPacket.class, StationEditPacket::new, PLAY_TO_SERVER), + CONFIGURE_TRAIN(TrainEditPacket.class, TrainEditPacket::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), @@ -124,6 +131,7 @@ public enum AllPackets { SOUL_PULSE(SoulPulseEffectPacket.class, SoulPulseEffectPacket::new, PLAY_TO_CLIENT), PERSISTENT_DATA(ISyncPersistentData.PersistentDataPacket.class, ISyncPersistentData.PersistentDataPacket::new, PLAY_TO_CLIENT), SYNC_POTATO_PROJECTILE_TYPES(PotatoProjectileTypeManager.SyncPacket.class, PotatoProjectileTypeManager.SyncPacket::new, PLAY_TO_CLIENT), + SYNC_RAIL_GRAPH(RailGraphSyncPacket.class, RailGraphSyncPacket::new, PLAY_TO_CLIENT), ; diff --git a/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java b/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java index 561d57733..e5648dd42 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java +++ b/src/main/java/com/simibubi/create/foundation/networking/TileEntityConfigurationPacket.java @@ -40,9 +40,10 @@ public abstract class TileEntityConfigurationPacket if (player == null) return; Level world = player.level; - if (world == null || !world.isLoaded(pos)) return; + if (!pos.closerThan(player.blockPosition(), 20)) + return; BlockEntity tileEntity = world.getBlockEntity(pos); if (tileEntity instanceof SyncedTileEntity) { applySettings((TE) tileEntity); diff --git a/src/main/java/com/simibubi/create/foundation/utility/Lang.java b/src/main/java/com/simibubi/create/foundation/utility/Lang.java index 0796fcb0b..df05c2320 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Lang.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Lang.java @@ -27,7 +27,7 @@ public class Lang { public static List translatedOptions(String prefix, String... keys) { List result = new ArrayList<>(keys.length); for (String key : keys) - result.add(translate(prefix + "." + key)); + result.add(translate((prefix != null ? prefix + "." : "") + key)); return result; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java index 92946bc88..2370b8cee 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -4,6 +4,7 @@ import java.util.Random; import javax.annotation.Nullable; +import com.jozufozu.flywheel.repack.joml.Math; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; @@ -13,8 +14,11 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Vec3i; +import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.DoubleTag; import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; @@ -35,7 +39,8 @@ public class VecHelper { public static Vec3 rotateCentered(Vec3 vec, double deg, Axis axis) { Vec3 shift = getCenterOf(BlockPos.ZERO); - return VecHelper.rotate(vec.subtract(shift), deg, axis).add(shift); + return VecHelper.rotate(vec.subtract(shift), deg, axis) + .add(shift); } public static Vec3 rotate(Vec3 vec, double deg, Axis axis) { @@ -62,7 +67,8 @@ public class VecHelper { public static Vec3 mirrorCentered(Vec3 vec, Mirror mirror) { Vec3 shift = getCenterOf(BlockPos.ZERO); - return VecHelper.mirror(vec.subtract(shift), mirror).add(shift); + return VecHelper.mirror(vec.subtract(shift), mirror) + .add(shift); } public static Vec3 mirror(Vec3 vec, Mirror mirror) { @@ -84,12 +90,14 @@ public class VecHelper { public static Vec3 lookAt(Vec3 vec, Vec3 fwd) { fwd = fwd.normalize(); - Vec3 up = new Vec3(0,1,0); + Vec3 up = new Vec3(0, 1, 0); double dot = fwd.dot(up); if (Math.abs(dot) > 1 - 1.0E-3) up = new Vec3(0, 0, dot > 0 ? 1 : -1); - Vec3 right = fwd.cross(up).normalize(); - up = right.cross(fwd).normalize(); + Vec3 right = fwd.cross(up) + .normalize(); + up = right.cross(fwd) + .normalize(); double x = vec.x * right.x + vec.y * up.x + vec.z * fwd.x; double y = vec.x * right.y + vec.y * up.y + vec.z * fwd.y; double z = vec.x * right.z + vec.y * up.z + vec.z * fwd.z; @@ -130,12 +138,32 @@ public class VecHelper { return listnbt; } + public static CompoundTag writeNBTCompound(Vec3 vec) { + CompoundTag compoundTag = new CompoundTag(); + compoundTag.put("V", writeNBT(vec)); + return compoundTag; + } + public static Vec3 readNBT(ListTag list) { if (list.isEmpty()) return Vec3.ZERO; return new Vec3(list.getDouble(0), list.getDouble(1), list.getDouble(2)); } + public static Vec3 readNBTCompound(CompoundTag nbt) { + return readNBT(nbt.getList("V", Tag.TAG_DOUBLE)); + } + + public static void write(Vec3 vec, FriendlyByteBuf buffer) { + buffer.writeDouble(vec.x); + buffer.writeDouble(vec.y); + buffer.writeDouble(vec.z); + } + + public static Vec3 read(FriendlyByteBuf buffer) { + return new Vec3(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()); + } + public static Vec3 voxelSpace(double x, double y, double z) { return new Vec3(x, y, z).scale(1 / 16f); } @@ -168,9 +196,16 @@ public class VecHelper { .scale(p)); } + public static Vec3 slerp(float p, Vec3 from, Vec3 to) { + double theta = Math.acos(from.dot(to)); + return from.scale(Mth.sin(1 - p) * theta) + .add(to.scale(Mth.sin((float) (theta * p)))) + .scale(1 / Mth.sin((float) theta)); + } + public static Vec3 clampComponentWise(Vec3 vec, float maxLength) { - return new Vec3(Mth.clamp(vec.x, -maxLength, maxLength), - Mth.clamp(vec.y, -maxLength, maxLength), Mth.clamp(vec.z, -maxLength, maxLength)); + return new Vec3(Mth.clamp(vec.x, -maxLength, maxLength), Mth.clamp(vec.y, -maxLength, maxLength), + Mth.clamp(vec.z, -maxLength, maxLength)); } public static Vec3 project(Vec3 vec, Vec3 ontoVec) { @@ -180,8 +215,7 @@ public class VecHelper { } @Nullable - public static Vec3 intersectSphere(Vec3 origin, Vec3 lineDirection, Vec3 sphereCenter, - double radius) { + public static Vec3 intersectSphere(Vec3 origin, Vec3 lineDirection, Vec3 sphereCenter, double radius) { if (lineDirection.equals(Vec3.ZERO)) return null; if (lineDirection.length() != 1) @@ -196,11 +230,13 @@ public class VecHelper { return origin.add(lineDirection.scale(t)); } - // https://forums.minecraftforge.net/topic/88562-116solved-3d-to-2d-conversion/?do=findComment&comment=413573 slightly modified + // https://forums.minecraftforge.net/topic/88562-116solved-3d-to-2d-conversion/?do=findComment&comment=413573 + // slightly modified public static Vec3 projectToPlayerView(Vec3 target, float partialTicks) { /* * The (centered) location on the screen of the given 3d point in the world. - * Result is (dist right of center screen, dist up from center screen, if < 0, then in front of view plane) + * Result is (dist right of center screen, dist up from center screen, if < 0, + * then in front of view plane) */ Camera ari = Minecraft.getInstance().gameRenderer.getMainCamera(); Vec3 camera_pos = ari.getPosition(); @@ -224,13 +260,12 @@ public class VecHelper { float f = distwalked_modified - playerentity.walkDistO; float f1 = -(distwalked_modified + f * partialTicks); float f2 = Mth.lerp(partialTicks, playerentity.oBob, playerentity.bob); - Quaternion q2 = new Quaternion(Vector3f.XP, - Math.abs(Mth.cos(f1 * (float) Math.PI - 0.2F) * f2) * 5.0F, true); + Quaternion q2 = + new Quaternion(Vector3f.XP, Math.abs(Mth.cos(f1 * (float) Math.PI - 0.2F) * f2) * 5.0F, true); q2.conj(); result3f.transform(q2); - Quaternion q1 = - new Quaternion(Vector3f.ZP, Mth.sin(f1 * (float) Math.PI) * f2 * 3.0F, true); + Quaternion q1 = new Quaternion(Vector3f.ZP, Mth.sin(f1 * (float) Math.PI) * f2 * 3.0F, true); q1.conj(); result3f.transform(q1); @@ -250,4 +285,48 @@ public class VecHelper { return new Vec3(-result3f.x() * scale_factor, result3f.y() * scale_factor, result3f.z()); } + public static Vec3 bezier(Vec3 p1, Vec3 p2, Vec3 q1, Vec3 q2, float t) { + Vec3 v1 = lerp(t, p1, q1); + Vec3 v2 = lerp(t, q1, q2); + Vec3 v3 = lerp(t, q2, p2); + Vec3 inner1 = lerp(t, v1, v2); + Vec3 inner2 = lerp(t, v2, v3); + Vec3 result = lerp(t, inner1, inner2); + return result; + } + + public static Vec3 bezierDerivative(Vec3 p1, Vec3 p2, Vec3 q1, Vec3 q2, float t) { + return p1.scale(-3 * t * t + 6 * t - 3) + .add(q1.scale(9 * t * t - 12 * t + 3)) + .add(q2.scale(-9 * t * t + 6 * t)) + .add(p2.scale(3 * t * t)); + } + + @Nullable + public static double[] intersect(Vec3 p1, Vec3 p2, Vec3 r, Vec3 s, Axis plane) { + if (plane == Axis.X) { + p1 = new Vec3(p1.y, 0, p1.z); + p2 = new Vec3(p2.y, 0, p2.z); + r = new Vec3(r.y, 0, r.z); + s = new Vec3(s.y, 0, s.z); + } + + if (plane == Axis.Z) { + p1 = new Vec3(p1.x, 0, p1.y); + p2 = new Vec3(p2.x, 0, p2.y); + r = new Vec3(r.x, 0, r.y); + s = new Vec3(s.x, 0, s.y); + } + + Vec3 qminusp = p2.subtract(p1); + double rcs = r.x * s.z - r.z * s.x; + if (Mth.equal(rcs, 0)) + return null; + Vec3 rdivrcs = r.scale(1 / rcs); + Vec3 sdivrcs = s.scale(1 / rcs); + double t = qminusp.x * sdivrcs.z - qminusp.z * sdivrcs.x; + double u = qminusp.x * rdivrcs.z - qminusp.z * rdivrcs.x; + return new double[] { t, u }; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java b/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java index b7d2a15ab..7f571ae5d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java +++ b/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java @@ -79,7 +79,7 @@ public class LerpedFloat { } public float getValue(float partialTicks) { - return Mth.lerp(partialTicks, previousValue, value); + return interpolater.interpolate(partialTicks, previousValue, value); } public boolean settled() { diff --git a/src/main/resources/assets/create/lang/default/interface.json b/src/main/resources/assets/create/lang/default/interface.json index 4ebd988d5..25de2865e 100644 --- a/src/main/resources/assets/create/lang/default/interface.json +++ b/src/main/resources/assets/create/lang/default/interface.json @@ -79,9 +79,15 @@ "create.generic.length": "Length", "create.generic.speed": "Speed", "create.generic.delay": "Delay", + "create.generic.duration": "Duration", + "create.generic.timeUnit": "Time Unit", "create.generic.unit.ticks": "Ticks", "create.generic.unit.seconds": "Seconds", "create.generic.unit.minutes": "Minutes", + "create.generic.daytime.hour": "Hour", + "create.generic.daytime.minute": "Minute", + "create.generic.daytime.pm": "pm", + "create.generic.daytime.am": "am", "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "\u00B0", @@ -544,6 +550,60 @@ "create.hint.full_deployer.title": "Deployer Item Overflow", "create.hint.full_deployer": "It appears this _Deployer_ contains _excess_ _items_ that need to be _extracted._ Use a _hopper,_ _funnel_ or other means to free it from its overflow.", + "create.gui.schedule.lmb_edit": "Left-Click to Edit", + "create.gui.schedule.rmb_remove": "Right-Click to Remove", + "create.gui.schedule.duplicate": "Duplicate", + "create.gui.schedule.remove_entry": "Remove Stop", + "create.gui.schedule.add_entry": "Add Stop", + "create.gui.schedule.move_up": "Move up", + "create.gui.schedule.move_down": "Move down", + "create.gui.schedule.add_condition": "Add Condition", + "create.gui.schedule.alternative_condition": "Alternative Condition", + + "create.schedule.destination_type": "Next Stop:", + "create.schedule.destination.editor": "Destination Editor", + "create.schedule.destination.filtered": "Specific Station", + "create.schedule.destination.filtered_matching": "Station: %1$s", + "create.schedule.destination.filter": "Station Name", + "create.schedule.destination.filter_2": "Use * as a text wildcard", + "create.schedule.destination.filter_3": "Example: 'My Station, Platform *'", + "create.schedule.destination.filter_4": "Train picks nearest unoccupied match", + "create.schedule.destination.nearest": "Nearest Station", + "create.schedule.destination.redstone": "Station with Redstone Pulse", + "create.schedule.condition_type": "Continue when:", + "create.schedule.condition.editor": "Condition Editor", + "create.schedule.condition.delay": "Scheduled Delay", + "create.schedule.condition.delay_short": "Wait: %1$s", + "create.schedule.condition.idle": "Cargo Inactivity", + "create.schedule.condition.idle_short": "Cargo Idle: %1$s", + "create.schedule.condition.for_x_time": "for %1$s", + "create.schedule.condition.unloaded": "Chunk Unloaded", + "create.schedule.condition.powered": "Station Powered", + "create.schedule.condition.time_of_day": "Time of Day", + "create.schedule.condition.time_of_day.scheduled": "Scheduled Time: %1$s", + "create.schedule.condition.time_of_day.digital_format": "%1$s:%3$s %4$s", + "create.schedule.condition.time_of_day.grace_period": "Grace Period", + "create.schedule.condition.time_of_day.grace_period.format": "+%1$s Hrs.", + "create.schedule.condition.threshold.train_holds": "Train Holds %1$s", + "create.schedule.condition.threshold.greater": "More than", + "create.schedule.condition.threshold.less": "Less than", + "create.schedule.condition.threshold.equal": "Exactly", + "create.schedule.condition.threshold.x_units_of_item": "%1$s %2$s of %3$s", + "create.schedule.condition.threshold.matching_content": "Matching Content", + "create.schedule.condition.threshold.item_measure": "Item Measure", + "create.schedule.condition.threshold.items": "Items", + "create.schedule.condition.threshold.stacks": "Stacks", + "create.schedule.condition.threshold.buckets": "Buckets", + "create.schedule.condition.threshold.place_item": "Reference Item", + "create.schedule.condition.threshold.place_item_2": "Filters can be used", + "create.schedule.condition.fluid_threshold": "Fluid Cargo Condition", + "create.schedule.condition.item_threshold": "Item Cargo Condition", + "create.schedule.loop": "Loop Forever", + "create.schedule.loop1": "Schedule starts over", + "create.schedule.loop2": "when completed", + + "create.train.unnamed": "Unnamed Train", + "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "This is a sample overlay", "create.gui.config.overlay3": "Click or drag with your mouse", diff --git a/src/main/resources/assets/create/models/block/controls/block_closed.json b/src/main/resources/assets/create/models/block/controls/block_closed.json new file mode 100644 index 000000000..faa53ee58 --- /dev/null +++ b/src/main/resources/assets/create/models/block/controls/block_closed.json @@ -0,0 +1,43 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "0": "create:block/brass_casing_belt", + "1": "create:block/brass_block", + "3": "create:block/brass_funnel_plating", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "from": [0, 0, 4], + "to": [16, 8, 16], + "faces": { + "north": {"uv": [8, 8.5, 16, 12.5], "texture": "#0"}, + "east": {"uv": [8, 8.5, 14, 12.5], "texture": "#0"}, + "south": {"uv": [8, 8.5, 16, 12.5], "texture": "#0"}, + "west": {"uv": [10, 8.5, 16, 12.5], "texture": "#0"}, + "up": {"uv": [9, 1, 15, 9], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 2, 16, 14], "texture": "#1"} + } + }, + { + "from": [0, 8, 6], + "to": [16, 14, 16], + "faces": { + "north": {"uv": [11, 1, 14, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 0, 16, 6], "texture": "#1"}, + "south": {"uv": [2, 0, 14, 6], "texture": "#1"}, + "west": {"uv": [0, 0, 10, 6], "texture": "#1"}, + "up": {"uv": [9, 1, 14, 9], "rotation": 270, "texture": "#3"} + } + } + ], + "groups": [ + { + "name": "closed", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/controls/block_open.json b/src/main/resources/assets/create/models/block/controls/block_open.json new file mode 100644 index 000000000..24f7dd6fd --- /dev/null +++ b/src/main/resources/assets/create/models/block/controls/block_open.json @@ -0,0 +1,73 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "0": "create:block/brass_casing_belt", + "1": "create:block/brass_block", + "2": "create:block/brass_funnel_back", + "3": "create:block/brass_funnel_plating", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "from": [0, 0, 4], + "to": [16, 8, 16], + "faces": { + "north": {"uv": [8, 8.5, 16, 12.5], "texture": "#0"}, + "east": {"uv": [8, 8.5, 14, 12.5], "texture": "#0"}, + "south": {"uv": [8, 8.5, 16, 12.5], "texture": "#0"}, + "west": {"uv": [10, 8.5, 16, 12.5], "texture": "#0"}, + "up": {"uv": [9, 1, 15, 9], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 2, 16, 14], "texture": "#1"} + } + }, + { + "from": [14, 8, 6], + "to": [16, 14, 16], + "faces": { + "north": {"uv": [11, 8, 14, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 0, 16, 6], "texture": "#1"}, + "south": {"uv": [11, 0, 13, 6], "texture": "#1"}, + "west": {"uv": [0, 0, 10, 6], "texture": "#1"}, + "up": {"uv": [9, 8, 14, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "from": [2, 8, 14], + "to": [14, 14, 16], + "faces": { + "north": {"uv": [2, 0, 14, 6], "texture": "#1"}, + "south": {"uv": [3, 0, 12, 6], "texture": "#1"}, + "up": {"uv": [10, 1, 14, 2], "rotation": 180, "texture": "#3"} + } + }, + { + "from": [0, 8, 6], + "to": [2, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [11, 9, 14, 8], "rotation": 90, "texture": "#3"}, + "east": {"uv": [10, 0, 0, 6], "texture": "#1"}, + "south": {"uv": [4, 0, 2, 6], "texture": "#1"}, + "west": {"uv": [16, 0, 7, 6], "texture": "#1"}, + "up": {"uv": [9, 9, 14, 8], "rotation": 270, "texture": "#3"} + } + }, + { + "from": [2, 8, 7], + "to": [14, 13, 14], + "faces": { + "north": {"uv": [0, 8, 2.5, 14], "rotation": 270, "texture": "#2"}, + "up": {"uv": [2.5, 8, 6, 14], "rotation": 90, "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "open", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3, 4] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/controls/item.json b/src/main/resources/assets/create/models/block/controls/item.json new file mode 100644 index 000000000..85fa1fe58 --- /dev/null +++ b/src/main/resources/assets/create/models/block/controls/item.json @@ -0,0 +1,175 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "0": "create:block/brass_casing_belt", + "1": "create:block/brass_block", + "2": "create:block/brass_funnel_back", + "3": "create:block/brass_funnel_plating", + "5": "block/lever", + "7": "create:block/chute" + }, + "elements": [ + { + "from": [0, 0, 4], + "to": [16, 8, 16], + "faces": { + "north": {"uv": [8, 8.5, 16, 12.5], "texture": "#0"}, + "east": {"uv": [8, 8.5, 14, 12.5], "texture": "#0"}, + "south": {"uv": [8, 8.5, 16, 12.5], "texture": "#0"}, + "west": {"uv": [10, 8.5, 16, 12.5], "texture": "#0"}, + "up": {"uv": [9, 1, 15, 9], "rotation": 90, "texture": "#3"}, + "down": {"uv": [0, 2, 16, 14], "texture": "#1"} + } + }, + { + "from": [14, 8, 6], + "to": [16, 14, 16], + "faces": { + "north": {"uv": [11, 8, 14, 9], "rotation": 90, "texture": "#3"}, + "east": {"uv": [7, 0, 16, 6], "texture": "#1"}, + "south": {"uv": [11, 0, 13, 6], "texture": "#1"}, + "west": {"uv": [0, 0, 10, 6], "texture": "#1"}, + "up": {"uv": [9, 8, 14, 9], "rotation": 270, "texture": "#3"} + } + }, + { + "from": [2, 8, 14], + "to": [14, 14, 16], + "faces": { + "north": {"uv": [2, 0, 14, 6], "texture": "#1"}, + "south": {"uv": [3, 0, 12, 6], "texture": "#1"}, + "up": {"uv": [10, 1, 14, 2], "rotation": 180, "texture": "#3"} + } + }, + { + "from": [0, 8, 6], + "to": [2, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [11, 9, 14, 8], "rotation": 90, "texture": "#3"}, + "east": {"uv": [10, 0, 0, 6], "texture": "#1"}, + "south": {"uv": [4, 0, 2, 6], "texture": "#1"}, + "west": {"uv": [16, 0, 7, 6], "texture": "#1"}, + "up": {"uv": [9, 9, 14, 8], "rotation": 270, "texture": "#3"} + } + }, + { + "from": [2, 8, 7], + "to": [14, 13, 14], + "faces": { + "north": {"uv": [0, 8, 2.5, 14], "rotation": 270, "texture": "#2"}, + "up": {"uv": [2.5, 8, 6, 14], "rotation": 90, "texture": "#2"} + } + }, + { + "from": [6, 7.25, 6.75], + "to": [10, 13.25, 14.75], + "faces": { + "north": {"uv": [10.5, 6, 13.5, 8], "rotation": 270, "texture": "#7"}, + "up": {"uv": [10, 6, 14, 8], "rotation": 90, "texture": "#7"} + } + }, + { + "from": [0, 7.25, 6.75], + "to": [4, 13.25, 14.75], + "faces": { + "north": {"uv": [10.5, 6, 13.5, 8], "rotation": 270, "texture": "#7"}, + "up": {"uv": [10, 6, 14, 8], "rotation": 90, "texture": "#7"} + } + }, + { + "from": [12, 7.25, 6.75], + "to": [16, 13.25, 14.75], + "faces": { + "north": {"uv": [10.5, 6, 13.5, 8], "rotation": 270, "texture": "#7"}, + "up": {"uv": [10, 6, 14, 8], "rotation": 90, "texture": "#7"} + } + }, + { + "from": [4, 9, -1], + "to": [6, 11, 9], + "rotation": {"angle": 45, "axis": "x", "origin": [0, 10, 11]}, + "faces": { + "north": {"uv": [7, 6, 9, 8], "rotation": 180, "texture": "#5"}, + "east": {"uv": [7, 6, 9, 16], "rotation": 90, "texture": "#5"}, + "west": {"uv": [7, 6, 9, 16], "rotation": 270, "texture": "#5"}, + "up": {"uv": [7, 6, 9, 16], "texture": "#5"}, + "down": {"uv": [7, 6, 9, 16], "rotation": 180, "texture": "#5"} + } + }, + { + "from": [10, 9, -1], + "to": [12, 11, 9], + "rotation": {"angle": 22.5, "axis": "x", "origin": [0, 10, 11]}, + "faces": { + "north": {"uv": [7, 6, 9, 8], "rotation": 180, "texture": "#5"}, + "east": {"uv": [7, 6, 9, 16], "rotation": 90, "texture": "#5"}, + "west": {"uv": [7, 6, 9, 16], "rotation": 270, "texture": "#5"}, + "up": {"uv": [7, 6, 9, 16], "texture": "#5"}, + "down": {"uv": [7, 6, 9, 16], "rotation": 180, "texture": "#5"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [1, 0, 0], + "scale": [0.625, 0.625, 0.625] + }, + "head": { + "translation": [0, 8.5, -2.25] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "open", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3, 4] + }, + { + "name": "cover", + "origin": [8, 8, 8], + "color": 0, + "children": [5, 6, 7] + }, + { + "name": "lever", + "origin": [8, 8, 8], + "color": 0, + "children": [8] + }, + { + "name": "lever", + "origin": [8, 8, 8], + "color": 0, + "children": [9] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/controls/train/cover.json b/src/main/resources/assets/create/models/block/controls/train/cover.json new file mode 100644 index 000000000..881c212d5 --- /dev/null +++ b/src/main/resources/assets/create/models/block/controls/train/cover.json @@ -0,0 +1,33 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "7": "create:block/chute", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "from": [6, 7.25, 6.75], + "to": [10, 13.25, 14.75], + "faces": { + "north": {"uv": [10.5, 6, 13.5, 8], "rotation": 270, "texture": "#7"}, + "up": {"uv": [10, 6, 14, 8], "rotation": 90, "texture": "#7"} + } + }, + { + "from": [0, 7.25, 6.75], + "to": [4, 13.25, 14.75], + "faces": { + "north": {"uv": [10.5, 6, 13.5, 8], "rotation": 270, "texture": "#7"}, + "up": {"uv": [10, 6, 14, 8], "rotation": 90, "texture": "#7"} + } + }, + { + "from": [12, 7.25, 6.75], + "to": [16, 13.25, 14.75], + "faces": { + "north": {"uv": [10.5, 6, 13.5, 8], "rotation": 270, "texture": "#7"}, + "up": {"uv": [10, 6, 14, 8], "rotation": 90, "texture": "#7"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/controls/train/lever.json b/src/main/resources/assets/create/models/block/controls/train/lever.json new file mode 100644 index 000000000..bc7b8c675 --- /dev/null +++ b/src/main/resources/assets/create/models/block/controls/train/lever.json @@ -0,0 +1,21 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "5": "block/lever", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "from": [4, 9, -1], + "to": [6, 11, 9], + "rotation": {"angle": 45, "axis": "x", "origin": [0, 10, 11]}, + "faces": { + "north": {"uv": [7, 6, 9, 8], "rotation": 180, "texture": "#5"}, + "east": {"uv": [7, 6, 9, 16], "rotation": 90, "texture": "#5"}, + "west": {"uv": [7, 6, 9, 16], "rotation": 270, "texture": "#5"}, + "up": {"uv": [7, 6, 9, 16], "texture": "#5"}, + "down": {"uv": [7, 6, 9, 16], "rotation": 180, "texture": "#5"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/ascending.json b/src/main/resources/assets/create/models/block/track/ascending.json new file mode 100644 index 000000000..009c53cd6 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/ascending.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/ascending.obj", + "textures": { + "0": "create:block/track", + "particle": "create:block/palettes/stone_types/polished/andesite_cut_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/ascending.obj b/src/main/resources/assets/create/models/block/track/ascending.obj new file mode 100644 index 000000000..bf8a0dbb0 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/ascending.obj @@ -0,0 +1,253 @@ +# Made in Blockbench 4.1.1 +mtllib track.mtl + +o cube4 +v 1.625 1.3129126073623882 0.9160533905932737 +v 1.625 0.2964466094067261 -0.10041260736238833 +v 1.625 1.3129126073623882 0.9160533905932737 +v 1.625 0.2964466094067261 -0.10041260736238833 +v -0.625 0.2964466094067261 -0.10041260736238833 +v -0.625 1.3129126073623882 0.9160533905932737 +v -0.625 0.2964466094067261 -0.10041260736238833 +v -0.625 1.3129126073623882 0.9160533905932737 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0 0.6875 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0 0.6875 +vn 0 0.7071067811865475 -0.7071067811865476 +vn 0 -0.7071067811865475 0.7071067811865476 +usemtl m_0 +f 6/4/1 1/3/1 2/2/1 5/1/1 +f 7/8/2 4/7/2 3/6/2 8/5/2 +o cube5 +v 1.625 1.1361359120657513 1.0928300858899105 +v 1.625 0.11966991411008931 0.07636408793424859 +v 1.625 1.1361359120657513 1.0928300858899105 +v 1.625 0.11966991411008931 0.07636408793424859 +v -0.625 0.11966991411008931 0.07636408793424859 +v -0.625 1.1361359120657513 1.0928300858899105 +v -0.625 0.11966991411008931 0.07636408793424859 +v -0.625 1.1361359120657513 1.0928300858899105 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0 0.6875 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0 0.6875 +vn 0 0.7071067811865475 -0.7071067811865476 +vn 0 -0.7071067811865475 0.7071067811865476 +usemtl m_0 +f 14/12/3 9/11/3 10/10/3 13/9/3 +f 15/16/4 12/15/4 11/14/4 16/13/4 +o cube1 +v 1.56875 1.3129126073623882 0.9160533905932737 +v 1.56875 0.2964466094067261 -0.10041260736238833 +v 1.56875 1.1361359120657513 1.0928300858899105 +v 1.56875 0.11966991411008931 0.07636408793424859 +v 1.36875 0.2964466094067261 -0.10041260736238833 +v 1.36875 1.3129126073623882 0.9160533905932737 +v 1.36875 0.11966991411008931 0.07636408793424859 +v 1.36875 1.1361359120657513 1.0928300858899105 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vn 0 -0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 0.7071067811865476 0.7071067811865475 +vn -1 0 0 +usemtl m_0 +f 20/20/5 23/19/5 21/18/5 18/17/5 +f 19/24/6 20/23/6 18/22/6 17/21/6 +f 24/28/7 19/27/7 17/26/7 22/25/7 +f 23/32/8 24/31/8 22/30/8 21/29/8 +o cube2 +v -0.36875 1.3129126073623882 0.9160533905932737 +v -0.36875 0.2964466094067261 -0.10041260736238833 +v -0.36875 1.1361359120657513 1.0928300858899105 +v -0.36875 0.11966991411008931 0.07636408793424859 +v -0.5687500000000001 0.2964466094067261 -0.10041260736238833 +v -0.5687500000000001 1.3129126073623882 0.9160533905932737 +v -0.5687500000000001 0.11966991411008931 0.07636408793424859 +v -0.5687500000000001 1.1361359120657513 1.0928300858899105 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vn 0 -0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 0.7071067811865476 0.7071067811865475 +vn -1 0 0 +usemtl m_0 +f 28/36/9 31/35/9 29/34/9 26/33/9 +f 27/40/10 28/39/10 26/38/10 25/37/10 +f 32/44/11 27/43/11 25/42/11 30/41/11 +f 31/48/12 32/47/12 30/46/12 29/45/12 +o cube3 +v 1.8718750000000002 1.0720543600207204 0.9801349426383046 +v 1.8718750000000002 0.8952776647240837 0.8033582473416677 +v 1.8718750000000002 0.8908582473416677 1.1613310553173575 +v 1.8718750000000002 0.7140815520450309 0.9845543600207205 +v -0.871875 0.8952776647240837 0.8033582473416677 +v -0.871875 1.0720543600207204 0.9801349426383046 +v -0.871875 0.7140815520450309 0.9845543600207205 +v -0.871875 0.8908582473416677 1.1613310553173575 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0 0.96875 +vt 0 0.921875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vn 0 -0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 -0.7071067811865476 +vn 0 -0.7071067811865475 0.7071067811865476 +usemtl m_0 +f 36/52/13 39/51/13 37/50/13 34/49/13 +f 35/56/14 36/55/14 34/54/14 33/53/14 +f 40/60/15 35/59/15 33/58/15 38/57/15 +f 39/64/16 40/63/16 38/62/16 37/61/16 +f 38/68/17 33/67/17 34/66/17 37/65/17 +f 39/72/18 36/71/18 35/70/18 40/69/18 +o cube6 +v 1.8718750000000002 0.4091417526583322 0.31722233527591637 +v 1.8718750000000002 0.23236505736169533 0.14044563997927945 +v 1.8718750000000002 0.2279456399792794 0.49841844795496915 +v 1.8718750000000002 0.05116894468264255 0.3216417526583323 +v -0.871875 0.23236505736169533 0.14044563997927945 +v -0.871875 0.4091417526583322 0.31722233527591637 +v -0.871875 0.05116894468264255 0.3216417526583323 +v -0.871875 0.2279456399792794 0.49841844795496915 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0 0.96875 +vt 0 0.921875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vn 0 -0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 -0.7071067811865476 +vn 0 -0.7071067811865475 0.7071067811865476 +usemtl m_0 +f 44/76/19 47/75/19 45/74/19 42/73/19 +f 43/80/20 44/79/20 42/78/20 41/77/20 +f 48/84/21 43/83/21 41/82/21 46/81/21 +f 47/88/22 48/87/22 46/86/22 45/85/22 +f 46/92/23 41/91/23 42/90/23 45/89/23 +f 47/96/24 44/95/24 43/94/24 48/93/24 +o cube7 +v 1.8718750000000002 0.7405980563395264 0.6486786389571104 +v 1.8718750000000002 0.5638213610428895 0.47190194366047356 +v 1.8718750000000002 0.5594019436604736 0.8298747516361632 +v 1.8718750000000002 0.3826252483638367 0.6530980563395263 +v -0.871875 0.5638213610428895 0.47190194366047356 +v -0.871875 0.7405980563395264 0.6486786389571104 +v -0.871875 0.3826252483638367 0.6530980563395263 +v -0.871875 0.5594019436604736 0.8298747516361632 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0 0.96875 +vt 0 0.921875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vn 0 -0.7071067811865476 -0.7071067811865475 +vn 1 0 0 +vn 0 0.7071067811865476 0.7071067811865475 +vn -1 0 0 +vn 0 0.7071067811865475 -0.7071067811865476 +vn 0 -0.7071067811865475 0.7071067811865476 +usemtl m_0 +f 52/100/25 55/99/25 53/98/25 50/97/25 +f 51/104/26 52/103/26 50/102/26 49/101/26 +f 56/108/27 51/107/27 49/106/27 54/105/27 +f 55/112/28 56/111/28 54/110/28 53/109/28 +f 54/116/29 49/115/29 50/114/29 53/113/29 +f 55/120/30 52/119/30 51/118/30 56/117/30 \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/ascending_template.json b/src/main/resources/assets/create/models/block/track/ascending_template.json new file mode 100644 index 000000000..f67003b5c --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/ascending_template.json @@ -0,0 +1,96 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [128, 128], + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube4", + "from": [-2, 21.9, 5.5], + "to": [34, 21.9, 28.5], + "rotation": {"angle": -45, "axis": "x", "origin": [16, 18.4, 17]}, + "faces": { + "up": {"uv": [0, 2.125, 3.75, 5], "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 5], "texture": "#0"} + } + }, + { + "name": "cube5", + "from": [-2, 17.9, 5.5], + "to": [34, 17.9, 28.5], + "rotation": {"angle": -45, "axis": "x", "origin": [16, 18.4, 17]}, + "faces": { + "up": {"uv": [0, 2.125, 3.75, 5], "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 5], "texture": "#0"} + } + }, + { + "name": "cube1", + "from": [29.9, 17.9, 5.5], + "to": [33.1, 21.9, 28.5], + "rotation": {"angle": -45, "axis": "x", "origin": [16, 18.4, 17]}, + "faces": { + "north": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "east": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"}, + "south": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "west": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"} + } + }, + { + "name": "cube2", + "from": [-1.1, 17.9, 5.5], + "to": [2.1, 21.9, 28.5], + "rotation": {"angle": -45, "axis": "x", "origin": [16, 18.4, 17]}, + "faces": { + "north": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "east": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"}, + "south": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "west": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"} + } + }, + { + "name": "cube3", + "from": [-5.95, 14.35, 22.5], + "to": [37.95, 18.45, 26.5], + "rotation": {"angle": -45, "axis": "x", "origin": [16, 18.4, 17]}, + "faces": { + "north": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "east": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "south": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "west": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "texture": "#0"} + } + }, + { + "name": "cube6", + "from": [-5.95, 14.35, 7.5], + "to": [37.95, 18.45, 11.5], + "rotation": {"angle": -45, "axis": "x", "origin": [16, 18.4, 17]}, + "faces": { + "north": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "east": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "south": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "west": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "texture": "#0"} + } + }, + { + "name": "cube7", + "from": [-5.95, 14.35, 15], + "to": [37.95, 18.45, 19], + "rotation": {"angle": -45, "axis": "x", "origin": [16, 18.4, 17]}, + "faces": { + "north": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "east": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "south": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "west": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/assembly_overlay.json b/src/main/resources/assets/create/models/block/track/assembly_overlay.json new file mode 100644 index 000000000..c53198060 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/assembly_overlay.json @@ -0,0 +1,38 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [128, 128], + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube5", + "from": [-14.05, -2.15, 9.9], + "to": [30.05, 2.15, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [11, 0.625, 15.75, 1.125], "texture": "#0"}, + "east": {"uv": [10.375, 1.25, 10.875, 1.75], "texture": "#0"}, + "south": {"uv": [11, 0.625, 15.75, 1.125], "texture": "#0"}, + "west": {"uv": [10.375, 1.25, 10.875, 1.75], "texture": "#0"}, + "up": {"uv": [11, 0, 15.75, 0.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [11, 1.25, 15.75, 1.75], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "cube6", + "from": [-14.05, -2.15, 1.9], + "to": [30.05, 2.15, 6.1], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [11, 2.5, 15.75, 3], "texture": "#0"}, + "east": {"uv": [10.375, 3.125, 10.875, 3.625], "texture": "#0"}, + "south": {"uv": [11, 2.5, 15.75, 3], "texture": "#0"}, + "west": {"uv": [10.375, 3.125, 10.875, 3.625], "texture": "#0"}, + "up": {"uv": [11, 1.875, 15.75, 2.375], "rotation": 180, "texture": "#0"}, + "down": {"uv": [11, 3.125, 15.75, 3.625], "rotation": 180, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.json b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.json new file mode 100644 index 000000000..b4ea2f414 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/track/bogey/textures", + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/bogey/bogey_drive.obj" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.mtl b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.mtl new file mode 100644 index 000000000..40aadbc70 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.mtl @@ -0,0 +1,46 @@ +# Blender MTL File: 'Bogey.blend' +# Material Count: 4 + +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 #belt + +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 #bogey + +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 #piston + +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 #wheel diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.obj b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.obj new file mode 100644 index 000000000..1ef72c40c --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive.obj @@ -0,0 +1,1485 @@ +# Blender v3.0.1 OBJ File: 'Bogey.blend' +# www.blender.org +mtllib bogey_drive.mtl +o Cube.050_Cube.042 +v 0.437500 0.687500 0.318750 +v 0.437500 1.375000 0.318750 +v 0.437500 0.687500 -0.318750 +v 0.437500 1.375000 -0.318750 +v 0.750000 0.687500 0.318750 +v 0.750000 1.375000 0.318750 +v 0.750000 0.687500 -0.318750 +v 0.750000 1.375000 -0.318750 +v -0.437500 0.687500 0.318750 +v -0.437500 1.375000 0.318750 +v -0.437500 0.687500 -0.318750 +v -0.437500 1.375000 -0.318750 +v -0.750000 0.687500 0.318750 +v -0.750000 1.375000 0.318750 +v -0.750000 0.687500 -0.318750 +v -0.750000 1.375000 -0.318750 +v 0.937500 0.687500 1.375000 +v 0.937500 1.312500 1.375000 +v 0.937500 0.687500 0.750000 +v 0.937500 1.312500 0.750000 +v 1.312500 0.687500 1.375000 +v 1.312500 1.312500 1.375000 +v 1.312500 0.687500 0.750000 +v 1.312500 1.312500 0.750000 +v 1.249999 0.750000 0.687500 +v 1.249999 1.250000 0.687500 +v 1.249999 0.750000 0.750000 +v 1.249999 1.250000 0.750000 +v 0.999999 0.750000 0.687500 +v 0.999999 1.250000 0.687500 +v 0.999999 0.750000 0.750000 +v 0.999999 1.250000 0.750000 +v 0.999999 1.250000 1.375000 +v 0.999999 0.750000 1.375000 +v 0.999999 1.250000 1.437500 +v 0.999999 0.750000 1.437500 +v 1.249999 1.250000 1.375000 +v 1.249999 0.750000 1.375000 +v 1.249999 1.250000 1.437500 +v 1.249999 0.750000 1.437500 +v -0.937500 0.687500 1.375000 +v -0.937500 1.312500 1.375000 +v -0.937500 0.687500 0.750000 +v -0.937500 1.312500 0.750000 +v -1.312500 0.687500 1.375000 +v -1.312500 1.312500 1.375000 +v -1.312500 0.687500 0.750000 +v -1.312500 1.312500 0.750000 +v -1.249999 0.750000 0.687500 +v -1.249999 1.250000 0.687500 +v -1.249999 0.750000 0.750000 +v -1.249999 1.250000 0.750000 +v -0.999999 0.750000 0.687500 +v -0.999999 1.250000 0.687500 +v -0.999999 0.750000 0.750000 +v -0.999999 1.250000 0.750000 +v -0.999999 1.250000 1.375000 +v -0.999999 0.750000 1.375000 +v -0.999999 1.250000 1.437500 +v -0.999999 0.750000 1.437500 +v -1.249999 1.250000 1.375000 +v -1.249999 0.750000 1.375000 +v -1.249999 1.250000 1.437500 +v -1.249999 0.750000 1.437500 +v 0.937500 0.687500 -1.375000 +v 0.937500 1.312500 -1.375000 +v 0.937500 0.687500 -0.750000 +v 0.937500 1.312500 -0.750000 +v 1.312500 0.687500 -1.375000 +v 1.312500 1.312500 -1.375000 +v 1.312500 0.687500 -0.750000 +v 1.312500 1.312500 -0.750000 +v 1.249999 0.750000 -0.687500 +v 1.249999 1.250000 -0.687500 +v 1.249999 0.750000 -0.750000 +v 1.249999 1.250000 -0.750000 +v 0.999999 0.750000 -0.687500 +v 0.999999 1.250000 -0.687500 +v 0.999999 0.750000 -0.750000 +v 0.999999 1.250000 -0.750000 +v 0.999999 1.250000 -1.375000 +v 0.999999 0.750000 -1.375000 +v 0.999999 1.250000 -1.437500 +v 0.999999 0.750000 -1.437500 +v 1.249999 1.250000 -1.375000 +v 1.249999 0.750000 -1.375000 +v 1.249999 1.250000 -1.437500 +v 1.249999 0.750000 -1.437500 +v -0.937500 0.687500 -1.375000 +v -0.937500 1.312500 -1.375000 +v -0.937500 0.687500 -0.750000 +v -0.937500 1.312500 -0.750000 +v -1.312500 0.687500 -1.375000 +v -1.312500 1.312500 -1.375000 +v -1.312500 0.687500 -0.750000 +v -1.312500 1.312500 -0.750000 +v -1.249999 0.750000 -0.687500 +v -1.249999 1.250000 -0.687500 +v -1.249999 0.750000 -0.750000 +v -1.249999 1.250000 -0.750000 +v -0.999999 0.750000 -0.687500 +v -0.999999 1.250000 -0.687500 +v -0.999999 0.750000 -0.750000 +v -0.999999 1.250000 -0.750000 +v -0.999999 1.250000 -1.375000 +v -0.999999 0.750000 -1.375000 +v -0.999999 1.250000 -1.437500 +v -0.999999 0.750000 -1.437500 +v -1.249999 1.250000 -1.375000 +v -1.249999 0.750000 -1.375000 +v -1.249999 1.250000 -1.437500 +v -1.249999 0.750000 -1.437500 +v -0.437500 0.750000 0.437500 +v -0.437500 1.250000 0.437500 +v -0.437500 0.750000 -0.437500 +v -0.437500 1.250000 -0.437500 +v 0.437500 0.750000 0.437500 +v 0.437500 1.250000 0.437500 +v 0.437500 0.750000 -0.437500 +v 0.437500 1.250000 -0.437500 +v -0.312500 0.437500 0.562500 +v -0.312500 1.062500 0.562500 +v -0.312500 0.437500 -0.562500 +v -0.312500 1.062500 -0.562500 +v 0.312500 0.437500 0.562500 +v 0.312500 1.062500 0.562500 +v 0.312500 0.437500 -0.562500 +v 0.312500 1.062500 -0.562500 +v -0.250000 1.250000 0.250000 +v -0.250000 1.500000 0.250000 +v -0.250000 1.250000 -0.250000 +v -0.250000 1.500000 -0.250000 +v 0.250000 1.250000 0.250000 +v 0.250000 1.500000 0.250000 +v 0.250000 1.250000 -0.250000 +v 0.250000 1.500000 -0.250000 +v 0.224112 0.588388 0.312500 +v 0.224112 0.588388 0.125000 +v 0.312500 0.500000 0.312500 +v 0.312500 0.500000 0.125000 +v 0.489277 0.853553 0.312500 +v 0.489277 0.853553 0.125000 +v 0.577665 0.765165 0.125000 +v 0.577665 0.765165 0.312500 +v -0.224112 0.588388 0.312500 +v -0.224112 0.588388 0.125000 +v -0.312500 0.500000 0.312500 +v -0.312500 0.500000 0.125000 +v -0.489277 0.853553 0.312500 +v -0.489277 0.853553 0.125000 +v -0.577665 0.765165 0.125000 +v -0.577665 0.765165 0.312500 +v 0.224112 0.588388 -0.312500 +v 0.224112 0.588388 -0.125000 +v 0.312500 0.500000 -0.312500 +v 0.312500 0.500000 -0.125000 +v 0.489277 0.853553 -0.312500 +v 0.489277 0.853553 -0.125000 +v 0.577665 0.765165 -0.125000 +v 0.577665 0.765165 -0.312500 +v -0.224112 0.588388 -0.312500 +v -0.224112 0.588388 -0.125000 +v -0.312500 0.500000 -0.312500 +v -0.312500 0.500000 -0.125000 +v -0.489277 0.853553 -0.312500 +v -0.489277 0.853553 -0.125000 +v -0.577665 0.765165 -0.125000 +v -0.577665 0.765165 -0.312500 +v 0.312500 0.437500 -1.312500 +v 0.312500 1.062500 -1.312500 +v 0.312500 0.437500 -0.687500 +v 0.312500 1.062500 -0.687500 +v -0.312500 0.437500 -1.312500 +v -0.312500 1.062500 -1.312500 +v -0.312500 0.437500 -0.687500 +v -0.312500 1.062500 -0.687500 +v -0.093750 1.062500 -0.906250 +v -0.093750 1.250000 -0.906250 +v -0.093750 1.062500 -1.093750 +v -0.093750 1.250000 -1.093750 +v 0.093750 1.062500 -0.906250 +v 0.093750 1.250000 -0.906250 +v 0.093750 1.062500 -1.093750 +v 0.093750 1.250000 -1.093750 +v 0.312500 0.437500 1.312500 +v 0.312500 1.062500 1.312500 +v 0.312500 0.437500 0.687500 +v 0.312500 1.062500 0.687500 +v -0.312500 0.437500 1.312500 +v -0.312500 1.062500 1.312500 +v -0.312500 0.437500 0.687500 +v -0.312500 1.062500 0.687500 +v -0.093750 1.062500 0.906250 +v -0.093750 1.250000 0.906250 +v -0.093750 1.062500 1.093750 +v -0.093750 1.250000 1.093750 +v 0.093750 1.062500 0.906250 +v 0.093750 1.250000 0.906250 +v 0.093750 1.062500 1.093750 +v 0.093750 1.250000 1.093750 +v 0.750000 0.500000 -1.250000 +v 0.750000 1.000000 -1.250000 +v 0.750000 0.500000 -0.750000 +v 0.750000 1.000000 -0.750000 +v 0.437500 0.500000 -1.250000 +v 0.437500 1.000000 -1.250000 +v 0.437500 0.500000 -0.750000 +v 0.437500 1.000000 -0.750000 +v -0.750000 0.500000 -1.250000 +v -0.750000 1.000000 -1.250000 +v -0.750000 0.500000 -0.750000 +v -0.750000 1.000000 -0.750000 +v -0.437500 0.500000 -1.250000 +v -0.437500 1.000000 -1.250000 +v -0.437500 0.500000 -0.750000 +v -0.437500 1.000000 -0.750000 +v 0.750000 0.500000 1.250000 +v 0.750000 1.000000 1.250000 +v 0.750000 0.500000 0.750000 +v 0.750000 1.000000 0.750000 +v 0.437500 0.500000 1.250000 +v 0.437500 1.000000 1.250000 +v 0.437500 0.500000 0.750000 +v 0.437500 1.000000 0.750000 +v -0.750000 0.500000 1.250000 +v -0.750000 1.000000 1.250000 +v -0.750000 0.500000 0.750000 +v -0.750000 1.000000 0.750000 +v -0.437500 0.500000 1.250000 +v -0.437500 1.000000 1.250000 +v -0.437500 0.500000 0.750000 +v -0.437500 1.000000 0.750000 +v 0.500000 1.000000 -1.062500 +v 0.687500 1.000000 -1.062500 +v 0.500000 1.310930 -0.311848 +v 0.687500 1.310930 -0.311848 +v -0.500000 1.000000 -1.062500 +v -0.687500 1.000000 -1.062500 +v -0.500000 1.310930 -0.311848 +v -0.687500 1.310930 -0.311848 +v 0.500000 1.000000 1.062500 +v 0.687500 1.000000 1.062500 +v 0.500000 1.310930 0.311848 +v 0.687500 1.310930 0.311848 +v -0.500000 1.000000 1.062500 +v -0.687500 1.000000 1.062500 +v -0.500000 1.310930 0.311848 +v -0.687500 1.310930 0.311848 +v 0.500000 0.656250 0.939394 +v 0.687500 0.656250 0.939394 +v 0.500000 0.656250 -1.060606 +v 0.687500 0.656250 -1.060606 +v 0.500000 0.656250 -0.060606 +v 0.687500 0.656250 -0.060606 +v -0.500000 0.593750 0.939394 +v -0.687500 0.593750 0.939394 +v -0.500000 0.593750 -1.060606 +v -0.687500 0.593750 -1.060606 +v -0.500000 0.593750 -0.060606 +v -0.687500 0.593750 -0.060606 +v 0.500000 0.942259 -1.038583 +v 0.687500 0.942259 -1.038583 +v 0.500000 1.253189 -0.287931 +v 0.687500 1.253189 -0.287931 +v -0.500000 0.942259 -1.038583 +v -0.687500 0.942259 -1.038583 +v -0.500000 1.253189 -0.287931 +v -0.687500 1.253189 -0.287931 +v 0.500000 0.942259 1.038583 +v 0.687500 0.942259 1.038583 +v 0.500000 1.253189 0.287931 +v 0.687500 1.253189 0.287931 +v -0.500000 0.942259 1.038583 +v -0.687500 0.942259 1.038583 +v -0.500000 1.253189 0.287931 +v -0.687500 1.253189 0.287931 +v 0.500000 0.593750 0.939394 +v 0.687500 0.593750 0.939394 +v 0.500000 0.593750 -1.060606 +v 0.687500 0.593750 -1.060606 +v 0.500000 0.593750 -0.060606 +v 0.687500 0.593750 -0.060606 +v -0.500000 0.531250 0.939394 +v -0.687500 0.531250 0.939394 +v -0.500000 0.531250 -1.060606 +v -0.687500 0.531250 -1.060606 +v -0.500000 0.531250 -0.060606 +v -0.687500 0.531250 -0.060606 +v 0.000000 0.562500 -0.937500 +v 0.000000 0.562500 -1.187500 +v -0.750000 0.375000 -0.937500 +v 0.000000 0.375000 -0.937500 +v 0.000000 0.375000 -1.187500 +v -1.059359 0.949524 -0.937500 +v -1.059359 0.949524 -1.187500 +v -0.750000 0.375000 -1.187500 +v -1.191942 0.816942 -0.937500 +v -1.191942 0.816942 -1.187500 +v -0.672335 0.562500 -0.937500 +v -0.672335 0.562500 -1.187500 +v 0.750000 0.375000 -0.937500 +v 1.059359 0.949524 -0.937500 +v 1.059359 0.949524 -1.187500 +v 0.750000 0.375000 -1.187500 +v 1.191942 0.816942 -0.937500 +v 1.191942 0.816942 -1.187500 +v 0.672335 0.562500 -0.937500 +v 0.672335 0.562500 -1.187500 +v 0.000000 0.562500 0.937500 +v 0.000000 0.562500 1.187500 +v -0.750000 0.375000 0.937500 +v 0.000000 0.375000 0.937500 +v 0.000000 0.375000 1.187500 +v -1.059359 0.949524 0.937500 +v -1.059359 0.949524 1.187500 +v -0.750000 0.375000 1.187500 +v -1.191942 0.816942 0.937500 +v -1.191942 0.816942 1.187500 +v -0.672335 0.562500 0.937500 +v -0.672335 0.562500 1.187500 +v 0.750000 0.375000 0.937500 +v 1.059359 0.949524 0.937500 +v 1.059359 0.949524 1.187500 +v 0.750000 0.375000 1.187500 +v 1.191942 0.816942 0.937500 +v 1.191942 0.816942 1.187500 +v 0.672335 0.562500 0.937500 +v 0.672335 0.562500 1.187500 +vt 0.812500 1.000000 +vt 0.500000 0.656250 +vt 0.812500 0.656250 +vt 0.968750 1.000000 +vt 0.812500 0.656250 +vt 0.968750 0.656250 +vt 0.968750 1.000000 +vt 0.968750 0.656250 +vt 0.500000 0.500000 +vt 0.812500 0.656250 +vt 0.500000 0.500000 +vt 0.812500 0.500000 +vt 0.500000 0.656250 +vt 0.812500 1.000000 +vt 0.812500 0.656250 +vt 0.812500 0.656250 +vt 0.968750 1.000000 +vt 0.968750 0.656250 +vt 0.968750 1.000000 +vt 0.968750 0.656250 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.812500 0.656250 +vt 0.812500 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.187500 0.000000 +vt 0.500000 0.187500 +vt 0.500000 0.000000 +vt 0.187500 0.500000 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.000000 0.187500 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.187500 0.187500 +vt 0.500000 -0.000000 +vt 0.875000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.625000 +vt 0.500000 0.937500 +vt 0.375000 0.687500 +vt 0.375000 0.937500 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 1.000000 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 0.875000 0.625000 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.625000 +vt 0.843750 0.625000 +vt 0.875000 0.375000 +vt 1.000000 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.625000 +vt 0.843750 0.625000 +vt 0.875000 0.656250 +vt 0.875000 0.656250 +vt 1.000000 0.625000 +vt 1.000000 0.656250 +vt 0.500000 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.187500 +vt 0.187500 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.187500 +vt 0.187500 0.500000 +vt 0.500000 0.500000 +vt 0.000000 0.187500 +vt 0.187500 0.500000 +vt 0.000000 0.500000 +vt 0.187500 0.187500 +vt 0.000000 0.500000 +vt 0.500000 -0.000000 +vt 1.000000 0.625000 +vt 0.875000 0.656250 +vt 0.875000 0.625000 +vt 0.375000 0.687500 +vt 0.500000 0.937500 +vt 0.375000 0.937500 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.625000 +vt 1.000000 0.656250 +vt 0.843750 0.375000 +vt 0.875000 0.625000 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 1.000000 0.625000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 0.500000 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.187500 +vt 0.187500 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.187500 +vt 0.187500 0.500000 +vt 0.500000 0.500000 +vt 0.000000 0.187500 +vt 0.187500 0.500000 +vt 0.000000 0.500000 +vt 0.187500 0.187500 +vt 0.000000 0.500000 +vt 0.500000 -0.000000 +vt 1.000000 0.625000 +vt 0.875000 0.656250 +vt 0.875000 0.625000 +vt 0.375000 0.687500 +vt 0.500000 0.937500 +vt 0.375000 0.937500 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.625000 +vt 1.000000 0.656250 +vt 0.843750 0.375000 +vt 0.875000 0.625000 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 1.000000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 0.875000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 0.187500 0.187500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.187500 0.000000 +vt 0.500000 0.187500 +vt 0.500000 0.000000 +vt 0.187500 0.500000 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.000000 0.187500 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.187500 0.187500 +vt 0.500000 -0.000000 +vt 0.875000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.625000 +vt 0.500000 0.937500 +vt 0.375000 0.687500 +vt 0.375000 0.937500 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 1.000000 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 0.875000 0.625000 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.625000 +vt 0.843750 0.625000 +vt 0.875000 0.375000 +vt 1.000000 0.625000 +vt 0.843750 0.625000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 0.875000 0.656250 +vt 1.000000 0.625000 +vt 1.000000 0.656250 +vt 0.500000 0.500000 +vt 0.750000 0.250000 +vt 0.750000 0.500000 +vt 0.812500 0.250000 +vt 0.656250 0.000000 +vt 0.812500 0.000000 +vt 0.656250 0.250000 +vt 0.500000 0.000000 +vt 0.656250 0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.000000 +vt 0.656250 0.250000 +vt 0.812500 0.000000 +vt 0.812500 0.250000 +vt 0.750000 0.250000 +vt 0.500000 0.500000 +vt 0.750000 0.500000 +vt 0.656250 0.000000 +vt 0.812500 0.250000 +vt 0.812500 0.000000 +vt 0.500000 0.000000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.000000 +vt 0.812500 0.000000 +vt 0.656250 0.250000 +vt 0.812500 0.250000 +vt 0.750000 0.250000 +vt 0.500000 0.500000 +vt 0.750000 0.500000 +vt 0.656250 0.000000 +vt 0.812500 0.250000 +vt 0.812500 0.000000 +vt 0.500000 0.000000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.000000 +vt 0.812500 0.000000 +vt 0.656250 0.250000 +vt 0.812500 0.250000 +vt 0.500000 0.500000 +vt 0.750000 0.250000 +vt 0.750000 0.500000 +vt 0.812500 0.250000 +vt 0.656250 0.000000 +vt 0.812500 0.000000 +vt 0.656250 0.250000 +vt 0.500000 0.000000 +vt 0.656250 0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.000000 +vt 0.656250 0.250000 +vt 0.812500 0.000000 +vt 0.812500 0.250000 +vt 0.500000 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.500000 +vt 0.500000 0.656250 +vt 0.500000 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.500000 +vt 0.500000 0.656250 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.187500 0.187500 +vt -0.000000 0.187500 +vt 0.187500 0.000000 +vt 1.000000 0.656250 +vt 0.500000 0.687500 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 1.000000 0.375000 +vt 0.875000 0.375000 +vt 1.000000 0.656250 +vt 0.875000 0.625000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.187500 0.187500 +vt -0.000000 0.187500 +vt 0.187500 0.000000 +vt 1.000000 0.656250 +vt 0.500000 0.687500 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 1.000000 0.375000 +vt 0.875000 0.375000 +vt 1.000000 0.656250 +vt 0.875000 0.625000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.187500 0.187500 +vt -0.000000 0.187500 +vt 0.187500 0.000000 +vt 1.000000 0.656250 +vt 0.500000 0.687500 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 1.000000 0.375000 +vt 0.875000 0.625000 +vt 1.000000 0.656250 +vt 0.875000 0.625000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.187500 0.187500 +vt -0.000000 0.187500 +vt 0.187500 0.000000 +vt 1.000000 0.656250 +vt 0.500000 0.687500 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 1.000000 0.375000 +vt 0.843750 0.375000 +vt 1.000000 0.656250 +vt 0.875000 0.625000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.375000 0.000000 +vt 0.000000 0.125000 +vt 0.375000 0.125000 +vt 0.336167 0.218750 +vt 0.000000 0.218750 +vt 0.336167 0.125000 +vt -0.000000 0.000000 +vt 0.336167 0.000000 +vt 0.336167 0.218750 +vt 0.000000 0.125000 +vt 0.375000 0.125000 +vt 0.687500 0.125000 +vt 0.413832 0.218750 +vt 0.687500 0.125000 +vt 0.687500 0.218750 +vt 0.413833 0.218750 +vt 0.413832 0.000000 +vt 0.687500 0.125000 +vt 0.413833 0.125000 +vt 0.375000 0.000000 +vt 0.375000 0.125000 +vt 0.336167 0.218750 +vt 0.336167 0.125000 +vt 0.336167 0.000000 +vt 0.336167 0.218750 +vt 0.375000 0.125000 +vt 0.687500 0.125000 +vt 0.687500 0.125000 +vt 0.413832 0.218750 +vt 0.687500 0.218750 +vt 0.413833 0.218750 +vt 0.687500 0.125000 +vt 0.413832 0.000000 +vt 0.413833 0.125000 +vt 0.000000 0.125000 +vt 0.375000 0.000000 +vt 0.375000 0.125000 +vt 0.336167 0.218750 +vt 0.000000 0.218750 +vt -0.000000 0.000000 +vt 0.336167 0.125000 +vt 0.336167 0.000000 +vt 0.000000 0.125000 +vt 0.336167 0.218750 +vt 0.375000 0.125000 +vt 0.687500 0.125000 +vt 0.687500 0.125000 +vt 0.413832 0.218750 +vt 0.687500 0.218750 +vt 0.413833 0.218750 +vt 0.687500 0.125000 +vt 0.413832 0.000000 +vt 0.413833 0.125000 +vt 0.375000 0.000000 +vt 0.375000 0.125000 +vt 0.336167 0.218750 +vt 0.336167 0.125000 +vt 0.336167 0.000000 +vt 0.336167 0.218750 +vt 0.375000 0.125000 +vt 0.687500 0.125000 +vt 0.413832 0.218750 +vt 0.687500 0.125000 +vt 0.687500 0.218750 +vt 0.413833 0.218750 +vt 0.413832 0.000000 +vt 0.687500 0.125000 +vt 0.413833 0.125000 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.812500 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.812500 0.468750 +vt -0.000000 0.000000 +vt 0.000000 0.125000 +vt 0.000000 0.218750 +vt 0.687500 0.000000 +vt 0.687500 0.218750 +vt 0.687500 0.000000 +vt 0.687500 0.000000 +vt 0.687500 0.218750 +vt 0.687500 0.000000 +vt -0.000000 0.000000 +vt 0.000000 0.125000 +vt 0.000000 0.218750 +vt 0.687500 0.000000 +vt 0.687500 0.218750 +vt 0.687500 0.000000 +vt 0.687500 0.000000 +vt 0.687500 0.218750 +vt 0.687500 0.000000 +vt 0.437500 1.000000 +vt 0.687500 0.562500 +vt 0.687500 1.000000 +vt 0.312500 0.562500 +vt 0.750000 0.312500 +vt 0.312500 0.312500 +vt 0.437500 1.000000 +vt 0.687500 0.562500 +vt 0.687500 1.000000 +vt 0.750000 0.562500 +vt 0.312500 0.312500 +vt 0.750000 0.312500 +vt 0.437500 0.562500 +vt 0.000000 1.000000 +vt 0.000000 0.562500 +vt 0.000000 1.000000 +vt 0.437500 0.562500 +vt 0.312500 0.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.687500 0.687500 +vt 1.000000 0.687500 +vt 0.312500 0.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.687500 0.687500 +vt 1.000000 0.687500 +vt 0.312500 0.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.718750 +vt 0.718750 0.968750 +vt 0.718750 0.718750 +vt 0.750000 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.906250 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.812500 0.562500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.906250 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.000000 +vt 0.625000 -0.000000 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.625000 -0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.312500 +vt 0.593750 0.031250 +vt 0.343750 0.281250 +vt 0.343750 0.031250 +vt 0.343750 0.281250 +vt 0.593750 0.031250 +vt 0.343750 0.031250 +vt 0.343750 0.281250 +vt 0.593750 0.031250 +vt 0.343750 0.031250 +vt 0.593750 0.031250 +vt 0.343750 0.281250 +vt 0.343750 0.031250 +vt 0.437500 0.562500 +vt 0.750000 0.562500 +vt 0.312500 0.562500 +vt 0.437500 1.000000 +vt 0.000000 0.562500 +vt 0.312500 0.562500 +vt 0.687500 1.000000 +vt 0.312500 0.562500 +vt 0.687500 1.000000 +vt 0.312500 0.562500 +vt 0.312500 0.562500 +vt 0.718750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.687500 +vt 0.968750 0.968750 +vt 0.906250 0.312500 +vt 0.812500 0.312500 +vt 0.906250 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.312500 +vt 0.750000 0.312500 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.593750 0.281250 +vt 0.593750 0.281250 +vt 0.593750 0.281250 +vt 0.593750 0.281250 +vt 0.312500 1.000000 +vt 0.125000 0.187500 +vt 0.312500 0.187500 +vt 0.875000 0.187500 +vt 0.687500 1.000000 +vt 0.687500 0.187500 +vt 0.125000 1.000000 +vt 0.312500 0.187500 +vt 0.312500 1.000000 +vt 0.687500 0.187500 +vt 0.875000 1.000000 +vt 0.687500 1.000000 +vt 0.125000 0.000000 +vt 0.312500 1.000000 +vt 0.312500 0.000000 +vt 0.125000 0.000000 +vt 0.312500 1.000000 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 1.000000 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 0.000000 +vt 0.312500 0.000000 +vt 0.125000 0.187500 +vt 0.312500 1.000000 +vt 0.312500 0.187500 +vt 0.687500 1.000000 +vt 0.875000 0.187500 +vt 0.687500 0.187500 +vt 0.312500 0.187500 +vt 0.125000 1.000000 +vt 0.312500 1.000000 +vt 0.875000 1.000000 +vt 0.687500 0.187500 +vt 0.687500 1.000000 +vt 0.312500 1.000000 +vt 0.125000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 0.000000 +vt 0.312500 0.000000 +vt 0.125000 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.000000 +vt 0.125000 0.000000 +vt 0.312500 1.000000 +vt 0.312500 0.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.125000 0.187500 +vt 0.125000 0.187500 +vt 0.875000 0.187500 +vt 0.875000 0.187500 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.000000 +vt 0.125000 0.000000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.7071 -0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.0000 0.9239 -0.3827 +vn 0.0000 0.9239 0.3827 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 -0.9239 -0.3827 +vn 0.0000 -0.3827 -0.9239 +vn 0.0000 0.3827 0.9239 +vn 0.0000 -0.3827 0.9239 +vn 0.0000 0.3827 -0.9239 +usemtl Bogey_Piston +s off +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 7/5/2 3/6/2 +f 6/7/3 1/3/3 5/8/3 +f 7/9/4 1/3/4 3/2/4 +f 4/10/5 6/11/5 8/12/5 +f 11/13/6 10/14/6 9/15/6 +f 15/16/2 12/17/2 11/18/2 +f 9/15/3 14/19/3 13/20/3 +f 9/15/4 15/21/4 11/13/4 +f 14/22/5 12/23/5 16/24/5 +f 18/25/1 19/26/1 17/27/1 +f 20/28/2 23/29/2 19/30/2 +f 24/31/6 21/32/6 23/33/6 +f 23/34/4 17/35/4 19/36/4 +f 20/37/5 22/38/5 24/31/5 +f 22/38/3 17/39/3 21/32/3 +f 32/40/5 26/41/5 30/42/5 +f 26/43/2 29/44/2 30/45/2 +f 30/42/1 31/46/1 32/47/1 +f 27/48/4 29/49/4 25/50/4 +f 28/51/6 25/52/6 26/53/6 +f 34/54/1 35/55/1 33/56/1 +f 36/57/3 39/58/3 35/55/3 +f 40/59/6 37/60/6 39/61/6 +f 39/58/5 33/62/5 35/55/5 +f 36/63/4 38/64/4 40/65/4 +f 43/66/6 42/67/6 41/68/6 +f 47/69/2 44/70/2 43/71/2 +f 45/72/1 48/73/1 47/74/1 +f 41/75/4 47/76/4 43/77/4 +f 46/78/5 44/79/5 48/73/5 +f 41/80/3 46/78/3 45/72/3 +f 50/81/5 56/82/5 54/83/5 +f 53/84/2 50/85/2 54/86/2 +f 55/87/6 54/83/6 56/88/6 +f 53/89/4 51/90/4 49/91/4 +f 49/92/1 52/93/1 50/94/1 +f 59/95/6 58/96/6 57/97/6 +f 63/98/3 60/99/3 59/95/3 +f 61/100/1 64/101/1 63/102/1 +f 57/103/5 63/98/5 59/95/5 +f 62/104/4 60/105/4 64/106/4 +f 67/107/1 66/108/1 65/109/1 +f 71/110/3 68/111/3 67/112/3 +f 69/113/6 72/114/6 71/115/6 +f 65/116/4 71/117/4 67/118/4 +f 70/119/5 68/120/5 72/114/5 +f 65/121/2 70/119/2 69/113/2 +f 74/122/5 80/123/5 78/124/5 +f 77/125/3 74/126/3 78/127/3 +f 79/128/1 78/124/1 80/129/1 +f 77/130/4 75/131/4 73/132/4 +f 73/133/6 76/134/6 74/135/6 +f 83/136/1 82/137/1 81/138/1 +f 87/139/2 84/140/2 83/136/2 +f 87/141/6 86/142/6 88/143/6 +f 81/144/5 87/139/5 83/136/5 +f 86/145/4 84/146/4 88/147/4 +f 90/148/6 91/149/6 89/150/6 +f 92/151/3 95/152/3 91/153/3 +f 96/154/1 93/155/1 95/156/1 +f 95/157/4 89/158/4 91/159/4 +f 92/160/5 94/161/5 96/154/5 +f 94/161/2 89/162/2 93/155/2 +f 104/163/5 98/164/5 102/165/5 +f 98/166/3 101/167/3 102/168/3 +f 102/165/6 103/169/6 104/170/6 +f 99/171/4 101/172/4 97/173/4 +f 100/174/1 97/175/1 98/176/1 +f 106/177/6 107/178/6 105/179/6 +f 108/180/2 111/181/2 107/178/2 +f 111/182/1 110/183/1 109/184/1 +f 111/181/5 105/185/5 107/178/5 +f 108/186/4 110/187/4 112/188/4 +f 202/189/6 203/190/6 201/191/6 +f 204/192/3 207/193/3 203/194/3 +f 206/195/2 201/196/2 205/197/2 +f 207/193/4 201/198/4 203/199/4 +f 204/200/5 206/201/5 208/202/5 +f 211/203/1 210/204/1 209/205/1 +f 215/206/3 212/207/3 211/208/3 +f 209/209/2 214/210/2 213/211/2 +f 209/212/4 215/206/4 211/213/4 +f 214/214/5 212/215/5 216/216/5 +f 219/217/6 218/218/6 217/219/6 +f 223/220/2 220/221/2 219/222/2 +f 217/223/3 222/224/3 221/225/3 +f 217/226/4 223/220/4 219/227/4 +f 222/228/5 220/229/5 224/230/5 +f 226/231/1 227/232/1 225/233/1 +f 228/234/2 231/235/2 227/236/2 +f 230/237/3 225/238/3 229/239/3 +f 231/235/4 225/240/4 227/241/4 +f 228/242/5 230/243/5 232/244/5 +f 2/1/1 4/245/1 3/2/1 +f 4/4/2 8/246/2 7/5/2 +f 6/7/3 2/1/3 1/3/3 +f 7/9/4 5/247/4 1/3/4 +f 4/10/5 2/248/5 6/11/5 +f 11/13/6 12/249/6 10/14/6 +f 15/16/2 16/250/2 12/17/2 +f 9/15/3 10/14/3 14/19/3 +f 9/15/4 13/251/4 15/21/4 +f 14/22/5 10/252/5 12/23/5 +f 18/25/1 20/253/1 19/26/1 +f 20/28/2 24/254/2 23/29/2 +f 24/31/6 22/38/6 21/32/6 +f 23/34/4 21/255/4 17/35/4 +f 20/37/5 18/256/5 22/38/5 +f 22/38/3 18/257/3 17/39/3 +f 32/40/5 28/258/5 26/41/5 +f 26/43/2 25/259/2 29/44/2 +f 30/42/1 29/260/1 31/46/1 +f 27/48/4 31/261/4 29/49/4 +f 28/51/6 27/262/6 25/52/6 +f 34/54/1 36/57/1 35/55/1 +f 36/57/3 40/263/3 39/58/3 +f 40/59/6 38/264/6 37/60/6 +f 39/58/5 37/265/5 33/62/5 +f 36/63/4 34/266/4 38/64/4 +f 43/66/6 44/267/6 42/67/6 +f 47/69/2 48/268/2 44/70/2 +f 45/72/1 46/78/1 48/73/1 +f 41/75/4 45/269/4 47/76/4 +f 46/78/5 42/270/5 44/79/5 +f 41/80/3 42/271/3 46/78/3 +f 50/81/5 52/272/5 56/82/5 +f 53/84/2 49/273/2 50/85/2 +f 55/87/6 53/274/6 54/83/6 +f 53/89/4 55/275/4 51/90/4 +f 49/92/1 51/276/1 52/93/1 +f 59/95/6 60/99/6 58/96/6 +f 63/98/3 64/277/3 60/99/3 +f 61/100/1 62/278/1 64/101/1 +f 57/103/5 61/279/5 63/98/5 +f 62/104/4 58/280/4 60/105/4 +f 67/107/1 68/281/1 66/108/1 +f 71/110/3 72/282/3 68/111/3 +f 69/113/6 70/119/6 72/114/6 +f 65/116/4 69/283/4 71/117/4 +f 70/119/5 66/284/5 68/120/5 +f 65/121/2 66/285/2 70/119/2 +f 74/122/5 76/286/5 80/123/5 +f 77/125/3 73/287/3 74/126/3 +f 79/128/1 77/288/1 78/124/1 +f 77/130/4 79/289/4 75/131/4 +f 73/133/6 75/290/6 76/134/6 +f 83/136/1 84/140/1 82/137/1 +f 87/139/2 88/291/2 84/140/2 +f 87/141/6 85/292/6 86/142/6 +f 81/144/5 85/293/5 87/139/5 +f 86/145/4 82/294/4 84/146/4 +f 90/148/6 92/295/6 91/149/6 +f 92/151/3 96/296/3 95/152/3 +f 96/154/1 94/161/1 93/155/1 +f 95/157/4 93/297/4 89/158/4 +f 92/160/5 90/298/5 94/161/5 +f 94/161/2 90/299/2 89/162/2 +f 104/163/5 100/300/5 98/164/5 +f 98/166/3 97/301/3 101/167/3 +f 102/165/6 101/302/6 103/169/6 +f 99/171/4 103/303/4 101/172/4 +f 100/174/1 99/304/1 97/175/1 +f 106/177/6 108/180/6 107/178/6 +f 108/180/2 112/305/2 111/181/2 +f 111/182/1 112/306/1 110/183/1 +f 111/181/5 109/307/5 105/185/5 +f 108/186/4 106/308/4 110/187/4 +f 202/189/6 204/309/6 203/190/6 +f 204/192/3 208/310/3 207/193/3 +f 206/195/2 202/311/2 201/196/2 +f 207/193/4 205/312/4 201/198/4 +f 204/200/5 202/313/5 206/201/5 +f 211/203/1 212/314/1 210/204/1 +f 215/206/3 216/315/3 212/207/3 +f 209/209/2 210/316/2 214/210/2 +f 209/212/4 213/317/4 215/206/4 +f 214/214/5 210/318/5 212/215/5 +f 219/217/6 220/319/6 218/218/6 +f 223/220/2 224/320/2 220/221/2 +f 217/223/3 218/321/3 222/224/3 +f 217/226/4 221/322/4 223/220/4 +f 222/228/5 218/323/5 220/229/5 +f 226/231/1 228/324/1 227/232/1 +f 228/234/2 232/325/2 231/235/2 +f 230/237/3 226/326/3 225/238/3 +f 231/235/4 229/327/4 225/240/4 +f 228/242/5 226/328/5 230/243/5 +usemtl wheel_Large +f 178/329/1 179/330/1 177/331/1 +f 180/332/2 183/333/2 179/334/2 +f 184/335/6 181/336/6 183/337/6 +f 182/338/3 177/339/3 181/340/3 +f 180/341/5 182/338/5 184/342/5 +f 195/343/1 194/344/1 193/345/1 +f 199/346/3 196/347/3 195/348/3 +f 197/349/6 200/350/6 199/351/6 +f 193/352/2 198/353/2 197/354/2 +f 198/353/5 196/355/5 200/356/5 +f 296/357/4 292/358/4 291/359/4 +f 299/360/3 292/358/3 289/361/3 +f 299/362/5 290/363/5 300/364/5 +f 300/365/2 293/366/2 296/367/2 +f 297/368/7 296/357/7 291/359/7 +f 300/369/2 298/370/2 295/371/2 +f 299/372/3 297/368/3 291/359/3 +f 300/373/8 294/374/8 299/375/8 +f 292/358/4 304/376/4 301/377/4 +f 292/358/3 307/378/3 289/361/3 +f 290/363/5 307/379/5 308/380/5 +f 293/366/2 308/381/2 304/382/2 +f 304/376/9 305/383/9 301/377/9 +f 306/384/2 308/385/2 303/386/2 +f 305/383/3 307/387/3 301/377/3 +f 302/388/10 308/389/10 307/390/10 +f 312/391/4 316/392/4 311/393/4 +f 312/391/2 319/394/2 309/395/2 +f 310/396/5 319/397/5 320/398/5 +f 313/399/3 320/400/3 316/401/3 +f 316/392/7 317/402/7 311/393/7 +f 318/403/3 320/404/3 315/405/3 +f 317/402/2 319/406/2 311/393/2 +f 314/407/8 320/408/8 319/409/8 +f 324/410/4 312/391/4 321/411/4 +f 327/412/2 312/391/2 309/395/2 +f 327/413/5 310/396/5 328/414/5 +f 328/415/3 313/399/3 324/416/3 +f 325/417/9 324/410/9 321/411/9 +f 328/418/3 326/419/3 323/420/3 +f 327/421/2 325/417/2 321/411/2 +f 328/422/10 322/423/10 327/424/10 +f 178/329/1 180/425/1 179/330/1 +f 180/332/2 184/426/2 183/333/2 +f 184/335/6 182/427/6 181/336/6 +f 182/338/3 178/428/3 177/339/3 +f 180/341/5 178/429/5 182/338/5 +f 195/343/1 196/430/1 194/344/1 +f 199/346/3 200/431/3 196/347/3 +f 197/349/6 198/432/6 200/350/6 +f 193/352/2 194/433/2 198/353/2 +f 198/353/5 194/434/5 196/355/5 +f 296/357/4 293/435/4 292/358/4 +f 299/360/3 291/359/3 292/358/3 +f 299/362/5 289/436/5 290/363/5 +f 300/365/2 290/437/2 293/366/2 +f 297/368/7 298/438/7 296/357/7 +f 300/369/2 296/367/2 298/370/2 +f 299/372/3 294/439/3 297/368/3 +f 300/373/8 295/440/8 294/374/8 +f 292/358/4 293/435/4 304/376/4 +f 292/358/3 301/377/3 307/378/3 +f 290/363/5 289/436/5 307/379/5 +f 293/366/2 290/437/2 308/381/2 +f 304/376/9 306/441/9 305/383/9 +f 306/384/2 304/382/2 308/385/2 +f 305/383/3 302/442/3 307/387/3 +f 302/388/10 303/443/10 308/389/10 +f 312/391/4 313/444/4 316/392/4 +f 312/391/2 311/393/2 319/394/2 +f 310/396/5 309/445/5 319/397/5 +f 313/399/3 310/446/3 320/400/3 +f 316/392/7 318/447/7 317/402/7 +f 318/403/3 316/401/3 320/404/3 +f 317/402/2 314/448/2 319/406/2 +f 314/407/8 315/449/8 320/408/8 +f 324/410/4 313/444/4 312/391/4 +f 327/412/2 321/411/2 312/391/2 +f 327/413/5 309/445/5 310/396/5 +f 328/415/3 310/446/3 313/399/3 +f 325/417/9 326/450/9 324/410/9 +f 328/418/3 324/416/3 326/419/3 +f 327/421/2 322/451/2 325/417/2 +f 328/422/10 323/452/10 322/423/10 +usemtl Bogey_Body +f 114/453/1 115/454/1 113/455/1 +f 116/456/2 119/457/2 115/458/2 +f 120/459/6 117/460/6 119/461/6 +f 118/462/3 113/463/3 117/464/3 +f 119/465/4 113/466/4 115/467/4 +f 116/468/5 118/469/5 120/459/5 +f 122/470/1 123/471/1 121/472/1 +f 124/473/2 127/474/2 123/475/2 +f 128/476/6 125/477/6 127/478/6 +f 126/479/3 121/480/3 125/481/3 +f 127/482/4 121/483/4 123/484/4 +f 124/485/5 126/486/5 128/487/5 +f 130/488/1 131/489/1 129/490/1 +f 132/491/2 135/492/2 131/493/2 +f 136/494/6 133/495/6 135/496/6 +f 134/497/3 129/498/3 133/499/3 +f 132/500/5 134/501/5 136/502/5 +f 142/503/2 140/504/2 138/505/2 +f 143/506/9 139/507/9 140/504/9 +f 139/508/3 141/509/3 137/510/3 +f 148/511/2 150/512/2 146/513/2 +f 147/514/7 151/515/7 148/511/7 +f 145/516/3 152/517/3 147/518/3 +f 156/519/3 158/520/3 154/521/3 +f 155/522/9 159/523/9 156/519/9 +f 153/524/2 160/525/2 155/526/2 +f 166/527/3 164/528/3 162/529/3 +f 167/530/7 163/531/7 164/528/7 +f 168/532/2 161/533/2 163/534/2 +f 170/535/6 171/536/6 169/537/6 +f 172/538/3 175/539/3 171/540/3 +f 176/541/1 173/542/1 175/543/1 +f 174/544/2 169/545/2 173/546/2 +f 175/547/4 169/548/4 171/549/4 +f 172/550/5 174/551/5 176/552/5 +f 187/553/6 186/554/6 185/555/6 +f 191/556/2 188/557/2 187/558/2 +f 189/559/1 192/560/1 191/561/1 +f 185/562/3 190/563/3 189/564/3 +f 185/565/4 191/566/4 187/567/4 +f 190/568/5 188/569/5 192/570/5 +f 208/571/1 205/572/1 207/573/1 +f 213/574/6 216/575/6 215/576/6 +f 221/577/1 224/578/1 223/579/1 +f 232/580/6 229/581/6 231/582/6 +f 114/453/1 116/583/1 115/454/1 +f 116/456/2 120/584/2 119/457/2 +f 120/459/6 118/469/6 117/460/6 +f 118/462/3 114/585/3 113/463/3 +f 119/465/4 117/586/4 113/466/4 +f 116/468/5 114/587/5 118/469/5 +f 122/470/1 124/588/1 123/471/1 +f 124/473/2 128/589/2 127/474/2 +f 128/476/6 126/590/6 125/477/6 +f 126/479/3 122/591/3 121/480/3 +f 127/482/4 125/592/4 121/483/4 +f 124/485/5 122/593/5 126/486/5 +f 130/488/1 132/594/1 131/489/1 +f 132/491/2 136/595/2 135/492/2 +f 136/494/6 134/596/6 133/495/6 +f 134/497/3 130/597/3 129/498/3 +f 132/500/5 130/598/5 134/501/5 +f 142/503/2 143/506/2 140/504/2 +f 143/506/9 144/599/9 139/507/9 +f 139/508/3 144/600/3 141/509/3 +f 148/511/2 151/515/2 150/512/2 +f 147/514/7 152/601/7 151/515/7 +f 145/516/3 149/602/3 152/517/3 +f 156/519/3 159/523/3 158/520/3 +f 155/522/9 160/603/9 159/523/9 +f 153/524/2 157/604/2 160/525/2 +f 166/527/3 167/530/3 164/528/3 +f 167/530/7 168/605/7 163/531/7 +f 168/532/2 165/606/2 161/533/2 +f 170/535/6 172/607/6 171/536/6 +f 172/538/3 176/552/3 175/539/3 +f 176/541/1 174/544/1 173/542/1 +f 174/544/2 170/608/2 169/545/2 +f 175/547/4 173/609/4 169/548/4 +f 172/550/5 170/610/5 174/551/5 +f 187/553/6 188/611/6 186/554/6 +f 191/556/2 192/570/2 188/557/2 +f 189/559/1 190/563/1 192/560/1 +f 185/562/3 186/612/3 190/563/3 +f 185/565/4 189/613/4 191/566/4 +f 190/568/5 186/614/5 188/569/5 +f 208/571/1 206/615/1 205/572/1 +f 213/574/6 214/616/6 216/575/6 +f 221/577/1 222/617/1 224/578/1 +f 232/580/6 230/618/6 229/581/6 +usemtl Belts +f 235/619/11 234/620/11 233/621/11 +f 238/622/11 239/623/11 237/624/11 +f 242/625/12 243/626/12 241/627/12 +f 247/628/12 246/629/12 245/630/12 +f 254/631/5 251/632/5 253/633/5 +f 250/634/5 253/635/5 249/636/5 +f 257/637/5 260/638/5 259/639/5 +f 259/640/5 256/641/5 255/642/5 +f 262/643/13 263/644/13 261/645/13 +f 267/646/13 266/647/13 265/648/13 +f 271/649/14 270/650/14 269/651/14 +f 274/652/14 275/653/14 273/654/14 +f 279/655/4 282/656/4 281/657/4 +f 281/658/4 278/659/4 277/660/4 +f 288/661/4 285/662/4 287/663/4 +f 284/664/4 287/665/4 283/666/4 +f 234/620/15 261/645/15 233/621/15 +f 235/619/16 264/667/16 236/668/16 +f 234/620/6 264/667/6 262/643/6 +f 233/621/1 263/644/1 235/619/1 +f 237/624/15 266/647/15 238/622/15 +f 240/669/16 267/646/16 239/623/16 +f 238/622/1 268/670/1 240/669/1 +f 237/624/6 267/646/6 265/648/6 +f 241/627/17 270/650/17 242/625/17 +f 244/671/18 271/649/18 243/626/18 +f 242/625/6 272/672/6 244/671/6 +f 241/627/1 271/649/1 269/651/1 +f 246/629/17 273/654/17 245/630/17 +f 247/628/18 276/673/18 248/674/18 +f 246/629/1 276/673/1 274/652/1 +f 245/630/6 275/653/6 247/628/6 +f 253/635/1 277/660/1 249/636/1 +f 249/636/3 278/659/3 250/634/3 +f 254/631/6 280/675/6 252/676/6 +f 252/676/2 279/655/2 251/632/2 +f 251/632/1 281/657/1 253/633/1 +f 250/634/6 282/677/6 254/678/6 +f 255/642/6 287/665/6 259/640/6 +f 256/641/3 283/666/3 255/642/3 +f 258/679/1 288/661/1 260/638/1 +f 257/637/2 286/680/2 258/679/2 +f 259/639/6 285/662/6 257/637/6 +f 260/638/1 284/664/1 256/641/1 +f 235/619/11 236/668/11 234/620/11 +f 238/622/11 240/669/11 239/623/11 +f 242/625/12 244/671/12 243/626/12 +f 247/628/12 248/674/12 246/629/12 +f 254/631/5 252/676/5 251/632/5 +f 250/634/5 254/678/5 253/635/5 +f 257/637/5 258/679/5 260/638/5 +f 259/640/5 260/638/5 256/641/5 +f 262/643/13 264/667/13 263/644/13 +f 267/646/13 268/670/13 266/647/13 +f 271/649/14 272/672/14 270/650/14 +f 274/652/14 276/673/14 275/653/14 +f 279/655/4 280/675/4 282/656/4 +f 281/658/4 282/677/4 278/659/4 +f 288/661/4 286/680/4 285/662/4 +f 284/664/4 288/661/4 287/665/4 +f 234/620/15 262/643/15 261/645/15 +f 235/619/16 263/644/16 264/667/16 +f 234/620/6 236/668/6 264/667/6 +f 233/621/1 261/645/1 263/644/1 +f 237/624/15 265/648/15 266/647/15 +f 240/669/16 268/670/16 267/646/16 +f 238/622/1 266/647/1 268/670/1 +f 237/624/6 239/623/6 267/646/6 +f 241/627/17 269/651/17 270/650/17 +f 244/671/18 272/672/18 271/649/18 +f 242/625/6 270/650/6 272/672/6 +f 241/627/1 243/626/1 271/649/1 +f 246/629/17 274/652/17 273/654/17 +f 247/628/18 275/653/18 276/673/18 +f 246/629/1 248/674/1 276/673/1 +f 245/630/6 273/654/6 275/653/6 +f 253/635/1 281/658/1 277/660/1 +f 249/636/3 277/660/3 278/659/3 +f 254/631/6 282/656/6 280/675/6 +f 252/676/2 280/675/2 279/655/2 +f 251/632/1 279/655/1 281/657/1 +f 250/634/6 278/659/6 282/677/6 +f 255/642/6 283/666/6 287/665/6 +f 256/641/3 284/664/3 283/666/3 +f 258/679/1 286/680/1 288/661/1 +f 257/637/2 285/662/2 286/680/2 +f 259/639/6 287/663/6 285/662/6 +f 260/638/1 288/661/1 284/664/1 diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_piston.json b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_piston.json new file mode 100644 index 000000000..7ac2000a1 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_piston.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/track/bogey/textures", + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/bogey/bogey_drive_piston.obj" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_piston.mtl b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_piston.mtl new file mode 100644 index 000000000..51555a734 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_piston.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'Bogey.blend' +# Material Count: 1 + +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 #piston diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_piston.obj b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_piston.obj new file mode 100644 index 000000000..23d4cf34a --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_piston.obj @@ -0,0 +1,576 @@ +# Blender v3.0.1 OBJ File: 'Bogey.blend' +# www.blender.org +mtllib bogey_drive_piston.mtl +o Cube.039_Cube.046 +v 1.062500 1.062500 0.250000 +v 1.062500 1.187500 0.250000 +v 1.187500 1.062500 0.250000 +v 1.187500 1.187500 0.250000 +v 1.062500 1.062500 1.000000 +v 1.062500 1.187500 1.000000 +v 1.187500 1.187500 1.000000 +v 1.187500 1.062500 1.000000 +v 1.062500 1.062500 -0.250000 +v 1.062500 1.187500 -0.250000 +v 1.187500 1.062500 -0.250000 +v 1.187500 1.187500 -0.250000 +v 1.062500 1.062500 -1.000000 +v 1.062500 1.187500 -1.000000 +v 1.187500 1.187500 -1.000000 +v 1.187500 1.062500 -1.000000 +v 1.062500 0.812500 0.250000 +v 1.062500 0.937500 0.250000 +v 1.187500 0.812500 0.250000 +v 1.187500 0.937500 0.250000 +v 1.062500 0.812500 1.000000 +v 1.062500 0.937500 1.000000 +v 1.187500 0.937500 1.000000 +v 1.187500 0.812500 1.000000 +v 1.062500 0.812500 -0.250000 +v 1.062500 0.937500 -0.250000 +v 1.187500 0.812500 -0.250000 +v 1.187500 0.937500 -0.250000 +v 1.062500 0.812500 -1.000000 +v 1.062500 0.937500 -1.000000 +v 1.187500 0.937500 -1.000000 +v 1.187500 0.812500 -1.000000 +v -1.062500 1.062500 0.250000 +v -1.062500 1.187500 0.250000 +v -1.187500 1.062500 0.250000 +v -1.187500 1.187500 0.250000 +v -1.062500 1.062500 1.000000 +v -1.062500 1.187500 1.000000 +v -1.187500 1.187500 1.000000 +v -1.187500 1.062500 1.000000 +v -1.062500 1.062500 -0.250000 +v -1.062500 1.187500 -0.250000 +v -1.187500 1.062500 -0.250000 +v -1.187500 1.187500 -0.250000 +v -1.062500 1.062500 -1.000000 +v -1.062500 1.187500 -1.000000 +v -1.187500 1.187500 -1.000000 +v -1.187500 1.062500 -1.000000 +v -1.062500 0.812500 0.250000 +v -1.062500 0.937500 0.250000 +v -1.187500 0.812500 0.250000 +v -1.187500 0.937500 0.250000 +v -1.062500 0.812500 1.000000 +v -1.062500 0.937500 1.000000 +v -1.187500 0.937500 1.000000 +v -1.187500 0.812500 1.000000 +v -1.062500 0.812500 -0.250000 +v -1.062500 0.937500 -0.250000 +v -1.187500 0.812500 -0.250000 +v -1.187500 0.937500 -0.250000 +v -1.062500 0.812500 -1.000000 +v -1.062500 0.937500 -1.000000 +v -1.187500 0.937500 -1.000000 +v -1.187500 0.812500 -1.000000 +v 1.062500 0.687500 0.062500 +v 1.062500 1.312500 0.062500 +v 1.062500 0.687500 -0.062500 +v 1.062500 1.312500 -0.062500 +v 1.187500 0.687500 0.062500 +v 1.187500 1.312500 0.062500 +v 1.187500 0.687500 -0.062500 +v 1.187500 1.312500 -0.062500 +v 1.062500 0.562500 -0.187500 +v 1.062500 0.562500 0.187500 +v 1.062500 1.437500 0.187500 +v 1.062500 1.437500 -0.187500 +v 1.187500 1.437500 -0.187500 +v 1.187500 0.562500 -0.187500 +v 1.187500 0.562500 0.187500 +v 1.187500 1.437500 0.187500 +v 1.062500 0.750000 0.250000 +v 1.062500 1.250000 0.250000 +v 1.062500 0.750000 0.125000 +v 1.062500 1.250000 0.125000 +v 1.250000 0.750000 0.250000 +v 1.250000 1.250000 0.250000 +v 1.250000 0.750000 0.125000 +v 1.250000 1.250000 0.125000 +v 1.062500 0.750000 -0.125000 +v 1.062500 1.250000 -0.125000 +v 1.062500 0.750000 -0.250000 +v 1.062500 1.250000 -0.250000 +v 1.250000 0.750000 -0.125000 +v 1.250000 1.250000 -0.125000 +v 1.250000 0.750000 -0.250000 +v 1.250000 1.250000 -0.250000 +v -1.062500 0.687500 0.062500 +v -1.062500 1.312500 0.062500 +v -1.062500 0.687500 -0.062500 +v -1.062500 1.312500 -0.062500 +v -1.187500 0.687500 0.062500 +v -1.187500 1.312500 0.062500 +v -1.187500 0.687500 -0.062500 +v -1.187500 1.312500 -0.062500 +v -1.062500 0.562500 -0.187500 +v -1.062500 0.562500 0.187500 +v -1.062500 1.437500 0.187500 +v -1.062500 1.437500 -0.187500 +v -1.187500 1.437500 -0.187500 +v -1.187500 0.562500 -0.187500 +v -1.187500 0.562500 0.187500 +v -1.187500 1.437500 0.187500 +v -1.062500 0.750000 0.250000 +v -1.062500 1.250000 0.250000 +v -1.062500 0.750000 0.125000 +v -1.062500 1.250000 0.125000 +v -1.250000 0.750000 0.250000 +v -1.250000 1.250000 0.250000 +v -1.250000 0.750000 0.125000 +v -1.250000 1.250000 0.125000 +v -1.062500 0.750000 -0.125000 +v -1.062500 1.250000 -0.125000 +v -1.062500 0.750000 -0.250000 +v -1.062500 1.250000 -0.250000 +v -1.250000 0.750000 -0.125000 +v -1.250000 1.250000 -0.125000 +v -1.250000 0.750000 -0.250000 +v -1.250000 1.250000 -0.250000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.906250 0.375000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 1.000000 0.375000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.906250 0.375000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 1.000000 0.375000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 0.906250 0.375000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 1.000000 0.375000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.906250 0.375000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 1.000000 0.375000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.250000 0.500000 +vt 0.187500 0.937500 +vt 0.250000 0.937500 +vt 0.062500 0.750000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.187500 0.500000 +vt 0.250000 0.937500 +vt 0.187500 0.937500 +vt 0.062500 0.687500 +vt 0.125000 0.875000 +vt 0.125000 0.687500 +vt 0.125000 0.687500 +vt 0.062500 0.875000 +vt 0.062500 0.687500 +vt 0.125000 0.562500 +vt 0.187500 0.937500 +vt 0.125000 0.875000 +vt 0.062500 0.562500 +vt 0.187500 0.500000 +vt 0.000000 0.937500 +vt 0.062500 0.875000 +vt 0.000000 0.500000 +vt 0.250000 0.562500 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.062500 0.812500 +vt 0.125000 0.750000 +vt 0.125000 0.812500 +vt 0.250000 0.562500 +vt 0.187500 0.875000 +vt 0.187500 0.562500 +vt 0.250000 0.937500 +vt 0.343750 0.687500 +vt 0.250000 0.687500 +vt 0.343750 0.937500 +vt 0.093750 1.000000 +vt 0.093750 0.937500 +vt 0.343750 0.937500 +vt 0.250000 0.687500 +vt 0.343750 0.687500 +vt 0.125000 0.562500 +vt 0.062500 0.656250 +vt 0.125000 0.656250 +vt 0.125000 0.656250 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.250000 0.937500 +vt 0.343750 0.687500 +vt 0.250000 0.687500 +vt 0.343750 1.000000 +vt 0.093750 0.937500 +vt 0.093750 1.000000 +vt 0.343750 0.937500 +vt 0.250000 0.687500 +vt 0.343750 0.687500 +vt 0.062500 0.562500 +vt 0.125000 0.656250 +vt 0.062500 0.656250 +vt 0.062500 0.656250 +vt 0.125000 0.562500 +vt 0.062500 0.562500 +vt 0.187500 0.937500 +vt 0.250000 0.500000 +vt 0.250000 0.937500 +vt 0.125000 0.812500 +vt 0.062500 0.750000 +vt 0.062500 0.812500 +vt 0.250000 0.937500 +vt 0.187500 0.500000 +vt 0.187500 0.937500 +vt 0.125000 0.875000 +vt 0.062500 0.687500 +vt 0.125000 0.687500 +vt 0.062500 0.875000 +vt 0.125000 0.687500 +vt 0.062500 0.687500 +vt 0.187500 0.937500 +vt 0.125000 0.562500 +vt 0.125000 0.875000 +vt 0.187500 0.500000 +vt 0.062500 0.562500 +vt 0.000000 0.937500 +vt 0.062500 0.875000 +vt 0.187500 0.875000 +vt 0.250000 0.562500 +vt 0.250000 0.875000 +vt 0.125000 0.750000 +vt 0.062500 0.812500 +vt 0.125000 0.812500 +vt 0.187500 0.875000 +vt 0.250000 0.562500 +vt 0.187500 0.562500 +vt 0.343750 0.687500 +vt 0.250000 0.937500 +vt 0.250000 0.687500 +vt 0.093750 1.000000 +vt 0.343750 0.937500 +vt 0.093750 0.937500 +vt 0.250000 0.687500 +vt 0.343750 0.937500 +vt 0.343750 0.687500 +vt 0.062500 0.656250 +vt 0.125000 0.562500 +vt 0.125000 0.656250 +vt 0.062500 0.562500 +vt 0.125000 0.656250 +vt 0.125000 0.562500 +vt 0.343750 0.687500 +vt 0.250000 0.937500 +vt 0.250000 0.687500 +vt 0.093750 0.937500 +vt 0.343750 1.000000 +vt 0.093750 1.000000 +vt 0.250000 0.687500 +vt 0.343750 0.937500 +vt 0.343750 0.687500 +vt 0.125000 0.656250 +vt 0.062500 0.562500 +vt 0.062500 0.656250 +vt 0.125000 0.562500 +vt 0.062500 0.656250 +vt 0.062500 0.562500 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 0.187500 0.500000 +vt 0.125000 0.750000 +vt 0.250000 0.500000 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.187500 0.562500 +vt 0.062500 0.750000 +vt 0.250000 0.875000 +vt 0.343750 1.000000 +vt 0.250000 0.937500 +vt 0.062500 0.562500 +vt 0.062500 0.656250 +vt 0.343750 0.937500 +vt 0.250000 0.937500 +vt 0.125000 0.562500 +vt 0.125000 0.656250 +vt 0.187500 0.500000 +vt 0.125000 0.750000 +vt 0.250000 0.500000 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.000000 0.500000 +vt 0.187500 0.562500 +vt 0.062500 0.750000 +vt 0.250000 0.875000 +vt 0.343750 1.000000 +vt 0.250000 0.937500 +vt 0.062500 0.562500 +vt 0.062500 0.656250 +vt 0.343750 0.937500 +vt 0.250000 0.937500 +vt 0.125000 0.562500 +vt 0.125000 0.656250 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +usemtl Bogey_Piston +s off +f 8/1/1 1/2/1 3/3/1 +f 6/4/2 4/5/2 2/6/2 +f 7/7/3 3/8/3 4/9/3 +f 5/10/4 2/11/4 1/12/4 +f 9/13/1 16/14/1 11/15/1 +f 12/16/2 14/17/2 10/18/2 +f 11/19/3 15/20/3 12/21/3 +f 10/22/4 13/23/4 9/24/4 +f 24/25/1 17/26/1 19/27/1 +f 22/28/2 20/29/2 18/30/2 +f 23/31/3 19/32/3 20/33/3 +f 21/34/4 18/35/4 17/36/4 +f 25/37/1 32/38/1 27/39/1 +f 28/40/2 30/41/2 26/42/2 +f 27/43/3 31/44/3 28/45/3 +f 26/46/4 29/47/4 25/48/4 +f 33/49/1 40/50/1 35/51/1 +f 36/52/2 38/53/2 34/54/2 +f 35/55/4 39/56/4 36/57/4 +f 34/58/3 37/59/3 33/60/3 +f 48/61/1 41/62/1 43/63/1 +f 46/64/2 44/65/2 42/66/2 +f 47/67/4 43/68/4 44/69/4 +f 45/70/3 42/71/3 41/72/3 +f 49/73/1 56/74/1 51/75/1 +f 52/76/2 54/77/2 50/78/2 +f 51/79/4 55/80/4 52/81/4 +f 50/82/3 53/83/3 49/84/3 +f 64/85/1 57/86/1 59/87/1 +f 62/88/2 60/89/2 58/90/2 +f 63/91/4 59/92/4 60/93/4 +f 61/94/3 58/95/3 57/96/3 +f 76/97/5 78/98/5 73/99/5 +f 65/100/2 71/101/2 67/102/2 +f 80/103/6 74/104/6 79/105/6 +f 78/106/1 74/107/1 73/108/1 +f 76/109/2 80/110/2 77/111/2 +f 71/112/3 77/113/3 72/114/3 +f 69/115/3 78/116/3 71/112/3 +f 72/114/3 80/117/3 70/118/3 +f 69/115/3 80/117/3 79/119/3 +f 69/120/5 66/121/5 70/122/5 +f 70/123/1 68/124/1 72/125/1 +f 71/126/6 68/127/6 67/128/6 +f 84/129/5 87/130/5 83/131/5 +f 88/132/3 85/133/3 87/134/3 +f 86/135/6 81/136/6 85/137/6 +f 87/138/1 81/139/1 83/140/1 +f 84/141/2 86/142/2 88/143/2 +f 92/144/5 95/145/5 91/146/5 +f 96/147/3 93/148/3 95/149/3 +f 94/150/6 89/151/6 93/152/6 +f 95/153/1 89/154/1 91/155/1 +f 92/156/2 94/157/2 96/158/2 +f 110/159/5 108/160/5 105/161/5 +f 103/162/2 97/163/2 99/164/2 +f 106/165/6 112/166/6 111/167/6 +f 106/168/1 110/169/1 105/170/1 +f 112/171/2 108/172/2 109/173/2 +f 109/174/4 103/175/4 104/176/4 +f 110/177/4 101/178/4 103/175/4 +f 112/179/4 104/176/4 102/180/4 +f 101/178/4 112/179/4 102/180/4 +f 98/181/5 101/182/5 102/183/5 +f 100/184/1 102/185/1 104/186/1 +f 100/187/6 103/188/6 99/189/6 +f 119/190/5 116/191/5 115/192/5 +f 117/193/4 120/194/4 119/195/4 +f 113/196/6 118/197/6 117/198/6 +f 113/199/1 119/200/1 115/201/1 +f 118/202/2 116/203/2 120/204/2 +f 127/205/5 124/206/5 123/207/5 +f 125/208/4 128/209/4 127/210/4 +f 121/211/6 126/212/6 125/213/6 +f 121/214/1 127/215/1 123/216/1 +f 126/217/2 124/218/2 128/219/2 +f 8/1/1 5/220/1 1/2/1 +f 6/4/2 7/221/2 4/5/2 +f 7/7/3 8/222/3 3/8/3 +f 5/10/4 6/223/4 2/11/4 +f 9/13/1 13/224/1 16/14/1 +f 12/16/2 15/225/2 14/17/2 +f 11/19/3 16/226/3 15/20/3 +f 10/22/4 14/227/4 13/23/4 +f 24/25/1 21/228/1 17/26/1 +f 22/28/2 23/229/2 20/29/2 +f 23/31/3 24/230/3 19/32/3 +f 21/34/4 22/231/4 18/35/4 +f 25/37/1 29/232/1 32/38/1 +f 28/40/2 31/233/2 30/41/2 +f 27/43/3 32/234/3 31/44/3 +f 26/46/4 30/235/4 29/47/4 +f 33/49/1 37/236/1 40/50/1 +f 36/52/2 39/237/2 38/53/2 +f 35/55/4 40/238/4 39/56/4 +f 34/58/3 38/239/3 37/59/3 +f 48/61/1 45/240/1 41/62/1 +f 46/64/2 47/241/2 44/65/2 +f 47/67/4 48/242/4 43/68/4 +f 45/70/3 46/243/3 42/71/3 +f 49/73/1 53/244/1 56/74/1 +f 52/76/2 55/245/2 54/77/2 +f 51/79/4 56/246/4 55/80/4 +f 50/82/3 54/247/3 53/83/3 +f 64/85/1 61/248/1 57/86/1 +f 62/88/2 63/249/2 60/89/2 +f 63/91/4 64/250/4 59/92/4 +f 61/94/3 62/251/3 58/95/3 +f 76/97/5 77/252/5 78/98/5 +f 65/100/2 69/253/2 71/101/2 +f 80/103/6 75/254/6 74/104/6 +f 78/106/1 79/255/1 74/107/1 +f 76/109/2 75/256/2 80/110/2 +f 71/112/3 78/116/3 77/113/3 +f 69/115/3 79/119/3 78/116/3 +f 72/114/3 77/113/3 80/117/3 +f 69/115/3 70/118/3 80/117/3 +f 69/120/5 65/257/5 66/121/5 +f 70/123/1 66/258/1 68/124/1 +f 71/126/6 72/259/6 68/127/6 +f 84/129/5 88/132/5 87/130/5 +f 88/132/3 86/260/3 85/133/3 +f 86/135/6 82/261/6 81/136/6 +f 87/138/1 85/262/1 81/139/1 +f 84/141/2 82/263/2 86/142/2 +f 92/144/5 96/264/5 95/145/5 +f 96/147/3 94/150/3 93/148/3 +f 94/150/6 90/265/6 89/151/6 +f 95/153/1 93/266/1 89/154/1 +f 92/156/2 90/267/2 94/157/2 +f 110/159/5 109/268/5 108/160/5 +f 103/162/2 101/269/2 97/163/2 +f 106/165/6 107/270/6 112/166/6 +f 106/168/1 111/271/1 110/169/1 +f 112/171/2 107/272/2 108/172/2 +f 109/174/4 110/177/4 103/175/4 +f 110/177/4 111/273/4 101/178/4 +f 112/179/4 109/174/4 104/176/4 +f 101/178/4 111/273/4 112/179/4 +f 98/181/5 97/274/5 101/182/5 +f 100/184/1 98/275/1 102/185/1 +f 100/187/6 104/276/6 103/188/6 +f 119/190/5 120/194/5 116/191/5 +f 117/193/4 118/277/4 120/194/4 +f 113/196/6 114/278/6 118/197/6 +f 113/199/1 117/279/1 119/200/1 +f 118/202/2 114/280/2 116/203/2 +f 127/205/5 128/281/5 124/206/5 +f 125/208/4 126/212/4 128/209/4 +f 121/211/6 122/282/6 126/212/6 +f 121/214/1 125/283/1 127/215/1 +f 126/217/2 122/284/2 124/218/2 diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel.json b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel.json new file mode 100644 index 000000000..203caf372 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/track/bogey/textures", + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/bogey/bogey_drive_wheel.obj" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel.mtl b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel.mtl new file mode 100644 index 000000000..5d47d85cd --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'Bogey.blend' +# Material Count: 1 + +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 #wheel diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel.obj b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel.obj new file mode 100644 index 000000000..d7b7d3114 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel.obj @@ -0,0 +1,1032 @@ +# Blender v3.0.1 OBJ File: 'Bogey.blend' +# www.blender.org +mtllib bogey_drive_wheel.mtl +o Cube.038_Cube.045 +v 1.062500 0.562500 0.000000 +v 0.750000 0.310660 0.750000 +v 0.750000 0.750000 0.000000 +v 0.875000 0.310660 0.750000 +v 0.875000 0.750000 0.310660 +v 0.875000 0.625000 0.258884 +v 0.750000 0.530330 0.530330 +v 0.875000 0.750000 0.000000 +v 1.062500 0.397747 0.397748 +v 0.875000 0.625000 0.000000 +v 0.750000 0.750000 -0.310660 +v 1.062500 0.232995 0.562500 +v 0.875000 0.530330 0.530330 +v 0.875000 0.441942 0.441942 +v 0.750000 0.750000 0.310660 +v 1.062500 0.562500 0.232995 +v 0.875000 -0.310660 0.750000 +v 0.750000 -0.000000 0.750000 +v 1.062500 -0.000000 0.562500 +v 0.875000 -0.258884 0.625000 +v 1.062500 -0.232995 0.562500 +v 0.875000 -0.000000 0.750000 +v 0.875000 -0.000000 0.625000 +v 0.875000 0.258883 0.625000 +v 0.750000 -0.530330 0.530330 +v 1.062500 -0.397748 0.397748 +v 0.875000 -0.530330 0.530330 +v 0.875000 -0.441942 0.441942 +v 0.750000 -0.310660 0.750000 +v 0.750000 -0.750000 0.000000 +v 1.062500 -0.562500 0.000000 +v 1.062500 -0.562500 -0.232995 +v 0.875000 -0.750000 0.000000 +v 0.875000 -0.625000 0.000000 +v 0.875000 -0.750000 0.310660 +v 0.750000 -0.750000 0.310660 +v 0.875000 -0.625000 0.258884 +v 1.062500 -0.562500 0.232995 +v 0.750000 -0.530330 -0.530330 +v 1.062500 -0.397748 -0.397748 +v 0.875000 -0.258884 -0.625000 +v 1.062500 -0.232995 -0.562500 +v 0.875000 -0.530330 -0.530330 +v 0.875000 -0.441942 -0.441942 +v 0.875000 -0.750000 -0.310660 +v 0.750000 -0.750000 -0.310660 +v 0.875000 -0.625000 -0.258883 +v 0.750000 -0.000000 -0.750000 +v 1.062500 -0.000000 -0.562500 +v 0.875000 -0.000000 -0.750000 +v 0.875000 -0.000000 -0.625000 +v 0.875000 -0.310660 -0.750000 +v 0.750000 -0.310660 -0.750000 +v 0.875000 0.750000 -0.310660 +v 0.750000 -0.000000 0.000000 +v 0.750000 0.530330 -0.530330 +v 1.062500 0.397747 -0.397748 +v 0.875000 0.625000 -0.258883 +v 1.062500 0.562500 -0.232995 +v 0.875000 0.530330 -0.530330 +v 0.875000 0.441942 -0.441942 +v 0.875000 0.310660 -0.750000 +v 0.750000 0.310660 -0.750000 +v 0.875000 0.258883 -0.625000 +v 1.062500 0.232995 -0.562500 +v 1.062500 0.258883 0.625000 +v 1.062500 0.441942 0.441942 +v 1.062500 0.625000 0.258883 +v 1.062500 -0.258884 0.625000 +v 1.062500 -0.000000 0.625000 +v 1.062500 -0.625000 -0.258883 +v 1.062500 -0.625000 0.000000 +v 1.062500 -0.625000 0.258884 +v 1.062500 -0.258884 -0.625000 +v 1.062500 -0.441942 -0.441942 +v 1.062500 0.625000 -0.258883 +v 1.062500 0.441942 -0.441942 +v 1.062500 0.258883 -0.625000 +v 1.062500 0.625000 0.000000 +v 1.062500 -0.441942 0.441942 +v 1.062500 -0.000000 -0.625000 +v -1.062500 0.562500 0.000000 +v -0.750000 0.310660 0.750000 +v -0.750000 0.750000 0.000000 +v -0.875000 0.310660 0.750000 +v -0.875000 0.750000 0.310660 +v -0.875000 0.625000 0.258884 +v -0.750000 0.530330 0.530330 +v -0.875000 0.750000 0.000000 +v -1.062500 0.397747 0.397748 +v -0.875000 0.625000 0.000000 +v -0.750000 0.750000 -0.310660 +v -1.062500 0.232995 0.562500 +v -0.875000 0.530330 0.530330 +v -0.875000 0.441942 0.441942 +v -0.750000 0.750000 0.310660 +v -1.062500 0.562500 0.232995 +v -0.875000 -0.310660 0.750000 +v -0.750000 -0.000000 0.750000 +v -1.062500 -0.000000 0.562500 +v -0.875000 -0.258884 0.625000 +v -1.062500 -0.232995 0.562500 +v -0.875000 -0.000000 0.750000 +v -0.875000 -0.000000 0.625000 +v -0.875000 0.258883 0.625000 +v -0.750000 -0.530330 0.530330 +v -1.062500 -0.397748 0.397748 +v -0.875000 -0.530330 0.530330 +v -0.875000 -0.441942 0.441942 +v -0.750000 -0.310660 0.750000 +v -0.750000 -0.750000 0.000000 +v -1.062500 -0.562500 0.000000 +v -1.062500 -0.562500 -0.232995 +v -0.875000 -0.750000 0.000000 +v -0.875000 -0.625000 0.000000 +v -0.875000 -0.750000 0.310660 +v -0.750000 -0.750000 0.310660 +v -0.875000 -0.625000 0.258884 +v -1.062500 -0.562500 0.232995 +v -0.750000 -0.530330 -0.530330 +v -1.062500 -0.397748 -0.397748 +v -0.875000 -0.258884 -0.625000 +v -1.062500 -0.232995 -0.562500 +v -0.875000 -0.530330 -0.530330 +v -0.875000 -0.441942 -0.441942 +v -0.875000 -0.750000 -0.310660 +v -0.750000 -0.750000 -0.310660 +v -0.875000 -0.625000 -0.258883 +v -0.750000 -0.000000 -0.750000 +v -1.062500 -0.000000 -0.562500 +v -0.875000 -0.000000 -0.750000 +v -0.875000 -0.000000 -0.625000 +v -0.875000 -0.310660 -0.750000 +v -0.750000 -0.310660 -0.750000 +v -0.875000 0.750000 -0.310660 +v -0.750000 -0.000000 0.000000 +v -0.750000 0.530330 -0.530330 +v -1.062500 0.397747 -0.397748 +v -0.875000 0.625000 -0.258883 +v -1.062500 0.562500 -0.232995 +v -0.875000 0.530330 -0.530330 +v -0.875000 0.441942 -0.441942 +v -0.875000 0.310660 -0.750000 +v -0.750000 0.310660 -0.750000 +v -0.875000 0.258883 -0.625000 +v -1.062500 0.232995 -0.562500 +v -1.062500 0.258883 0.625000 +v -1.062500 0.441942 0.441942 +v -1.062500 0.625000 0.258883 +v -1.062500 -0.258884 0.625000 +v -1.062500 -0.000000 0.625000 +v -1.062500 -0.625000 -0.258883 +v -1.062500 -0.625000 0.000000 +v -1.062500 -0.625000 0.258884 +v -1.062500 -0.258884 -0.625000 +v -1.062500 -0.441942 -0.441942 +v -1.062500 0.625000 -0.258883 +v -1.062500 0.441942 -0.441942 +v -1.062500 0.258883 -0.625000 +v -1.062500 0.625000 0.000000 +v -1.062500 -0.441942 0.441942 +v -1.062500 -0.000000 -0.625000 +v 1.062500 0.232995 -0.232995 +v 1.062500 0.232995 0.000000 +v 1.062500 0.232995 0.232995 +v 1.062500 -0.000000 -0.232995 +v 1.062500 -0.000000 0.000000 +v 1.062500 -0.000000 0.232995 +v 1.062500 -0.232995 -0.232995 +v 1.062500 -0.232995 0.000000 +v 1.062500 -0.232995 0.232995 +v -1.062500 -0.232995 -0.232995 +v -1.062500 -0.232995 0.000000 +v -1.062500 -0.232995 0.232995 +v -1.062500 -0.000000 -0.232995 +v -1.062500 -0.000000 0.000000 +v -1.062500 -0.000000 0.232995 +v -1.062500 0.232995 -0.232995 +v -1.062500 0.232995 0.000000 +v -1.062500 0.232995 0.232995 +vt 0.812500 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.468750 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.812500 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.199370 0.803889 +vt 0.199370 0.968489 +vt 0.115555 0.884445 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.937500 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.812500 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937499 +vt 0.699369 0.905987 +vt 0.812500 0.906151 +vt 0.925632 0.905988 +vt 0.812500 0.937500 +vt 0.699370 0.905989 +vt 0.812500 0.906151 +vt 0.812500 0.937500 +vt 0.699370 0.905989 +vt 0.812500 0.906151 +vt 0.925630 0.905989 +vt 0.812500 0.937499 +vt 0.699369 0.905987 +vt 0.812500 0.906151 +vt 0.812500 0.937499 +vt 0.699369 0.905987 +vt 0.812500 0.906151 +vt 0.925632 0.905988 +vt 0.812500 0.937500 +vt 0.699370 0.905989 +vt 0.812500 0.906151 +vt 0.925630 0.905989 +vt 0.925630 0.905989 +vt 0.812500 0.937499 +vt 0.699369 0.905987 +vt 0.812500 0.906151 +vt 0.925632 0.905987 +vt 0.925632 0.905987 +vt 0.812500 0.937500 +vt 0.699370 0.905989 +vt 0.812500 0.906151 +vt 0.925630 0.905989 +vt 0.812500 0.937500 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.468750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.937500 +vt 0.812500 0.843750 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.812500 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.812500 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.812500 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.812500 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.812500 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.812500 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.199370 0.571111 +vt 0.199370 0.406511 +vt 0.115555 0.490555 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.812500 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.941942 0.781250 +vt 0.812500 0.781250 +vt 0.967830 0.843750 +vt 0.699369 0.905987 +vt 0.812500 0.937499 +vt 0.812500 0.906151 +vt 0.925632 0.905988 +vt 0.937500 0.937500 +vt 0.699370 0.905989 +vt 0.812500 0.937500 +vt 0.812500 0.906151 +vt 0.699370 0.905989 +vt 0.812500 0.937500 +vt 0.812500 0.906151 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.699369 0.905987 +vt 0.812500 0.937499 +vt 0.812500 0.906151 +vt 0.699369 0.905987 +vt 0.812500 0.937499 +vt 0.812500 0.906151 +vt 0.925632 0.905988 +vt 0.937500 0.937500 +vt 0.699370 0.905989 +vt 0.812500 0.937500 +vt 0.812500 0.906151 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.699369 0.905987 +vt 0.812500 0.937499 +vt 0.812500 0.906151 +vt 0.925632 0.905987 +vt 0.937500 0.937500 +vt 0.925632 0.905987 +vt 0.937500 0.937500 +vt 0.699370 0.905989 +vt 0.812500 0.937500 +vt 0.812500 0.906151 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.312500 0.968651 +vt 0.312500 0.803956 +vt 0.312500 0.571043 +vt 0.425630 0.406511 +vt 0.425630 0.571111 +vt 0.509445 0.490555 +vt 0.199370 0.687500 +vt 0.312500 0.687500 +vt 0.425630 0.803889 +vt 0.425630 0.968489 +vt 0.509445 0.884445 +vt 0.031349 0.687500 +vt 0.199370 0.571111 +vt 0.425630 0.687500 +vt 0.593651 0.687500 +vt 0.593489 0.800630 +vt 0.031511 0.574370 +vt 0.199370 0.406511 +vt 0.312500 0.406349 +vt 0.593489 0.574370 +vt 0.115555 0.490555 +vt 0.031511 0.800630 +vt 0.425630 0.571111 +vt 0.593489 0.574370 +vt 0.509445 0.490555 +vt 0.425630 0.406511 +vt 0.312500 0.571043 +vt 0.312500 0.406349 +vt 0.199370 0.687500 +vt 0.312500 0.687500 +vt 0.425630 0.687500 +vt 0.593651 0.687500 +vt 0.031511 0.574370 +vt 0.031349 0.687500 +vt 0.199370 0.803889 +vt 0.312500 0.803956 +vt 0.425630 0.803889 +vt 0.593489 0.800630 +vt 0.031511 0.800630 +vt 0.199370 0.968489 +vt 0.312500 0.968651 +vt 0.425630 0.968489 +vt 0.509445 0.884445 +vt 0.115555 0.884445 +vt 0.683058 0.937500 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.657170 0.843750 +vt 0.968750 1.000000 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.683058 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.687500 0.937498 +vt 0.937500 0.937500 +vt 0.687500 0.937500 +vt 0.687500 0.937500 +vt 0.937500 0.937500 +vt 0.687500 0.937498 +vt 0.687500 0.937498 +vt 0.937500 0.937500 +vt 0.687500 0.937500 +vt 0.937500 0.937500 +vt 0.937500 0.937500 +vt 0.687500 0.937498 +vt 0.937500 0.937500 +vt 0.937500 0.937500 +vt 0.687500 0.937500 +vt 0.937500 0.937500 +vt 0.657170 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.843750 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.843750 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.843750 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.843750 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.843750 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.843750 +vt 0.683058 0.843750 +vt 0.656250 1.000000 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.843750 +vt 0.683058 0.843750 +vt 0.657170 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.843750 +vt 0.687500 0.937498 +vt 0.687500 0.937500 +vt 0.687500 0.937500 +vt 0.687500 0.937498 +vt 0.687500 0.937498 +vt 0.687500 0.937500 +vt 0.687500 0.937498 +vt 0.687500 0.937500 +vn 0.0000 1.0000 0.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.0000 1.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.7071 -0.7071 +usemtl wheel_Large +s off +f 10/1/1 68/2/1 79/3/1 +f 8/4/1 15/5/1 5/6/1 +f 8/7/2 6/8/2 10/9/2 +f 55/10/3 15/11/3 3/12/3 +f 79/3/1 58/13/1 10/1/1 +f 54/14/1 3/15/1 8/4/1 +f 8/7/2 58/16/2 54/17/2 +f 55/10/3 3/12/3 11/18/3 +f 24/19/4 67/20/4 14/21/4 +f 7/22/4 4/23/4 13/24/4 +f 13/25/2 24/26/2 14/27/2 +f 55/10/3 2/28/3 7/29/3 +f 67/20/4 6/30/4 14/21/4 +f 5/31/4 7/22/4 13/24/4 +f 13/25/2 6/32/2 5/33/2 +f 55/10/3 7/29/3 15/34/3 +f 20/35/5 70/36/5 23/37/5 +f 18/38/5 17/39/5 22/40/5 +f 22/41/2 20/42/2 23/43/2 +f 55/10/3 29/44/3 18/45/3 +f 70/36/5 24/46/5 23/37/5 +f 4/47/5 18/38/5 22/40/5 +f 22/41/2 24/48/2 4/49/2 +f 55/10/3 18/45/3 2/50/3 +f 37/51/6 80/52/6 28/53/6 +f 25/54/6 35/55/6 27/56/6 +f 27/57/2 37/58/2 28/59/2 +f 55/10/3 36/60/3 25/61/3 +f 80/52/6 20/62/6 28/53/6 +f 17/63/6 25/54/6 27/56/6 +f 27/57/2 20/64/2 17/65/2 +f 55/10/3 25/61/3 29/66/3 +f 47/67/7 72/68/7 34/69/7 +f 30/70/7 45/71/7 33/72/7 +f 33/73/2 47/74/2 34/75/2 +f 55/10/3 46/76/3 30/77/3 +f 72/68/7 37/78/7 34/69/7 +f 35/79/7 30/70/7 33/72/7 +f 33/73/2 37/80/2 35/81/2 +f 55/10/3 30/77/3 36/82/3 +f 41/83/8 75/84/8 44/85/8 +f 39/86/8 52/87/8 43/88/8 +f 43/89/2 41/90/2 44/91/2 +f 55/10/3 53/92/3 39/93/3 +f 44/85/8 71/94/8 47/95/8 +f 45/96/8 39/86/8 43/88/8 +f 43/89/2 47/97/2 45/98/2 +f 55/10/3 39/93/3 46/99/3 +f 64/100/9 81/101/9 51/102/9 +f 48/103/9 62/104/9 50/105/9 +f 50/106/2 64/107/2 51/108/2 +f 55/10/3 63/109/3 48/110/3 +f 165/111/2 16/112/2 9/113/2 +f 81/101/9 41/114/9 51/102/9 +f 52/115/9 48/103/9 50/105/9 +f 50/106/2 41/116/2 52/117/2 +f 55/10/3 48/110/3 53/118/3 +f 58/119/10 77/120/10 61/121/10 +f 60/122/10 11/123/10 54/124/10 +f 60/125/2 58/126/2 61/127/2 +f 55/10/3 11/128/3 56/129/3 +f 77/120/10 64/130/10 61/121/10 +f 62/131/10 56/132/10 60/122/10 +f 60/125/2 64/133/2 62/134/2 +f 55/10/3 56/129/3 63/135/3 +f 67/136/2 12/137/2 9/138/2 +f 16/139/2 67/136/2 9/138/2 +f 70/140/2 21/141/2 19/142/2 +f 72/143/2 32/144/2 31/145/2 +f 38/146/2 72/143/2 31/145/2 +f 75/147/2 42/148/2 40/149/2 +f 77/150/2 59/151/2 57/152/2 +f 65/153/2 77/150/2 57/152/2 +f 79/154/2 16/155/2 1/156/2 +f 59/157/2 79/154/2 1/156/2 +f 12/158/2 70/140/2 19/142/2 +f 80/159/2 38/160/2 26/161/2 +f 21/162/2 80/159/2 26/161/2 +f 32/163/2 75/147/2 40/149/2 +f 81/164/2 65/165/2 49/166/2 +f 42/167/2 81/164/2 49/166/2 +f 91/168/1 149/169/1 87/170/1 +f 89/171/1 96/172/1 84/173/1 +f 89/174/3 87/175/3 86/176/3 +f 136/177/2 84/178/2 96/179/2 +f 139/180/1 160/181/1 91/168/1 +f 84/173/1 135/182/1 89/171/1 +f 89/174/3 139/183/3 91/184/3 +f 136/177/2 92/185/2 84/178/2 +f 148/186/4 105/187/4 95/188/4 +f 85/189/4 88/190/4 94/191/4 +f 94/192/3 105/193/3 85/194/3 +f 136/177/2 88/195/2 83/196/2 +f 87/197/4 148/186/4 95/188/4 +f 88/190/4 86/198/4 94/191/4 +f 94/192/3 87/199/3 95/200/3 +f 136/177/2 96/201/2 88/195/2 +f 151/202/5 101/203/5 104/204/5 +f 98/205/5 99/206/5 103/207/5 +f 103/208/3 101/209/3 98/210/3 +f 136/177/2 99/211/2 110/212/2 +f 105/213/5 151/202/5 104/204/5 +f 99/206/5 85/214/5 103/207/5 +f 103/208/3 105/215/3 104/216/3 +f 136/177/2 83/217/2 99/211/2 +f 161/218/6 118/219/6 109/220/6 +f 116/221/6 106/222/6 108/223/6 +f 108/224/3 118/225/3 116/226/3 +f 136/177/2 106/227/2 117/228/2 +f 101/229/6 161/218/6 109/220/6 +f 106/222/6 98/230/6 108/223/6 +f 108/224/3 101/231/3 109/232/3 +f 136/177/2 110/233/2 106/227/2 +f 153/234/7 128/235/7 115/236/7 +f 126/237/7 111/238/7 114/239/7 +f 114/240/3 128/241/3 126/242/3 +f 136/177/2 111/243/2 127/244/2 +f 118/245/7 153/234/7 115/236/7 +f 111/238/7 116/246/7 114/239/7 +f 114/240/3 118/247/3 115/248/3 +f 136/177/2 117/249/2 111/243/2 +f 156/250/8 122/251/8 125/252/8 +f 133/253/8 120/254/8 124/255/8 +f 124/256/3 122/257/3 133/258/3 +f 136/177/2 120/259/2 134/260/2 +f 128/261/8 156/250/8 125/252/8 +f 120/254/8 126/262/8 124/255/8 +f 124/256/3 128/263/3 125/264/3 +f 136/177/2 127/265/2 120/259/2 +f 162/266/9 145/267/9 132/268/9 +f 143/269/9 129/270/9 131/271/9 +f 131/272/3 145/273/3 143/274/3 +f 136/177/2 129/275/2 144/276/2 +f 174/277/3 119/278/3 107/279/3 +f 122/280/9 162/266/9 132/268/9 +f 129/270/9 133/281/9 131/271/9 +f 131/272/3 122/282/3 132/283/3 +f 136/177/2 134/284/2 129/275/2 +f 158/285/10 139/286/10 142/287/10 +f 141/288/10 92/289/10 137/290/10 +f 141/291/3 139/292/3 135/293/3 +f 136/177/2 137/294/2 92/295/2 +f 145/296/10 158/285/10 142/287/10 +f 137/290/10 143/297/10 141/288/10 +f 141/291/3 145/298/3 142/299/3 +f 136/177/2 144/300/2 137/294/2 +f 93/301/3 148/302/3 90/303/3 +f 97/304/3 148/302/3 149/305/3 +f 102/306/3 151/307/3 100/308/3 +f 113/309/3 153/310/3 112/311/3 +f 119/312/3 153/310/3 154/313/3 +f 123/314/3 156/315/3 121/316/3 +f 140/317/3 158/318/3 138/319/3 +f 146/320/3 158/318/3 159/321/3 +f 97/322/3 160/323/3 82/324/3 +f 140/325/3 160/323/3 157/326/3 +f 93/327/3 151/307/3 147/328/3 +f 119/329/3 161/330/3 107/331/3 +f 102/332/3 161/330/3 150/333/3 +f 113/334/3 156/315/3 152/335/3 +f 146/336/3 162/337/3 130/338/3 +f 123/339/3 162/337/3 155/340/3 +f 1/341/2 165/111/2 164/342/2 +f 170/343/2 32/344/2 169/345/2 +f 169/345/2 32/344/2 40/346/2 +f 164/342/2 168/347/2 167/348/2 +f 1/341/2 163/349/2 59/350/2 +f 57/351/2 59/350/2 163/349/2 +f 165/111/2 19/352/2 168/347/2 +f 170/343/2 168/347/2 171/353/2 +f 164/342/2 166/354/2 163/349/2 +f 163/349/2 49/355/2 65/356/2 +f 168/347/2 21/357/2 171/353/2 +f 170/343/2 38/358/2 31/359/2 +f 167/348/2 169/345/2 166/354/2 +f 166/354/2 42/360/2 49/355/2 +f 171/353/2 21/357/2 26/361/2 +f 38/358/2 171/353/2 26/361/2 +f 42/360/2 169/345/2 40/346/2 +f 65/356/2 57/351/2 163/349/2 +f 12/362/2 165/111/2 9/113/2 +f 172/363/3 123/364/3 121/365/3 +f 113/366/3 173/367/3 172/363/3 +f 112/368/3 174/277/3 173/367/3 +f 173/367/3 177/369/3 176/370/3 +f 172/363/3 176/370/3 175/371/3 +f 130/372/3 172/363/3 175/371/3 +f 177/369/3 102/373/3 100/374/3 +f 176/370/3 180/375/3 179/376/3 +f 175/371/3 179/376/3 178/377/3 +f 130/372/3 178/377/3 146/378/3 +f 177/369/3 93/379/3 180/375/3 +f 179/376/3 97/380/3 82/381/3 +f 178/377/3 82/381/3 140/382/3 +f 138/383/3 146/378/3 178/377/3 +f 180/375/3 93/379/3 90/384/3 +f 113/366/3 172/363/3 121/365/3 +f 102/373/3 174/277/3 107/279/3 +f 97/380/3 180/375/3 90/384/3 +f 140/382/3 138/383/3 178/377/3 +f 10/1/1 6/385/1 68/2/1 +f 8/4/1 3/15/1 15/5/1 +f 8/7/2 5/386/2 6/8/2 +f 79/3/1 76/387/1 58/13/1 +f 54/14/1 11/388/1 3/15/1 +f 8/7/2 10/9/2 58/16/2 +f 24/19/4 66/389/4 67/20/4 +f 7/22/4 2/390/4 4/23/4 +f 13/25/2 4/391/2 24/26/2 +f 67/20/4 68/392/4 6/30/4 +f 5/31/4 15/393/4 7/22/4 +f 13/25/2 14/27/2 6/32/2 +f 20/35/5 69/394/5 70/36/5 +f 18/38/5 29/395/5 17/39/5 +f 22/41/2 17/396/2 20/42/2 +f 70/36/5 66/397/5 24/46/5 +f 4/47/5 2/398/5 18/38/5 +f 22/41/2 23/43/2 24/48/2 +f 37/51/6 73/399/6 80/52/6 +f 25/54/6 36/400/6 35/55/6 +f 27/57/2 35/401/2 37/58/2 +f 80/52/6 69/402/6 20/62/6 +f 17/63/6 29/403/6 25/54/6 +f 27/57/2 28/59/2 20/64/2 +f 47/67/7 71/404/7 72/68/7 +f 30/70/7 46/405/7 45/71/7 +f 33/73/2 45/406/2 47/74/2 +f 72/68/7 73/407/7 37/78/7 +f 35/79/7 36/408/7 30/70/7 +f 33/73/2 34/75/2 37/80/2 +f 41/83/8 74/409/8 75/84/8 +f 39/86/8 53/410/8 52/87/8 +f 43/89/2 52/411/2 41/90/2 +f 44/85/8 75/84/8 71/94/8 +f 45/96/8 46/412/8 39/86/8 +f 43/89/2 44/91/2 47/97/2 +f 64/100/9 78/413/9 81/101/9 +f 48/103/9 63/414/9 62/104/9 +f 50/106/2 62/415/2 64/107/2 +f 81/101/9 74/416/9 41/114/9 +f 52/115/9 53/417/9 48/103/9 +f 50/106/2 51/108/2 41/116/2 +f 58/119/10 76/418/10 77/120/10 +f 60/122/10 56/132/10 11/123/10 +f 60/125/2 54/419/2 58/126/2 +f 77/120/10 78/420/10 64/130/10 +f 62/131/10 63/421/10 56/132/10 +f 60/125/2 61/127/2 64/133/2 +f 67/136/2 66/422/2 12/137/2 +f 16/139/2 68/423/2 67/136/2 +f 70/140/2 69/424/2 21/141/2 +f 72/143/2 71/425/2 32/144/2 +f 38/146/2 73/426/2 72/143/2 +f 75/147/2 74/427/2 42/148/2 +f 77/150/2 76/428/2 59/151/2 +f 65/153/2 78/429/2 77/150/2 +f 79/154/2 68/430/2 16/155/2 +f 59/157/2 76/431/2 79/154/2 +f 12/158/2 66/432/2 70/140/2 +f 80/159/2 73/433/2 38/160/2 +f 21/162/2 69/434/2 80/159/2 +f 32/163/2 71/435/2 75/147/2 +f 81/164/2 78/436/2 65/165/2 +f 42/167/2 74/437/2 81/164/2 +f 91/168/1 160/181/1 149/169/1 +f 89/171/1 86/438/1 96/172/1 +f 89/174/3 91/184/3 87/175/3 +f 139/180/1 157/439/1 160/181/1 +f 84/173/1 92/440/1 135/182/1 +f 89/174/3 135/441/3 139/183/3 +f 148/186/4 147/442/4 105/187/4 +f 85/189/4 83/443/4 88/190/4 +f 94/192/3 95/200/3 105/193/3 +f 87/197/4 149/444/4 148/186/4 +f 88/190/4 96/445/4 86/198/4 +f 94/192/3 86/446/3 87/199/3 +f 151/202/5 150/447/5 101/203/5 +f 98/205/5 110/448/5 99/206/5 +f 103/208/3 104/216/3 101/209/3 +f 105/213/5 147/449/5 151/202/5 +f 99/206/5 83/450/5 85/214/5 +f 103/208/3 85/451/3 105/215/3 +f 161/218/6 154/452/6 118/219/6 +f 116/221/6 117/453/6 106/222/6 +f 108/224/3 109/232/3 118/225/3 +f 101/229/6 150/454/6 161/218/6 +f 106/222/6 110/455/6 98/230/6 +f 108/224/3 98/456/3 101/231/3 +f 153/234/7 152/457/7 128/235/7 +f 126/237/7 127/458/7 111/238/7 +f 114/240/3 115/248/3 128/241/3 +f 118/245/7 154/459/7 153/234/7 +f 111/238/7 117/460/7 116/246/7 +f 114/240/3 116/461/3 118/247/3 +f 156/250/8 155/462/8 122/251/8 +f 133/253/8 134/463/8 120/254/8 +f 124/256/3 125/264/3 122/257/3 +f 128/261/8 152/464/8 156/250/8 +f 120/254/8 127/465/8 126/262/8 +f 124/256/3 126/466/3 128/263/3 +f 162/266/9 159/467/9 145/267/9 +f 143/269/9 144/468/9 129/270/9 +f 131/272/3 132/283/3 145/273/3 +f 122/280/9 155/469/9 162/266/9 +f 129/270/9 134/470/9 133/281/9 +f 131/272/3 133/471/3 122/282/3 +f 158/285/10 157/472/10 139/286/10 +f 141/288/10 135/473/10 92/289/10 +f 141/291/3 142/299/3 139/292/3 +f 145/296/10 159/474/10 158/285/10 +f 137/290/10 144/475/10 143/297/10 +f 141/291/3 143/476/3 145/298/3 +f 93/301/3 147/477/3 148/302/3 +f 97/304/3 90/303/3 148/302/3 +f 102/306/3 150/478/3 151/307/3 +f 113/309/3 152/479/3 153/310/3 +f 119/312/3 112/311/3 153/310/3 +f 123/314/3 155/480/3 156/315/3 +f 140/317/3 157/481/3 158/318/3 +f 146/320/3 138/319/3 158/318/3 +f 97/322/3 149/482/3 160/323/3 +f 140/325/3 82/324/3 160/323/3 +f 93/327/3 100/308/3 151/307/3 +f 119/329/3 154/483/3 161/330/3 +f 102/332/3 107/331/3 161/330/3 +f 113/334/3 121/316/3 156/315/3 +f 146/336/3 159/484/3 162/337/3 +f 123/339/3 130/338/3 162/337/3 +f 1/341/2 16/112/2 165/111/2 +f 170/343/2 31/359/2 32/344/2 +f 164/342/2 165/111/2 168/347/2 +f 1/341/2 164/342/2 163/349/2 +f 165/111/2 12/362/2 19/352/2 +f 170/343/2 167/348/2 168/347/2 +f 164/342/2 167/348/2 166/354/2 +f 163/349/2 166/354/2 49/355/2 +f 168/347/2 19/352/2 21/357/2 +f 170/343/2 171/353/2 38/358/2 +f 167/348/2 170/343/2 169/345/2 +f 166/354/2 169/345/2 42/360/2 +f 113/366/3 112/368/3 173/367/3 +f 112/368/3 119/278/3 174/277/3 +f 173/367/3 174/277/3 177/369/3 +f 172/363/3 173/367/3 176/370/3 +f 130/372/3 123/364/3 172/363/3 +f 177/369/3 174/277/3 102/373/3 +f 176/370/3 177/369/3 180/375/3 +f 175/371/3 176/370/3 179/376/3 +f 130/372/3 175/371/3 178/377/3 +f 177/369/3 100/374/3 93/379/3 +f 179/376/3 180/375/3 97/380/3 +f 178/377/3 179/376/3 82/381/3 diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel_pin.json b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel_pin.json new file mode 100644 index 000000000..9cfafddfb --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel_pin.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/track/bogey/textures", + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/bogey/bogey_drive_wheel_pin.obj" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel_pin.mtl b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel_pin.mtl new file mode 100644 index 000000000..51555a734 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel_pin.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'Bogey.blend' +# Material Count: 1 + +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 #piston diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel_pin.obj b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel_pin.obj new file mode 100644 index 000000000..13c74ddbc --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_drive_wheel_pin.obj @@ -0,0 +1,84 @@ +# Blender v3.0.1 OBJ File: 'Bogey.blend' +# www.blender.org +mtllib bogey_drive_wheel_pin.mtl +o Cube.040_Cube.047 +v 1.062500 -0.125000 0.125000 +v 1.062500 0.125000 0.125000 +v 1.062500 -0.125000 -0.125000 +v 1.062500 0.125000 -0.125000 +v 1.312500 0.125000 -0.125000 +v 1.312500 -0.125000 -0.125000 +v 1.312500 -0.125000 0.125000 +v 1.312500 0.125000 0.125000 +v -1.062500 -0.125000 0.125000 +v -1.062500 0.125000 0.125000 +v -1.062500 -0.125000 -0.125000 +v -1.062500 0.125000 -0.125000 +v -1.312500 0.125000 -0.125000 +v -1.312500 -0.125000 -0.125000 +v -1.312500 -0.125000 0.125000 +v -1.312500 0.125000 0.125000 +vt 0.375000 0.625000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.375000 0.625000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.375000 0.625000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.375000 0.625000 +vt 0.250000 0.500000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.250000 0.500000 +vt 0.375000 0.625000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.250000 0.625000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.250000 0.625000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +usemtl Bogey_Piston +s off +f 8/1/1 4/2/1 2/3/1 +f 7/4/2 2/5/2 1/6/2 +f 6/7/3 1/8/3 3/9/3 +f 5/10/4 7/11/4 6/12/4 +f 5/10/5 3/13/5 4/14/5 +f 12/15/1 16/16/1 10/17/1 +f 10/18/2 15/19/2 9/20/2 +f 9/21/3 14/22/3 11/23/3 +f 15/24/6 13/25/6 14/26/6 +f 11/27/5 13/25/5 12/28/5 +f 8/1/1 5/29/1 4/2/1 +f 7/4/2 8/30/2 2/5/2 +f 6/7/3 7/31/3 1/8/3 +f 5/10/4 8/32/4 7/11/4 +f 5/10/5 6/12/5 3/13/5 +f 12/15/1 13/33/1 16/16/1 +f 10/18/2 16/34/2 15/19/2 +f 9/21/3 15/35/3 14/22/3 +f 15/24/6 16/36/6 13/25/6 +f 11/27/5 14/26/5 13/25/5 diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_frame.json b/src/main/resources/assets/create/models/block/track/bogey/bogey_frame.json new file mode 100644 index 000000000..f9b2073b1 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_frame.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/track/bogey/textures", + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/bogey/bogey_frame.obj" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_frame.mtl b/src/main/resources/assets/create/models/block/track/bogey/bogey_frame.mtl new file mode 100644 index 000000000..04674d292 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_frame.mtl @@ -0,0 +1,35 @@ +# Blender MTL File: 'Bogey.blend' +# Material Count: 3 + +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 #bogey + +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 #bogey2 + +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 #wheel diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_frame.obj b/src/main/resources/assets/create/models/block/track/bogey/bogey_frame.obj new file mode 100644 index 000000000..8859b2fdb --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_frame.obj @@ -0,0 +1,960 @@ +# Blender v3.0.1 OBJ File: 'Bogey.blend' +# www.blender.org +mtllib bogey_frame.mtl +o Cube.035_Cube.021 +v -0.437500 0.750000 0.437500 +v -0.437500 1.250000 0.437500 +v -0.437500 0.750000 -0.437500 +v -0.437500 1.250000 -0.437500 +v 0.437500 0.750000 0.437500 +v 0.437500 1.250000 0.437500 +v 0.437500 0.750000 -0.437500 +v 0.437500 1.250000 -0.437500 +v -0.312500 0.437500 0.562500 +v -0.250000 1.250000 0.250000 +v -0.250000 1.500000 0.250000 +v -0.250000 1.250000 -0.250000 +v -0.250000 1.500000 -0.250000 +v 0.250000 1.250000 0.250000 +v 0.250000 1.500000 0.250000 +v 0.250000 1.250000 -0.250000 +v 0.250000 1.500000 -0.250000 +v 0.224112 0.588388 0.312500 +v 0.224112 0.588388 0.125000 +v 0.312500 0.500000 0.312500 +v 0.312500 0.500000 0.125000 +v 0.489277 0.853553 0.312500 +v 0.489277 0.853553 0.125000 +v 0.577665 0.765165 0.125000 +v 0.577665 0.765165 0.312500 +v -0.224112 0.588388 0.312500 +v -0.224112 0.588388 0.125000 +v -0.312500 0.500000 0.312500 +v -0.312500 0.500000 0.125000 +v -0.489277 0.853553 0.312500 +v -0.489277 0.853553 0.125000 +v -0.577665 0.765165 0.125000 +v -0.577665 0.765165 0.312500 +v 0.224112 0.588388 -0.312500 +v 0.224112 0.588388 -0.125000 +v 0.312500 0.500000 -0.312500 +v 0.312500 0.500000 -0.125000 +v 0.489277 0.853553 -0.312500 +v 0.489277 0.853553 -0.125000 +v 0.577665 0.765165 -0.125000 +v 0.577665 0.765165 -0.312500 +v -0.224112 0.588388 -0.312500 +v -0.224112 0.588388 -0.125000 +v -0.312500 0.500000 -0.312500 +v -0.312500 0.500000 -0.125000 +v -0.489277 0.853553 -0.312500 +v -0.489277 0.853553 -0.125000 +v -0.577665 0.765165 -0.125000 +v -0.577665 0.765165 -0.312500 +v 0.937500 0.687500 -0.500000 +v 0.937500 1.312500 -0.500000 +v 0.937500 0.687500 0.500000 +v 0.937500 1.312500 0.500000 +v 0.312500 0.687500 -0.500000 +v 0.312500 1.312500 -0.500000 +v 0.312500 0.687500 0.500000 +v 0.312500 1.312500 0.500000 +v -0.937500 0.687500 -0.500000 +v -0.937500 1.312500 -0.500000 +v -0.937500 0.687500 0.500000 +v -0.937500 1.312500 0.500000 +v -0.312500 0.687500 -0.500000 +v -0.312500 1.312500 -0.500000 +v -0.312500 0.687500 0.500000 +v -0.312500 1.312500 0.500000 +v 0.750000 0.750000 -1.353553 +v 0.750000 1.103553 -1.000000 +v 0.750000 0.396447 -1.000000 +v 0.750000 0.750000 -0.646447 +v 0.375000 0.750000 -1.353553 +v 0.375000 1.103553 -1.000000 +v 0.375000 0.396447 -1.000000 +v 0.375000 0.750000 -0.646447 +v -0.750000 0.750000 -1.353553 +v -0.750000 1.103553 -1.000000 +v -0.750000 0.396447 -1.000000 +v -0.750000 0.750000 -0.646447 +v -0.375000 0.750000 -1.353553 +v -0.375000 1.103553 -1.000000 +v -0.375000 0.396447 -1.000000 +v -0.375000 0.750000 -0.646447 +v 0.750000 0.750000 1.353553 +v 0.750000 1.103553 1.000000 +v 0.750000 0.396447 1.000000 +v 0.750000 0.750000 0.646446 +v 0.375000 0.750000 1.353553 +v 0.375000 1.103553 1.000000 +v 0.375000 0.396447 1.000000 +v 0.375000 0.750000 0.646446 +v -0.750000 0.750000 1.353553 +v -0.750000 1.103553 1.000000 +v -0.750000 0.396447 1.000000 +v -0.750000 0.750000 0.646446 +v -0.375000 0.750000 1.353553 +v -0.375000 1.103553 1.000000 +v -0.375000 0.396447 1.000000 +v -0.375000 0.750000 0.646446 +v 0.437500 0.838388 -0.734835 +v 0.437500 1.015165 -0.911612 +v 0.687500 0.838388 -0.734835 +v 0.687500 1.015165 -0.911612 +v 0.437500 1.457107 -0.469670 +v 0.437500 1.280330 -0.292893 +v 0.687500 1.280330 -0.292893 +v 0.687500 1.457107 -0.469670 +v -0.437500 0.838388 -0.734835 +v -0.437500 1.015165 -0.911612 +v -0.687500 0.838388 -0.734835 +v -0.687500 1.015165 -0.911612 +v -0.437500 1.457107 -0.469670 +v -0.437500 1.280330 -0.292893 +v -0.687500 1.280330 -0.292893 +v -0.687500 1.457107 -0.469670 +v 0.437500 0.838388 0.734835 +v 0.437500 1.015165 0.911612 +v 0.687500 0.838388 0.734835 +v 0.687500 1.015165 0.911612 +v 0.437500 1.457107 0.469670 +v 0.437500 1.280330 0.292893 +v 0.687500 1.280330 0.292893 +v 0.687500 1.457107 0.469670 +v -0.437500 0.838388 0.734835 +v -0.437500 1.015165 0.911612 +v -0.687500 0.838388 0.734835 +v -0.687500 1.015165 0.911612 +v -0.437500 1.457107 0.469670 +v -0.437500 1.280330 0.292893 +v -0.687500 1.280330 0.292893 +v -0.687500 1.457107 0.469670 +v 0.312500 0.437500 -1.312500 +v 0.312500 1.062500 -1.312500 +v 0.312500 0.437500 -0.687500 +v 0.312500 1.062500 -0.687500 +v -0.312500 0.437500 -1.312500 +v -0.312500 1.062500 -1.312500 +v -0.312500 0.437500 -0.687500 +v -0.312500 1.062500 -0.687500 +v -0.093750 1.062500 -0.906250 +v -0.093750 1.250000 -0.906250 +v -0.093750 1.062500 -1.093750 +v -0.093750 1.250000 -1.093750 +v 0.093750 1.062500 -0.906250 +v 0.093750 1.250000 -0.906250 +v 0.093750 1.062500 -1.093750 +v 0.093750 1.250000 -1.093750 +v 0.312500 0.437500 1.312500 +v 0.312500 1.062500 1.312500 +v 0.312500 0.437500 0.687500 +v 0.312500 1.062500 0.687500 +v -0.312500 0.437500 1.312500 +v -0.312500 1.062500 1.312500 +v -0.312500 0.437500 0.687500 +v -0.312500 1.062500 0.687500 +v -0.093750 1.062500 0.906250 +v -0.093750 1.250000 0.906250 +v -0.093750 1.062500 1.093750 +v -0.093750 1.250000 1.093750 +v 0.093750 1.062500 0.906250 +v 0.093750 1.250000 0.906250 +v 0.093750 1.062500 1.093750 +v 0.093750 1.250000 1.093750 +v 0.312500 0.437500 1.312500 +v 0.312500 1.062500 1.312500 +v 0.312500 0.437500 0.687500 +v 0.312500 1.062500 0.687500 +v -0.312500 0.437500 1.312500 +v -0.312500 1.062500 1.312500 +v -0.312500 0.437500 0.687500 +v -0.312500 1.062500 0.687500 +v -0.093750 1.062500 0.906250 +v -0.093750 1.250000 0.906250 +v -0.093750 1.062500 1.093750 +v -0.093750 1.250000 1.093750 +v 0.093750 1.062500 0.906250 +v 0.093750 1.250000 0.906250 +v 0.093750 1.062500 1.093750 +v 0.093750 1.250000 1.093750 +v 0.312500 0.437500 -1.312500 +v 0.312500 1.062500 -1.312500 +v 0.312500 0.437500 -0.687500 +v 0.312500 1.062500 -0.687500 +v -0.312500 0.437500 -1.312500 +v -0.312500 1.062500 -1.312500 +v -0.312500 0.437500 -0.687500 +v -0.312500 1.062500 -0.687500 +v -0.093750 1.062500 -0.906250 +v -0.093750 1.250000 -0.906250 +v -0.093750 1.062500 -1.093750 +v -0.093750 1.250000 -1.093750 +v 0.093750 1.062500 -0.906250 +v 0.093750 1.250000 -0.906250 +v 0.093750 1.062500 -1.093750 +v 0.093750 1.250000 -1.093750 +v -0.312500 0.437500 -0.562500 +v 0.312500 0.437500 0.562500 +v 0.312500 1.062500 0.562500 +v 0.312500 0.437500 -0.562500 +v 0.312500 1.062500 -0.562500 +v -0.312500 1.062500 0.562500 +v -0.312500 1.062500 -0.562500 +vt 0.437500 1.000000 +vt 0.687500 0.562500 +vt 0.687500 1.000000 +vt 0.312500 0.562500 +vt 0.750000 0.312500 +vt 0.312500 0.312500 +vt 0.437500 1.000000 +vt 0.687500 0.562500 +vt 0.687500 1.000000 +vt 0.750000 0.562500 +vt 0.312500 0.312500 +vt 0.750000 0.312500 +vt 0.437500 0.562500 +vt 0.000000 1.000000 +vt 0.000000 0.562500 +vt 0.000000 1.000000 +vt 0.437500 0.562500 +vt 0.312500 0.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.687500 0.687500 +vt 1.000000 0.687500 +vt 0.312500 0.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.718750 +vt 0.718750 0.968750 +vt 0.718750 0.718750 +vt 0.750000 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.562500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.906250 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.000000 +vt 0.625000 -0.000000 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.625000 -0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.625000 -0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.000000 +vt 0.625000 -0.000000 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.687500 0.687500 +vt 1.000000 1.000000 +vt 1.000000 0.687500 +vt 0.000000 0.562500 +vt 0.312500 0.000000 +vt 0.000000 -0.000000 +vt 0.000000 0.562500 +vt 0.312500 0.000000 +vt 0.000000 -0.000000 +vt 0.437500 0.562500 +vt 0.750000 0.562500 +vt 0.312500 0.562500 +vt 0.437500 1.000000 +vt 0.000000 0.562500 +vt 0.312500 0.562500 +vt 0.687500 1.000000 +vt 0.312500 0.562500 +vt 0.718750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.687500 +vt 0.968750 0.968750 +vt 0.906250 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.312500 +vt 0.812500 0.312500 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.687500 1.000000 +vt 0.312500 0.562500 +vt 0.312500 0.562500 +vt 0.312500 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.812500 0.500000 +vt 0.500000 0.187500 +vt 0.812500 0.187500 +vt 0.625000 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.500000 0.500000 +vt 0.812500 0.187500 +vt 0.500000 0.187500 +vt 0.968750 0.500000 +vt 0.656250 1.000000 +vt 0.968750 1.000000 +vt 0.312500 0.500000 +vt -0.000000 1.000000 +vt -0.000000 0.500000 +vt 0.625000 0.500000 +vt 0.312500 1.000000 +vt 0.625000 1.000000 +vt 0.500000 0.187500 +vt 0.812500 0.500000 +vt 0.812500 0.187500 +vt 0.937500 0.500000 +vt 0.625000 1.000000 +vt 0.937500 1.000000 +vt 0.812500 0.187500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.968750 0.500000 +vt 0.656250 1.000000 +vt 0.656250 0.500000 +vt -0.000000 1.000000 +vt 0.312500 0.500000 +vt -0.000000 0.500000 +vt 0.250000 0.250000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.250000 0.250000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.250000 +vt 0.000000 0.250000 +vt 0.218750 0.250000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.250000 +vt 0.000000 0.250000 +vt 0.218750 0.250000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.250000 +vt 0.000000 0.250000 +vt 0.218750 0.250000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.250000 +vt 0.000000 0.250000 +vt 0.218750 0.250000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.250000 0.250000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.250000 0.250000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.375000 0.500000 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.500000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.062500 +vt 0.250000 0.187500 +vt 0.250000 0.062500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.500000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.062500 +vt 0.250000 0.062500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.500000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.062500 +vt 0.250000 0.062500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.375000 0.500000 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.500000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.062500 +vt 0.250000 0.187500 +vt 0.250000 0.062500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.812500 0.500000 +vt 0.656250 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.812500 0.500000 +vt 0.968750 1.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 -0.000000 +vt 0.250000 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.187500 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.812500 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.812500 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.812500 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.812500 0.468750 +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.7071 -0.7071 0.0000 +vn -0.7071 -0.7071 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_Body +s off +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 7/5/2 3/6/2 +f 8/7/3 5/8/3 7/9/3 +f 6/10/4 1/11/4 5/12/4 +f 7/13/5 1/14/5 3/15/5 +f 4/16/6 6/17/6 8/7/6 +f 199/18/1 194/19/1 9/20/1 +f 196/21/4 9/22/4 195/23/4 +f 197/24/5 9/25/5 194/26/5 +f 11/27/1 12/28/1 10/29/1 +f 13/30/2 16/31/2 12/32/2 +f 17/33/3 14/34/3 16/35/3 +f 15/36/4 10/37/4 14/38/4 +f 13/39/6 15/40/6 17/41/6 +f 23/42/2 21/43/2 19/44/2 +f 24/45/7 20/46/7 21/43/7 +f 25/47/4 18/48/4 20/49/4 +f 29/50/2 31/51/2 27/52/2 +f 28/53/8 32/54/8 29/50/8 +f 26/55/4 33/56/4 28/57/4 +f 35/58/4 40/59/4 39/60/4 +f 36/61/7 40/59/7 37/62/7 +f 34/63/2 41/64/2 36/65/2 +f 47/66/4 45/67/4 43/68/4 +f 48/69/8 44/70/8 45/67/8 +f 44/71/2 46/72/2 42/73/2 +f 131/74/3 132/75/3 130/76/3 +f 133/77/4 136/78/4 132/79/4 +f 137/80/1 134/81/1 136/82/1 +f 135/83/2 130/84/2 134/85/2 +f 136/86/5 130/87/5 132/88/5 +f 133/89/6 135/90/6 137/91/6 +f 148/92/3 147/93/3 146/94/3 +f 152/95/2 149/96/2 148/97/2 +f 150/98/1 153/99/1 152/100/1 +f 146/101/4 151/102/4 150/103/4 +f 146/104/5 152/105/5 148/106/5 +f 151/107/6 149/108/6 153/109/6 +f 164/110/3 163/111/3 162/112/3 +f 168/113/2 165/114/2 164/115/2 +f 166/116/1 169/117/1 168/118/1 +f 162/119/4 167/120/4 166/121/4 +f 162/122/5 168/123/5 164/124/5 +f 167/125/6 165/126/6 169/127/6 +f 179/128/3 180/129/3 178/130/3 +f 181/131/4 184/132/4 180/133/4 +f 185/134/1 182/135/1 184/136/1 +f 183/137/2 178/138/2 182/139/2 +f 184/140/5 178/141/5 180/142/5 +f 181/143/6 183/144/6 185/145/6 +f 194/146/2 198/147/2 197/148/2 +f 197/149/3 196/150/3 195/151/3 +f 199/152/6 198/153/6 200/154/6 +f 2/1/1 4/155/1 3/2/1 +f 4/4/2 8/156/2 7/5/2 +f 8/7/3 6/17/3 5/8/3 +f 6/10/4 2/157/4 1/11/4 +f 7/13/5 5/158/5 1/14/5 +f 4/16/6 2/159/6 6/17/6 +f 199/18/1 200/160/1 194/19/1 +f 196/21/4 199/161/4 9/22/4 +f 197/24/5 195/162/5 9/25/5 +f 11/27/1 13/163/1 12/28/1 +f 13/30/2 17/164/2 16/31/2 +f 17/33/3 15/165/3 14/34/3 +f 15/36/4 11/166/4 10/37/4 +f 13/39/6 11/167/6 15/40/6 +f 23/42/2 24/45/2 21/43/2 +f 24/45/7 25/168/7 20/46/7 +f 25/47/4 22/169/4 18/48/4 +f 29/50/2 32/54/2 31/51/2 +f 28/53/8 33/170/8 32/54/8 +f 26/55/4 30/171/4 33/56/4 +f 35/58/4 37/62/4 40/59/4 +f 36/61/7 41/172/7 40/59/7 +f 34/63/2 38/173/2 41/64/2 +f 47/66/4 48/69/4 45/67/4 +f 48/69/8 49/174/8 44/70/8 +f 44/71/2 49/175/2 46/72/2 +f 131/74/3 133/176/3 132/75/3 +f 133/77/4 137/91/4 136/78/4 +f 137/80/1 135/83/1 134/81/1 +f 135/83/2 131/177/2 130/84/2 +f 136/86/5 134/178/5 130/87/5 +f 133/89/6 131/179/6 135/90/6 +f 148/92/3 149/180/3 147/93/3 +f 152/95/2 153/109/2 149/96/2 +f 150/98/1 151/102/1 153/99/1 +f 146/101/4 147/181/4 151/102/4 +f 146/104/5 150/182/5 152/105/5 +f 151/107/6 147/183/6 149/108/6 +f 164/110/3 165/184/3 163/111/3 +f 168/113/2 169/127/2 165/114/2 +f 166/116/1 167/120/1 169/117/1 +f 162/119/4 163/185/4 167/120/4 +f 162/122/5 166/186/5 168/123/5 +f 167/125/6 163/187/6 165/126/6 +f 179/128/3 181/188/3 180/129/3 +f 181/131/4 185/145/4 184/132/4 +f 185/134/1 183/137/1 182/135/1 +f 183/137/2 179/189/2 178/138/2 +f 184/140/5 182/190/5 178/141/5 +f 181/143/6 179/191/6 183/144/6 +f 194/146/2 200/192/2 198/147/2 +f 197/149/3 198/193/3 196/150/3 +f 199/152/6 196/194/6 198/153/6 +usemtl Bogey_Body_2 +f 51/195/3 52/196/3 50/197/3 +f 53/198/4 56/199/4 52/200/4 +f 57/201/1 54/202/1 56/203/1 +f 55/204/2 50/205/2 54/206/2 +f 52/207/5 54/208/5 50/209/5 +f 53/210/6 55/211/6 57/212/6 +f 60/213/1 59/214/1 58/215/1 +f 64/216/4 61/217/4 60/218/4 +f 62/219/3 65/220/3 64/221/3 +f 58/222/2 63/223/2 62/224/2 +f 60/225/5 62/226/5 64/227/5 +f 63/228/6 61/229/6 65/230/6 +f 67/231/3 68/232/3 66/233/3 +f 69/234/9 72/235/9 68/236/9 +f 73/237/1 70/238/1 72/239/1 +f 71/240/10 66/241/10 70/242/10 +f 72/243/11 66/244/11 68/245/11 +f 69/246/12 71/247/12 73/248/12 +f 76/249/1 75/250/1 74/251/1 +f 80/252/9 77/253/9 76/254/9 +f 78/255/3 81/256/3 80/257/3 +f 74/258/10 79/259/10 78/260/10 +f 74/261/11 80/262/11 76/263/11 +f 79/264/12 77/265/12 81/266/12 +f 84/267/3 83/268/3 82/269/3 +f 88/270/11 85/271/11 84/272/11 +f 86/273/1 89/274/1 88/275/1 +f 82/276/12 87/277/12 86/278/12 +f 82/279/9 88/280/9 84/281/9 +f 87/282/10 85/283/10 89/284/10 +f 91/285/1 92/286/1 90/287/1 +f 93/288/11 96/289/11 92/290/11 +f 97/291/3 94/292/3 96/293/3 +f 95/294/12 90/295/12 94/296/12 +f 96/297/9 90/298/9 92/299/9 +f 93/300/10 95/301/10 97/302/10 +f 102/303/10 101/304/10 99/305/10 +f 105/306/3 100/307/3 101/308/3 +f 104/309/9 98/310/9 100/311/9 +f 104/312/12 102/313/12 103/314/12 +f 103/315/1 99/305/1 98/316/1 +f 109/317/10 110/318/10 107/319/10 +f 108/320/1 113/321/1 109/322/1 +f 106/323/9 112/324/9 108/325/9 +f 110/326/12 112/327/12 111/328/12 +f 107/319/3 111/329/3 106/330/3 +f 117/331/12 118/332/12 115/333/12 +f 116/334/3 121/335/3 117/336/3 +f 114/337/11 120/338/11 116/339/11 +f 118/340/10 120/341/10 119/342/10 +f 115/333/1 119/343/1 114/344/1 +f 126/345/12 125/346/12 123/347/12 +f 129/348/1 124/349/1 125/350/1 +f 128/351/11 122/352/11 124/353/11 +f 128/354/10 126/355/10 127/356/10 +f 127/357/3 123/347/3 122/358/3 +f 51/195/3 53/210/3 52/196/3 +f 53/198/4 57/359/4 56/199/4 +f 57/201/1 55/360/1 54/202/1 +f 55/204/2 51/361/2 50/205/2 +f 52/207/5 56/362/5 54/208/5 +f 53/210/6 51/195/6 55/211/6 +f 60/213/1 61/229/1 59/214/1 +f 64/216/4 65/363/4 61/217/4 +f 62/219/3 63/364/3 65/220/3 +f 58/222/2 59/365/2 63/223/2 +f 60/225/5 58/366/5 62/226/5 +f 63/228/6 59/214/6 61/229/6 +f 67/231/3 69/367/3 68/232/3 +f 69/234/9 73/368/9 72/235/9 +f 73/237/1 71/369/1 70/238/1 +f 71/240/10 67/370/10 66/241/10 +f 72/243/11 70/371/11 66/244/11 +f 69/246/12 67/372/12 71/247/12 +f 76/249/1 77/373/1 75/250/1 +f 80/252/9 81/374/9 77/253/9 +f 78/255/3 79/375/3 81/256/3 +f 74/258/10 75/376/10 79/259/10 +f 74/261/11 78/377/11 80/262/11 +f 79/264/12 75/378/12 77/265/12 +f 84/267/3 85/379/3 83/268/3 +f 88/270/11 89/380/11 85/271/11 +f 86/273/1 87/381/1 89/274/1 +f 82/276/12 83/382/12 87/277/12 +f 82/279/9 86/383/9 88/280/9 +f 87/282/10 83/384/10 85/283/10 +f 91/285/1 93/385/1 92/286/1 +f 93/288/11 97/386/11 96/289/11 +f 97/291/3 95/387/3 94/292/3 +f 95/294/12 91/388/12 90/295/12 +f 96/297/9 94/389/9 90/298/9 +f 93/300/10 91/390/10 95/301/10 +f 102/303/10 105/391/10 101/304/10 +f 105/306/3 104/392/3 100/307/3 +f 104/309/9 103/393/9 98/310/9 +f 104/312/12 105/394/12 102/313/12 +f 103/315/1 102/303/1 99/305/1 +f 109/317/10 113/395/10 110/318/10 +f 108/320/1 112/396/1 113/321/1 +f 106/323/9 111/397/9 112/324/9 +f 110/326/12 113/398/12 112/327/12 +f 107/319/3 110/318/3 111/329/3 +f 117/331/12 121/399/12 118/332/12 +f 116/334/3 120/400/3 121/335/3 +f 114/337/11 119/401/11 120/338/11 +f 118/340/10 121/402/10 120/341/10 +f 115/333/1 118/332/1 119/343/1 +f 126/345/12 129/403/12 125/346/12 +f 129/348/1 128/404/1 124/349/1 +f 128/351/11 127/405/11 122/352/11 +f 128/354/10 129/406/10 126/355/10 +f 127/357/3 126/345/3 123/347/3 +usemtl wheel_Large +f 139/407/1 140/408/1 138/409/1 +f 141/410/2 144/411/2 140/412/2 +f 145/413/3 142/414/3 144/415/3 +f 143/416/4 138/417/4 142/418/4 +f 141/419/6 143/416/6 145/420/6 +f 156/421/1 155/422/1 154/423/1 +f 160/424/4 157/425/4 156/426/4 +f 158/427/3 161/428/3 160/429/3 +f 154/430/2 159/431/2 158/432/2 +f 159/431/6 157/433/6 161/434/6 +f 172/435/1 171/436/1 170/437/1 +f 176/438/4 173/439/4 172/440/4 +f 174/441/3 177/442/3 176/443/3 +f 170/444/2 175/445/2 174/446/2 +f 175/445/6 173/447/6 177/448/6 +f 187/449/1 188/450/1 186/451/1 +f 189/452/2 192/453/2 188/454/2 +f 193/455/3 190/456/3 192/457/3 +f 191/458/4 186/459/4 190/460/4 +f 189/461/6 191/458/6 193/462/6 +f 139/407/1 141/463/1 140/408/1 +f 141/410/2 145/464/2 144/411/2 +f 145/413/3 143/465/3 142/414/3 +f 143/416/4 139/466/4 138/417/4 +f 141/419/6 139/467/6 143/416/6 +f 156/421/1 157/468/1 155/422/1 +f 160/424/4 161/469/4 157/425/4 +f 158/427/3 159/470/3 161/428/3 +f 154/430/2 155/471/2 159/431/2 +f 159/431/6 155/472/6 157/433/6 +f 172/435/1 173/473/1 171/436/1 +f 176/438/4 177/474/4 173/439/4 +f 174/441/3 175/475/3 177/442/3 +f 170/444/2 171/476/2 175/445/2 +f 175/445/6 171/477/6 173/447/6 +f 187/449/1 189/478/1 188/450/1 +f 189/452/2 193/479/2 192/453/2 +f 193/455/3 191/480/3 190/456/3 +f 191/458/4 187/481/4 186/459/4 +f 189/461/6 187/482/6 191/458/6 diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_wheel.json b/src/main/resources/assets/create/models/block/track/bogey/bogey_wheel.json new file mode 100644 index 000000000..fd8f602ff --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_wheel.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/track/bogey/textures", + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/bogey/bogey_wheel.obj" +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_wheel.mtl b/src/main/resources/assets/create/models/block/track/bogey/bogey_wheel.mtl new file mode 100644 index 000000000..2231cc2c3 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_wheel.mtl @@ -0,0 +1,35 @@ +# Blender MTL File: 'Bogey.blend' +# Material Count: 3 + +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 #axis + +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 #axis_top + +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 #wheel diff --git a/src/main/resources/assets/create/models/block/track/bogey/bogey_wheel.obj b/src/main/resources/assets/create/models/block/track/bogey/bogey_wheel.obj new file mode 100644 index 000000000..cac78604a --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/bogey_wheel.obj @@ -0,0 +1,870 @@ +# Blender v3.0.1 OBJ File: 'Bogey.blend' +# www.blender.org +mtllib bogey_wheel.mtl +o Cube.029_Cube.049 +v 0.750000 0.449926 0.000000 +v 1.062500 0.387426 0.160477 +v 1.062500 0.387426 0.000000 +v 0.750000 0.318146 0.318146 +v 0.875000 0.160477 0.387426 +v 0.875000 0.186365 0.449926 +v 1.062500 0.160477 0.387426 +v 1.062500 0.273951 0.273951 +v 0.875000 0.387426 0.160477 +v 0.875000 0.449926 0.186365 +v 0.750000 0.449926 0.186365 +v 0.750000 0.000000 0.449926 +v 0.875000 -0.186365 0.449926 +v 1.062500 0.000000 0.387426 +v 0.750000 0.186365 0.449926 +v 0.750000 -0.318145 0.318146 +v 1.062500 -0.387426 0.160477 +v 1.062500 -0.273951 0.273951 +v 0.875000 -0.160477 0.387426 +v 1.062500 -0.160477 0.387426 +v 0.750000 -0.186365 0.449926 +v 0.750000 -0.449926 0.000000 +v 1.062500 -0.387426 0.000000 +v 0.875000 -0.387426 0.160477 +v 0.875000 -0.449926 0.186365 +v 0.750000 -0.449926 0.186365 +v 0.750000 -0.318145 -0.318146 +v 0.875000 -0.186365 -0.449926 +v 1.062500 -0.273951 -0.273951 +v 0.875000 -0.387426 -0.160477 +v 0.875000 -0.449926 -0.186365 +v 1.062500 -0.387426 -0.160477 +v 0.750000 -0.449926 -0.186365 +v 0.750000 0.000000 -0.449926 +v 0.875000 0.160477 -0.387426 +v 1.062500 0.160477 -0.387426 +v 0.750000 0.186365 -0.449926 +v 1.062500 0.000000 -0.387426 +v 0.875000 -0.160477 -0.387426 +v 1.062500 -0.160477 -0.387426 +v 0.750000 -0.186365 -0.449926 +v 0.750000 0.318146 -0.318146 +v 0.875000 0.387426 -0.160477 +v 0.875000 0.449926 -0.186365 +v 1.062500 0.387426 -0.160477 +v 0.750000 -0.000000 0.000000 +v 0.750000 0.449926 -0.186365 +v 1.062500 -0.000000 0.000000 +v 1.062500 0.273951 -0.273951 +v 0.875000 0.186365 -0.449926 +v 1.187500 -0.125000 -0.125000 +v 1.187500 0.125000 -0.125000 +v 1.187500 -0.125000 0.124999 +v 1.187500 0.125000 0.124999 +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 -0.750000 0.449926 0.000000 +v -1.062500 0.387426 0.160477 +v -1.062500 0.387426 0.000000 +v -0.750000 0.318146 0.318146 +v -0.875000 0.160477 0.387426 +v -0.875000 0.186365 0.449926 +v -1.062500 0.160477 0.387426 +v -1.062500 0.273951 0.273951 +v -0.875000 0.387426 0.160477 +v -0.875000 0.449926 0.186365 +v -0.750000 0.449926 0.186365 +v -0.750000 0.000000 0.449926 +v -0.875000 -0.186365 0.449926 +v -1.062500 0.000000 0.387426 +v -0.750000 0.186365 0.449926 +v -0.750000 -0.318145 0.318146 +v -1.062500 -0.387426 0.160477 +v -1.062500 -0.273951 0.273951 +v -0.875000 -0.160477 0.387426 +v -1.062500 -0.160477 0.387426 +v -0.750000 -0.186365 0.449926 +v -0.750000 -0.449926 0.000000 +v -1.062500 -0.387426 0.000000 +v -0.875000 -0.387426 0.160477 +v -0.875000 -0.449926 0.186365 +v -0.750000 -0.449926 0.186365 +v -0.750000 -0.318145 -0.318146 +v -0.875000 -0.186365 -0.449926 +v -1.062500 -0.273951 -0.273951 +v -0.875000 -0.387426 -0.160477 +v -0.875000 -0.449926 -0.186365 +v -1.062500 -0.387426 -0.160477 +v -0.750000 -0.449926 -0.186365 +v -0.750000 0.000000 -0.449926 +v -0.875000 0.160477 -0.387426 +v -1.062500 0.160477 -0.387426 +v -0.750000 0.186365 -0.449926 +v -1.062500 0.000000 -0.387426 +v -0.875000 -0.160477 -0.387426 +v -1.062500 -0.160477 -0.387426 +v -0.750000 -0.186365 -0.449926 +v -0.750000 0.318146 -0.318146 +v -0.875000 0.387426 -0.160477 +v -0.875000 0.449926 -0.186365 +v -1.062500 0.387426 -0.160477 +v -0.750000 -0.000000 0.000000 +v -0.750000 0.449926 -0.186365 +v -1.062500 -0.000000 0.000000 +v -1.062500 0.273951 -0.273951 +v -0.875000 0.186365 -0.449926 +v -1.187500 -0.125000 -0.125000 +v -1.187500 0.125000 -0.125000 +v -1.187500 -0.125000 0.124999 +v -1.187500 0.125000 0.124999 +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 0.875000 0.387426 0.000000 +v 0.875000 0.449926 0.000000 +v 0.875000 0.273951 0.273951 +v 0.875000 0.318146 0.318146 +v 0.875000 0.000000 0.387426 +v 0.875000 0.000000 0.449926 +v 0.875000 -0.273951 0.273951 +v 0.875000 -0.318145 0.318146 +v 0.875000 -0.387426 -0.000000 +v 0.875000 -0.449926 0.000000 +v 0.875000 -0.273951 -0.273951 +v 0.875000 -0.318145 -0.318145 +v 0.875000 0.000000 -0.387426 +v 0.875000 0.000000 -0.449926 +v 0.875000 0.273951 -0.273951 +v 0.875000 0.318146 -0.318145 +v -0.875000 0.000000 0.387426 +v -0.875000 0.000000 0.449926 +v -0.875000 0.273951 0.273951 +v -0.875000 0.318146 0.318146 +v -0.875000 0.387426 0.000000 +v -0.875000 0.449926 0.000000 +v -0.875000 0.273951 -0.273951 +v -0.875000 0.318146 -0.318145 +v -0.875000 0.000000 -0.387426 +v -0.875000 0.000000 -0.449926 +v -0.875000 -0.273951 -0.273951 +v -0.875000 -0.318145 -0.318145 +v -0.875000 -0.387426 -0.000000 +v -0.875000 -0.449926 0.000000 +v -0.875000 -0.273951 0.273951 +v -0.875000 -0.318145 0.318146 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.625000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.000000 +vt 0.625000 0.375000 +vt 0.375000 0.625000 +vt 0.375000 0.375000 +vt 0.375000 0.625000 +vt 0.625000 0.375000 +vt 0.375000 0.375000 +vt 0.625000 0.625000 +vt 0.625000 0.625000 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.593750 +vt 0.812500 0.781250 +vt 0.812500 0.562500 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.731773 0.843750 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.593750 +vt 0.812500 0.562500 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.906250 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.906250 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.906250 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.893227 0.656250 +vt 0.893227 0.843750 +vt 0.812500 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.843750 +vt 0.812500 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.718750 1.000000 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.718750 1.000000 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.843750 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.843750 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.843750 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.812500 1.000000 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.906250 0.937500 +vt 0.718750 0.687500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 0.937500 +vt 0.718750 0.687500 +vt 0.812500 0.937500 +vt 0.906250 0.937500 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.843750 +vt 0.812500 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.843750 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.843750 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.812500 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +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 00_Shaft +s off +f 58/1/1 51/2/1 57/3/1 +f 54/4/2 58/5/2 56/6/2 +f 55/7/3 51/8/3 53/9/3 +f 54/10/4 55/11/4 53/12/4 +f 109/13/1 116/14/1 115/15/1 +f 116/16/2 112/17/2 114/18/2 +f 109/19/3 113/20/3 111/21/3 +f 113/22/4 112/23/4 111/24/4 +f 58/1/1 52/25/1 51/2/1 +f 54/4/2 52/26/2 58/5/2 +f 55/7/3 57/27/3 51/8/3 +f 54/10/4 56/28/4 55/11/4 +f 109/13/1 110/29/1 116/14/1 +f 116/16/2 110/30/2 112/17/2 +f 109/19/3 115/31/3 113/20/3 +f 113/22/4 114/32/4 112/23/4 +usemtl 00_Shaft_end +f 52/33/5 53/34/5 51/35/5 +f 111/36/6 110/37/6 109/38/6 +f 52/33/5 54/39/5 53/34/5 +f 111/36/6 112/40/6 110/37/6 +usemtl wheel_Large +f 44/41/2 1/42/2 118/43/2 +f 118/44/5 9/45/5 117/46/5 +f 2/47/5 48/48/5 3/49/5 +f 46/50/6 11/51/6 1/52/6 +f 45/53/5 3/49/5 48/48/5 +f 46/50/6 1/52/6 47/54/6 +f 3/55/2 9/56/2 2/57/2 +f 120/58/7 11/59/7 4/60/7 +f 120/61/5 5/62/5 119/63/5 +f 7/64/5 48/48/5 8/65/5 +f 46/50/6 15/66/6 4/67/6 +f 2/68/5 8/65/5 48/48/5 +f 46/50/6 4/67/6 11/69/6 +f 8/70/7 5/71/7 7/72/7 +f 6/73/4 12/74/4 122/75/4 +f 122/76/5 19/77/5 121/78/5 +f 20/79/5 48/48/5 14/80/5 +f 46/50/6 21/81/6 12/82/6 +f 7/83/5 14/80/5 48/48/5 +f 46/50/6 12/82/6 15/84/6 +f 121/85/4 20/86/4 14/87/4 +f 124/88/8 21/89/8 16/90/8 +f 124/91/5 24/92/5 123/93/5 +f 17/94/5 48/48/5 18/95/5 +f 46/50/6 26/96/6 16/97/6 +f 20/98/5 18/95/5 48/48/5 +f 46/50/6 16/97/6 21/99/6 +f 18/100/8 24/101/8 17/102/8 +f 126/103/3 26/104/3 22/105/3 +f 126/106/5 30/107/5 125/108/5 +f 32/109/5 48/48/5 23/110/5 +f 46/50/6 33/111/6 22/112/6 +f 17/113/5 23/110/5 48/48/5 +f 46/50/6 22/112/6 26/114/6 +f 125/115/3 32/116/3 23/117/3 +f 31/118/9 27/119/9 128/120/9 +f 128/121/5 39/122/5 127/123/5 +f 40/124/5 48/48/5 29/125/5 +f 46/50/6 41/126/6 27/127/6 +f 32/128/5 29/125/5 48/48/5 +f 46/50/6 27/127/6 33/129/6 +f 127/130/9 40/131/9 29/132/9 +f 28/133/1 34/134/1 130/135/1 +f 130/136/5 35/137/5 129/138/5 +f 36/139/5 48/48/5 38/140/5 +f 46/50/6 37/141/6 34/142/6 +f 40/143/5 38/140/5 48/48/5 +f 46/50/6 34/142/6 41/144/6 +f 129/145/1 36/146/1 38/147/1 +f 132/148/10 37/149/10 42/150/10 +f 132/151/5 43/152/5 131/153/5 +f 45/154/5 48/48/5 49/155/5 +f 46/50/6 47/156/6 42/157/6 +f 36/158/5 49/155/5 48/48/5 +f 46/50/6 42/157/6 37/159/6 +f 131/160/10 45/161/10 49/162/10 +f 59/163/2 102/164/2 138/165/2 +f 67/166/6 138/167/6 137/168/6 +f 60/169/6 61/170/6 106/171/6 +f 104/172/5 59/173/5 69/174/5 +f 103/175/6 106/171/6 61/170/6 +f 104/172/5 105/176/5 59/173/5 +f 61/177/2 67/178/2 137/179/2 +f 136/180/7 69/181/7 68/182/7 +f 63/183/6 136/184/6 135/185/6 +f 65/186/6 66/187/6 106/171/6 +f 104/172/5 62/188/5 73/189/5 +f 60/190/6 106/171/6 66/187/6 +f 104/172/5 69/191/5 62/188/5 +f 66/192/7 63/193/7 135/194/7 +f 70/195/4 64/196/4 134/197/4 +f 77/198/6 134/199/6 133/200/6 +f 78/201/6 72/202/6 106/171/6 +f 104/172/5 70/203/5 79/204/5 +f 65/205/6 106/171/6 72/202/6 +f 104/172/5 73/206/5 70/203/5 +f 78/207/4 133/208/4 72/209/4 +f 74/210/8 71/211/8 148/212/8 +f 82/213/6 148/214/6 147/215/6 +f 75/216/6 76/217/6 106/171/6 +f 104/172/5 74/218/5 84/219/5 +f 78/220/6 106/171/6 76/217/6 +f 104/172/5 79/221/5 74/218/5 +f 76/222/8 82/223/8 147/224/8 +f 146/225/3 84/226/3 83/227/3 +f 88/228/6 146/229/6 145/230/6 +f 90/231/6 81/232/6 106/171/6 +f 104/172/5 80/233/5 91/234/5 +f 75/235/6 106/171/6 81/232/6 +f 104/172/5 84/236/5 80/233/5 +f 90/237/3 145/238/3 81/239/3 +f 85/240/9 89/241/9 144/242/9 +f 97/243/6 144/244/6 143/245/6 +f 98/246/6 87/247/6 106/171/6 +f 104/172/5 85/248/5 99/249/5 +f 90/250/6 106/171/6 87/247/6 +f 104/172/5 91/251/5 85/248/5 +f 98/252/9 143/253/9 87/254/9 +f 92/255/1 86/256/1 142/257/1 +f 93/258/6 142/259/6 141/260/6 +f 94/261/6 96/262/6 106/171/6 +f 104/172/5 92/263/5 95/264/5 +f 98/265/6 106/171/6 96/262/6 +f 104/172/5 99/266/5 92/263/5 +f 94/267/1 141/268/1 96/269/1 +f 140/270/10 95/271/10 108/272/10 +f 101/273/6 140/274/6 139/275/6 +f 103/276/6 107/277/6 106/171/6 +f 104/172/5 100/278/5 105/279/5 +f 94/280/6 106/171/6 107/277/6 +f 104/172/5 95/281/5 100/278/5 +f 103/282/10 139/283/10 107/284/10 +f 43/285/5 118/44/5 117/46/5 +f 45/286/2 117/287/2 3/55/2 +f 118/43/2 11/288/2 10/289/2 +f 9/290/5 120/61/5 119/63/5 +f 2/291/7 119/292/7 8/70/7 +f 120/58/7 15/293/7 6/294/7 +f 5/295/5 122/76/5 121/78/5 +f 5/296/4 14/87/4 7/297/4 +f 122/75/4 21/298/4 13/299/4 +f 19/300/5 124/91/5 123/93/5 +f 19/301/8 18/100/8 20/302/8 +f 124/88/8 26/303/8 25/304/8 +f 24/305/5 126/106/5 125/108/5 +f 24/306/3 23/117/3 17/307/3 +f 31/308/3 22/105/3 33/309/3 +f 30/310/5 128/121/5 127/123/5 +f 30/311/9 29/132/9 32/312/9 +f 128/120/9 41/313/9 28/314/9 +f 39/315/5 130/136/5 129/138/5 +f 39/316/1 38/147/1 40/317/1 +f 50/318/1 34/134/1 37/319/1 +f 36/320/10 131/160/10 49/162/10 +f 132/148/10 47/321/10 44/322/10 +f 63/323/6 134/199/6 64/324/6 +f 72/209/4 63/325/4 65/326/4 +f 79/327/4 134/197/4 71/328/4 +f 67/329/6 136/184/6 68/330/6 +f 60/331/7 135/194/7 67/332/7 +f 73/333/7 136/180/7 64/334/7 +f 101/335/6 138/167/6 102/336/6 +f 103/337/2 137/179/2 101/338/2 +f 69/339/2 138/165/2 68/340/2 +f 93/341/6 140/274/6 108/342/6 +f 94/343/10 139/283/10 93/344/10 +f 105/345/10 140/270/10 102/346/10 +f 97/347/6 142/259/6 86/348/6 +f 96/269/1 97/349/1 98/350/1 +f 108/351/1 92/255/1 142/257/1 +f 88/352/6 144/244/6 89/353/6 +f 87/254/9 88/354/9 90/355/9 +f 99/356/9 144/242/9 86/357/9 +f 82/358/6 146/229/6 83/359/6 +f 81/239/3 82/360/3 75/361/3 +f 89/362/3 80/363/3 146/225/3 +f 77/364/6 148/214/6 71/365/6 +f 76/222/8 77/366/8 78/367/8 +f 84/368/8 148/212/8 83/369/8 +f 44/41/2 47/370/2 1/42/2 +f 118/44/5 10/371/5 9/45/5 +f 3/55/2 117/287/2 9/56/2 +f 120/58/7 10/372/7 11/59/7 +f 120/61/5 6/373/5 5/62/5 +f 8/70/7 119/292/7 5/71/7 +f 6/73/4 15/374/4 12/74/4 +f 122/76/5 13/375/5 19/77/5 +f 121/85/4 19/376/4 20/86/4 +f 124/88/8 13/377/8 21/89/8 +f 124/91/5 25/378/5 24/92/5 +f 18/100/8 123/379/8 24/101/8 +f 126/103/3 25/380/3 26/104/3 +f 126/106/5 31/381/5 30/107/5 +f 125/115/3 30/382/3 32/116/3 +f 31/118/9 33/383/9 27/119/9 +f 128/121/5 28/384/5 39/122/5 +f 127/130/9 39/385/9 40/131/9 +f 28/133/1 41/386/1 34/134/1 +f 130/136/5 50/387/5 35/137/5 +f 129/145/1 35/388/1 36/146/1 +f 132/148/10 50/389/10 37/149/10 +f 131/153/5 35/390/5 132/151/5 +f 35/390/5 50/391/5 132/151/5 +f 132/151/5 44/392/5 43/152/5 +f 131/160/10 43/393/10 45/161/10 +f 59/163/2 105/394/2 102/164/2 +f 67/166/6 68/395/6 138/167/6 +f 61/177/2 60/396/2 67/178/2 +f 136/180/7 62/397/7 69/181/7 +f 63/183/6 64/398/6 136/184/6 +f 66/192/7 65/399/7 63/193/7 +f 70/195/4 73/400/4 64/196/4 +f 77/198/6 71/401/6 134/199/6 +f 78/207/4 77/402/4 133/208/4 +f 74/210/8 79/403/8 71/211/8 +f 82/213/6 83/404/6 148/214/6 +f 76/222/8 75/405/8 82/223/8 +f 146/225/3 80/363/3 84/226/3 +f 88/228/6 89/406/6 146/229/6 +f 90/237/3 88/407/3 145/238/3 +f 85/240/9 91/408/9 89/241/9 +f 97/243/6 86/409/6 144/244/6 +f 98/252/9 97/410/9 143/253/9 +f 92/255/1 99/411/1 86/256/1 +f 93/258/6 108/412/6 142/259/6 +f 94/267/1 93/413/1 141/268/1 +f 140/270/10 100/414/10 95/271/10 +f 101/273/6 102/415/6 140/274/6 +f 103/282/10 101/416/10 139/283/10 +f 43/285/5 44/417/5 118/44/5 +f 45/286/2 43/418/2 117/287/2 +f 118/43/2 1/42/2 11/288/2 +f 9/290/5 10/419/5 120/61/5 +f 2/291/7 9/420/7 119/292/7 +f 120/58/7 4/60/7 15/293/7 +f 5/295/5 6/421/5 122/76/5 +f 5/296/4 121/85/4 14/87/4 +f 122/75/4 12/74/4 21/298/4 +f 19/300/5 13/422/5 124/91/5 +f 19/301/8 123/379/8 18/100/8 +f 124/88/8 16/90/8 26/303/8 +f 24/305/5 25/423/5 126/106/5 +f 24/306/3 125/115/3 23/117/3 +f 31/308/3 126/103/3 22/105/3 +f 30/310/5 31/424/5 128/121/5 +f 30/311/9 127/130/9 29/132/9 +f 128/120/9 27/119/9 41/313/9 +f 39/315/5 28/425/5 130/136/5 +f 39/316/1 129/145/1 38/147/1 +f 50/318/1 130/135/1 34/134/1 +f 36/320/10 35/426/10 131/160/10 +f 132/148/10 42/150/10 47/321/10 +f 63/323/6 133/200/6 134/199/6 +f 72/209/4 133/208/4 63/325/4 +f 79/327/4 70/195/4 134/197/4 +f 67/329/6 135/185/6 136/184/6 +f 60/331/7 66/192/7 135/194/7 +f 73/333/7 62/397/7 136/180/7 +f 101/335/6 137/168/6 138/167/6 +f 103/337/2 61/177/2 137/179/2 +f 69/339/2 59/163/2 138/165/2 +f 93/341/6 139/275/6 140/274/6 +f 94/343/10 107/284/10 139/283/10 +f 105/345/10 100/414/10 140/270/10 +f 97/347/6 141/260/6 142/259/6 +f 96/269/1 141/268/1 97/349/1 +f 108/351/1 95/427/1 92/255/1 +f 88/352/6 143/245/6 144/244/6 +f 87/254/9 143/253/9 88/354/9 +f 99/356/9 85/240/9 144/242/9 +f 82/358/6 145/230/6 146/229/6 +f 81/239/3 145/238/3 82/360/3 +f 89/362/3 91/428/3 80/363/3 +f 77/364/6 147/215/6 148/214/6 +f 76/222/8 147/224/8 77/366/8 +f 84/368/8 74/210/8 148/212/8 diff --git a/src/main/resources/assets/create/models/block/track/bogey/coupling_cable.json b/src/main/resources/assets/create/models/block/track/bogey/coupling_cable.json new file mode 100644 index 000000000..2072d4e45 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/coupling_cable.json @@ -0,0 +1,39 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:block/track/bogey/textures", + "textures": { + "0": "#wheel" + }, + "elements": [ + { + "from": [-1.5, -1.5, -2], + "to": [1.5, 1.5, 2], + "faces": { + "east": {"uv": [0, 10, 2, 12], "texture": "#0"}, + "west": {"uv": [0, 10, 2, 12], "texture": "#0"}, + "up": {"uv": [0, 10, 2, 12], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 10, 2, 12], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [-2, -2, -1], + "to": [2, 2, 1], + "faces": { + "east": {"uv": [2, 10, 3, 12], "texture": "#0"}, + "west": {"uv": [2, 10, 3, 12], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 10, 3, 12], "rotation": 270, "texture": "#0"}, + "down": {"uv": [2, 10, 3, 12], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [-2, -2, 1], + "to": [2, 2, -1], + "faces": { + "east": {"uv": [2, 10, 3, 12], "texture": "#0"}, + "west": {"uv": [2, 10, 3, 12], "rotation": 180, "texture": "#0"}, + "up": {"uv": [2, 10, 3, 12], "rotation": 270, "texture": "#0"}, + "down": {"uv": [2, 10, 3, 12], "rotation": 90, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/coupling_head.json b/src/main/resources/assets/create/models/block/track/bogey/coupling_head.json new file mode 100644 index 000000000..d87c536a9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/coupling_head.json @@ -0,0 +1,33 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:block/track/bogey/textures", + "textures": { + "0": "#wheel" + }, + "elements": [ + { + "from": [-3.5, -1.5, -3.5], + "to": [3.5, 1.5, 3.5], + "faces": { + "north": {"uv": [11, 11, 14.5, 12.5], "texture": "#0"}, + "east": {"uv": [11, 11, 14.5, 12.5], "texture": "#0"}, + "south": {"uv": [11, 11, 14.5, 12.5], "texture": "#0"}, + "west": {"uv": [11, 11, 14.5, 12.5], "texture": "#0"}, + "up": {"uv": [11, 12.5, 14.5, 16], "texture": "#0"}, + "down": {"uv": [11, 12.5, 14.5, 16], "texture": "#0"} + } + }, + { + "from": [-2.5, -2.5, -4.5], + "to": [2.5, 2.5, -2.5], + "faces": { + "north": {"uv": [8.5, 10, 11, 12.5], "texture": "#0"}, + "east": {"uv": [11.5, 10, 14, 11], "rotation": 90, "texture": "#0"}, + "south": {"uv": [8.5, 10, 11, 12.5], "texture": "#0"}, + "west": {"uv": [11.5, 10, 14, 11], "rotation": 270, "texture": "#0"}, + "up": {"uv": [11.5, 10, 14, 11], "texture": "#0"}, + "down": {"uv": [11.5, 10, 14, 11], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/bogey.mtl b/src/main/resources/assets/create/models/block/track/bogey/old/bogey.mtl new file mode 100644 index 000000000..470cba530 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/bogey.mtl @@ -0,0 +1,12 @@ +# 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 \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/bogey.obj b/src/main/resources/assets/create/models/block/track/bogey/old/bogey.obj new file mode 100644 index 000000000..35d3afbce --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/bogey.obj @@ -0,0 +1,6200 @@ +# Blender v3.0.1 OBJ File: 'Bogey.blend' +# www.blender.org +mtllib bogey.mtl +o Grid.001_Grid.002 +v 71.999977 0.000000 -88.000023 +v 55.999981 0.000000 -88.000015 +v 39.999977 0.000000 -88.000015 +v 23.999975 0.000000 -88.000008 +v 7.999976 0.000000 -88.000000 +v -8.000023 0.000000 -88.000000 +v -24.000027 0.000000 -87.999992 +v -40.000019 0.000000 -87.999985 +v -56.000027 0.000000 -87.999985 +v -72.000031 0.000000 -87.999977 +v 71.999985 0.000000 -72.000031 +v 55.999985 0.000000 -72.000023 +v 39.999981 0.000000 -72.000015 +v 23.999979 0.000000 -72.000015 +v 7.999981 0.000000 -72.000008 +v -8.000018 0.000000 -72.000000 +v -24.000023 0.000000 -72.000000 +v -40.000015 0.000000 -71.999992 +v -56.000023 0.000000 -71.999985 +v -72.000023 0.000000 -71.999985 +v 71.999985 0.000000 -56.000023 +v 55.999992 0.000000 -56.000019 +v 39.999989 0.000000 -56.000011 +v 23.999985 0.000000 -56.000008 +v 7.999987 0.000000 -56.000004 +v -8.000012 0.000000 -55.999996 +v -24.000017 0.000000 -55.999992 +v -40.000008 0.000000 -55.999989 +v -56.000015 0.000000 -55.999981 +v -72.000023 0.000000 -55.999977 +v 71.999992 0.000000 -40.000023 +v 55.999996 0.000000 -40.000015 +v 39.999992 0.000000 -40.000011 +v 23.999990 0.000000 -40.000008 +v 7.999992 0.000000 -40.000000 +v -8.000008 0.000000 -39.999996 +v -24.000011 0.000000 -39.999992 +v -40.000004 0.000000 -39.999985 +v -56.000011 0.000000 -39.999977 +v -72.000015 0.000000 -39.999977 +v 72.000000 0.000000 -24.000023 +v 56.000000 0.000000 -24.000019 +v 39.999996 0.000000 -24.000011 +v 23.999996 0.000000 -24.000008 +v 7.999997 0.000000 -24.000002 +v -8.000002 0.000000 -23.999996 +v -24.000006 0.000000 -23.999992 +v -40.000000 0.000000 -23.999987 +v -56.000008 0.000000 -23.999981 +v -72.000008 0.000000 -23.999977 +v 72.000000 0.000000 -8.000024 +v 56.000008 0.000000 -8.000019 +v 40.000004 0.000000 -8.000013 +v 24.000000 0.000000 -8.000008 +v 8.000002 0.000000 -8.000003 +v -7.999997 0.000000 -7.999998 +v -24.000002 0.000000 -7.999992 +v -39.999992 0.000000 -7.999988 +v -56.000000 0.000000 -7.999982 +v -72.000008 0.000000 -7.999977 +v 72.000008 0.000000 7.999981 +v 56.000011 0.000000 7.999985 +v 40.000008 0.000000 7.999990 +v 24.000006 0.000000 7.999996 +v 8.000008 0.000000 8.000002 +v -7.999992 0.000000 8.000006 +v -23.999996 0.000000 8.000011 +v -39.999989 0.000000 8.000017 +v -55.999996 0.000000 8.000023 +v -72.000000 0.000000 8.000027 +v 72.000015 0.000000 23.999973 +v 56.000015 0.000000 23.999977 +v 40.000011 0.000000 23.999985 +v 24.000011 0.000000 23.999989 +v 8.000012 0.000000 23.999992 +v -7.999987 0.000000 24.000000 +v -23.999990 0.000000 24.000004 +v -39.999985 0.000000 24.000008 +v -55.999992 0.000000 24.000015 +v -71.999992 0.000000 24.000019 +v 72.000015 0.000000 39.999981 +v 56.000023 0.000000 39.999985 +v 40.000019 0.000000 39.999992 +v 24.000017 0.000000 39.999996 +v 8.000018 0.000000 40.000000 +v -7.999981 0.000000 40.000008 +v -23.999985 0.000000 40.000011 +v -39.999977 0.000000 40.000015 +v -55.999985 0.000000 40.000023 +v -71.999992 0.000000 40.000027 +v 72.000023 0.000000 55.999985 +v 56.000027 0.000000 55.999992 +v 40.000023 0.000000 55.999992 +v 24.000021 0.000000 56.000000 +v 8.000023 0.000000 56.000008 +v -7.999976 0.000000 56.000008 +v -23.999981 0.000000 56.000015 +v -39.999973 0.000000 56.000023 +v -55.999981 0.000000 56.000023 +v -71.999985 0.000000 56.000031 +v 55.999981 -16.000000 -88.000015 +v 39.999977 -16.000000 -88.000015 +v -8.000023 -16.000000 -88.000000 +v -24.000027 -16.000000 -87.999992 +v -40.000019 -16.000000 -87.999985 +v -56.000027 -16.000000 -87.999985 +v -72.000031 -16.000000 -87.999977 +v 71.999985 -16.000000 -72.000031 +v -72.000023 -16.000000 -71.999985 +v 71.999985 -16.000000 -56.000023 +v -72.000015 -16.000000 -39.999977 +v 72.000000 -16.000000 -24.000023 +v -72.000008 -16.000000 -23.999977 +v 72.000008 -16.000000 7.999981 +v -72.000000 -16.000000 8.000027 +v 72.000015 -16.000000 39.999981 +v 72.000023 -16.000000 55.999985 +v 56.000027 -16.000000 55.999992 +v 40.000023 -16.000000 55.999992 +v 24.000021 -16.000000 56.000000 +v 8.000023 -16.000000 56.000008 +v -7.999976 -16.000000 56.000008 +v 71.999977 -16.000000 -88.000023 +v 23.999975 -16.000000 -88.000008 +v 7.999976 -16.000000 -88.000000 +v 55.999985 -16.000000 -72.000023 +v 39.999981 -16.000000 -72.000015 +v 23.999979 -16.000000 -72.000015 +v 7.999981 -16.000000 -72.000008 +v -8.000018 -16.000000 -72.000000 +v -24.000023 -16.000000 -72.000000 +v -40.000015 -16.000000 -71.999992 +v -56.000023 -16.000000 -71.999985 +v 55.999992 -16.000000 -56.000019 +v 39.999989 -16.000000 -56.000011 +v 23.999985 -16.000000 -56.000008 +v 7.999987 -16.000000 -56.000004 +v -8.000012 -16.000000 -55.999996 +v -24.000017 -16.000000 -55.999992 +v -40.000008 -16.000000 -55.999989 +v -56.000015 -16.000000 -55.999981 +v -72.000023 -16.000000 -55.999977 +v 71.999992 -16.000000 -40.000023 +v 55.999996 -16.000000 -40.000015 +v 39.999992 -16.000000 -40.000011 +v 23.999990 -16.000000 -40.000008 +v 7.999992 -16.000000 -40.000000 +v -8.000008 -16.000000 -39.999996 +v -24.000011 -16.000000 -39.999992 +v -40.000004 -16.000000 -39.999985 +v -56.000011 -16.000000 -39.999977 +v 56.000000 -16.000000 -24.000019 +v 39.999996 -16.000000 -24.000011 +v 23.999996 -16.000000 -24.000008 +v 7.999997 -16.000000 -24.000002 +v -8.000002 -16.000000 -23.999996 +v -24.000006 -16.000000 -23.999992 +v -40.000000 -16.000000 -23.999987 +v -56.000008 -16.000000 -23.999981 +v 72.000000 -16.000000 -8.000024 +v 56.000008 -16.000000 -8.000019 +v 40.000004 -16.000000 -8.000013 +v 24.000000 -16.000000 -8.000008 +v 8.000002 -16.000000 -8.000003 +v -7.999997 -16.000000 -7.999998 +v -24.000002 -16.000000 -7.999992 +v -39.999992 -16.000000 -7.999988 +v -56.000000 -16.000000 -7.999982 +v -72.000008 -16.000000 -7.999977 +v 56.000011 -16.000000 7.999985 +v 40.000008 -16.000000 7.999990 +v 24.000006 -16.000000 7.999996 +v 8.000008 -16.000000 8.000002 +v -7.999992 -16.000000 8.000006 +v -23.999996 -16.000000 8.000011 +v -39.999989 -16.000000 8.000017 +v -55.999996 -16.000000 8.000023 +v 72.000015 -16.000000 23.999973 +v 56.000015 -16.000000 23.999977 +v 40.000011 -16.000000 23.999985 +v 24.000011 -16.000000 23.999989 +v 8.000012 -16.000000 23.999992 +v -7.999987 -16.000000 24.000000 +v -23.999990 -16.000000 24.000004 +v -39.999985 -16.000000 24.000008 +v -55.999992 -16.000000 24.000015 +v -71.999992 -16.000000 24.000019 +v 56.000023 -16.000000 39.999985 +v 40.000019 -16.000000 39.999992 +v 24.000017 -16.000000 39.999996 +v 8.000018 -16.000000 40.000000 +v -7.999981 -16.000000 40.000008 +v -23.999985 -16.000000 40.000011 +v -39.999977 -16.000000 40.000015 +v -55.999985 -16.000000 40.000023 +v -71.999992 -16.000000 40.000027 +v -23.999981 -16.000000 56.000015 +v -39.999973 -16.000000 56.000023 +v -55.999981 -16.000000 56.000023 +v -71.999985 -16.000000 56.000031 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +usemtl Checker_White +s off +f 2/1/1 3/2/1 13/3/1 12/4/1 +f 4/5/1 5/6/1 15/7/1 14/8/1 +f 6/9/1 7/10/1 17/11/1 16/12/1 +f 8/13/1 9/14/1 19/15/1 18/16/1 +f 11/17/1 12/18/1 22/19/1 21/20/1 +f 13/21/1 14/22/1 24/23/1 23/24/1 +f 15/25/1 16/26/1 26/27/1 25/28/1 +f 17/29/1 18/30/1 28/31/1 27/32/1 +f 19/33/1 20/34/1 30/35/1 29/36/1 +f 22/37/1 23/38/1 33/39/1 32/40/1 +f 24/41/1 25/42/1 35/43/1 34/44/1 +f 26/45/1 27/46/1 37/47/1 36/48/1 +f 28/49/1 29/50/1 39/51/1 38/52/1 +f 31/53/1 32/54/1 42/55/1 41/56/1 +f 33/57/1 34/58/1 44/59/1 43/60/1 +f 35/61/1 36/62/1 46/63/1 45/64/1 +f 37/65/1 38/66/1 48/67/1 47/68/1 +f 39/69/1 40/70/1 50/71/1 49/72/1 +f 42/73/1 43/74/1 53/75/1 52/76/1 +f 44/77/1 45/78/1 55/79/1 54/80/1 +f 46/81/1 47/82/1 57/83/1 56/84/1 +f 48/85/1 49/86/1 59/87/1 58/88/1 +f 51/89/1 52/90/1 62/91/1 61/92/1 +f 53/93/1 54/94/1 64/95/1 63/96/1 +f 55/97/1 56/98/1 66/99/1 65/100/1 +f 57/101/1 58/102/1 68/103/1 67/104/1 +f 59/105/1 60/106/1 70/107/1 69/108/1 +f 62/109/1 63/110/1 73/111/1 72/112/1 +f 64/113/1 65/114/1 75/115/1 74/116/1 +f 66/117/1 67/118/1 77/119/1 76/120/1 +f 68/121/1 69/122/1 79/123/1 78/124/1 +f 71/125/1 72/126/1 82/127/1 81/128/1 +f 73/129/1 74/130/1 84/131/1 83/132/1 +f 75/133/1 76/134/1 86/135/1 85/136/1 +f 77/137/1 78/138/1 88/139/1 87/140/1 +f 79/141/1 80/142/1 90/143/1 89/144/1 +f 82/145/1 83/146/1 93/147/1 92/148/1 +f 84/149/1 85/150/1 95/151/1 94/152/1 +f 86/153/1 87/154/1 97/155/1 96/156/1 +f 88/157/1 89/158/1 99/159/1 98/160/1 +f 71/125/2 81/128/2 116/161/2 178/162/2 +f 94/152/3 95/151/3 121/163/3 120/164/3 +f 9/14/4 8/13/4 105/165/4 106/166/4 +f 5/6/4 4/5/4 124/167/4 125/168/4 +f 51/89/2 61/92/2 114/169/2 160/170/2 +f 90/143/5 80/142/5 187/171/5 196/172/5 +f 96/156/3 97/155/3 197/173/3 122/174/3 +f 31/53/2 41/56/2 112/175/2 143/176/2 +f 70/107/5 60/106/5 169/177/5 115/178/5 +f 11/17/2 21/20/2 110/179/2 108/180/2 +f 50/71/5 40/70/5 111/181/5 113/182/5 +f 7/10/4 6/9/4 103/183/4 104/184/4 +f 98/160/3 99/159/3 199/185/3 198/186/3 +f 3/2/4 2/1/4 101/187/4 102/188/4 +f 92/148/3 93/147/3 119/189/3 118/190/3 +f 30/35/5 20/34/5 109/191/5 142/192/5 +f 101/187/1 102/188/1 127/193/1 126/194/1 +f 124/167/1 125/168/1 129/195/1 128/196/1 +f 103/183/1 104/184/1 131/197/1 130/198/1 +f 105/165/1 106/166/1 133/199/1 132/200/1 +f 108/180/1 126/201/1 134/202/1 110/179/1 +f 127/203/1 128/204/1 136/205/1 135/206/1 +f 129/207/1 130/208/1 138/209/1 137/210/1 +f 131/211/1 132/212/1 140/213/1 139/214/1 +f 133/215/1 109/191/1 142/192/1 141/216/1 +f 134/217/1 135/218/1 145/219/1 144/220/1 +f 136/221/1 137/222/1 147/223/1 146/224/1 +f 138/225/1 139/226/1 149/227/1 148/228/1 +f 140/229/1 141/230/1 151/231/1 150/232/1 +f 143/176/1 144/233/1 152/234/1 112/175/1 +f 145/235/1 146/236/1 154/237/1 153/238/1 +f 147/239/1 148/240/1 156/241/1 155/242/1 +f 149/243/1 150/244/1 158/245/1 157/246/1 +f 151/247/1 111/181/1 113/182/1 159/248/1 +f 152/249/1 153/250/1 162/251/1 161/252/1 +f 154/253/1 155/254/1 164/255/1 163/256/1 +f 156/257/1 157/258/1 166/259/1 165/260/1 +f 158/261/1 159/262/1 168/263/1 167/264/1 +f 160/170/1 161/265/1 170/266/1 114/169/1 +f 162/267/1 163/268/1 172/269/1 171/270/1 +f 164/271/1 165/272/1 174/273/1 173/274/1 +f 166/275/1 167/276/1 176/277/1 175/278/1 +f 168/279/1 169/177/1 115/178/1 177/280/1 +f 170/281/1 171/282/1 180/283/1 179/284/1 +f 172/285/1 173/286/1 182/287/1 181/288/1 +f 174/289/1 175/290/1 184/291/1 183/292/1 +f 176/293/1 177/294/1 186/295/1 185/296/1 +f 178/162/1 179/297/1 188/298/1 116/161/1 +f 180/299/1 181/300/1 190/301/1 189/302/1 +f 182/303/1 183/304/1 192/305/1 191/306/1 +f 184/307/1 185/308/1 194/309/1 193/310/1 +f 186/311/1 187/171/1 196/172/1 195/312/1 +f 188/313/1 189/314/1 119/189/1 118/190/1 +f 190/315/1 191/316/1 121/163/1 120/164/1 +f 192/317/1 193/318/1 197/173/1 122/174/1 +f 194/319/1 195/320/1 199/185/1 198/186/1 +usemtl Checker_Black +f 1/321/1 2/322/1 12/323/1 11/324/1 +f 3/325/1 4/326/1 14/327/1 13/328/1 +f 5/329/1 6/330/1 16/331/1 15/332/1 +f 7/333/1 8/334/1 18/335/1 17/336/1 +f 9/337/1 10/338/1 20/339/1 19/340/1 +f 12/341/1 13/342/1 23/343/1 22/344/1 +f 14/345/1 15/346/1 25/347/1 24/348/1 +f 16/349/1 17/350/1 27/351/1 26/352/1 +f 18/353/1 19/354/1 29/355/1 28/356/1 +f 21/357/1 22/358/1 32/359/1 31/360/1 +f 23/361/1 24/362/1 34/363/1 33/364/1 +f 25/365/1 26/366/1 36/367/1 35/368/1 +f 27/369/1 28/370/1 38/371/1 37/372/1 +f 29/373/1 30/374/1 40/375/1 39/376/1 +f 32/377/1 33/378/1 43/379/1 42/380/1 +f 34/381/1 35/382/1 45/383/1 44/384/1 +f 36/385/1 37/386/1 47/387/1 46/388/1 +f 38/389/1 39/390/1 49/391/1 48/392/1 +f 41/393/1 42/394/1 52/395/1 51/396/1 +f 43/397/1 44/398/1 54/399/1 53/400/1 +f 45/401/1 46/402/1 56/403/1 55/404/1 +f 47/405/1 48/406/1 58/407/1 57/408/1 +f 49/409/1 50/410/1 60/411/1 59/412/1 +f 52/413/1 53/414/1 63/415/1 62/416/1 +f 54/417/1 55/418/1 65/419/1 64/420/1 +f 56/421/1 57/422/1 67/423/1 66/424/1 +f 58/425/1 59/426/1 69/427/1 68/428/1 +f 61/429/1 62/430/1 72/431/1 71/432/1 +f 63/433/1 64/434/1 74/435/1 73/436/1 +f 65/437/1 66/438/1 76/439/1 75/440/1 +f 67/441/1 68/442/1 78/443/1 77/444/1 +f 69/445/1 70/446/1 80/447/1 79/448/1 +f 72/449/1 73/450/1 83/451/1 82/452/1 +f 74/453/1 75/454/1 85/455/1 84/456/1 +f 76/457/1 77/458/1 87/459/1 86/460/1 +f 78/461/1 79/462/1 89/463/1 88/464/1 +f 81/465/1 82/466/1 92/467/1 91/468/1 +f 83/469/1 84/470/1 94/471/1 93/472/1 +f 85/473/1 86/474/1 96/475/1 95/476/1 +f 87/477/1 88/478/1 98/479/1 97/480/1 +f 89/481/1 90/482/1 100/483/1 99/484/1 +f 60/411/5 50/410/5 113/485/5 169/486/5 +f 95/476/3 96/475/3 122/487/3 121/488/3 +f 40/375/5 30/374/5 142/489/5 111/490/5 +f 10/338/4 9/337/4 106/491/4 107/492/4 +f 20/339/5 10/338/5 107/492/5 109/493/5 +f 6/330/4 5/329/4 125/494/4 103/495/4 +f 1/321/2 11/324/2 108/496/2 123/497/2 +f 81/465/2 91/468/2 117/498/2 116/499/2 +f 97/480/3 98/479/3 198/500/3 197/501/3 +f 2/322/4 1/321/4 123/497/4 101/502/4 +f 91/468/3 92/467/3 118/503/3 117/498/3 +f 61/429/2 71/432/2 178/504/2 114/505/2 +f 100/483/5 90/482/5 196/506/5 200/507/5 +f 41/393/2 51/396/2 160/508/2 112/509/2 +f 99/484/3 100/483/3 200/507/3 199/510/3 +f 8/334/4 7/333/4 104/511/4 105/512/4 +f 80/447/5 70/446/5 115/513/5 187/514/5 +f 93/472/3 94/471/3 120/515/3 119/516/3 +f 21/357/2 31/360/2 143/517/2 110/518/2 +f 4/326/4 3/325/4 102/519/4 124/520/4 +f 123/497/1 101/502/1 126/521/1 108/496/1 +f 102/519/1 124/520/1 128/522/1 127/523/1 +f 125/494/1 103/495/1 130/524/1 129/525/1 +f 104/511/1 105/512/1 132/526/1 131/527/1 +f 106/491/1 107/492/1 109/493/1 133/528/1 +f 126/529/1 127/530/1 135/531/1 134/532/1 +f 128/533/1 129/534/1 137/535/1 136/536/1 +f 130/537/1 131/538/1 139/539/1 138/540/1 +f 132/541/1 133/542/1 141/543/1 140/544/1 +f 110/518/1 134/545/1 144/546/1 143/517/1 +f 135/547/1 136/548/1 146/549/1 145/550/1 +f 137/551/1 138/552/1 148/553/1 147/554/1 +f 139/555/1 140/556/1 150/557/1 149/558/1 +f 141/559/1 142/489/1 111/490/1 151/560/1 +f 144/561/1 145/562/1 153/563/1 152/564/1 +f 146/565/1 147/566/1 155/567/1 154/568/1 +f 148/569/1 149/570/1 157/571/1 156/572/1 +f 150/573/1 151/574/1 159/575/1 158/576/1 +f 112/509/1 152/577/1 161/578/1 160/508/1 +f 153/579/1 154/580/1 163/581/1 162/582/1 +f 155/583/1 156/584/1 165/585/1 164/586/1 +f 157/587/1 158/588/1 167/589/1 166/590/1 +f 159/591/1 113/485/1 169/486/1 168/592/1 +f 161/593/1 162/594/1 171/595/1 170/596/1 +f 163/597/1 164/598/1 173/599/1 172/600/1 +f 165/601/1 166/602/1 175/603/1 174/604/1 +f 167/605/1 168/606/1 177/607/1 176/608/1 +f 114/505/1 170/609/1 179/610/1 178/504/1 +f 171/611/1 172/612/1 181/613/1 180/614/1 +f 173/615/1 174/616/1 183/617/1 182/618/1 +f 175/619/1 176/620/1 185/621/1 184/622/1 +f 177/623/1 115/513/1 187/514/1 186/624/1 +f 179/625/1 180/626/1 189/627/1 188/628/1 +f 181/629/1 182/630/1 191/631/1 190/632/1 +f 183/633/1 184/634/1 193/635/1 192/636/1 +f 185/637/1 186/638/1 195/639/1 194/640/1 +f 116/499/1 188/641/1 118/503/1 117/498/1 +f 189/642/1 190/643/1 120/515/1 119/516/1 +f 191/644/1 192/645/1 122/487/1 121/488/1 +f 193/646/1 194/647/1 198/500/1 197/501/1 +f 195/648/1 196/506/1 200/507/1 199/510/1 +o Track.001_cube4.001 +v -17.999994 5.499999 -71.999985 +v 18.000006 5.499999 -72.000015 +v 17.999998 5.500001 -88.000015 +v -18.000002 5.500001 -87.999985 +v -18.000002 5.500001 -87.999985 +v 17.999998 5.500001 -88.000015 +v 18.000006 5.499999 -72.000015 +v -17.999994 5.499999 -71.999985 +v 17.099997 1.500001 -88.000015 +v 13.899994 1.500001 -88.000008 +v 13.899994 5.500001 -88.000008 +v 17.099997 5.500001 -88.000015 +v 17.100004 1.499999 -72.000015 +v 17.100004 5.499999 -72.000015 +v 13.900005 1.499999 -72.000008 +v 13.900005 5.499999 -72.000008 +v -13.900006 1.500001 -87.999992 +v -17.100004 1.500001 -87.999985 +v -17.100004 5.500001 -87.999985 +v -13.900006 5.500001 -87.999992 +v -13.899995 1.499999 -71.999992 +v -13.899995 5.499999 -71.999985 +v -17.099997 1.499999 -71.999985 +v -17.099997 5.499999 -71.999985 +v 21.950003 -2.050000 -78.000015 +v -21.949999 -2.050000 -77.999985 +v -21.949999 2.050000 -77.999985 +v 21.950003 2.050000 -78.000015 +v 21.950006 -2.050001 -74.000015 +v 21.950006 2.049999 -74.000015 +v -21.949995 -2.050001 -73.999985 +v -21.949995 2.049999 -73.999985 +v 21.949999 -2.049999 -86.000015 +v -21.950003 -2.049999 -85.999985 +v -21.950003 2.050001 -85.999985 +v 21.949999 2.050001 -86.000015 +v 21.950003 -2.050000 -82.000015 +v 21.950003 2.050000 -82.000015 +v -21.949999 -2.050000 -81.999985 +v -21.949999 2.050000 -81.999985 +v -17.999994 1.499999 -71.999985 +v 18.000006 1.499999 -72.000015 +v 17.999998 1.500001 -88.000015 +v -18.000002 1.500001 -87.999985 +v -18.000002 1.500001 -87.999985 +v 17.999998 1.500001 -88.000015 +v 18.000006 1.499999 -72.000015 +v -17.999994 1.499999 -71.999985 +vt 0.000000 0.742188 +vt 0.234375 0.742188 +vt 0.234375 0.867188 +vt 0.000000 0.867188 +vt 0.000000 0.742188 +vt 0.234375 0.742188 +vt 0.234375 0.867188 +vt 0.000000 0.867188 +vt 0.406250 0.507812 +vt 0.429688 0.507812 +vt 0.429688 0.539062 +vt 0.406250 0.539062 +vt 0.000000 0.507812 +vt 0.125000 0.507812 +vt 0.125000 0.539062 +vt 0.000000 0.539062 +vt 0.406250 0.507812 +vt 0.429688 0.507812 +vt 0.429688 0.539062 +vt 0.406250 0.539062 +vt 0.000000 0.507812 +vt 0.125000 0.507812 +vt 0.125000 0.539062 +vt 0.000000 0.539062 +vt 0.406250 0.507812 +vt 0.429688 0.507812 +vt 0.429688 0.539062 +vt 0.406250 0.539062 +vt 0.000000 0.507812 +vt 0.125000 0.507812 +vt 0.125000 0.539062 +vt 0.000000 0.539062 +vt 0.406250 0.507812 +vt 0.429688 0.507812 +vt 0.429688 0.539062 +vt 0.406250 0.539062 +vt 0.000000 0.507812 +vt 0.125000 0.507812 +vt 0.125000 0.539062 +vt 0.000000 0.539062 +vt 0.000000 0.929688 +vt 0.296875 0.929688 +vt 0.296875 0.960938 +vt 0.000000 0.960938 +vt 0.304688 0.929688 +vt 0.335938 0.929688 +vt 0.335938 0.960938 +vt 0.304688 0.960938 +vt 0.000000 0.929688 +vt 0.296875 0.929688 +vt 0.296875 0.960938 +vt 0.000000 0.960938 +vt 0.304688 0.929688 +vt 0.335938 0.929688 +vt 0.335938 0.960938 +vt 0.304688 0.960938 +vt 0.000000 0.968750 +vt 0.296875 0.968750 +vt 0.296875 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.890625 +vt 0.296875 0.890625 +vt 0.296875 0.921875 +vt 0.000000 0.921875 +vt 0.000000 0.929688 +vt 0.296875 0.929688 +vt 0.296875 0.960938 +vt 0.000000 0.960938 +vt 0.304688 0.929688 +vt 0.335938 0.929688 +vt 0.335938 0.960938 +vt 0.304688 0.960938 +vt 0.000000 0.929688 +vt 0.296875 0.929688 +vt 0.296875 0.960938 +vt 0.000000 0.960938 +vt 0.304688 0.929688 +vt 0.335938 0.929688 +vt 0.335938 0.960938 +vt 0.304688 0.960938 +vt 0.000000 0.968750 +vt 0.296875 0.968750 +vt 0.296875 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.890625 +vt 0.296875 0.890625 +vt 0.296875 0.921875 +vt 0.000000 0.921875 +vt 0.000000 0.742188 +vt 0.234375 0.742188 +vt 0.234375 0.867188 +vt 0.000000 0.867188 +vt 0.000000 0.742188 +vt 0.234375 0.742188 +vt 0.234375 0.867188 +vt 0.000000 0.867188 +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 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +usemtl m_0.001 +s 1 +f 201/649/6 202/650/6 203/651/6 204/652/6 +f 205/653/7 206/654/7 207/655/7 208/656/7 +f 209/657/8 210/658/8 211/659/8 212/660/8 +f 213/661/9 209/662/9 212/663/9 214/664/9 +f 215/665/10 213/666/10 214/667/10 216/668/10 +f 210/669/11 215/670/11 216/671/11 211/672/11 +f 217/673/8 218/674/8 219/675/8 220/676/8 +f 221/677/9 217/678/9 220/679/9 222/680/9 +f 223/681/10 221/682/10 222/683/10 224/684/10 +f 218/685/11 223/686/11 224/687/11 219/688/11 +f 225/689/8 226/690/8 227/691/8 228/692/8 +f 229/693/9 225/694/9 228/695/9 230/696/9 +f 231/697/10 229/698/10 230/699/10 232/700/10 +f 226/701/11 231/702/11 232/703/11 227/704/11 +f 232/705/6 230/706/6 228/707/6 227/708/6 +f 226/709/7 225/710/7 229/711/7 231/712/7 +f 233/713/8 234/714/8 235/715/8 236/716/8 +f 237/717/9 233/718/9 236/719/9 238/720/9 +f 239/721/10 237/722/10 238/723/10 240/724/10 +f 234/725/11 239/726/11 240/727/11 235/728/11 +f 240/729/6 238/730/6 236/731/6 235/732/6 +f 234/733/7 233/734/7 237/735/7 239/736/7 +f 241/737/6 242/738/6 243/739/6 244/740/6 +f 245/741/7 246/742/7 247/743/7 248/744/7 +o Cube.017_Cube.003 +v -8.000000 0.000000 8.000000 +v -8.000000 16.000000 8.000000 +v -8.000000 0.000000 -8.000000 +v -8.000000 16.000000 -8.000000 +v 8.000000 0.000000 8.000000 +v 8.000000 16.000000 8.000000 +v 8.000000 0.000000 -8.000000 +v 8.000000 16.000000 -8.000000 +v -8.000000 32.000000 8.000000 +v -8.000000 32.000000 -8.000000 +v 8.000000 32.000000 -8.000000 +v 8.000000 32.000000 8.000000 +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.625000 0.750000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +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 +usemtl None +s off +f 249/745/12 250/746/12 252/747/12 251/748/12 +f 251/748/13 252/747/13 256/749/13 255/750/13 +f 255/750/14 256/749/14 254/751/14 253/752/14 +f 253/752/15 254/751/15 250/753/15 249/754/15 +f 251/755/16 255/750/16 253/752/16 249/756/16 +f 250/753/15 254/751/15 260/757/15 257/758/15 +f 259/759/17 258/760/17 257/761/17 260/757/17 +f 256/749/13 252/747/13 258/762/13 259/759/13 +f 254/751/14 256/749/14 259/759/14 260/757/14 +f 252/747/12 250/746/12 257/763/12 258/762/12 +o Cube.026_Cube.004 +v -8.000000 0.000000 -40.000000 +v -8.000000 16.000000 -40.000000 +v -8.000000 0.000000 -56.000000 +v -8.000000 16.000000 -56.000000 +v 8.000000 0.000000 -40.000000 +v 8.000000 16.000000 -40.000000 +v 8.000000 0.000000 -56.000000 +v 8.000000 16.000000 -56.000000 +v -8.000000 32.000000 -40.000000 +v -8.000000 32.000000 -56.000000 +v 8.000000 32.000000 -56.000000 +v 8.000000 32.000000 -40.000000 +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.625000 0.750000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +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 +usemtl None +s off +f 261/764/18 262/765/18 264/766/18 263/767/18 +f 263/767/19 264/766/19 268/768/19 267/769/19 +f 267/769/20 268/768/20 266/770/20 265/771/20 +f 265/771/21 266/770/21 262/772/21 261/773/21 +f 263/774/22 267/769/22 265/771/22 261/775/22 +f 262/772/21 266/770/21 272/776/21 269/777/21 +f 271/778/23 270/779/23 269/780/23 272/776/23 +f 268/768/19 264/766/19 270/781/19 271/778/19 +f 266/770/20 268/768/20 271/778/20 272/776/20 +f 264/766/18 262/765/18 269/782/18 270/781/18 +o Cube.035_Cube.021 +v -0.437500 0.750000 0.437500 +v -0.437500 1.250000 0.437500 +v -0.437500 0.750000 -0.437500 +v -0.437500 1.250000 -0.437500 +v 0.437500 0.750000 0.437500 +v 0.437500 1.250000 0.437500 +v 0.437500 0.750000 -0.437500 +v 0.437500 1.250000 -0.437500 +v -0.312500 0.437500 0.562500 +v -0.250000 1.250000 0.250000 +v -0.250000 1.500000 0.250000 +v -0.250000 1.250000 -0.250000 +v -0.250000 1.500000 -0.250000 +v 0.250000 1.250000 0.250000 +v 0.250000 1.500000 0.250000 +v 0.250000 1.250000 -0.250000 +v 0.250000 1.500000 -0.250000 +v 0.224112 0.588388 0.312500 +v 0.224112 0.588388 0.125000 +v 0.312500 0.500000 0.312500 +v 0.312500 0.500000 0.125000 +v 0.489277 0.853553 0.312500 +v 0.489277 0.853553 0.125000 +v 0.577665 0.765165 0.125000 +v 0.577665 0.765165 0.312500 +v -0.224112 0.588388 0.312500 +v -0.224112 0.588388 0.125000 +v -0.312500 0.500000 0.312500 +v -0.312500 0.500000 0.125000 +v -0.489277 0.853553 0.312500 +v -0.489277 0.853553 0.125000 +v -0.577665 0.765165 0.125000 +v -0.577665 0.765165 0.312500 +v 0.224112 0.588388 -0.312500 +v 0.224112 0.588388 -0.125000 +v 0.312500 0.500000 -0.312500 +v 0.312500 0.500000 -0.125000 +v 0.489277 0.853553 -0.312500 +v 0.489277 0.853553 -0.125000 +v 0.577665 0.765165 -0.125000 +v 0.577665 0.765165 -0.312500 +v -0.224112 0.588388 -0.312500 +v -0.224112 0.588388 -0.125000 +v -0.312500 0.500000 -0.312500 +v -0.312500 0.500000 -0.125000 +v -0.489277 0.853553 -0.312500 +v -0.489277 0.853553 -0.125000 +v -0.577665 0.765165 -0.125000 +v -0.577665 0.765165 -0.312500 +v 0.937500 0.687500 -0.500000 +v 0.937500 1.312500 -0.500000 +v 0.937500 0.687500 0.500000 +v 0.937500 1.312500 0.500000 +v 0.312500 0.687500 -0.500000 +v 0.312500 1.312500 -0.500000 +v 0.312500 0.687500 0.500000 +v 0.312500 1.312500 0.500000 +v -0.937500 0.687500 -0.500000 +v -0.937500 1.312500 -0.500000 +v -0.937500 0.687500 0.500000 +v -0.937500 1.312500 0.500000 +v -0.312500 0.687500 -0.500000 +v -0.312500 1.312500 -0.500000 +v -0.312500 0.687500 0.500000 +v -0.312500 1.312500 0.500000 +v 0.750000 0.750000 -1.353553 +v 0.750000 1.103553 -1.000000 +v 0.750000 0.396447 -1.000000 +v 0.750000 0.750000 -0.646447 +v 0.375000 0.750000 -1.353553 +v 0.375000 1.103553 -1.000000 +v 0.375000 0.396447 -1.000000 +v 0.375000 0.750000 -0.646447 +v -0.750000 0.750000 -1.353553 +v -0.750000 1.103553 -1.000000 +v -0.750000 0.396447 -1.000000 +v -0.750000 0.750000 -0.646447 +v -0.375000 0.750000 -1.353553 +v -0.375000 1.103553 -1.000000 +v -0.375000 0.396447 -1.000000 +v -0.375000 0.750000 -0.646447 +v 0.750000 0.750000 1.353553 +v 0.750000 1.103553 1.000000 +v 0.750000 0.396447 1.000000 +v 0.750000 0.750000 0.646446 +v 0.375000 0.750000 1.353553 +v 0.375000 1.103553 1.000000 +v 0.375000 0.396447 1.000000 +v 0.375000 0.750000 0.646446 +v -0.750000 0.750000 1.353553 +v -0.750000 1.103553 1.000000 +v -0.750000 0.396447 1.000000 +v -0.750000 0.750000 0.646446 +v -0.375000 0.750000 1.353553 +v -0.375000 1.103553 1.000000 +v -0.375000 0.396447 1.000000 +v -0.375000 0.750000 0.646446 +v 0.437500 0.838388 -0.734835 +v 0.437500 1.015165 -0.911612 +v 0.687500 0.838388 -0.734835 +v 0.687500 1.015165 -0.911612 +v 0.437500 1.457107 -0.469670 +v 0.437500 1.280330 -0.292893 +v 0.687500 1.280330 -0.292893 +v 0.687500 1.457107 -0.469670 +v -0.437500 0.838388 -0.734835 +v -0.437500 1.015165 -0.911612 +v -0.687500 0.838388 -0.734835 +v -0.687500 1.015165 -0.911612 +v -0.437500 1.457107 -0.469670 +v -0.437500 1.280330 -0.292893 +v -0.687500 1.280330 -0.292893 +v -0.687500 1.457107 -0.469670 +v 0.437500 0.838388 0.734835 +v 0.437500 1.015165 0.911612 +v 0.687500 0.838388 0.734835 +v 0.687500 1.015165 0.911612 +v 0.437500 1.457107 0.469670 +v 0.437500 1.280330 0.292893 +v 0.687500 1.280330 0.292893 +v 0.687500 1.457107 0.469670 +v -0.437500 0.838388 0.734835 +v -0.437500 1.015165 0.911612 +v -0.687500 0.838388 0.734835 +v -0.687500 1.015165 0.911612 +v -0.437500 1.457107 0.469670 +v -0.437500 1.280330 0.292893 +v -0.687500 1.280330 0.292893 +v -0.687500 1.457107 0.469670 +v 0.312500 0.437500 -1.312500 +v 0.312500 1.062500 -1.312500 +v 0.312500 0.437500 -0.687500 +v 0.312500 1.062500 -0.687500 +v -0.312500 0.437500 -1.312500 +v -0.312500 1.062500 -1.312500 +v -0.312500 0.437500 -0.687500 +v -0.312500 1.062500 -0.687500 +v -0.093750 1.062500 -0.906250 +v -0.093750 1.250000 -0.906250 +v -0.093750 1.062500 -1.093750 +v -0.093750 1.250000 -1.093750 +v 0.093750 1.062500 -0.906250 +v 0.093750 1.250000 -0.906250 +v 0.093750 1.062500 -1.093750 +v 0.093750 1.250000 -1.093750 +v 0.312500 0.437500 1.312500 +v 0.312500 1.062500 1.312500 +v 0.312500 0.437500 0.687500 +v 0.312500 1.062500 0.687500 +v -0.312500 0.437500 1.312500 +v -0.312500 1.062500 1.312500 +v -0.312500 0.437500 0.687500 +v -0.312500 1.062500 0.687500 +v -0.093750 1.062500 0.906250 +v -0.093750 1.250000 0.906250 +v -0.093750 1.062500 1.093750 +v -0.093750 1.250000 1.093750 +v 0.093750 1.062500 0.906250 +v 0.093750 1.250000 0.906250 +v 0.093750 1.062500 1.093750 +v 0.093750 1.250000 1.093750 +v 0.312500 0.437500 1.312500 +v 0.312500 1.062500 1.312500 +v 0.312500 0.437500 0.687500 +v 0.312500 1.062500 0.687500 +v -0.312500 0.437500 1.312500 +v -0.312500 1.062500 1.312500 +v -0.312500 0.437500 0.687500 +v -0.312500 1.062500 0.687500 +v -0.093750 1.062500 0.906250 +v -0.093750 1.250000 0.906250 +v -0.093750 1.062500 1.093750 +v -0.093750 1.250000 1.093750 +v 0.093750 1.062500 0.906250 +v 0.093750 1.250000 0.906250 +v 0.093750 1.062500 1.093750 +v 0.093750 1.250000 1.093750 +v 0.312500 0.437500 -1.312500 +v 0.312500 1.062500 -1.312500 +v 0.312500 0.437500 -0.687500 +v 0.312500 1.062500 -0.687500 +v -0.312500 0.437500 -1.312500 +v -0.312500 1.062500 -1.312500 +v -0.312500 0.437500 -0.687500 +v -0.312500 1.062500 -0.687500 +v -0.093750 1.062500 -0.906250 +v -0.093750 1.250000 -0.906250 +v -0.093750 1.062500 -1.093750 +v -0.093750 1.250000 -1.093750 +v 0.093750 1.062500 -0.906250 +v 0.093750 1.250000 -0.906250 +v 0.093750 1.062500 -1.093750 +v 0.093750 1.250000 -1.093750 +v -0.312500 0.437500 -0.562500 +v 0.312500 0.437500 0.562500 +v 0.312500 1.062500 0.562500 +v 0.312500 0.437500 -0.562500 +v 0.312500 1.062500 -0.562500 +v -0.312500 1.062500 0.562500 +v -0.312500 1.062500 -0.562500 +vt 0.437500 1.000000 +vt 0.687500 0.562500 +vt 0.687500 1.000000 +vt 0.312500 0.562500 +vt 0.750000 0.312500 +vt 0.312500 0.312500 +vt 0.437500 1.000000 +vt 0.687500 0.562500 +vt 0.687500 1.000000 +vt 0.750000 0.562500 +vt 0.312500 0.312500 +vt 0.750000 0.312500 +vt 0.437500 0.562500 +vt 0.000000 1.000000 +vt 0.000000 0.562500 +vt 0.000000 1.000000 +vt 0.437500 0.562500 +vt 0.312500 0.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.687500 0.687500 +vt 1.000000 0.687500 +vt 0.312500 0.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.718750 +vt 0.718750 0.968750 +vt 0.718750 0.718750 +vt 0.750000 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.562500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.906250 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.000000 +vt 0.625000 -0.000000 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.625000 -0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.625000 -0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.000000 +vt 0.625000 -0.000000 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.687500 0.687500 +vt 1.000000 1.000000 +vt 1.000000 0.687500 +vt 0.000000 0.562500 +vt 0.312500 0.000000 +vt 0.000000 -0.000000 +vt 0.000000 0.562500 +vt 0.312500 0.000000 +vt 0.000000 -0.000000 +vt 0.437500 0.562500 +vt 0.750000 0.562500 +vt 0.312500 0.562500 +vt 0.437500 1.000000 +vt 0.000000 0.562500 +vt 0.312500 0.562500 +vt 0.687500 1.000000 +vt 0.312500 0.562500 +vt 0.718750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.687500 +vt 0.968750 0.968750 +vt 0.906250 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.312500 +vt 0.812500 0.312500 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.687500 1.000000 +vt 0.312500 0.562500 +vt 0.312500 0.562500 +vt 0.312500 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.812500 0.500000 +vt 0.500000 0.187500 +vt 0.812500 0.187500 +vt 0.625000 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.500000 0.500000 +vt 0.812500 0.187500 +vt 0.500000 0.187500 +vt 0.968750 0.500000 +vt 0.656250 1.000000 +vt 0.968750 1.000000 +vt 0.312500 0.500000 +vt -0.000000 1.000000 +vt -0.000000 0.500000 +vt 0.625000 0.500000 +vt 0.312500 1.000000 +vt 0.625000 1.000000 +vt 0.500000 0.187500 +vt 0.812500 0.500000 +vt 0.812500 0.187500 +vt 0.937500 0.500000 +vt 0.625000 1.000000 +vt 0.937500 1.000000 +vt 0.812500 0.187500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.968750 0.500000 +vt 0.656250 1.000000 +vt 0.656250 0.500000 +vt -0.000000 1.000000 +vt 0.312500 0.500000 +vt -0.000000 0.500000 +vt 0.250000 0.250000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.250000 0.250000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.250000 +vt 0.000000 0.250000 +vt 0.218750 0.250000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.250000 +vt 0.000000 0.250000 +vt 0.218750 0.250000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.250000 +vt 0.000000 0.250000 +vt 0.218750 0.250000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.250000 +vt 0.000000 0.250000 +vt 0.218750 0.250000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.250000 0.250000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.250000 0.250000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.375000 0.500000 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.500000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.062500 +vt 0.250000 0.187500 +vt 0.250000 0.062500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.500000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.062500 +vt 0.250000 0.062500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.500000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.375000 0.062500 +vt 0.250000 0.062500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.375000 0.500000 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.500000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.062500 +vt 0.250000 0.187500 +vt 0.250000 0.062500 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.812500 0.500000 +vt 0.656250 0.500000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.812500 0.500000 +vt 0.968750 1.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.250000 0.500000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 -0.000000 +vt 0.250000 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.500000 +vt 0.375000 0.187500 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.812500 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.812500 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.812500 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.468750 +vt 0.812500 0.468750 +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.7071 -0.7071 0.0000 +vn -0.7071 -0.7071 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_Body +s off +f 274/783/24 275/784/24 273/785/24 +f 276/786/25 279/787/25 275/788/25 +f 280/789/26 277/790/26 279/791/26 +f 278/792/27 273/793/27 277/794/27 +f 279/795/28 273/796/28 275/797/28 +f 276/798/29 278/799/29 280/789/29 +f 471/800/24 466/801/24 281/802/24 +f 468/803/27 281/804/27 467/805/27 +f 469/806/28 281/807/28 466/808/28 +f 283/809/24 284/810/24 282/811/24 +f 285/812/25 288/813/25 284/814/25 +f 289/815/26 286/816/26 288/817/26 +f 287/818/27 282/819/27 286/820/27 +f 285/821/29 287/822/29 289/823/29 +f 295/824/25 293/825/25 291/826/25 +f 296/827/30 292/828/30 293/825/30 +f 297/829/27 290/830/27 292/831/27 +f 301/832/25 303/833/25 299/834/25 +f 300/835/31 304/836/31 301/832/31 +f 298/837/27 305/838/27 300/839/27 +f 307/840/27 312/841/27 311/842/27 +f 308/843/30 312/841/30 309/844/30 +f 306/845/25 313/846/25 308/847/25 +f 319/848/27 317/849/27 315/850/27 +f 320/851/31 316/852/31 317/849/31 +f 316/853/25 318/854/25 314/855/25 +f 403/856/26 404/857/26 402/858/26 +f 405/859/27 408/860/27 404/861/27 +f 409/862/24 406/863/24 408/864/24 +f 407/865/25 402/866/25 406/867/25 +f 408/868/28 402/869/28 404/870/28 +f 405/871/29 407/872/29 409/873/29 +f 420/874/26 419/875/26 418/876/26 +f 424/877/25 421/878/25 420/879/25 +f 422/880/24 425/881/24 424/882/24 +f 418/883/27 423/884/27 422/885/27 +f 418/886/28 424/887/28 420/888/28 +f 423/889/29 421/890/29 425/891/29 +f 436/892/26 435/893/26 434/894/26 +f 440/895/25 437/896/25 436/897/25 +f 438/898/24 441/899/24 440/900/24 +f 434/901/27 439/902/27 438/903/27 +f 434/904/28 440/905/28 436/906/28 +f 439/907/29 437/908/29 441/909/29 +f 451/910/26 452/911/26 450/912/26 +f 453/913/27 456/914/27 452/915/27 +f 457/916/24 454/917/24 456/918/24 +f 455/919/25 450/920/25 454/921/25 +f 456/922/28 450/923/28 452/924/28 +f 453/925/29 455/926/29 457/927/29 +f 466/928/25 470/929/25 469/930/25 +f 469/931/26 468/932/26 467/933/26 +f 471/934/29 470/935/29 472/936/29 +f 274/783/24 276/937/24 275/784/24 +f 276/786/25 280/938/25 279/787/25 +f 280/789/26 278/799/26 277/790/26 +f 278/792/27 274/939/27 273/793/27 +f 279/795/28 277/940/28 273/796/28 +f 276/798/29 274/941/29 278/799/29 +f 471/800/24 472/942/24 466/801/24 +f 468/803/27 471/943/27 281/804/27 +f 469/806/28 467/944/28 281/807/28 +f 283/809/24 285/945/24 284/810/24 +f 285/812/25 289/946/25 288/813/25 +f 289/815/26 287/947/26 286/816/26 +f 287/818/27 283/948/27 282/819/27 +f 285/821/29 283/949/29 287/822/29 +f 295/824/25 296/827/25 293/825/25 +f 296/827/30 297/950/30 292/828/30 +f 297/829/27 294/951/27 290/830/27 +f 301/832/25 304/836/25 303/833/25 +f 300/835/31 305/952/31 304/836/31 +f 298/837/27 302/953/27 305/838/27 +f 307/840/27 309/844/27 312/841/27 +f 308/843/30 313/954/30 312/841/30 +f 306/845/25 310/955/25 313/846/25 +f 319/848/27 320/851/27 317/849/27 +f 320/851/31 321/956/31 316/852/31 +f 316/853/25 321/957/25 318/854/25 +f 403/856/26 405/958/26 404/857/26 +f 405/859/27 409/873/27 408/860/27 +f 409/862/24 407/865/24 406/863/24 +f 407/865/25 403/959/25 402/866/25 +f 408/868/28 406/960/28 402/869/28 +f 405/871/29 403/961/29 407/872/29 +f 420/874/26 421/962/26 419/875/26 +f 424/877/25 425/891/25 421/878/25 +f 422/880/24 423/884/24 425/881/24 +f 418/883/27 419/963/27 423/884/27 +f 418/886/28 422/964/28 424/887/28 +f 423/889/29 419/965/29 421/890/29 +f 436/892/26 437/966/26 435/893/26 +f 440/895/25 441/909/25 437/896/25 +f 438/898/24 439/902/24 441/899/24 +f 434/901/27 435/967/27 439/902/27 +f 434/904/28 438/968/28 440/905/28 +f 439/907/29 435/969/29 437/908/29 +f 451/910/26 453/970/26 452/911/26 +f 453/913/27 457/927/27 456/914/27 +f 457/916/24 455/919/24 454/917/24 +f 455/919/25 451/971/25 450/920/25 +f 456/922/28 454/972/28 450/923/28 +f 453/925/29 451/973/29 455/926/29 +f 466/928/25 472/974/25 470/929/25 +f 469/931/26 470/975/26 468/932/26 +f 471/934/29 468/976/29 470/935/29 +usemtl Bogey_Body_2 +f 323/977/26 324/978/26 322/979/26 +f 325/980/27 328/981/27 324/982/27 +f 329/983/24 326/984/24 328/985/24 +f 327/986/25 322/987/25 326/988/25 +f 324/989/28 326/990/28 322/991/28 +f 325/992/29 327/993/29 329/994/29 +f 332/995/24 331/996/24 330/997/24 +f 336/998/27 333/999/27 332/1000/27 +f 334/1001/26 337/1002/26 336/1003/26 +f 330/1004/25 335/1005/25 334/1006/25 +f 332/1007/28 334/1008/28 336/1009/28 +f 335/1010/29 333/1011/29 337/1012/29 +f 339/1013/26 340/1014/26 338/1015/26 +f 341/1016/32 344/1017/32 340/1018/32 +f 345/1019/24 342/1020/24 344/1021/24 +f 343/1022/33 338/1023/33 342/1024/33 +f 344/1025/34 338/1026/34 340/1027/34 +f 341/1028/35 343/1029/35 345/1030/35 +f 348/1031/24 347/1032/24 346/1033/24 +f 352/1034/32 349/1035/32 348/1036/32 +f 350/1037/26 353/1038/26 352/1039/26 +f 346/1040/33 351/1041/33 350/1042/33 +f 346/1043/34 352/1044/34 348/1045/34 +f 351/1046/35 349/1047/35 353/1048/35 +f 356/1049/26 355/1050/26 354/1051/26 +f 360/1052/34 357/1053/34 356/1054/34 +f 358/1055/24 361/1056/24 360/1057/24 +f 354/1058/35 359/1059/35 358/1060/35 +f 354/1061/32 360/1062/32 356/1063/32 +f 359/1064/33 357/1065/33 361/1066/33 +f 363/1067/24 364/1068/24 362/1069/24 +f 365/1070/34 368/1071/34 364/1072/34 +f 369/1073/26 366/1074/26 368/1075/26 +f 367/1076/35 362/1077/35 366/1078/35 +f 368/1079/32 362/1080/32 364/1081/32 +f 365/1082/33 367/1083/33 369/1084/33 +f 374/1085/33 373/1086/33 371/1087/33 +f 377/1088/26 372/1089/26 373/1090/26 +f 376/1091/32 370/1092/32 372/1093/32 +f 376/1094/35 374/1095/35 375/1096/35 +f 375/1097/24 371/1087/24 370/1098/24 +f 381/1099/33 382/1100/33 379/1101/33 +f 380/1102/24 385/1103/24 381/1104/24 +f 378/1105/32 384/1106/32 380/1107/32 +f 382/1108/35 384/1109/35 383/1110/35 +f 379/1101/26 383/1111/26 378/1112/26 +f 389/1113/35 390/1114/35 387/1115/35 +f 388/1116/26 393/1117/26 389/1118/26 +f 386/1119/34 392/1120/34 388/1121/34 +f 390/1122/33 392/1123/33 391/1124/33 +f 387/1115/24 391/1125/24 386/1126/24 +f 398/1127/35 397/1128/35 395/1129/35 +f 401/1130/24 396/1131/24 397/1132/24 +f 400/1133/34 394/1134/34 396/1135/34 +f 400/1136/33 398/1137/33 399/1138/33 +f 399/1139/26 395/1129/26 394/1140/26 +f 323/977/26 325/992/26 324/978/26 +f 325/980/27 329/1141/27 328/981/27 +f 329/983/24 327/1142/24 326/984/24 +f 327/986/25 323/1143/25 322/987/25 +f 324/989/28 328/1144/28 326/990/28 +f 325/992/29 323/977/29 327/993/29 +f 332/995/24 333/1011/24 331/996/24 +f 336/998/27 337/1145/27 333/999/27 +f 334/1001/26 335/1146/26 337/1002/26 +f 330/1004/25 331/1147/25 335/1005/25 +f 332/1007/28 330/1148/28 334/1008/28 +f 335/1010/29 331/996/29 333/1011/29 +f 339/1013/26 341/1149/26 340/1014/26 +f 341/1016/32 345/1150/32 344/1017/32 +f 345/1019/24 343/1151/24 342/1020/24 +f 343/1022/33 339/1152/33 338/1023/33 +f 344/1025/34 342/1153/34 338/1026/34 +f 341/1028/35 339/1154/35 343/1029/35 +f 348/1031/24 349/1155/24 347/1032/24 +f 352/1034/32 353/1156/32 349/1035/32 +f 350/1037/26 351/1157/26 353/1038/26 +f 346/1040/33 347/1158/33 351/1041/33 +f 346/1043/34 350/1159/34 352/1044/34 +f 351/1046/35 347/1160/35 349/1047/35 +f 356/1049/26 357/1161/26 355/1050/26 +f 360/1052/34 361/1162/34 357/1053/34 +f 358/1055/24 359/1163/24 361/1056/24 +f 354/1058/35 355/1164/35 359/1059/35 +f 354/1061/32 358/1165/32 360/1062/32 +f 359/1064/33 355/1166/33 357/1065/33 +f 363/1067/24 365/1167/24 364/1068/24 +f 365/1070/34 369/1168/34 368/1071/34 +f 369/1073/26 367/1169/26 366/1074/26 +f 367/1076/35 363/1170/35 362/1077/35 +f 368/1079/32 366/1171/32 362/1080/32 +f 365/1082/33 363/1172/33 367/1083/33 +f 374/1085/33 377/1173/33 373/1086/33 +f 377/1088/26 376/1174/26 372/1089/26 +f 376/1091/32 375/1175/32 370/1092/32 +f 376/1094/35 377/1176/35 374/1095/35 +f 375/1097/24 374/1085/24 371/1087/24 +f 381/1099/33 385/1177/33 382/1100/33 +f 380/1102/24 384/1178/24 385/1103/24 +f 378/1105/32 383/1179/32 384/1106/32 +f 382/1108/35 385/1180/35 384/1109/35 +f 379/1101/26 382/1100/26 383/1111/26 +f 389/1113/35 393/1181/35 390/1114/35 +f 388/1116/26 392/1182/26 393/1117/26 +f 386/1119/34 391/1183/34 392/1120/34 +f 390/1122/33 393/1184/33 392/1123/33 +f 387/1115/24 390/1114/24 391/1125/24 +f 398/1127/35 401/1185/35 397/1128/35 +f 401/1130/24 400/1186/24 396/1131/24 +f 400/1133/34 399/1187/34 394/1134/34 +f 400/1136/33 401/1188/33 398/1137/33 +f 399/1139/26 398/1127/26 395/1129/26 +usemtl wheel_Large +f 411/1189/24 412/1190/24 410/1191/24 +f 413/1192/25 416/1193/25 412/1194/25 +f 417/1195/26 414/1196/26 416/1197/26 +f 415/1198/27 410/1199/27 414/1200/27 +f 413/1201/29 415/1198/29 417/1202/29 +f 428/1203/24 427/1204/24 426/1205/24 +f 432/1206/27 429/1207/27 428/1208/27 +f 430/1209/26 433/1210/26 432/1211/26 +f 426/1212/25 431/1213/25 430/1214/25 +f 431/1213/29 429/1215/29 433/1216/29 +f 444/1217/24 443/1218/24 442/1219/24 +f 448/1220/27 445/1221/27 444/1222/27 +f 446/1223/26 449/1224/26 448/1225/26 +f 442/1226/25 447/1227/25 446/1228/25 +f 447/1227/29 445/1229/29 449/1230/29 +f 459/1231/24 460/1232/24 458/1233/24 +f 461/1234/25 464/1235/25 460/1236/25 +f 465/1237/26 462/1238/26 464/1239/26 +f 463/1240/27 458/1241/27 462/1242/27 +f 461/1243/29 463/1240/29 465/1244/29 +f 411/1189/24 413/1245/24 412/1190/24 +f 413/1192/25 417/1246/25 416/1193/25 +f 417/1195/26 415/1247/26 414/1196/26 +f 415/1198/27 411/1248/27 410/1199/27 +f 413/1201/29 411/1249/29 415/1198/29 +f 428/1203/24 429/1250/24 427/1204/24 +f 432/1206/27 433/1251/27 429/1207/27 +f 430/1209/26 431/1252/26 433/1210/26 +f 426/1212/25 427/1253/25 431/1213/25 +f 431/1213/29 427/1254/29 429/1215/29 +f 444/1217/24 445/1255/24 443/1218/24 +f 448/1220/27 449/1256/27 445/1221/27 +f 446/1223/26 447/1257/26 449/1224/26 +f 442/1226/25 443/1258/25 447/1227/25 +f 447/1227/29 443/1259/29 445/1229/29 +f 459/1231/24 461/1260/24 460/1232/24 +f 461/1234/25 465/1261/25 464/1235/25 +f 465/1237/26 463/1262/26 462/1238/26 +f 463/1240/27 459/1263/27 458/1241/27 +f 461/1243/29 459/1264/29 463/1240/29 +o Cube.029_Cube.049 +v 0.750000 0.449926 0.000000 +v 1.062500 0.387426 0.160477 +v 1.062500 0.387426 0.000000 +v 0.750000 0.318146 0.318146 +v 0.875000 0.160477 0.387426 +v 0.875000 0.186365 0.449926 +v 1.062500 0.160477 0.387426 +v 1.062500 0.273951 0.273951 +v 0.875000 0.387426 0.160477 +v 0.875000 0.449926 0.186365 +v 0.750000 0.449926 0.186365 +v 0.750000 0.000000 0.449926 +v 0.875000 -0.186365 0.449926 +v 1.062500 0.000000 0.387426 +v 0.750000 0.186365 0.449926 +v 0.750000 -0.318145 0.318146 +v 1.062500 -0.387426 0.160477 +v 1.062500 -0.273951 0.273951 +v 0.875000 -0.160477 0.387426 +v 1.062500 -0.160477 0.387426 +v 0.750000 -0.186365 0.449926 +v 0.750000 -0.449926 0.000000 +v 1.062500 -0.387426 0.000000 +v 0.875000 -0.387426 0.160477 +v 0.875000 -0.449926 0.186365 +v 0.750000 -0.449926 0.186365 +v 0.750000 -0.318145 -0.318146 +v 0.875000 -0.186365 -0.449926 +v 1.062500 -0.273951 -0.273951 +v 0.875000 -0.387426 -0.160477 +v 0.875000 -0.449926 -0.186365 +v 1.062500 -0.387426 -0.160477 +v 0.750000 -0.449926 -0.186365 +v 0.750000 0.000000 -0.449926 +v 0.875000 0.160477 -0.387426 +v 1.062500 0.160477 -0.387426 +v 0.750000 0.186365 -0.449926 +v 1.062500 0.000000 -0.387426 +v 0.875000 -0.160477 -0.387426 +v 1.062500 -0.160477 -0.387426 +v 0.750000 -0.186365 -0.449926 +v 0.750000 0.318146 -0.318146 +v 0.875000 0.387426 -0.160477 +v 0.875000 0.449926 -0.186365 +v 1.062500 0.387426 -0.160477 +v 0.750000 -0.000000 0.000000 +v 0.750000 0.449926 -0.186365 +v 1.062500 -0.000000 0.000000 +v 1.062500 0.273951 -0.273951 +v 0.875000 0.186365 -0.449926 +v 1.187500 -0.125000 -0.125000 +v 1.187500 0.125000 -0.125000 +v 1.187500 -0.125000 0.124999 +v 1.187500 0.125000 0.124999 +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 -0.750000 0.449926 0.000000 +v -1.062500 0.387426 0.160477 +v -1.062500 0.387426 0.000000 +v -0.750000 0.318146 0.318146 +v -0.875000 0.160477 0.387426 +v -0.875000 0.186365 0.449926 +v -1.062500 0.160477 0.387426 +v -1.062500 0.273951 0.273951 +v -0.875000 0.387426 0.160477 +v -0.875000 0.449926 0.186365 +v -0.750000 0.449926 0.186365 +v -0.750000 0.000000 0.449926 +v -0.875000 -0.186365 0.449926 +v -1.062500 0.000000 0.387426 +v -0.750000 0.186365 0.449926 +v -0.750000 -0.318145 0.318146 +v -1.062500 -0.387426 0.160477 +v -1.062500 -0.273951 0.273951 +v -0.875000 -0.160477 0.387426 +v -1.062500 -0.160477 0.387426 +v -0.750000 -0.186365 0.449926 +v -0.750000 -0.449926 0.000000 +v -1.062500 -0.387426 0.000000 +v -0.875000 -0.387426 0.160477 +v -0.875000 -0.449926 0.186365 +v -0.750000 -0.449926 0.186365 +v -0.750000 -0.318145 -0.318146 +v -0.875000 -0.186365 -0.449926 +v -1.062500 -0.273951 -0.273951 +v -0.875000 -0.387426 -0.160477 +v -0.875000 -0.449926 -0.186365 +v -1.062500 -0.387426 -0.160477 +v -0.750000 -0.449926 -0.186365 +v -0.750000 0.000000 -0.449926 +v -0.875000 0.160477 -0.387426 +v -1.062500 0.160477 -0.387426 +v -0.750000 0.186365 -0.449926 +v -1.062500 0.000000 -0.387426 +v -0.875000 -0.160477 -0.387426 +v -1.062500 -0.160477 -0.387426 +v -0.750000 -0.186365 -0.449926 +v -0.750000 0.318146 -0.318146 +v -0.875000 0.387426 -0.160477 +v -0.875000 0.449926 -0.186365 +v -1.062500 0.387426 -0.160477 +v -0.750000 -0.000000 0.000000 +v -0.750000 0.449926 -0.186365 +v -1.062500 -0.000000 0.000000 +v -1.062500 0.273951 -0.273951 +v -0.875000 0.186365 -0.449926 +v -1.187500 -0.125000 -0.125000 +v -1.187500 0.125000 -0.125000 +v -1.187500 -0.125000 0.124999 +v -1.187500 0.125000 0.124999 +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 0.875000 0.387426 0.000000 +v 0.875000 0.449926 0.000000 +v 0.875000 0.273951 0.273951 +v 0.875000 0.318146 0.318146 +v 0.875000 0.000000 0.387426 +v 0.875000 0.000000 0.449926 +v 0.875000 -0.273951 0.273951 +v 0.875000 -0.318145 0.318146 +v 0.875000 -0.387426 -0.000000 +v 0.875000 -0.449926 0.000000 +v 0.875000 -0.273951 -0.273951 +v 0.875000 -0.318145 -0.318145 +v 0.875000 0.000000 -0.387426 +v 0.875000 0.000000 -0.449926 +v 0.875000 0.273951 -0.273951 +v 0.875000 0.318146 -0.318145 +v -0.875000 0.000000 0.387426 +v -0.875000 0.000000 0.449926 +v -0.875000 0.273951 0.273951 +v -0.875000 0.318146 0.318146 +v -0.875000 0.387426 0.000000 +v -0.875000 0.449926 0.000000 +v -0.875000 0.273951 -0.273951 +v -0.875000 0.318146 -0.318145 +v -0.875000 0.000000 -0.387426 +v -0.875000 0.000000 -0.449926 +v -0.875000 -0.273951 -0.273951 +v -0.875000 -0.318145 -0.318145 +v -0.875000 -0.387426 -0.000000 +v -0.875000 -0.449926 0.000000 +v -0.875000 -0.273951 0.273951 +v -0.875000 -0.318145 0.318146 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.625000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.000000 +vt 0.625000 0.375000 +vt 0.375000 0.625000 +vt 0.375000 0.375000 +vt 0.375000 0.625000 +vt 0.625000 0.375000 +vt 0.375000 0.375000 +vt 0.625000 0.625000 +vt 0.625000 0.625000 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.593750 +vt 0.812500 0.781250 +vt 0.812500 0.562500 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.731773 0.843750 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.593750 +vt 0.812500 0.562500 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.906250 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.906250 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.906250 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.893227 0.656250 +vt 0.893227 0.843750 +vt 0.812500 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.843750 +vt 0.812500 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.718750 1.000000 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.718750 1.000000 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.843750 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.843750 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.843750 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.812500 1.000000 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.906250 0.937500 +vt 0.718750 0.687500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 0.937500 +vt 0.718750 0.687500 +vt 0.812500 0.937500 +vt 0.906250 0.937500 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.843750 +vt 0.812500 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.843750 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.843750 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.812500 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +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 00_Shaft +s off +f 530/1265/36 523/1266/36 529/1267/36 +f 526/1268/37 530/1269/37 528/1270/37 +f 527/1271/38 523/1272/38 525/1273/38 +f 526/1274/39 527/1275/39 525/1276/39 +f 581/1277/36 588/1278/36 587/1279/36 +f 588/1280/37 584/1281/37 586/1282/37 +f 581/1283/38 585/1284/38 583/1285/38 +f 585/1286/39 584/1287/39 583/1288/39 +f 530/1265/36 524/1289/36 523/1266/36 +f 526/1268/37 524/1290/37 530/1269/37 +f 527/1271/38 529/1291/38 523/1272/38 +f 526/1274/39 528/1292/39 527/1275/39 +f 581/1277/36 582/1293/36 588/1278/36 +f 588/1280/37 582/1294/37 584/1281/37 +f 581/1283/38 587/1295/38 585/1284/38 +f 585/1286/39 586/1296/39 584/1287/39 +usemtl 00_Shaft_end +f 524/1297/40 525/1298/40 523/1299/40 +f 583/1300/41 582/1301/41 581/1302/41 +f 524/1297/40 526/1303/40 525/1298/40 +f 583/1300/41 584/1304/41 582/1301/41 +usemtl wheel_Large +f 516/1305/37 473/1306/37 590/1307/37 +f 590/1308/40 481/1309/40 589/1310/40 +f 474/1311/40 520/1312/40 475/1313/40 +f 518/1314/41 483/1315/41 473/1316/41 +f 517/1317/40 475/1313/40 520/1312/40 +f 518/1314/41 473/1316/41 519/1318/41 +f 475/1319/37 481/1320/37 474/1321/37 +f 592/1322/42 483/1323/42 476/1324/42 +f 592/1325/40 477/1326/40 591/1327/40 +f 479/1328/40 520/1312/40 480/1329/40 +f 518/1314/41 487/1330/41 476/1331/41 +f 474/1332/40 480/1329/40 520/1312/40 +f 518/1314/41 476/1331/41 483/1333/41 +f 480/1334/42 477/1335/42 479/1336/42 +f 478/1337/39 484/1338/39 594/1339/39 +f 594/1340/40 491/1341/40 593/1342/40 +f 492/1343/40 520/1312/40 486/1344/40 +f 518/1314/41 493/1345/41 484/1346/41 +f 479/1347/40 486/1344/40 520/1312/40 +f 518/1314/41 484/1346/41 487/1348/41 +f 593/1349/39 492/1350/39 486/1351/39 +f 596/1352/43 493/1353/43 488/1354/43 +f 596/1355/40 496/1356/40 595/1357/40 +f 489/1358/40 520/1312/40 490/1359/40 +f 518/1314/41 498/1360/41 488/1361/41 +f 492/1362/40 490/1359/40 520/1312/40 +f 518/1314/41 488/1361/41 493/1363/41 +f 490/1364/43 496/1365/43 489/1366/43 +f 598/1367/38 498/1368/38 494/1369/38 +f 598/1370/40 502/1371/40 597/1372/40 +f 504/1373/40 520/1312/40 495/1374/40 +f 518/1314/41 505/1375/41 494/1376/41 +f 489/1377/40 495/1374/40 520/1312/40 +f 518/1314/41 494/1376/41 498/1378/41 +f 597/1379/38 504/1380/38 495/1381/38 +f 503/1382/44 499/1383/44 600/1384/44 +f 600/1385/40 511/1386/40 599/1387/40 +f 512/1388/40 520/1312/40 501/1389/40 +f 518/1314/41 513/1390/41 499/1391/41 +f 504/1392/40 501/1389/40 520/1312/40 +f 518/1314/41 499/1391/41 505/1393/41 +f 599/1394/44 512/1395/44 501/1396/44 +f 500/1397/36 506/1398/36 602/1399/36 +f 602/1400/40 507/1401/40 601/1402/40 +f 508/1403/40 520/1312/40 510/1404/40 +f 518/1314/41 509/1405/41 506/1406/41 +f 512/1407/40 510/1404/40 520/1312/40 +f 518/1314/41 506/1406/41 513/1408/41 +f 601/1409/36 508/1410/36 510/1411/36 +f 604/1412/45 509/1413/45 514/1414/45 +f 604/1415/40 515/1416/40 603/1417/40 +f 517/1418/40 520/1312/40 521/1419/40 +f 518/1314/41 519/1420/41 514/1421/41 +f 508/1422/40 521/1419/40 520/1312/40 +f 518/1314/41 514/1421/41 509/1423/41 +f 603/1424/45 517/1425/45 521/1426/45 +f 531/1427/37 574/1428/37 610/1429/37 +f 539/1430/41 610/1431/41 609/1432/41 +f 532/1433/41 533/1434/41 578/1435/41 +f 576/1436/40 531/1437/40 541/1438/40 +f 575/1439/41 578/1435/41 533/1434/41 +f 576/1436/40 577/1440/40 531/1437/40 +f 533/1441/37 539/1442/37 609/1443/37 +f 608/1444/42 541/1445/42 540/1446/42 +f 535/1447/41 608/1448/41 607/1449/41 +f 537/1450/41 538/1451/41 578/1435/41 +f 576/1436/40 534/1452/40 545/1453/40 +f 532/1454/41 578/1435/41 538/1451/41 +f 576/1436/40 541/1455/40 534/1452/40 +f 538/1456/42 535/1457/42 607/1458/42 +f 542/1459/39 536/1460/39 606/1461/39 +f 549/1462/41 606/1463/41 605/1464/41 +f 550/1465/41 544/1466/41 578/1435/41 +f 576/1436/40 542/1467/40 551/1468/40 +f 537/1469/41 578/1435/41 544/1466/41 +f 576/1436/40 545/1470/40 542/1467/40 +f 550/1471/39 605/1472/39 544/1473/39 +f 546/1474/43 543/1475/43 620/1476/43 +f 554/1477/41 620/1478/41 619/1479/41 +f 547/1480/41 548/1481/41 578/1435/41 +f 576/1436/40 546/1482/40 556/1483/40 +f 550/1484/41 578/1435/41 548/1481/41 +f 576/1436/40 551/1485/40 546/1482/40 +f 548/1486/43 554/1487/43 619/1488/43 +f 618/1489/38 556/1490/38 555/1491/38 +f 560/1492/41 618/1493/41 617/1494/41 +f 562/1495/41 553/1496/41 578/1435/41 +f 576/1436/40 552/1497/40 563/1498/40 +f 547/1499/41 578/1435/41 553/1496/41 +f 576/1436/40 556/1500/40 552/1497/40 +f 562/1501/38 617/1502/38 553/1503/38 +f 557/1504/44 561/1505/44 616/1506/44 +f 569/1507/41 616/1508/41 615/1509/41 +f 570/1510/41 559/1511/41 578/1435/41 +f 576/1436/40 557/1512/40 571/1513/40 +f 562/1514/41 578/1435/41 559/1511/41 +f 576/1436/40 563/1515/40 557/1512/40 +f 570/1516/44 615/1517/44 559/1518/44 +f 564/1519/36 558/1520/36 614/1521/36 +f 565/1522/41 614/1523/41 613/1524/41 +f 566/1525/41 568/1526/41 578/1435/41 +f 576/1436/40 564/1527/40 567/1528/40 +f 570/1529/41 578/1435/41 568/1526/41 +f 576/1436/40 571/1530/40 564/1527/40 +f 566/1531/36 613/1532/36 568/1533/36 +f 612/1534/45 567/1535/45 580/1536/45 +f 573/1537/41 612/1538/41 611/1539/41 +f 575/1540/41 579/1541/41 578/1435/41 +f 576/1436/40 572/1542/40 577/1543/40 +f 566/1544/41 578/1435/41 579/1541/41 +f 576/1436/40 567/1545/40 572/1542/40 +f 575/1546/45 611/1547/45 579/1548/45 +f 515/1549/40 590/1308/40 589/1310/40 +f 517/1550/37 589/1551/37 475/1319/37 +f 590/1307/37 483/1552/37 482/1553/37 +f 481/1554/40 592/1325/40 591/1327/40 +f 474/1555/42 591/1556/42 480/1334/42 +f 592/1322/42 487/1557/42 478/1558/42 +f 477/1559/40 594/1340/40 593/1342/40 +f 477/1560/39 486/1351/39 479/1561/39 +f 594/1339/39 493/1562/39 485/1563/39 +f 491/1564/40 596/1355/40 595/1357/40 +f 491/1565/43 490/1364/43 492/1566/43 +f 596/1352/43 498/1567/43 497/1568/43 +f 496/1569/40 598/1370/40 597/1372/40 +f 496/1570/38 495/1381/38 489/1571/38 +f 503/1572/38 494/1369/38 505/1573/38 +f 502/1574/40 600/1385/40 599/1387/40 +f 502/1575/44 501/1396/44 504/1576/44 +f 600/1384/44 513/1577/44 500/1578/44 +f 511/1579/40 602/1400/40 601/1402/40 +f 511/1580/36 510/1411/36 512/1581/36 +f 522/1582/36 506/1398/36 509/1583/36 +f 508/1584/45 603/1424/45 521/1426/45 +f 604/1412/45 519/1585/45 516/1586/45 +f 535/1587/41 606/1463/41 536/1588/41 +f 544/1473/39 535/1589/39 537/1590/39 +f 551/1591/39 606/1461/39 543/1592/39 +f 539/1593/41 608/1448/41 540/1594/41 +f 532/1595/42 607/1458/42 539/1596/42 +f 545/1597/42 608/1444/42 536/1598/42 +f 573/1599/41 610/1431/41 574/1600/41 +f 575/1601/37 609/1443/37 573/1602/37 +f 541/1603/37 610/1429/37 540/1604/37 +f 565/1605/41 612/1538/41 580/1606/41 +f 566/1607/45 611/1547/45 565/1608/45 +f 577/1609/45 612/1534/45 574/1610/45 +f 569/1611/41 614/1523/41 558/1612/41 +f 568/1533/36 569/1613/36 570/1614/36 +f 580/1615/36 564/1519/36 614/1521/36 +f 560/1616/41 616/1508/41 561/1617/41 +f 559/1518/44 560/1618/44 562/1619/44 +f 571/1620/44 616/1506/44 558/1621/44 +f 554/1622/41 618/1493/41 555/1623/41 +f 553/1503/38 554/1624/38 547/1625/38 +f 561/1626/38 552/1627/38 618/1489/38 +f 549/1628/41 620/1478/41 543/1629/41 +f 548/1486/43 549/1630/43 550/1631/43 +f 556/1632/43 620/1476/43 555/1633/43 +f 516/1305/37 519/1634/37 473/1306/37 +f 590/1308/40 482/1635/40 481/1309/40 +f 475/1319/37 589/1551/37 481/1320/37 +f 592/1322/42 482/1636/42 483/1323/42 +f 592/1325/40 478/1637/40 477/1326/40 +f 480/1334/42 591/1556/42 477/1335/42 +f 478/1337/39 487/1638/39 484/1338/39 +f 594/1340/40 485/1639/40 491/1341/40 +f 593/1349/39 491/1640/39 492/1350/39 +f 596/1352/43 485/1641/43 493/1353/43 +f 596/1355/40 497/1642/40 496/1356/40 +f 490/1364/43 595/1643/43 496/1365/43 +f 598/1367/38 497/1644/38 498/1368/38 +f 598/1370/40 503/1645/40 502/1371/40 +f 597/1379/38 502/1646/38 504/1380/38 +f 503/1382/44 505/1647/44 499/1383/44 +f 600/1385/40 500/1648/40 511/1386/40 +f 599/1394/44 511/1649/44 512/1395/44 +f 500/1397/36 513/1650/36 506/1398/36 +f 602/1400/40 522/1651/40 507/1401/40 +f 601/1409/36 507/1652/36 508/1410/36 +f 604/1412/45 522/1653/45 509/1413/45 +f 603/1417/40 507/1654/40 604/1415/40 +f 507/1654/40 522/1655/40 604/1415/40 +f 604/1415/40 516/1656/40 515/1416/40 +f 603/1424/45 515/1657/45 517/1425/45 +f 531/1427/37 577/1658/37 574/1428/37 +f 539/1430/41 540/1659/41 610/1431/41 +f 533/1441/37 532/1660/37 539/1442/37 +f 608/1444/42 534/1661/42 541/1445/42 +f 535/1447/41 536/1662/41 608/1448/41 +f 538/1456/42 537/1663/42 535/1457/42 +f 542/1459/39 545/1664/39 536/1460/39 +f 549/1462/41 543/1665/41 606/1463/41 +f 550/1471/39 549/1666/39 605/1472/39 +f 546/1474/43 551/1667/43 543/1475/43 +f 554/1477/41 555/1668/41 620/1478/41 +f 548/1486/43 547/1669/43 554/1487/43 +f 618/1489/38 552/1627/38 556/1490/38 +f 560/1492/41 561/1670/41 618/1493/41 +f 562/1501/38 560/1671/38 617/1502/38 +f 557/1504/44 563/1672/44 561/1505/44 +f 569/1507/41 558/1673/41 616/1508/41 +f 570/1516/44 569/1674/44 615/1517/44 +f 564/1519/36 571/1675/36 558/1520/36 +f 565/1522/41 580/1676/41 614/1523/41 +f 566/1531/36 565/1677/36 613/1532/36 +f 612/1534/45 572/1678/45 567/1535/45 +f 573/1537/41 574/1679/41 612/1538/41 +f 575/1546/45 573/1680/45 611/1547/45 +f 515/1549/40 516/1681/40 590/1308/40 +f 517/1550/37 515/1682/37 589/1551/37 +f 590/1307/37 473/1306/37 483/1552/37 +f 481/1554/40 482/1683/40 592/1325/40 +f 474/1555/42 481/1684/42 591/1556/42 +f 592/1322/42 476/1324/42 487/1557/42 +f 477/1559/40 478/1685/40 594/1340/40 +f 477/1560/39 593/1349/39 486/1351/39 +f 594/1339/39 484/1338/39 493/1562/39 +f 491/1564/40 485/1686/40 596/1355/40 +f 491/1565/43 595/1643/43 490/1364/43 +f 596/1352/43 488/1354/43 498/1567/43 +f 496/1569/40 497/1687/40 598/1370/40 +f 496/1570/38 597/1379/38 495/1381/38 +f 503/1572/38 598/1367/38 494/1369/38 +f 502/1574/40 503/1688/40 600/1385/40 +f 502/1575/44 599/1394/44 501/1396/44 +f 600/1384/44 499/1383/44 513/1577/44 +f 511/1579/40 500/1689/40 602/1400/40 +f 511/1580/36 601/1409/36 510/1411/36 +f 522/1582/36 602/1399/36 506/1398/36 +f 508/1584/45 507/1690/45 603/1424/45 +f 604/1412/45 514/1414/45 519/1585/45 +f 535/1587/41 605/1464/41 606/1463/41 +f 544/1473/39 605/1472/39 535/1589/39 +f 551/1591/39 542/1459/39 606/1461/39 +f 539/1593/41 607/1449/41 608/1448/41 +f 532/1595/42 538/1456/42 607/1458/42 +f 545/1597/42 534/1661/42 608/1444/42 +f 573/1599/41 609/1432/41 610/1431/41 +f 575/1601/37 533/1441/37 609/1443/37 +f 541/1603/37 531/1427/37 610/1429/37 +f 565/1605/41 611/1539/41 612/1538/41 +f 566/1607/45 579/1548/45 611/1547/45 +f 577/1609/45 572/1678/45 612/1534/45 +f 569/1611/41 613/1524/41 614/1523/41 +f 568/1533/36 613/1532/36 569/1613/36 +f 580/1615/36 567/1691/36 564/1519/36 +f 560/1616/41 615/1509/41 616/1508/41 +f 559/1518/44 615/1517/44 560/1618/44 +f 571/1620/44 557/1504/44 616/1506/44 +f 554/1622/41 617/1494/41 618/1493/41 +f 553/1503/38 617/1502/38 554/1624/38 +f 561/1626/38 563/1692/38 552/1627/38 +f 549/1628/41 619/1479/41 620/1478/41 +f 548/1486/43 619/1488/43 549/1630/43 +f 556/1632/43 546/1474/43 620/1476/43 +o Cube.050_Cube.042 +v 0.437500 0.687500 0.318750 +v 0.437500 1.375000 0.318750 +v 0.437500 0.687500 -0.318750 +v 0.437500 1.375000 -0.318750 +v 0.750000 0.687500 0.318750 +v 0.750000 1.375000 0.318750 +v 0.750000 0.687500 -0.318750 +v 0.750000 1.375000 -0.318750 +v -0.437500 0.687500 0.318750 +v -0.437500 1.375000 0.318750 +v -0.437500 0.687500 -0.318750 +v -0.437500 1.375000 -0.318750 +v -0.750000 0.687500 0.318750 +v -0.750000 1.375000 0.318750 +v -0.750000 0.687500 -0.318750 +v -0.750000 1.375000 -0.318750 +v 0.937500 0.687500 1.375000 +v 0.937500 1.312500 1.375000 +v 0.937500 0.687500 0.750000 +v 0.937500 1.312500 0.750000 +v 1.312500 0.687500 1.375000 +v 1.312500 1.312500 1.375000 +v 1.312500 0.687500 0.750000 +v 1.312500 1.312500 0.750000 +v 1.249999 0.750000 0.687500 +v 1.249999 1.250000 0.687500 +v 1.249999 0.750000 0.750000 +v 1.249999 1.250000 0.750000 +v 0.999999 0.750000 0.687500 +v 0.999999 1.250000 0.687500 +v 0.999999 0.750000 0.750000 +v 0.999999 1.250000 0.750000 +v 0.999999 1.250000 1.375000 +v 0.999999 0.750000 1.375000 +v 0.999999 1.250000 1.437500 +v 0.999999 0.750000 1.437500 +v 1.249999 1.250000 1.375000 +v 1.249999 0.750000 1.375000 +v 1.249999 1.250000 1.437500 +v 1.249999 0.750000 1.437500 +v -0.937500 0.687500 1.375000 +v -0.937500 1.312500 1.375000 +v -0.937500 0.687500 0.750000 +v -0.937500 1.312500 0.750000 +v -1.312500 0.687500 1.375000 +v -1.312500 1.312500 1.375000 +v -1.312500 0.687500 0.750000 +v -1.312500 1.312500 0.750000 +v -1.249999 0.750000 0.687500 +v -1.249999 1.250000 0.687500 +v -1.249999 0.750000 0.750000 +v -1.249999 1.250000 0.750000 +v -0.999999 0.750000 0.687500 +v -0.999999 1.250000 0.687500 +v -0.999999 0.750000 0.750000 +v -0.999999 1.250000 0.750000 +v -0.999999 1.250000 1.375000 +v -0.999999 0.750000 1.375000 +v -0.999999 1.250000 1.437500 +v -0.999999 0.750000 1.437500 +v -1.249999 1.250000 1.375000 +v -1.249999 0.750000 1.375000 +v -1.249999 1.250000 1.437500 +v -1.249999 0.750000 1.437500 +v 0.937500 0.687500 -1.375000 +v 0.937500 1.312500 -1.375000 +v 0.937500 0.687500 -0.750000 +v 0.937500 1.312500 -0.750000 +v 1.312500 0.687500 -1.375000 +v 1.312500 1.312500 -1.375000 +v 1.312500 0.687500 -0.750000 +v 1.312500 1.312500 -0.750000 +v 1.249999 0.750000 -0.687500 +v 1.249999 1.250000 -0.687500 +v 1.249999 0.750000 -0.750000 +v 1.249999 1.250000 -0.750000 +v 0.999999 0.750000 -0.687500 +v 0.999999 1.250000 -0.687500 +v 0.999999 0.750000 -0.750000 +v 0.999999 1.250000 -0.750000 +v 0.999999 1.250000 -1.375000 +v 0.999999 0.750000 -1.375000 +v 0.999999 1.250000 -1.437500 +v 0.999999 0.750000 -1.437500 +v 1.249999 1.250000 -1.375000 +v 1.249999 0.750000 -1.375000 +v 1.249999 1.250000 -1.437500 +v 1.249999 0.750000 -1.437500 +v -0.937500 0.687500 -1.375000 +v -0.937500 1.312500 -1.375000 +v -0.937500 0.687500 -0.750000 +v -0.937500 1.312500 -0.750000 +v -1.312500 0.687500 -1.375000 +v -1.312500 1.312500 -1.375000 +v -1.312500 0.687500 -0.750000 +v -1.312500 1.312500 -0.750000 +v -1.249999 0.750000 -0.687500 +v -1.249999 1.250000 -0.687500 +v -1.249999 0.750000 -0.750000 +v -1.249999 1.250000 -0.750000 +v -0.999999 0.750000 -0.687500 +v -0.999999 1.250000 -0.687500 +v -0.999999 0.750000 -0.750000 +v -0.999999 1.250000 -0.750000 +v -0.999999 1.250000 -1.375000 +v -0.999999 0.750000 -1.375000 +v -0.999999 1.250000 -1.437500 +v -0.999999 0.750000 -1.437500 +v -1.249999 1.250000 -1.375000 +v -1.249999 0.750000 -1.375000 +v -1.249999 1.250000 -1.437500 +v -1.249999 0.750000 -1.437500 +v -0.437500 0.750000 0.437500 +v -0.437500 1.250000 0.437500 +v -0.437500 0.750000 -0.437500 +v -0.437500 1.250000 -0.437500 +v 0.437500 0.750000 0.437500 +v 0.437500 1.250000 0.437500 +v 0.437500 0.750000 -0.437500 +v 0.437500 1.250000 -0.437500 +v -0.312500 0.437500 0.562500 +v -0.312500 1.062500 0.562500 +v -0.312500 0.437500 -0.562500 +v -0.312500 1.062500 -0.562500 +v 0.312500 0.437500 0.562500 +v 0.312500 1.062500 0.562500 +v 0.312500 0.437500 -0.562500 +v 0.312500 1.062500 -0.562500 +v -0.250000 1.250000 0.250000 +v -0.250000 1.500000 0.250000 +v -0.250000 1.250000 -0.250000 +v -0.250000 1.500000 -0.250000 +v 0.250000 1.250000 0.250000 +v 0.250000 1.500000 0.250000 +v 0.250000 1.250000 -0.250000 +v 0.250000 1.500000 -0.250000 +v 0.224112 0.588388 0.312500 +v 0.224112 0.588388 0.125000 +v 0.312500 0.500000 0.312500 +v 0.312500 0.500000 0.125000 +v 0.489277 0.853553 0.312500 +v 0.489277 0.853553 0.125000 +v 0.577665 0.765165 0.125000 +v 0.577665 0.765165 0.312500 +v -0.224112 0.588388 0.312500 +v -0.224112 0.588388 0.125000 +v -0.312500 0.500000 0.312500 +v -0.312500 0.500000 0.125000 +v -0.489277 0.853553 0.312500 +v -0.489277 0.853553 0.125000 +v -0.577665 0.765165 0.125000 +v -0.577665 0.765165 0.312500 +v 0.224112 0.588388 -0.312500 +v 0.224112 0.588388 -0.125000 +v 0.312500 0.500000 -0.312500 +v 0.312500 0.500000 -0.125000 +v 0.489277 0.853553 -0.312500 +v 0.489277 0.853553 -0.125000 +v 0.577665 0.765165 -0.125000 +v 0.577665 0.765165 -0.312500 +v -0.224112 0.588388 -0.312500 +v -0.224112 0.588388 -0.125000 +v -0.312500 0.500000 -0.312500 +v -0.312500 0.500000 -0.125000 +v -0.489277 0.853553 -0.312500 +v -0.489277 0.853553 -0.125000 +v -0.577665 0.765165 -0.125000 +v -0.577665 0.765165 -0.312500 +v 0.312500 0.437500 -1.312500 +v 0.312500 1.062500 -1.312500 +v 0.312500 0.437500 -0.687500 +v 0.312500 1.062500 -0.687500 +v -0.312500 0.437500 -1.312500 +v -0.312500 1.062500 -1.312500 +v -0.312500 0.437500 -0.687500 +v -0.312500 1.062500 -0.687500 +v -0.093750 1.062500 -0.906250 +v -0.093750 1.250000 -0.906250 +v -0.093750 1.062500 -1.093750 +v -0.093750 1.250000 -1.093750 +v 0.093750 1.062500 -0.906250 +v 0.093750 1.250000 -0.906250 +v 0.093750 1.062500 -1.093750 +v 0.093750 1.250000 -1.093750 +v 0.312500 0.437500 1.312500 +v 0.312500 1.062500 1.312500 +v 0.312500 0.437500 0.687500 +v 0.312500 1.062500 0.687500 +v -0.312500 0.437500 1.312500 +v -0.312500 1.062500 1.312500 +v -0.312500 0.437500 0.687500 +v -0.312500 1.062500 0.687500 +v -0.093750 1.062500 0.906250 +v -0.093750 1.250000 0.906250 +v -0.093750 1.062500 1.093750 +v -0.093750 1.250000 1.093750 +v 0.093750 1.062500 0.906250 +v 0.093750 1.250000 0.906250 +v 0.093750 1.062500 1.093750 +v 0.093750 1.250000 1.093750 +v 0.750000 0.500000 -1.250000 +v 0.750000 1.000000 -1.250000 +v 0.750000 0.500000 -0.750000 +v 0.750000 1.000000 -0.750000 +v 0.437500 0.500000 -1.250000 +v 0.437500 1.000000 -1.250000 +v 0.437500 0.500000 -0.750000 +v 0.437500 1.000000 -0.750000 +v -0.750000 0.500000 -1.250000 +v -0.750000 1.000000 -1.250000 +v -0.750000 0.500000 -0.750000 +v -0.750000 1.000000 -0.750000 +v -0.437500 0.500000 -1.250000 +v -0.437500 1.000000 -1.250000 +v -0.437500 0.500000 -0.750000 +v -0.437500 1.000000 -0.750000 +v 0.750000 0.500000 1.250000 +v 0.750000 1.000000 1.250000 +v 0.750000 0.500000 0.750000 +v 0.750000 1.000000 0.750000 +v 0.437500 0.500000 1.250000 +v 0.437500 1.000000 1.250000 +v 0.437500 0.500000 0.750000 +v 0.437500 1.000000 0.750000 +v -0.750000 0.500000 1.250000 +v -0.750000 1.000000 1.250000 +v -0.750000 0.500000 0.750000 +v -0.750000 1.000000 0.750000 +v -0.437500 0.500000 1.250000 +v -0.437500 1.000000 1.250000 +v -0.437500 0.500000 0.750000 +v -0.437500 1.000000 0.750000 +v 0.500000 1.000000 -1.062500 +v 0.687500 1.000000 -1.062500 +v 0.500000 1.310930 -0.311848 +v 0.687500 1.310930 -0.311848 +v -0.500000 1.000000 -1.062500 +v -0.687500 1.000000 -1.062500 +v -0.500000 1.310930 -0.311848 +v -0.687500 1.310930 -0.311848 +v 0.500000 1.000000 1.062500 +v 0.687500 1.000000 1.062500 +v 0.500000 1.310930 0.311848 +v 0.687500 1.310930 0.311848 +v -0.500000 1.000000 1.062500 +v -0.687500 1.000000 1.062500 +v -0.500000 1.310930 0.311848 +v -0.687500 1.310930 0.311848 +v 0.500000 0.656250 0.939394 +v 0.687500 0.656250 0.939394 +v 0.500000 0.656250 -1.060606 +v 0.687500 0.656250 -1.060606 +v 0.500000 0.656250 -0.060606 +v 0.687500 0.656250 -0.060606 +v -0.500000 0.593750 0.939394 +v -0.687500 0.593750 0.939394 +v -0.500000 0.593750 -1.060606 +v -0.687500 0.593750 -1.060606 +v -0.500000 0.593750 -0.060606 +v -0.687500 0.593750 -0.060606 +v 0.500000 0.942259 -1.038583 +v 0.687500 0.942259 -1.038583 +v 0.500000 1.253189 -0.287931 +v 0.687500 1.253189 -0.287931 +v -0.500000 0.942259 -1.038583 +v -0.687500 0.942259 -1.038583 +v -0.500000 1.253189 -0.287931 +v -0.687500 1.253189 -0.287931 +v 0.500000 0.942259 1.038583 +v 0.687500 0.942259 1.038583 +v 0.500000 1.253189 0.287931 +v 0.687500 1.253189 0.287931 +v -0.500000 0.942259 1.038583 +v -0.687500 0.942259 1.038583 +v -0.500000 1.253189 0.287931 +v -0.687500 1.253189 0.287931 +v 0.500000 0.593750 0.939394 +v 0.687500 0.593750 0.939394 +v 0.500000 0.593750 -1.060606 +v 0.687500 0.593750 -1.060606 +v 0.500000 0.593750 -0.060606 +v 0.687500 0.593750 -0.060606 +v -0.500000 0.531250 0.939394 +v -0.687500 0.531250 0.939394 +v -0.500000 0.531250 -1.060606 +v -0.687500 0.531250 -1.060606 +v -0.500000 0.531250 -0.060606 +v -0.687500 0.531250 -0.060606 +v 0.000000 0.562500 -0.937500 +v 0.000000 0.562500 -1.187500 +v -0.750000 0.375000 -0.937500 +v 0.000000 0.375000 -0.937500 +v 0.000000 0.375000 -1.187500 +v -1.059359 0.949524 -0.937500 +v -1.059359 0.949524 -1.187500 +v -0.750000 0.375000 -1.187500 +v -1.191942 0.816942 -0.937500 +v -1.191942 0.816942 -1.187500 +v -0.672335 0.562500 -0.937500 +v -0.672335 0.562500 -1.187500 +v 0.750000 0.375000 -0.937500 +v 1.059359 0.949524 -0.937500 +v 1.059359 0.949524 -1.187500 +v 0.750000 0.375000 -1.187500 +v 1.191942 0.816942 -0.937500 +v 1.191942 0.816942 -1.187500 +v 0.672335 0.562500 -0.937500 +v 0.672335 0.562500 -1.187500 +v 0.000000 0.562500 0.937500 +v 0.000000 0.562500 1.187500 +v -0.750000 0.375000 0.937500 +v 0.000000 0.375000 0.937500 +v 0.000000 0.375000 1.187500 +v -1.059359 0.949524 0.937500 +v -1.059359 0.949524 1.187500 +v -0.750000 0.375000 1.187500 +v -1.191942 0.816942 0.937500 +v -1.191942 0.816942 1.187500 +v -0.672335 0.562500 0.937500 +v -0.672335 0.562500 1.187500 +v 0.750000 0.375000 0.937500 +v 1.059359 0.949524 0.937500 +v 1.059359 0.949524 1.187500 +v 0.750000 0.375000 1.187500 +v 1.191942 0.816942 0.937500 +v 1.191942 0.816942 1.187500 +v 0.672335 0.562500 0.937500 +v 0.672335 0.562500 1.187500 +vt 0.812500 0.656250 +vt 0.812500 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.656250 +vt 0.968750 0.656250 +vt 0.968750 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.656250 +vt 0.968750 0.656250 +vt 0.968750 1.000000 +vt 0.500000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.656250 +vt 0.500000 0.656250 +vt 0.500000 0.500000 +vt 0.812500 0.656250 +vt 0.500000 0.656250 +vt 0.500000 1.000000 +vt 0.812500 1.000000 +vt 0.968750 0.656250 +vt 0.812500 0.656250 +vt 0.812500 1.000000 +vt 0.968750 1.000000 +vt 0.968750 0.656250 +vt 0.968750 1.000000 +vt 0.812500 0.500000 +vt 0.500000 0.500000 +vt 0.812500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.656250 +vt 0.812500 0.656250 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.187500 0.000000 +vt 0.187500 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.187500 +vt 0.000000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.500000 +vt -0.000000 0.187500 +vt 0.187500 0.000000 +vt 0.500000 -0.000000 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.375000 0.937500 +vt 0.375000 0.687500 +vt 0.500000 0.687500 +vt 0.500000 0.937500 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 1.000000 0.375000 +vt 1.000000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.000000 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.000000 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt -0.000000 0.187500 +vt 0.000000 0.500000 +vt 0.500000 -0.000000 +vt 0.187500 0.000000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.375000 0.937500 +vt 0.500000 0.937500 +vt 0.500000 0.687500 +vt 0.375000 0.687500 +vt 0.843750 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 1.000000 0.625000 +vt 1.000000 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.000000 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.000000 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt -0.000000 0.187500 +vt 0.000000 0.500000 +vt 0.500000 -0.000000 +vt 0.187500 0.000000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.375000 0.937500 +vt 0.500000 0.937500 +vt 0.500000 0.687500 +vt 0.375000 0.687500 +vt 0.843750 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 1.000000 0.625000 +vt 1.000000 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.187500 0.000000 +vt 0.187500 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.187500 +vt 0.000000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.500000 +vt -0.000000 0.187500 +vt 0.187500 0.000000 +vt 0.500000 -0.000000 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.375000 0.937500 +vt 0.375000 0.687500 +vt 0.500000 0.687500 +vt 0.500000 0.937500 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 1.000000 0.375000 +vt 1.000000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.250000 +vt 0.750000 0.250000 +vt 0.812500 0.000000 +vt 0.812500 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.500000 0.000000 +vt 0.500000 0.000000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.812500 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.812500 0.000000 +vt 0.750000 0.500000 +vt 0.750000 0.250000 +vt 0.500000 0.250000 +vt 0.500000 0.500000 +vt 0.812500 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.812500 0.250000 +vt 0.656250 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.500000 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.812500 0.250000 +vt 0.812500 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.750000 0.500000 +vt 0.750000 0.250000 +vt 0.500000 0.250000 +vt 0.500000 0.500000 +vt 0.812500 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.812500 0.250000 +vt 0.656250 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.500000 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.812500 0.250000 +vt 0.812500 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.250000 +vt 0.750000 0.250000 +vt 0.812500 0.000000 +vt 0.812500 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.500000 0.000000 +vt 0.500000 0.000000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.812500 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.812500 0.000000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.812500 0.468750 +vt 0.812500 0.375000 +vt 0.375000 0.125000 +vt 0.375000 0.000000 +vt -0.000000 0.000000 +vt 0.000000 0.125000 +vt 0.000000 0.218750 +vt 0.336167 0.218750 +vt 0.336167 0.000000 +vt 0.336167 0.125000 +vt 0.000000 0.125000 +vt -0.000000 0.000000 +vt 0.375000 0.125000 +vt 0.336167 0.218750 +vt 0.000000 0.218750 +vt 0.000000 0.125000 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.687500 0.218750 +vt 0.413832 0.218750 +vt 0.687500 0.125000 +vt 0.413833 0.218750 +vt 0.687500 0.218750 +vt 0.413833 0.125000 +vt 0.413832 0.000000 +vt 0.687500 0.000000 +vt 0.687500 0.125000 +vt 0.375000 0.125000 +vt 0.375000 0.000000 +vt 0.336167 0.218750 +vt 0.336167 0.000000 +vt 0.336167 0.125000 +vt 0.375000 0.125000 +vt 0.336167 0.218750 +vt 0.687500 0.000000 +vt 0.687500 0.125000 +vt 0.687500 0.218750 +vt 0.687500 0.125000 +vt 0.413832 0.218750 +vt 0.687500 0.218750 +vt 0.413833 0.218750 +vt 0.413833 0.125000 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.413832 0.000000 +vt 0.375000 0.125000 +vt 0.000000 0.125000 +vt -0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.000000 0.218750 +vt 0.336167 0.218750 +vt 0.336167 0.000000 +vt -0.000000 0.000000 +vt 0.000000 0.125000 +vt 0.336167 0.125000 +vt 0.375000 0.125000 +vt 0.000000 0.125000 +vt 0.000000 0.218750 +vt 0.336167 0.218750 +vt 0.687500 0.000000 +vt 0.687500 0.125000 +vt 0.687500 0.218750 +vt 0.687500 0.125000 +vt 0.413832 0.218750 +vt 0.687500 0.218750 +vt 0.413833 0.218750 +vt 0.413833 0.125000 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.413832 0.000000 +vt 0.375000 0.125000 +vt 0.375000 0.000000 +vt 0.336167 0.218750 +vt 0.336167 0.000000 +vt 0.336167 0.125000 +vt 0.375000 0.125000 +vt 0.336167 0.218750 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.687500 0.218750 +vt 0.413832 0.218750 +vt 0.687500 0.125000 +vt 0.413833 0.218750 +vt 0.687500 0.218750 +vt 0.413833 0.125000 +vt 0.413832 0.000000 +vt 0.687500 0.000000 +vt 0.687500 0.125000 +vt 0.687500 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.562500 +vt 0.687500 0.562500 +vt 0.312500 0.312500 +vt 0.312500 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.687500 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.562500 +vt 0.687500 0.562500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.312500 0.562500 +vt 0.312500 0.312500 +vt 0.000000 0.562500 +vt 0.437500 0.562500 +vt 0.437500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.562500 +vt 0.000000 0.562500 +vt 1.000000 0.687500 +vt 1.000000 1.000000 +vt 0.687500 1.000000 +vt 0.687500 0.687500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.562500 +vt 0.000000 0.562500 +vt 1.000000 0.687500 +vt 1.000000 1.000000 +vt 0.687500 1.000000 +vt 0.687500 0.687500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.562500 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.562500 +vt 0.000000 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.718750 0.718750 +vt 0.968750 0.718750 +vt 0.968750 0.968750 +vt 0.718750 0.968750 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.906250 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.562500 +vt 0.906250 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.562500 +vt 0.906250 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.906250 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.625000 -0.000000 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.625000 -0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.343750 0.031250 +vt 0.593750 0.031250 +vt 0.593750 0.281250 +vt 0.343750 0.281250 +vt 0.343750 0.031250 +vt 0.343750 0.281250 +vt 0.593750 0.281250 +vt 0.593750 0.031250 +vt 0.343750 0.031250 +vt 0.343750 0.281250 +vt 0.593750 0.281250 +vt 0.593750 0.031250 +vt 0.343750 0.031250 +vt 0.593750 0.031250 +vt 0.593750 0.281250 +vt 0.343750 0.281250 +vt 0.312500 0.187500 +vt 0.312500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.187500 +vt 0.687500 0.187500 +vt 0.875000 0.187500 +vt 0.875000 1.000000 +vt 0.687500 1.000000 +vt 0.312500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.187500 +vt 0.312500 0.187500 +vt 0.687500 1.000000 +vt 0.687500 0.187500 +vt 0.875000 0.187500 +vt 0.875000 1.000000 +vt 0.312500 0.000000 +vt 0.125000 0.000000 +vt 0.125000 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.000000 +vt 0.125000 0.000000 +vt 0.125000 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 0.000000 +vt 0.125000 1.000000 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 0.000000 +vt 0.312500 0.187500 +vt 0.125000 0.187500 +vt 0.125000 1.000000 +vt 0.312500 1.000000 +vt 0.687500 0.187500 +vt 0.687500 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.187500 +vt 0.312500 1.000000 +vt 0.312500 0.187500 +vt 0.125000 0.187500 +vt 0.125000 1.000000 +vt 0.687500 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.187500 +vt 0.687500 0.187500 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.000000 +vt 0.312500 0.000000 +vt 0.125000 1.000000 +vt 0.125000 0.000000 +vt 0.312500 1.000000 +vt 0.312500 0.000000 +vt 0.125000 0.000000 +vt 0.312500 1.000000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.7071 -0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.0000 0.9239 -0.3827 +vn 0.0000 0.9239 0.3827 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 -0.9239 -0.3827 +vn 0.0000 -0.3827 -0.9239 +vn 0.0000 0.3827 0.9239 +vn 0.0000 -0.3827 0.9239 +vn 0.0000 0.3827 -0.9239 +usemtl Bogey_Piston +s off +f 621/1693/46 622/1694/46 624/1695/46 623/1696/46 +f 623/1697/47 624/1698/47 628/1699/47 627/1700/47 +f 625/1701/48 626/1702/48 622/1694/48 621/1693/48 +f 623/1696/49 627/1703/49 625/1704/49 621/1693/49 +f 628/1705/50 624/1706/50 622/1707/50 626/1708/50 +f 629/1709/51 631/1710/51 632/1711/51 630/1712/51 +f 631/1713/47 635/1714/47 636/1715/47 632/1716/47 +f 633/1717/48 629/1709/48 630/1712/48 634/1718/48 +f 631/1710/49 629/1709/49 633/1719/49 635/1720/49 +f 636/1721/50 634/1722/50 630/1723/50 632/1724/50 +f 637/1725/46 638/1726/46 640/1727/46 639/1728/46 +f 639/1729/47 640/1730/47 644/1731/47 643/1732/47 +f 643/1733/51 644/1734/51 642/1735/51 641/1736/51 +f 639/1737/49 643/1738/49 641/1739/49 637/1740/49 +f 644/1734/50 640/1741/50 638/1742/50 642/1735/50 +f 641/1736/48 642/1735/48 638/1743/48 637/1744/48 +f 650/1745/49 646/1746/49 648/1747/49 652/1748/49 +f 650/1749/48 649/1750/48 645/1751/48 646/1752/48 +f 652/1753/51 651/1754/51 649/1755/51 650/1745/51 +f 645/1756/50 649/1757/50 651/1758/50 647/1759/50 +f 646/1760/46 645/1761/46 647/1762/46 648/1763/46 +f 653/1764/46 654/1765/46 656/1766/46 655/1767/46 +f 655/1767/48 656/1766/48 660/1768/48 659/1769/48 +f 659/1770/51 660/1771/51 658/1772/51 657/1773/51 +f 655/1767/50 659/1769/50 657/1774/50 653/1775/50 +f 660/1776/49 656/1777/49 654/1778/49 658/1779/49 +f 661/1780/51 663/1781/51 664/1782/51 662/1783/51 +f 663/1784/47 667/1785/47 668/1786/47 664/1787/47 +f 667/1788/46 665/1789/46 666/1790/46 668/1791/46 +f 663/1792/49 661/1793/49 665/1794/49 667/1795/49 +f 668/1791/50 666/1790/50 662/1796/50 664/1797/50 +f 665/1789/48 661/1798/48 662/1799/48 666/1790/48 +f 674/1800/49 676/1801/49 672/1802/49 670/1803/49 +f 674/1804/48 670/1805/48 669/1806/48 673/1807/48 +f 676/1808/46 674/1800/46 673/1809/46 675/1810/46 +f 669/1811/50 671/1812/50 675/1813/50 673/1814/50 +f 670/1815/51 672/1816/51 671/1817/51 669/1818/51 +f 677/1819/51 679/1820/51 680/1821/51 678/1822/51 +f 679/1820/48 683/1823/48 684/1824/48 680/1821/48 +f 683/1825/46 681/1826/46 682/1827/46 684/1828/46 +f 679/1820/50 677/1829/50 681/1830/50 683/1823/50 +f 684/1831/49 682/1832/49 678/1833/49 680/1834/49 +f 685/1835/46 687/1836/46 688/1837/46 686/1838/46 +f 687/1839/48 691/1840/48 692/1841/48 688/1842/48 +f 691/1843/51 689/1844/51 690/1845/51 692/1846/51 +f 687/1847/49 685/1848/49 689/1849/49 691/1850/49 +f 692/1846/50 690/1845/50 686/1851/50 688/1852/50 +f 689/1844/47 685/1853/47 686/1854/47 690/1845/47 +f 698/1855/49 700/1856/49 696/1857/49 694/1858/49 +f 698/1859/47 694/1860/47 693/1861/47 697/1862/47 +f 700/1863/51 698/1855/51 697/1864/51 699/1865/51 +f 693/1866/50 695/1867/50 699/1868/50 697/1869/50 +f 694/1870/46 696/1871/46 695/1872/46 693/1873/46 +f 701/1874/46 703/1875/46 704/1876/46 702/1877/46 +f 703/1875/47 707/1878/47 708/1879/47 704/1876/47 +f 707/1880/51 705/1881/51 706/1882/51 708/1883/51 +f 703/1875/50 701/1884/50 705/1885/50 707/1878/50 +f 708/1886/49 706/1887/49 702/1888/49 704/1889/49 +f 709/1890/51 710/1891/51 712/1892/51 711/1893/51 +f 711/1894/48 712/1895/48 716/1896/48 715/1897/48 +f 715/1898/46 716/1899/46 714/1900/46 713/1901/46 +f 711/1902/49 715/1903/49 713/1904/49 709/1905/49 +f 716/1899/50 712/1906/50 710/1907/50 714/1900/50 +f 713/1901/47 714/1900/47 710/1908/47 709/1909/47 +f 722/1910/49 718/1911/49 720/1912/49 724/1913/49 +f 722/1914/47 721/1915/47 717/1916/47 718/1917/47 +f 724/1918/46 723/1919/46 721/1920/46 722/1910/46 +f 717/1921/50 721/1922/50 723/1923/50 719/1924/50 +f 718/1925/51 717/1926/51 719/1927/51 720/1928/51 +f 725/1929/51 726/1930/51 728/1931/51 727/1932/51 +f 727/1932/47 728/1931/47 732/1933/47 731/1934/47 +f 731/1935/46 732/1936/46 730/1937/46 729/1938/46 +f 727/1932/50 731/1934/50 729/1939/50 725/1940/50 +f 732/1941/49 728/1942/49 726/1943/49 730/1944/49 +f 821/1945/51 822/1946/51 824/1947/51 823/1948/51 +f 823/1949/48 824/1950/48 828/1951/48 827/1952/48 +f 825/1953/47 826/1954/47 822/1955/47 821/1956/47 +f 823/1957/49 827/1952/49 825/1958/49 821/1959/49 +f 828/1960/50 824/1961/50 822/1962/50 826/1963/50 +f 829/1964/46 831/1965/46 832/1966/46 830/1967/46 +f 831/1968/48 835/1969/48 836/1970/48 832/1971/48 +f 833/1972/47 829/1973/47 830/1974/47 834/1975/47 +f 831/1976/49 829/1977/49 833/1978/49 835/1969/49 +f 836/1979/50 834/1980/50 830/1981/50 832/1982/50 +f 837/1983/51 839/1984/51 840/1985/51 838/1986/51 +f 839/1987/47 843/1988/47 844/1989/47 840/1990/47 +f 841/1991/48 837/1992/48 838/1993/48 842/1994/48 +f 839/1995/49 837/1996/49 841/1997/49 843/1988/49 +f 844/1998/50 842/1999/50 838/2000/50 840/2001/50 +f 845/2002/46 846/2003/46 848/2004/46 847/2005/46 +f 847/2006/47 848/2007/47 852/2008/47 851/2009/47 +f 849/2010/48 850/2011/48 846/2012/48 845/2013/48 +f 847/2014/49 851/2009/49 849/2015/49 845/2016/49 +f 852/2017/50 848/2018/50 846/2019/50 850/2020/50 +usemtl wheel_Large +f 797/2021/46 798/2022/46 800/2023/46 799/2024/46 +f 799/2025/47 800/2026/47 804/2027/47 803/2028/47 +f 803/2029/51 804/2030/51 802/2031/51 801/2032/51 +f 801/2033/48 802/2034/48 798/2035/48 797/2036/48 +f 804/2037/50 800/2038/50 798/2039/50 802/2034/50 +f 813/2040/46 815/2041/46 816/2042/46 814/2043/46 +f 815/2044/48 819/2045/48 820/2046/48 816/2047/48 +f 819/2048/51 817/2049/51 818/2050/51 820/2051/51 +f 817/2052/47 813/2053/47 814/2054/47 818/2055/47 +f 820/2056/50 818/2055/50 814/2057/50 816/2058/50 +f 911/2059/49 916/2060/49 913/2061/49 912/2062/49 +f 909/2063/48 919/2064/48 911/2059/48 912/2062/48 +f 920/2065/50 919/2066/50 909/2067/50 910/2068/50 +f 916/2069/47 920/2070/47 910/2071/47 913/2072/47 +f 911/2059/52 917/2073/52 918/2074/52 916/2060/52 +f 915/2075/47 920/2076/47 916/2069/47 918/2077/47 +f 911/2059/48 919/2078/48 914/2079/48 917/2073/48 +f 919/2080/53 920/2081/53 915/2082/53 914/2083/53 +f 921/2084/49 912/2062/49 913/2061/49 924/2085/49 +f 909/2063/48 912/2062/48 921/2084/48 927/2086/48 +f 928/2087/50 910/2068/50 909/2067/50 927/2088/50 +f 924/2089/47 913/2072/47 910/2071/47 928/2090/47 +f 921/2084/54 924/2085/54 926/2091/54 925/2092/54 +f 923/2093/47 926/2094/47 924/2089/47 928/2095/47 +f 921/2084/48 925/2092/48 922/2096/48 927/2097/48 +f 927/2098/55 922/2099/55 923/2100/55 928/2101/55 +f 931/2102/49 932/2103/49 933/2104/49 936/2105/49 +f 929/2106/47 932/2103/47 931/2102/47 939/2107/47 +f 940/2108/50 930/2109/50 929/2110/50 939/2111/50 +f 936/2112/48 933/2113/48 930/2114/48 940/2115/48 +f 931/2102/52 936/2105/52 938/2116/52 937/2117/52 +f 935/2118/48 938/2119/48 936/2112/48 940/2120/48 +f 931/2102/47 937/2117/47 934/2121/47 939/2122/47 +f 939/2123/53 934/2124/53 935/2125/53 940/2126/53 +f 941/2127/49 944/2128/49 933/2104/49 932/2103/49 +f 929/2106/47 947/2129/47 941/2127/47 932/2103/47 +f 948/2130/50 947/2131/50 929/2110/50 930/2109/50 +f 944/2132/48 948/2133/48 930/2114/48 933/2113/48 +f 941/2127/54 945/2134/54 946/2135/54 944/2128/54 +f 943/2136/48 948/2137/48 944/2132/48 946/2138/48 +f 941/2127/47 947/2139/47 942/2140/47 945/2134/47 +f 947/2141/55 948/2142/55 943/2143/55 942/2144/55 +usemtl Bogey_Body +f 733/2145/46 734/2146/46 736/2147/46 735/2148/46 +f 735/2149/47 736/2150/47 740/2151/47 739/2152/47 +f 739/2153/51 740/2154/51 738/2155/51 737/2156/51 +f 737/2157/48 738/2158/48 734/2159/48 733/2160/48 +f 735/2161/49 739/2162/49 737/2163/49 733/2164/49 +f 740/2154/50 736/2165/50 734/2166/50 738/2155/50 +f 741/2167/46 742/2168/46 744/2169/46 743/2170/46 +f 743/2171/47 744/2172/47 748/2173/47 747/2174/47 +f 747/2175/51 748/2176/51 746/2177/51 745/2178/51 +f 745/2179/48 746/2180/48 742/2181/48 741/2182/48 +f 743/2183/49 747/2184/49 745/2185/49 741/2186/49 +f 748/2187/50 744/2188/50 742/2189/50 746/2190/50 +f 749/2191/46 750/2192/46 752/2193/46 751/2194/46 +f 751/2195/47 752/2196/47 756/2197/47 755/2198/47 +f 755/2199/51 756/2200/51 754/2201/51 753/2202/51 +f 753/2203/48 754/2204/48 750/2205/48 749/2206/48 +f 756/2207/50 752/2208/50 750/2209/50 754/2210/50 +f 758/2211/47 762/2212/47 763/2213/47 760/2214/47 +f 760/2214/54 763/2213/54 764/2215/54 759/2216/54 +f 759/2217/48 764/2218/48 761/2219/48 757/2220/48 +f 766/2221/47 768/2222/47 771/2223/47 770/2224/47 +f 768/2222/52 767/2225/52 772/2226/52 771/2223/52 +f 767/2227/48 765/2228/48 769/2229/48 772/2230/48 +f 774/2231/48 776/2232/48 779/2233/48 778/2234/48 +f 776/2232/54 775/2235/54 780/2236/54 779/2233/54 +f 775/2237/47 773/2238/47 777/2239/47 780/2240/47 +f 782/2241/48 786/2242/48 787/2243/48 784/2244/48 +f 784/2244/52 787/2243/52 788/2245/52 783/2246/52 +f 783/2247/47 788/2248/47 785/2249/47 781/2250/47 +f 789/2251/51 790/2252/51 792/2253/51 791/2254/51 +f 791/2255/48 792/2256/48 796/2257/48 795/2258/48 +f 795/2259/46 796/2260/46 794/2261/46 793/2262/46 +f 793/2263/47 794/2261/47 790/2264/47 789/2265/47 +f 791/2266/49 795/2267/49 793/2268/49 789/2269/49 +f 796/2257/50 792/2270/50 790/2271/50 794/2272/50 +f 805/2273/51 807/2274/51 808/2275/51 806/2276/51 +f 807/2277/47 811/2278/47 812/2279/47 808/2280/47 +f 811/2281/46 809/2282/46 810/2283/46 812/2284/46 +f 809/2285/48 805/2286/48 806/2287/48 810/2283/48 +f 807/2288/49 805/2289/49 809/2290/49 811/2291/49 +f 812/2279/50 810/2292/50 806/2293/50 808/2294/50 +f 827/2295/46 828/2296/46 826/2297/46 825/2298/46 +f 835/2299/51 833/2300/51 834/2301/51 836/2302/51 +f 843/2303/46 841/2304/46 842/2305/46 844/2306/46 +f 851/2307/51 852/2308/51 850/2309/51 849/2310/51 +usemtl Belts +f 853/2311/56 855/2312/56 856/2313/56 854/2314/56 +f 857/2315/56 858/2316/56 860/2317/56 859/2318/56 +f 861/2319/57 862/2320/57 864/2321/57 863/2322/57 +f 865/2323/57 867/2324/57 868/2325/57 866/2326/57 +f 873/2327/50 874/2328/50 872/2329/50 871/2330/50 +f 869/2331/50 870/2332/50 874/2333/50 873/2334/50 +f 879/2335/50 877/2336/50 878/2337/50 880/2338/50 +f 875/2339/50 879/2340/50 880/2338/50 876/2341/50 +f 881/2342/58 882/2343/58 884/2344/58 883/2345/58 +f 885/2346/58 887/2347/58 888/2348/58 886/2349/58 +f 889/2350/59 891/2351/59 892/2352/59 890/2353/59 +f 893/2354/59 894/2355/59 896/2356/59 895/2357/59 +f 901/2358/49 899/2359/49 900/2360/49 902/2361/49 +f 897/2362/49 901/2363/49 902/2364/49 898/2365/49 +f 907/2366/49 908/2367/49 906/2368/49 905/2369/49 +f 903/2370/49 904/2371/49 908/2367/49 907/2372/49 +f 853/2311/60 854/2314/60 882/2343/60 881/2342/60 +f 856/2313/61 855/2312/61 883/2345/61 884/2344/61 +f 854/2314/51 856/2313/51 884/2344/51 882/2343/51 +f 855/2312/46 853/2311/46 881/2342/46 883/2345/46 +f 858/2316/60 857/2315/60 885/2346/60 886/2349/60 +f 859/2318/61 860/2317/61 888/2348/61 887/2347/61 +f 860/2317/46 858/2316/46 886/2349/46 888/2348/46 +f 857/2315/51 859/2318/51 887/2347/51 885/2346/51 +f 862/2320/62 861/2319/62 889/2350/62 890/2353/62 +f 863/2322/63 864/2321/63 892/2352/63 891/2351/63 +f 864/2321/51 862/2320/51 890/2353/51 892/2352/51 +f 861/2319/46 863/2322/46 891/2351/46 889/2350/46 +f 865/2323/62 866/2326/62 894/2355/62 893/2354/62 +f 868/2325/63 867/2324/63 895/2357/63 896/2356/63 +f 866/2326/46 868/2325/46 896/2356/46 894/2355/46 +f 867/2324/51 865/2323/51 893/2354/51 895/2357/51 +f 869/2331/46 873/2334/46 901/2363/46 897/2362/46 +f 870/2332/48 869/2331/48 897/2362/48 898/2365/48 +f 872/2329/51 874/2328/51 902/2361/51 900/2360/51 +f 871/2330/47 872/2329/47 900/2360/47 899/2359/47 +f 873/2327/46 871/2330/46 899/2359/46 901/2358/46 +f 874/2333/51 870/2332/51 898/2365/51 902/2364/51 +f 879/2340/51 875/2339/51 903/2370/51 907/2372/51 +f 875/2339/48 876/2341/48 904/2371/48 903/2370/48 +f 880/2338/46 878/2337/46 906/2368/46 908/2367/46 +f 878/2337/47 877/2336/47 905/2369/47 906/2368/47 +f 877/2336/51 879/2335/51 907/2366/51 905/2369/51 +f 876/2341/46 880/2338/46 908/2367/46 904/2371/46 +o Cube.051_Cube.043 +v -3.500000 18.500000 3.500000 +v -3.500000 21.500000 3.500000 +v -3.500000 18.500000 -3.500000 +v -3.500000 21.500000 -3.500000 +v 3.500000 18.500000 3.500000 +v 3.500000 21.500000 3.500000 +v 3.500000 18.500000 -3.500000 +v 3.500000 21.500000 -3.500000 +v -2.500000 17.499998 -2.500000 +v -2.500000 22.499998 -2.500000 +v -2.500000 17.499998 -4.500000 +v -2.500000 22.499998 -4.500000 +v 2.500000 17.499998 -2.500000 +v 2.500000 22.499998 -2.500000 +v 2.500000 17.499998 -4.500000 +v 2.500000 22.499998 -4.500000 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.000000 +vt 0.906250 0.000000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.531250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.375000 +vt 0.531250 0.375000 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.531250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.375000 +vt 0.531250 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +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 +usemtl wheel_Large +s off +f 949/2373/64 950/2374/64 952/2375/64 951/2376/64 +f 951/2377/65 952/2378/65 956/2379/65 955/2380/65 +f 955/2381/66 956/2382/66 954/2383/66 953/2384/66 +f 953/2385/67 954/2386/67 950/2387/67 949/2388/67 +f 951/2389/68 955/2390/68 953/2391/68 949/2392/68 +f 956/2393/69 952/2394/69 950/2387/69 954/2386/69 +f 957/2395/64 958/2396/64 960/2397/64 959/2398/64 +f 959/2399/65 960/2400/65 964/2401/65 963/2402/65 +f 963/2403/66 964/2404/66 962/2405/66 961/2406/66 +f 961/2407/67 962/2408/67 958/2409/67 957/2410/67 +f 959/2411/68 963/2412/68 961/2413/68 957/2414/68 +f 964/2415/69 960/2416/69 958/2417/69 962/2418/69 +o Cube.052_Cube.044 +v -1.500000 21.499998 -4.500000 +v 1.500000 21.499998 -4.500000 +v 1.500000 21.499998 -8.500000 +v 1.500000 18.499998 -8.500000 +v -1.500000 18.499998 -8.500000 +v -1.500000 18.499998 -4.500000 +v 1.500000 18.499998 -4.500000 +v -1.500000 21.499998 -8.500000 +v -2.000000 17.999998 -5.500000 +v -2.000000 21.999998 -5.500000 +v 2.000000 21.999998 -7.500000 +v -2.000000 17.999998 -7.500000 +v 2.000000 17.999998 -5.500000 +v 2.000000 21.999998 -5.500000 +v 2.000000 17.999998 -7.500000 +v -2.000000 21.999998 -7.500000 +v -1.500000 21.499998 -8.500000 +v 1.500000 21.499998 -8.500000 +v 1.500000 21.499998 -12.500000 +v 1.500000 18.499998 -12.500000 +v -1.500000 18.499998 -12.500000 +v -1.500000 18.499998 -8.500000 +v 1.500000 18.499998 -8.500000 +v -1.500000 21.499998 -12.500000 +v -2.000000 17.999998 -9.500000 +v -2.000000 21.999998 -9.500000 +v 2.000000 21.999998 -11.500000 +v -2.000000 17.999998 -11.500000 +v 2.000000 17.999998 -9.500000 +v 2.000000 21.999998 -9.500000 +v 2.000000 17.999998 -11.500000 +v -2.000000 21.999998 -11.500000 +v -1.500000 21.499998 -12.500000 +v 1.500000 21.499998 -12.500000 +v 1.500000 21.499998 -16.500000 +v 1.500000 18.499998 -16.500000 +v -1.500000 18.499998 -16.500000 +v -1.500000 18.499998 -12.500000 +v 1.500000 18.499998 -12.500000 +v -1.500000 21.499998 -16.500000 +v -2.000000 17.999998 -13.500000 +v -2.000000 21.999998 -13.500000 +v 2.000000 21.999998 -15.500000 +v -2.000000 17.999998 -15.500000 +v 2.000000 17.999998 -13.500000 +v 2.000000 21.999998 -13.500000 +v 2.000000 17.999998 -15.500000 +v -2.000000 21.999998 -15.500000 +v -1.500000 21.499998 -16.500000 +v 1.500000 21.499998 -16.500000 +v 1.500000 21.499998 -20.500000 +v 1.500000 18.499998 -20.500000 +v -1.500000 18.499998 -20.500000 +v -1.500000 18.499998 -16.500000 +v 1.500000 18.499998 -16.500000 +v -1.500000 21.499998 -20.500000 +v -2.000000 17.999998 -17.500000 +v -2.000000 21.999998 -17.500000 +v 2.000000 21.999998 -19.500000 +v -2.000000 17.999998 -19.500000 +v 2.000000 17.999998 -17.500000 +v 2.000000 21.999998 -17.500000 +v 2.000000 17.999998 -19.500000 +v -2.000000 21.999998 -19.500000 +v -1.500000 21.499998 -20.500000 +v 1.500000 21.499998 -20.500000 +v 1.500000 21.499998 -24.500000 +v 1.500000 18.499998 -24.500000 +v -1.500000 18.499998 -24.500000 +v -1.500000 18.499998 -20.500000 +v 1.500000 18.499998 -20.500000 +v -1.500000 21.499998 -24.500000 +v -2.000000 17.999998 -21.500000 +v -2.000000 21.999998 -21.500000 +v 2.000000 21.999998 -23.500000 +v -2.000000 17.999998 -23.500000 +v 2.000000 17.999998 -21.500000 +v 2.000000 21.999998 -21.500000 +v 2.000000 17.999998 -23.500000 +v -2.000000 21.999998 -23.500000 +v -1.500000 21.499998 -24.500000 +v 1.500000 21.499998 -24.500000 +v 1.500000 21.499998 -28.500000 +v 1.500000 18.499998 -28.500000 +v -1.500000 18.499998 -28.500000 +v -1.500000 18.499998 -24.500000 +v 1.500000 18.499998 -24.500000 +v -1.500000 21.499998 -28.500000 +v -2.000000 17.999998 -25.500000 +v -2.000000 21.999998 -25.500000 +v 2.000000 21.999998 -27.500000 +v -2.000000 17.999998 -27.500000 +v 2.000000 17.999998 -25.500000 +v 2.000000 21.999998 -25.500000 +v 2.000000 17.999998 -27.500000 +v -2.000000 21.999998 -27.500000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +usemtl wheel_Large +s off +f 970/2419/70 965/2420/70 972/2421/70 969/2422/70 +f 966/2423/71 965/2420/71 972/2421/71 967/2424/71 +f 970/2419/72 971/2425/72 968/2426/72 969/2422/72 +f 966/2423/73 971/2425/73 968/2426/73 967/2424/73 +f 973/2427/70 974/2428/70 980/2429/70 976/2430/70 +f 978/2431/71 974/2428/71 980/2429/71 975/2432/71 +f 973/2427/72 977/2433/72 979/2434/72 976/2430/72 +f 978/2431/73 977/2433/73 979/2434/73 975/2432/73 +f 986/2435/70 981/2436/70 988/2437/70 985/2438/70 +f 982/2439/71 981/2436/71 988/2437/71 983/2440/71 +f 986/2435/72 987/2441/72 984/2442/72 985/2438/72 +f 982/2439/73 987/2441/73 984/2442/73 983/2440/73 +f 989/2443/70 990/2444/70 996/2445/70 992/2446/70 +f 994/2447/71 990/2444/71 996/2445/71 991/2448/71 +f 989/2443/72 993/2449/72 995/2450/72 992/2446/72 +f 994/2447/73 993/2449/73 995/2450/73 991/2448/73 +f 1002/2451/70 997/2452/70 1004/2453/70 1001/2454/70 +f 998/2455/71 997/2452/71 1004/2453/71 999/2456/71 +f 1002/2451/72 1003/2457/72 1000/2458/72 1001/2454/72 +f 998/2455/73 1003/2457/73 1000/2458/73 999/2456/73 +f 1005/2459/70 1006/2460/70 1012/2461/70 1008/2462/70 +f 1010/2463/71 1006/2460/71 1012/2461/71 1007/2464/71 +f 1005/2459/72 1009/2465/72 1011/2466/72 1008/2462/72 +f 1010/2463/73 1009/2465/73 1011/2466/73 1007/2464/73 +f 1018/2467/70 1013/2468/70 1020/2469/70 1017/2470/70 +f 1014/2471/71 1013/2468/71 1020/2469/71 1015/2472/71 +f 1018/2467/72 1019/2473/72 1016/2474/72 1017/2470/72 +f 1014/2471/73 1019/2473/73 1016/2474/73 1015/2472/73 +f 1021/2475/70 1022/2476/70 1028/2477/70 1024/2478/70 +f 1026/2479/71 1022/2476/71 1028/2477/71 1023/2480/71 +f 1021/2475/72 1025/2481/72 1027/2482/72 1024/2478/72 +f 1026/2479/73 1025/2481/73 1027/2482/73 1023/2480/73 +f 1034/2483/70 1029/2484/70 1036/2485/70 1033/2486/70 +f 1030/2487/71 1029/2484/71 1036/2485/71 1031/2488/71 +f 1034/2483/72 1035/2489/72 1032/2490/72 1033/2486/72 +f 1030/2487/73 1035/2489/73 1032/2490/73 1031/2488/73 +f 1037/2491/70 1038/2492/70 1044/2493/70 1040/2494/70 +f 1042/2495/71 1038/2492/71 1044/2493/71 1039/2496/71 +f 1037/2491/72 1041/2497/72 1043/2498/72 1040/2494/72 +f 1042/2495/73 1041/2497/73 1043/2498/73 1039/2496/73 +f 1050/2499/70 1045/2500/70 1052/2501/70 1049/2502/70 +f 1046/2503/71 1045/2500/71 1052/2501/71 1047/2504/71 +f 1050/2499/72 1051/2505/72 1048/2506/72 1049/2502/72 +f 1046/2503/73 1051/2505/73 1048/2506/73 1047/2504/73 +f 1053/2507/70 1054/2508/70 1060/2509/70 1056/2510/70 +f 1058/2511/71 1054/2508/71 1060/2509/71 1055/2512/71 +f 1053/2507/72 1057/2513/72 1059/2514/72 1056/2510/72 +f 1058/2511/73 1057/2513/73 1059/2514/73 1055/2512/73 +o Cube.053_Cube.043 +v 3.500001 18.500000 -35.500000 +v 3.500001 21.500000 -35.500000 +v 3.499999 18.500000 -28.499998 +v 3.499999 21.500000 -28.499998 +v -3.499999 18.500000 -35.500000 +v -3.499999 21.500000 -35.500000 +v -3.500001 18.500000 -28.500002 +v -3.500001 21.500000 -28.500002 +v 2.499999 17.499998 -29.500000 +v 2.499999 22.499998 -29.500000 +v 2.499998 17.499998 -27.500000 +v 2.499998 22.499998 -27.500000 +v -2.500000 17.499998 -29.500000 +v -2.500000 22.499998 -29.500000 +v -2.500001 17.499998 -27.500002 +v -2.500001 22.499998 -27.500002 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.000000 +vt 0.906250 0.000000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.531250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.375000 +vt 0.531250 0.375000 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.531250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.375000 +vt 0.531250 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +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 +usemtl wheel_Large +s off +f 1061/2515/74 1062/2516/74 1064/2517/74 1063/2518/74 +f 1063/2519/75 1064/2520/75 1068/2521/75 1067/2522/75 +f 1067/2523/76 1068/2524/76 1066/2525/76 1065/2526/76 +f 1065/2527/77 1066/2528/77 1062/2529/77 1061/2530/77 +f 1063/2531/78 1067/2532/78 1065/2533/78 1061/2534/78 +f 1068/2535/79 1064/2536/79 1062/2529/79 1066/2528/79 +f 1069/2537/74 1070/2538/74 1072/2539/74 1071/2540/74 +f 1071/2541/75 1072/2542/75 1076/2543/75 1075/2544/75 +f 1075/2545/76 1076/2546/76 1074/2547/76 1073/2548/76 +f 1073/2549/77 1074/2550/77 1070/2551/77 1069/2552/77 +f 1071/2553/78 1075/2554/78 1073/2555/78 1069/2556/78 +f 1076/2557/79 1072/2558/79 1070/2559/79 1074/2560/79 +o Cube.038_Cube.045 +v 1.062500 0.562500 0.000000 +v 0.750000 0.310660 0.750000 +v 0.750000 0.750000 0.000000 +v 0.875000 0.310660 0.750000 +v 0.875000 0.750000 0.310660 +v 0.875000 0.625000 0.258884 +v 0.750000 0.530330 0.530330 +v 0.875000 0.750000 0.000000 +v 1.062500 0.397747 0.397748 +v 0.875000 0.625000 0.000000 +v 0.750000 0.750000 -0.310660 +v 1.062500 0.232995 0.562500 +v 0.875000 0.530330 0.530330 +v 0.875000 0.441942 0.441942 +v 0.750000 0.750000 0.310660 +v 1.062500 0.562500 0.232995 +v 0.875000 -0.310660 0.750000 +v 0.750000 -0.000000 0.750000 +v 1.062500 -0.000000 0.562500 +v 0.875000 -0.258884 0.625000 +v 1.062500 -0.232995 0.562500 +v 0.875000 -0.000000 0.750000 +v 0.875000 -0.000000 0.625000 +v 0.875000 0.258883 0.625000 +v 0.750000 -0.530330 0.530330 +v 1.062500 -0.397748 0.397748 +v 0.875000 -0.530330 0.530330 +v 0.875000 -0.441942 0.441942 +v 0.750000 -0.310660 0.750000 +v 0.750000 -0.750000 0.000000 +v 1.062500 -0.562500 0.000000 +v 1.062500 -0.562500 -0.232995 +v 0.875000 -0.750000 0.000000 +v 0.875000 -0.625000 0.000000 +v 0.875000 -0.750000 0.310660 +v 0.750000 -0.750000 0.310660 +v 0.875000 -0.625000 0.258884 +v 1.062500 -0.562500 0.232995 +v 0.750000 -0.530330 -0.530330 +v 1.062500 -0.397748 -0.397748 +v 0.875000 -0.258884 -0.625000 +v 1.062500 -0.232995 -0.562500 +v 0.875000 -0.530330 -0.530330 +v 0.875000 -0.441942 -0.441942 +v 0.875000 -0.750000 -0.310660 +v 0.750000 -0.750000 -0.310660 +v 0.875000 -0.625000 -0.258883 +v 0.750000 -0.000000 -0.750000 +v 1.062500 -0.000000 -0.562500 +v 0.875000 -0.000000 -0.750000 +v 0.875000 -0.000000 -0.625000 +v 0.875000 -0.310660 -0.750000 +v 0.750000 -0.310660 -0.750000 +v 0.875000 0.750000 -0.310660 +v 0.750000 -0.000000 0.000000 +v 0.750000 0.530330 -0.530330 +v 1.062500 0.397747 -0.397748 +v 0.875000 0.625000 -0.258883 +v 1.062500 0.562500 -0.232995 +v 0.875000 0.530330 -0.530330 +v 0.875000 0.441942 -0.441942 +v 0.875000 0.310660 -0.750000 +v 0.750000 0.310660 -0.750000 +v 0.875000 0.258883 -0.625000 +v 1.062500 0.232995 -0.562500 +v 1.062500 0.258883 0.625000 +v 1.062500 0.441942 0.441942 +v 1.062500 0.625000 0.258883 +v 1.062500 -0.258884 0.625000 +v 1.062500 -0.000000 0.625000 +v 1.062500 -0.625000 -0.258883 +v 1.062500 -0.625000 0.000000 +v 1.062500 -0.625000 0.258884 +v 1.062500 -0.258884 -0.625000 +v 1.062500 -0.441942 -0.441942 +v 1.062500 0.625000 -0.258883 +v 1.062500 0.441942 -0.441942 +v 1.062500 0.258883 -0.625000 +v 1.062500 0.625000 0.000000 +v 1.062500 -0.441942 0.441942 +v 1.062500 -0.000000 -0.625000 +v -1.062500 0.562500 0.000000 +v -0.750000 0.310660 0.750000 +v -0.750000 0.750000 0.000000 +v -0.875000 0.310660 0.750000 +v -0.875000 0.750000 0.310660 +v -0.875000 0.625000 0.258884 +v -0.750000 0.530330 0.530330 +v -0.875000 0.750000 0.000000 +v -1.062500 0.397747 0.397748 +v -0.875000 0.625000 0.000000 +v -0.750000 0.750000 -0.310660 +v -1.062500 0.232995 0.562500 +v -0.875000 0.530330 0.530330 +v -0.875000 0.441942 0.441942 +v -0.750000 0.750000 0.310660 +v -1.062500 0.562500 0.232995 +v -0.875000 -0.310660 0.750000 +v -0.750000 -0.000000 0.750000 +v -1.062500 -0.000000 0.562500 +v -0.875000 -0.258884 0.625000 +v -1.062500 -0.232995 0.562500 +v -0.875000 -0.000000 0.750000 +v -0.875000 -0.000000 0.625000 +v -0.875000 0.258883 0.625000 +v -0.750000 -0.530330 0.530330 +v -1.062500 -0.397748 0.397748 +v -0.875000 -0.530330 0.530330 +v -0.875000 -0.441942 0.441942 +v -0.750000 -0.310660 0.750000 +v -0.750000 -0.750000 0.000000 +v -1.062500 -0.562500 0.000000 +v -1.062500 -0.562500 -0.232995 +v -0.875000 -0.750000 0.000000 +v -0.875000 -0.625000 0.000000 +v -0.875000 -0.750000 0.310660 +v -0.750000 -0.750000 0.310660 +v -0.875000 -0.625000 0.258884 +v -1.062500 -0.562500 0.232995 +v -0.750000 -0.530330 -0.530330 +v -1.062500 -0.397748 -0.397748 +v -0.875000 -0.258884 -0.625000 +v -1.062500 -0.232995 -0.562500 +v -0.875000 -0.530330 -0.530330 +v -0.875000 -0.441942 -0.441942 +v -0.875000 -0.750000 -0.310660 +v -0.750000 -0.750000 -0.310660 +v -0.875000 -0.625000 -0.258883 +v -0.750000 -0.000000 -0.750000 +v -1.062500 -0.000000 -0.562500 +v -0.875000 -0.000000 -0.750000 +v -0.875000 -0.000000 -0.625000 +v -0.875000 -0.310660 -0.750000 +v -0.750000 -0.310660 -0.750000 +v -0.875000 0.750000 -0.310660 +v -0.750000 -0.000000 0.000000 +v -0.750000 0.530330 -0.530330 +v -1.062500 0.397747 -0.397748 +v -0.875000 0.625000 -0.258883 +v -1.062500 0.562500 -0.232995 +v -0.875000 0.530330 -0.530330 +v -0.875000 0.441942 -0.441942 +v -0.875000 0.310660 -0.750000 +v -0.750000 0.310660 -0.750000 +v -0.875000 0.258883 -0.625000 +v -1.062500 0.232995 -0.562500 +v -1.062500 0.258883 0.625000 +v -1.062500 0.441942 0.441942 +v -1.062500 0.625000 0.258883 +v -1.062500 -0.258884 0.625000 +v -1.062500 -0.000000 0.625000 +v -1.062500 -0.625000 -0.258883 +v -1.062500 -0.625000 0.000000 +v -1.062500 -0.625000 0.258884 +v -1.062500 -0.258884 -0.625000 +v -1.062500 -0.441942 -0.441942 +v -1.062500 0.625000 -0.258883 +v -1.062500 0.441942 -0.441942 +v -1.062500 0.258883 -0.625000 +v -1.062500 0.625000 0.000000 +v -1.062500 -0.441942 0.441942 +v -1.062500 -0.000000 -0.625000 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.468750 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.509445 0.884445 +vt 0.593489 0.800630 +vt 0.593651 0.687500 +vt 0.593489 0.574370 +vt 0.509445 0.490555 +vt 0.425630 0.406511 +vt 0.312500 0.406349 +vt 0.199370 0.406511 +vt 0.115555 0.490555 +vt 0.031511 0.574370 +vt 0.031349 0.687500 +vt 0.031511 0.800630 +vt 0.115555 0.884445 +vt 0.199370 0.968489 +vt 0.312500 0.968651 +vt 0.425630 0.968489 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.906151 +vt 0.699369 0.905987 +vt 0.687500 0.937498 +vt 0.812500 0.937499 +vt 0.925632 0.905988 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.699370 0.905989 +vt 0.687500 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.906151 +vt 0.699370 0.905989 +vt 0.687500 0.937500 +vt 0.812500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.699369 0.905987 +vt 0.687500 0.937498 +vt 0.812500 0.937499 +vt 0.812500 0.906151 +vt 0.699369 0.905987 +vt 0.687500 0.937498 +vt 0.812500 0.937499 +vt 0.925632 0.905988 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.699370 0.905989 +vt 0.687500 0.937500 +vt 0.812500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.699369 0.905987 +vt 0.687500 0.937498 +vt 0.812500 0.937499 +vt 0.925632 0.905987 +vt 0.937500 0.937500 +vt 0.925632 0.905987 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.699370 0.905989 +vt 0.687500 0.937500 +vt 0.812500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.468750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.509445 0.884445 +vt 0.425630 0.968489 +vt 0.312500 0.968651 +vt 0.199370 0.968489 +vt 0.115555 0.884445 +vt 0.031511 0.800630 +vt 0.031349 0.687500 +vt 0.031511 0.574370 +vt 0.115555 0.490555 +vt 0.199370 0.406511 +vt 0.312500 0.406349 +vt 0.425630 0.406511 +vt 0.509445 0.490555 +vt 0.593489 0.574370 +vt 0.593651 0.687500 +vt 0.593489 0.800630 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.906151 +vt 0.812500 0.937499 +vt 0.687500 0.937498 +vt 0.699369 0.905987 +vt 0.925632 0.905988 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.812500 0.937500 +vt 0.687500 0.937500 +vt 0.699370 0.905989 +vt 0.812500 0.906151 +vt 0.812500 0.937500 +vt 0.687500 0.937500 +vt 0.699370 0.905989 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.812500 0.937499 +vt 0.687500 0.937498 +vt 0.699369 0.905987 +vt 0.812500 0.906151 +vt 0.812500 0.937499 +vt 0.687500 0.937498 +vt 0.699369 0.905987 +vt 0.925632 0.905988 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.812500 0.937500 +vt 0.687500 0.937500 +vt 0.699370 0.905989 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.812500 0.937499 +vt 0.687500 0.937498 +vt 0.699369 0.905987 +vt 0.925632 0.905987 +vt 0.937500 0.937500 +vt 0.925632 0.905987 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.812500 0.937500 +vt 0.687500 0.937500 +vt 0.699370 0.905989 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.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.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +usemtl wheel_Large +s off +f 1086/2561/80 1082/2562/80 1144/2563/80 1155/2564/80 +f 1084/2565/80 1079/2566/80 1091/2567/80 1081/2568/80 +f 1084/2569/81 1081/2570/81 1082/2571/81 1086/2572/81 +f 1131/2573/82 1091/2574/82 1079/2575/82 +f 1086/2561/83 1134/2576/83 1152/2577/83 1155/2564/83 +f 1084/2565/83 1079/2566/83 1087/2578/83 1130/2579/83 +f 1084/2569/82 1130/2580/82 1134/2581/82 1086/2572/82 +f 1131/2573/81 1087/2582/81 1079/2575/81 +f 1090/2583/84 1100/2584/84 1142/2585/84 1143/2586/84 +f 1089/2587/84 1083/2588/84 1078/2589/84 1080/2590/84 +f 1089/2591/81 1080/2592/81 1100/2593/81 1090/2594/81 +f 1131/2573/82 1078/2595/82 1083/2596/82 +f 1090/2583/85 1082/2597/85 1144/2598/85 1143/2586/85 +f 1089/2587/85 1083/2588/85 1091/2599/85 1081/2600/85 +f 1089/2591/82 1081/2601/82 1082/2602/82 1090/2594/82 +f 1131/2573/81 1091/2603/81 1083/2596/81 +f 1099/2604/86 1096/2605/86 1145/2606/86 1146/2607/86 +f 1098/2608/86 1094/2609/86 1105/2610/86 1093/2611/86 +f 1098/2612/81 1093/2613/81 1096/2614/81 1099/2615/81 +f 1131/2573/82 1105/2616/82 1094/2617/82 +f 1099/2604/87 1100/2618/87 1142/2619/87 1146/2607/87 +f 1098/2608/87 1094/2609/87 1078/2620/87 1080/2621/87 +f 1098/2612/82 1080/2622/82 1100/2623/82 1099/2615/82 +f 1131/2573/81 1078/2624/81 1094/2617/81 +f 1104/2625/88 1113/2626/88 1149/2627/88 1156/2628/88 +f 1103/2629/88 1101/2630/88 1112/2631/88 1111/2632/88 +f 1103/2633/81 1111/2634/81 1113/2635/81 1104/2636/81 +f 1131/2573/82 1112/2637/82 1101/2638/82 +f 1104/2625/89 1096/2639/89 1145/2640/89 1156/2628/89 +f 1103/2629/89 1101/2630/89 1105/2641/89 1093/2642/89 +f 1103/2633/82 1093/2643/82 1096/2644/82 1104/2636/82 +f 1131/2573/81 1105/2645/81 1101/2638/81 +f 1110/2646/83 1123/2647/83 1147/2648/83 1148/2649/83 +f 1109/2650/83 1106/2651/83 1122/2652/83 1121/2653/83 +f 1109/2654/81 1121/2655/81 1123/2656/81 1110/2657/81 +f 1131/2573/82 1122/2658/82 1106/2659/82 +f 1110/2646/80 1113/2660/80 1149/2661/80 1148/2649/80 +f 1109/2650/80 1106/2651/80 1112/2662/80 1111/2663/80 +f 1109/2654/82 1111/2664/82 1113/2665/82 1110/2657/82 +f 1131/2573/81 1112/2666/81 1106/2659/81 +f 1120/2667/85 1117/2668/85 1150/2669/85 1151/2670/85 +f 1119/2671/85 1115/2672/85 1129/2673/85 1128/2674/85 +f 1119/2675/81 1128/2676/81 1117/2677/81 1120/2678/81 +f 1131/2573/82 1129/2679/82 1115/2680/82 +f 1120/2667/84 1123/2681/84 1147/2682/84 1151/2670/84 +f 1119/2671/84 1115/2672/84 1122/2683/84 1121/2684/84 +f 1119/2675/82 1121/2685/82 1123/2686/82 1120/2678/82 +f 1131/2573/81 1122/2687/81 1115/2680/81 +f 1127/2688/87 1140/2689/87 1154/2690/87 1157/2691/87 +f 1126/2692/87 1124/2693/87 1139/2694/87 1138/2695/87 +f 1126/2696/81 1138/2697/81 1140/2698/81 1127/2699/81 +f 1131/2573/82 1139/2700/82 1124/2701/82 +f 1133/2702/82 1141/2703/82 1125/2704/82 1118/2705/82 1116/2706/82 1108/2707/82 1107/2708/82 1114/2709/82 1102/2710/82 1097/2711/82 1095/2712/82 1088/2713/82 1085/2714/82 1092/2715/82 1077/2716/82 1135/2717/82 +f 1127/2688/86 1117/2718/86 1150/2719/86 1157/2691/86 +f 1126/2692/86 1124/2693/86 1129/2720/86 1128/2721/86 +f 1126/2696/82 1128/2722/82 1117/2723/82 1127/2699/82 +f 1131/2573/81 1129/2724/81 1124/2701/81 +f 1137/2725/89 1134/2726/89 1152/2727/89 1153/2728/89 +f 1136/2729/89 1132/2730/89 1087/2731/89 1130/2732/89 +f 1136/2733/81 1130/2734/81 1134/2735/81 1137/2736/81 +f 1131/2573/82 1087/2737/82 1132/2738/82 +f 1137/2725/88 1140/2739/88 1154/2740/88 1153/2728/88 +f 1136/2729/88 1132/2730/88 1139/2741/88 1138/2742/88 +f 1136/2733/82 1138/2743/82 1140/2744/82 1137/2736/82 +f 1131/2573/81 1139/2745/81 1132/2738/81 +f 1085/2746/82 1088/2747/82 1142/2748/82 1143/2749/82 +f 1092/2750/82 1085/2746/82 1143/2749/82 1144/2751/82 +f 1095/2752/82 1097/2753/82 1145/2754/82 1146/2755/82 +f 1107/2756/82 1108/2757/82 1147/2758/82 1148/2759/82 +f 1114/2760/82 1107/2756/82 1148/2759/82 1149/2761/82 +f 1116/2762/82 1118/2763/82 1150/2764/82 1151/2765/82 +f 1133/2766/82 1135/2767/82 1152/2768/82 1153/2769/82 +f 1141/2770/82 1133/2766/82 1153/2769/82 1154/2771/82 +f 1077/2772/82 1092/2773/82 1144/2774/82 1155/2775/82 +f 1135/2776/82 1077/2772/82 1155/2775/82 1152/2777/82 +f 1088/2778/82 1095/2752/82 1146/2755/82 1142/2779/82 +f 1102/2780/82 1114/2781/82 1149/2782/82 1156/2783/82 +f 1097/2784/82 1102/2780/82 1156/2783/82 1145/2785/82 +f 1108/2786/82 1116/2762/82 1151/2765/82 1147/2787/82 +f 1125/2788/82 1141/2789/82 1154/2790/82 1157/2791/82 +f 1118/2792/82 1125/2788/82 1157/2791/82 1150/2793/82 +f 1167/2794/80 1236/2795/80 1225/2796/80 1163/2797/80 +f 1165/2798/80 1162/2799/80 1172/2800/80 1160/2801/80 +f 1165/2802/82 1167/2803/82 1163/2804/82 1162/2805/82 +f 1212/2806/81 1160/2807/81 1172/2808/81 +f 1167/2794/83 1236/2795/83 1233/2809/83 1215/2810/83 +f 1165/2798/83 1211/2811/83 1168/2812/83 1160/2801/83 +f 1165/2802/81 1167/2803/81 1215/2813/81 1211/2814/81 +f 1212/2806/82 1160/2807/82 1168/2815/82 +f 1171/2816/84 1224/2817/84 1223/2818/84 1181/2819/84 +f 1170/2820/84 1161/2821/84 1159/2822/84 1164/2823/84 +f 1170/2824/82 1171/2825/82 1181/2826/82 1161/2827/82 +f 1212/2806/81 1164/2828/81 1159/2829/81 +f 1171/2816/85 1224/2817/85 1225/2830/85 1163/2831/85 +f 1170/2820/85 1162/2832/85 1172/2833/85 1164/2823/85 +f 1170/2824/81 1171/2825/81 1163/2834/81 1162/2835/81 +f 1212/2806/82 1164/2828/82 1172/2836/82 +f 1180/2837/86 1227/2838/86 1226/2839/86 1177/2840/86 +f 1179/2841/86 1174/2842/86 1186/2843/86 1175/2844/86 +f 1179/2845/82 1180/2846/82 1177/2847/82 1174/2848/82 +f 1212/2806/81 1175/2849/81 1186/2850/81 +f 1180/2837/87 1227/2838/87 1223/2851/87 1181/2852/87 +f 1179/2841/87 1161/2853/87 1159/2854/87 1175/2844/87 +f 1179/2845/81 1180/2846/81 1181/2855/81 1161/2856/81 +f 1212/2806/82 1175/2849/82 1159/2857/82 +f 1185/2858/88 1237/2859/88 1230/2860/88 1194/2861/88 +f 1184/2862/88 1192/2863/88 1193/2864/88 1182/2865/88 +f 1184/2866/82 1185/2867/82 1194/2868/82 1192/2869/82 +f 1212/2806/81 1182/2870/81 1193/2871/81 +f 1185/2858/89 1237/2859/89 1226/2872/89 1177/2873/89 +f 1184/2862/89 1174/2874/89 1186/2875/89 1182/2865/89 +f 1184/2866/81 1185/2867/81 1177/2876/81 1174/2877/81 +f 1212/2806/82 1182/2870/82 1186/2878/82 +f 1191/2879/83 1229/2880/83 1228/2881/83 1204/2882/83 +f 1190/2883/83 1202/2884/83 1203/2885/83 1187/2886/83 +f 1190/2887/82 1191/2888/82 1204/2889/82 1202/2890/82 +f 1212/2806/81 1187/2891/81 1203/2892/81 +f 1191/2879/80 1229/2880/80 1230/2893/80 1194/2894/80 +f 1190/2883/80 1192/2895/80 1193/2896/80 1187/2886/80 +f 1190/2887/81 1191/2888/81 1194/2897/81 1192/2898/81 +f 1212/2806/82 1187/2891/82 1193/2899/82 +f 1201/2900/85 1232/2901/85 1231/2902/85 1198/2903/85 +f 1200/2904/85 1209/2905/85 1210/2906/85 1196/2907/85 +f 1200/2908/82 1201/2909/82 1198/2910/82 1209/2911/82 +f 1212/2806/81 1196/2912/81 1210/2913/81 +f 1201/2900/84 1232/2901/84 1228/2914/84 1204/2915/84 +f 1200/2904/84 1202/2916/84 1203/2917/84 1196/2907/84 +f 1200/2908/81 1201/2909/81 1204/2918/81 1202/2919/81 +f 1212/2806/82 1196/2912/82 1203/2920/82 +f 1208/2921/87 1238/2922/87 1235/2923/87 1221/2924/87 +f 1207/2925/87 1219/2926/87 1220/2927/87 1205/2928/87 +f 1207/2929/82 1208/2930/82 1221/2931/82 1219/2932/82 +f 1212/2806/81 1205/2933/81 1220/2934/81 +f 1214/2935/81 1216/2936/81 1158/2937/81 1173/2938/81 1166/2939/81 1169/2940/81 1176/2941/81 1178/2942/81 1183/2943/81 1195/2944/81 1188/2945/81 1189/2946/81 1197/2947/81 1199/2948/81 1206/2949/81 1222/2950/81 +f 1208/2921/86 1238/2922/86 1231/2951/86 1198/2952/86 +f 1207/2925/86 1209/2953/86 1210/2954/86 1205/2928/86 +f 1207/2929/81 1208/2930/81 1198/2955/81 1209/2956/81 +f 1212/2806/82 1205/2933/82 1210/2957/82 +f 1218/2958/89 1234/2959/89 1233/2960/89 1215/2961/89 +f 1217/2962/89 1211/2963/89 1168/2964/89 1213/2965/89 +f 1217/2966/82 1218/2967/82 1215/2968/82 1211/2969/82 +f 1212/2806/81 1213/2970/81 1168/2971/81 +f 1218/2958/88 1234/2959/88 1235/2972/88 1221/2973/88 +f 1217/2962/88 1219/2974/88 1220/2975/88 1213/2965/88 +f 1217/2966/81 1218/2967/81 1221/2976/81 1219/2977/81 +f 1212/2806/82 1213/2970/82 1220/2978/82 +f 1166/2979/81 1224/2980/81 1223/2981/81 1169/2982/81 +f 1173/2983/81 1225/2984/81 1224/2980/81 1166/2979/81 +f 1176/2985/81 1227/2986/81 1226/2987/81 1178/2988/81 +f 1188/2989/81 1229/2990/81 1228/2991/81 1189/2992/81 +f 1195/2993/81 1230/2994/81 1229/2990/81 1188/2989/81 +f 1197/2995/81 1232/2996/81 1231/2997/81 1199/2998/81 +f 1214/2999/81 1234/3000/81 1233/3001/81 1216/3002/81 +f 1222/3003/81 1235/3004/81 1234/3000/81 1214/2999/81 +f 1158/3005/81 1236/3006/81 1225/3007/81 1173/3008/81 +f 1216/3009/81 1233/3010/81 1236/3006/81 1158/3005/81 +f 1169/3011/81 1223/3012/81 1227/2986/81 1176/2985/81 +f 1183/3013/81 1237/3014/81 1230/3015/81 1195/3016/81 +f 1178/3017/81 1226/3018/81 1237/3014/81 1183/3013/81 +f 1189/3019/81 1228/3020/81 1232/2996/81 1197/2995/81 +f 1206/3021/81 1238/3022/81 1235/3023/81 1222/3024/81 +f 1199/3025/81 1231/3026/81 1238/3022/81 1206/3021/81 +o Cube.039_Cube.046 +v 1.062500 1.062500 0.250000 +v 1.062500 1.187500 0.250000 +v 1.187500 1.062500 0.250000 +v 1.187500 1.187500 0.250000 +v 1.062500 1.062500 1.000000 +v 1.062500 1.187500 1.000000 +v 1.187500 1.187500 1.000000 +v 1.187500 1.062500 1.000000 +v 1.062500 1.062500 -0.250000 +v 1.062500 1.187500 -0.250000 +v 1.187500 1.062500 -0.250000 +v 1.187500 1.187500 -0.250000 +v 1.062500 1.062500 -1.000000 +v 1.062500 1.187500 -1.000000 +v 1.187500 1.187500 -1.000000 +v 1.187500 1.062500 -1.000000 +v 1.062500 0.812500 0.250000 +v 1.062500 0.937500 0.250000 +v 1.187500 0.812500 0.250000 +v 1.187500 0.937500 0.250000 +v 1.062500 0.812500 1.000000 +v 1.062500 0.937500 1.000000 +v 1.187500 0.937500 1.000000 +v 1.187500 0.812500 1.000000 +v 1.062500 0.812500 -0.250000 +v 1.062500 0.937500 -0.250000 +v 1.187500 0.812500 -0.250000 +v 1.187500 0.937500 -0.250000 +v 1.062500 0.812500 -1.000000 +v 1.062500 0.937500 -1.000000 +v 1.187500 0.937500 -1.000000 +v 1.187500 0.812500 -1.000000 +v -1.062500 1.062500 0.250000 +v -1.062500 1.187500 0.250000 +v -1.187500 1.062500 0.250000 +v -1.187500 1.187500 0.250000 +v -1.062500 1.062500 1.000000 +v -1.062500 1.187500 1.000000 +v -1.187500 1.187500 1.000000 +v -1.187500 1.062500 1.000000 +v -1.062500 1.062500 -0.250000 +v -1.062500 1.187500 -0.250000 +v -1.187500 1.062500 -0.250000 +v -1.187500 1.187500 -0.250000 +v -1.062500 1.062500 -1.000000 +v -1.062500 1.187500 -1.000000 +v -1.187500 1.187500 -1.000000 +v -1.187500 1.062500 -1.000000 +v -1.062500 0.812500 0.250000 +v -1.062500 0.937500 0.250000 +v -1.187500 0.812500 0.250000 +v -1.187500 0.937500 0.250000 +v -1.062500 0.812500 1.000000 +v -1.062500 0.937500 1.000000 +v -1.187500 0.937500 1.000000 +v -1.187500 0.812500 1.000000 +v -1.062500 0.812500 -0.250000 +v -1.062500 0.937500 -0.250000 +v -1.187500 0.812500 -0.250000 +v -1.187500 0.937500 -0.250000 +v -1.062500 0.812500 -1.000000 +v -1.062500 0.937500 -1.000000 +v -1.187500 0.937500 -1.000000 +v -1.187500 0.812500 -1.000000 +v 1.062500 0.687500 0.062500 +v 1.062500 1.312500 0.062500 +v 1.062500 0.687500 -0.062500 +v 1.062500 1.312500 -0.062500 +v 1.187500 0.687500 0.062500 +v 1.187500 1.312500 0.062500 +v 1.187500 0.687500 -0.062500 +v 1.187500 1.312500 -0.062500 +v 1.062500 0.562500 -0.187500 +v 1.062500 0.562500 0.187500 +v 1.062500 1.437500 0.187500 +v 1.062500 1.437500 -0.187500 +v 1.187500 1.437500 -0.187500 +v 1.187500 0.562500 -0.187500 +v 1.187500 0.562500 0.187500 +v 1.187500 1.437500 0.187500 +v 1.062500 0.750000 0.250000 +v 1.062500 1.250000 0.250000 +v 1.062500 0.750000 0.125000 +v 1.062500 1.250000 0.125000 +v 1.250000 0.750000 0.250000 +v 1.250000 1.250000 0.250000 +v 1.250000 0.750000 0.125000 +v 1.250000 1.250000 0.125000 +v 1.062500 0.750000 -0.125000 +v 1.062500 1.250000 -0.125000 +v 1.062500 0.750000 -0.250000 +v 1.062500 1.250000 -0.250000 +v 1.250000 0.750000 -0.125000 +v 1.250000 1.250000 -0.125000 +v 1.250000 0.750000 -0.250000 +v 1.250000 1.250000 -0.250000 +v -1.062500 0.687500 0.062500 +v -1.062500 1.312500 0.062500 +v -1.062500 0.687500 -0.062500 +v -1.062500 1.312500 -0.062500 +v -1.187500 0.687500 0.062500 +v -1.187500 1.312500 0.062500 +v -1.187500 0.687500 -0.062500 +v -1.187500 1.312500 -0.062500 +v -1.062500 0.562500 -0.187500 +v -1.062500 0.562500 0.187500 +v -1.062500 1.437500 0.187500 +v -1.062500 1.437500 -0.187500 +v -1.187500 1.437500 -0.187500 +v -1.187500 0.562500 -0.187500 +v -1.187500 0.562500 0.187500 +v -1.187500 1.437500 0.187500 +v -1.062500 0.750000 0.250000 +v -1.062500 1.250000 0.250000 +v -1.062500 0.750000 0.125000 +v -1.062500 1.250000 0.125000 +v -1.250000 0.750000 0.250000 +v -1.250000 1.250000 0.250000 +v -1.250000 0.750000 0.125000 +v -1.250000 1.250000 0.125000 +v -1.062500 0.750000 -0.125000 +v -1.062500 1.250000 -0.125000 +v -1.062500 0.750000 -0.250000 +v -1.062500 1.250000 -0.250000 +v -1.250000 0.750000 -0.125000 +v -1.250000 1.250000 -0.125000 +v -1.250000 0.750000 -0.250000 +v -1.250000 1.250000 -0.250000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.250000 0.937500 +vt 0.250000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.937500 +vt 0.062500 0.812500 +vt 0.062500 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.812500 +vt 0.187500 0.937500 +vt 0.187500 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.937500 +vt 0.125000 0.687500 +vt 0.062500 0.687500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.062500 0.687500 +vt 0.125000 0.687500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.562500 +vt 0.187500 0.500000 +vt 0.187500 0.937500 +vt 0.062500 0.562500 +vt 0.000000 0.500000 +vt 0.062500 0.875000 +vt 0.000000 0.937500 +vt 0.250000 0.875000 +vt 0.250000 0.562500 +vt 0.187500 0.562500 +vt 0.187500 0.875000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.750000 +vt 0.125000 0.750000 +vt 0.187500 0.562500 +vt 0.250000 0.562500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.250000 0.687500 +vt 0.250000 0.937500 +vt 0.343750 0.937500 +vt 0.343750 0.687500 +vt 0.093750 0.937500 +vt 0.343750 1.000000 +vt 0.093750 1.000000 +vt 0.343750 0.687500 +vt 0.343750 0.937500 +vt 0.250000 0.937500 +vt 0.250000 0.687500 +vt 0.125000 0.656250 +vt 0.125000 0.562500 +vt 0.062500 0.562500 +vt 0.062500 0.656250 +vt 0.125000 0.562500 +vt 0.125000 0.656250 +vt 0.062500 0.656250 +vt 0.062500 0.562500 +vt 0.250000 0.687500 +vt 0.250000 0.937500 +vt 0.343750 0.937500 +vt 0.343750 0.687500 +vt 0.093750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 0.937500 +vt 0.093750 0.937500 +vt 0.343750 0.687500 +vt 0.250000 0.937500 +vt 0.250000 0.687500 +vt 0.062500 0.656250 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.656250 +vt 0.062500 0.562500 +vt 0.062500 0.656250 +vt 0.125000 0.656250 +vt 0.125000 0.562500 +vt 0.250000 0.937500 +vt 0.187500 0.937500 +vt 0.187500 0.500000 +vt 0.250000 0.500000 +vt 0.062500 0.812500 +vt 0.125000 0.812500 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.187500 0.937500 +vt 0.250000 0.937500 +vt 0.250000 0.500000 +vt 0.187500 0.500000 +vt 0.125000 0.687500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.687500 +vt 0.062500 0.687500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.687500 +vt 0.125000 0.875000 +vt 0.187500 0.937500 +vt 0.187500 0.500000 +vt 0.125000 0.562500 +vt 0.000000 0.500000 +vt 0.062500 0.562500 +vt 0.062500 0.875000 +vt 0.000000 0.937500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.187500 0.562500 +vt 0.250000 0.562500 +vt 0.125000 0.812500 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.062500 0.812500 +vt 0.187500 0.562500 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.562500 +vt 0.250000 0.687500 +vt 0.343750 0.687500 +vt 0.343750 0.937500 +vt 0.250000 0.937500 +vt 0.093750 0.937500 +vt 0.093750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 0.687500 +vt 0.250000 0.687500 +vt 0.250000 0.937500 +vt 0.343750 0.937500 +vt 0.125000 0.656250 +vt 0.062500 0.656250 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.562500 +vt 0.062500 0.562500 +vt 0.062500 0.656250 +vt 0.125000 0.656250 +vt 0.250000 0.687500 +vt 0.343750 0.687500 +vt 0.343750 0.937500 +vt 0.250000 0.937500 +vt 0.093750 1.000000 +vt 0.093750 0.937500 +vt 0.343750 0.937500 +vt 0.343750 1.000000 +vt 0.343750 0.687500 +vt 0.250000 0.687500 +vt 0.250000 0.937500 +vt 0.062500 0.656250 +vt 0.125000 0.656250 +vt 0.125000 0.562500 +vt 0.062500 0.562500 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.656250 +vt 0.062500 0.656250 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +usemtl Bogey_Piston +s off +f 1241/3027/90 1246/3028/90 1243/3029/90 1239/3030/90 +f 1240/3031/91 1244/3032/91 1245/3033/91 1242/3034/91 +f 1242/3035/92 1245/3036/92 1246/3037/92 1241/3038/92 +f 1239/3039/93 1243/3040/93 1244/3041/93 1240/3042/93 +f 1249/3043/90 1247/3044/90 1251/3045/90 1254/3046/90 +f 1248/3047/91 1250/3048/91 1253/3049/91 1252/3050/91 +f 1250/3051/92 1249/3052/92 1254/3053/92 1253/3054/92 +f 1247/3055/93 1248/3056/93 1252/3057/93 1251/3058/93 +f 1257/3059/90 1262/3060/90 1259/3061/90 1255/3062/90 +f 1256/3063/91 1260/3064/91 1261/3065/91 1258/3066/91 +f 1258/3067/92 1261/3068/92 1262/3069/92 1257/3070/92 +f 1255/3071/93 1259/3072/93 1260/3073/93 1256/3074/93 +f 1265/3075/90 1263/3076/90 1267/3077/90 1270/3078/90 +f 1264/3079/91 1266/3080/91 1269/3081/91 1268/3082/91 +f 1266/3083/92 1265/3084/92 1270/3085/92 1269/3086/92 +f 1263/3087/93 1264/3088/93 1268/3089/93 1267/3090/93 +f 1273/3091/90 1271/3092/90 1275/3093/90 1278/3094/90 +f 1272/3095/91 1274/3096/91 1277/3097/91 1276/3098/91 +f 1274/3099/93 1273/3100/93 1278/3101/93 1277/3102/93 +f 1271/3103/92 1272/3104/92 1276/3105/92 1275/3106/92 +f 1281/3107/90 1286/3108/90 1283/3109/90 1279/3110/90 +f 1280/3111/91 1284/3112/91 1285/3113/91 1282/3114/91 +f 1282/3115/93 1285/3116/93 1286/3117/93 1281/3118/93 +f 1279/3119/92 1283/3120/92 1284/3121/92 1280/3122/92 +f 1289/3123/90 1287/3124/90 1291/3125/90 1294/3126/90 +f 1288/3127/91 1290/3128/91 1293/3129/91 1292/3130/91 +f 1290/3131/93 1289/3132/93 1294/3133/93 1293/3134/93 +f 1287/3135/92 1288/3136/92 1292/3137/92 1291/3138/92 +f 1297/3139/90 1302/3140/90 1299/3141/90 1295/3142/90 +f 1296/3143/91 1300/3144/91 1301/3145/91 1298/3146/91 +f 1298/3147/93 1301/3148/93 1302/3149/93 1297/3150/93 +f 1295/3151/92 1299/3152/92 1300/3153/92 1296/3154/92 +f 1311/3155/94 1314/3156/94 1315/3157/94 1316/3158/94 +f 1305/3159/91 1303/3160/91 1307/3161/91 1309/3162/91 +f 1317/3163/95 1318/3164/95 1313/3165/95 1312/3166/95 +f 1311/3167/90 1316/3168/90 1317/3169/90 1312/3170/90 +f 1315/3171/91 1314/3172/91 1313/3173/91 1318/3174/91 +f 1310/3175/92 1309/3176/92 1316/3177/92 1315/3178/92 +f 1309/3176/92 1307/3179/92 1317/3180/92 1316/3177/92 +f 1308/3181/92 1310/3175/92 1315/3178/92 1318/3182/92 +f 1307/3179/92 1308/3181/92 1318/3182/92 1317/3180/92 +f 1308/3183/94 1307/3184/94 1303/3185/94 1304/3186/94 +f 1310/3187/90 1308/3188/90 1304/3189/90 1306/3190/90 +f 1305/3191/95 1309/3192/95 1310/3193/95 1306/3194/95 +f 1321/3195/94 1322/3196/94 1326/3197/94 1325/3198/94 +f 1325/3199/92 1326/3197/92 1324/3200/92 1323/3201/92 +f 1323/3202/95 1324/3203/95 1320/3204/95 1319/3205/95 +f 1321/3206/90 1325/3207/90 1323/3208/90 1319/3209/90 +f 1326/3210/91 1322/3211/91 1320/3212/91 1324/3213/91 +f 1329/3214/94 1330/3215/94 1334/3216/94 1333/3217/94 +f 1333/3218/92 1334/3219/92 1332/3220/92 1331/3221/92 +f 1331/3222/95 1332/3220/95 1328/3223/95 1327/3224/95 +f 1329/3225/90 1333/3226/90 1331/3227/90 1327/3228/90 +f 1334/3229/91 1330/3230/91 1328/3231/91 1332/3232/91 +f 1343/3233/94 1348/3234/94 1347/3235/94 1346/3236/94 +f 1337/3237/91 1341/3238/91 1339/3239/91 1335/3240/91 +f 1349/3241/95 1344/3242/95 1345/3243/95 1350/3244/95 +f 1343/3245/90 1344/3246/90 1349/3247/90 1348/3248/90 +f 1347/3249/91 1350/3250/91 1345/3251/91 1346/3252/91 +f 1342/3253/93 1347/3254/93 1348/3255/93 1341/3256/93 +f 1341/3256/93 1348/3255/93 1349/3257/93 1339/3258/93 +f 1340/3259/93 1350/3260/93 1347/3254/93 1342/3253/93 +f 1339/3258/93 1349/3257/93 1350/3260/93 1340/3259/93 +f 1340/3261/94 1336/3262/94 1335/3263/94 1339/3264/94 +f 1342/3265/90 1338/3266/90 1336/3267/90 1340/3268/90 +f 1337/3269/95 1338/3270/95 1342/3271/95 1341/3272/95 +f 1353/3273/94 1357/3274/94 1358/3275/94 1354/3276/94 +f 1357/3277/93 1355/3278/93 1356/3279/93 1358/3275/93 +f 1355/3280/95 1351/3281/95 1352/3282/95 1356/3283/95 +f 1353/3284/90 1351/3285/90 1355/3286/90 1357/3287/90 +f 1358/3288/91 1356/3289/91 1352/3290/91 1354/3291/91 +f 1361/3292/94 1365/3293/94 1366/3294/94 1362/3295/94 +f 1365/3296/93 1363/3297/93 1364/3298/93 1366/3299/93 +f 1363/3300/95 1359/3301/95 1360/3302/95 1364/3298/95 +f 1361/3303/90 1359/3304/90 1363/3305/90 1365/3306/90 +f 1366/3307/91 1364/3308/91 1360/3309/91 1362/3310/91 +o Cube.040_Cube.047 +v 1.062500 -0.125000 0.125000 +v 1.062500 0.125000 0.125000 +v 1.062500 -0.125000 -0.125000 +v 1.062500 0.125000 -0.125000 +v 1.312500 0.125000 -0.125000 +v 1.312500 -0.125000 -0.125000 +v 1.312500 -0.125000 0.125000 +v 1.312500 0.125000 0.125000 +v -1.062500 -0.125000 0.125000 +v -1.062500 0.125000 0.125000 +v -1.062500 -0.125000 -0.125000 +v -1.062500 0.125000 -0.125000 +v -1.312500 0.125000 -0.125000 +v -1.312500 -0.125000 -0.125000 +v -1.312500 -0.125000 0.125000 +v -1.312500 0.125000 0.125000 +vt 0.500000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.500000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.375000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.625000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +usemtl Bogey_Piston +s off +f 1368/3311/96 1374/3312/96 1371/3313/96 1370/3314/96 +f 1367/3315/97 1373/3316/97 1374/3317/97 1368/3318/97 +f 1369/3319/98 1372/3320/98 1373/3321/98 1367/3322/98 +f 1372/3323/99 1371/3324/99 1374/3325/99 1373/3326/99 +f 1370/3327/100 1371/3324/100 1372/3323/100 1369/3328/100 +f 1376/3329/96 1378/3330/96 1379/3331/96 1382/3332/96 +f 1375/3333/97 1376/3334/97 1382/3335/97 1381/3336/97 +f 1377/3337/98 1375/3338/98 1381/3339/98 1380/3340/98 +f 1380/3341/101 1381/3342/101 1382/3343/101 1379/3344/101 +f 1378/3345/100 1377/3346/100 1380/3341/100 1379/3344/100 diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/bogey_wheel.mtl b/src/main/resources/assets/create/models/block/track/bogey/old/bogey_wheel.mtl new file mode 100644 index 000000000..aa4b039e8 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/bogey_wheel.mtl @@ -0,0 +1,120 @@ +# 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 diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/bogey_wheel.obj b/src/main/resources/assets/create/models/block/track/bogey/old/bogey_wheel.obj new file mode 100644 index 000000000..9478c8378 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/bogey_wheel.obj @@ -0,0 +1,6071 @@ +# Blender v3.0.1 OBJ File: 'Bogey.blend' +# www.blender.org +mtllib bogey_wheel.mtl +o Grid.001_Grid.002 +v 71.999977 0.000000 -88.000023 +v 55.999981 0.000000 -88.000015 +v 39.999977 0.000000 -88.000015 +v 23.999975 0.000000 -88.000008 +v 7.999976 0.000000 -88.000000 +v -8.000023 0.000000 -88.000000 +v -24.000027 0.000000 -87.999992 +v -40.000019 0.000000 -87.999985 +v -56.000027 0.000000 -87.999985 +v -72.000031 0.000000 -87.999977 +v 71.999985 0.000000 -72.000031 +v 55.999985 0.000000 -72.000023 +v 39.999981 0.000000 -72.000015 +v 23.999979 0.000000 -72.000015 +v 7.999981 0.000000 -72.000008 +v -8.000018 0.000000 -72.000000 +v -24.000023 0.000000 -72.000000 +v -40.000015 0.000000 -71.999992 +v -56.000023 0.000000 -71.999985 +v -72.000023 0.000000 -71.999985 +v 71.999985 0.000000 -56.000023 +v 55.999992 0.000000 -56.000019 +v 39.999989 0.000000 -56.000011 +v 23.999985 0.000000 -56.000008 +v 7.999987 0.000000 -56.000004 +v -8.000012 0.000000 -55.999996 +v -24.000017 0.000000 -55.999992 +v -40.000008 0.000000 -55.999989 +v -56.000015 0.000000 -55.999981 +v -72.000023 0.000000 -55.999977 +v 71.999992 0.000000 -40.000023 +v 55.999996 0.000000 -40.000015 +v 39.999992 0.000000 -40.000011 +v 23.999990 0.000000 -40.000008 +v 7.999992 0.000000 -40.000000 +v -8.000008 0.000000 -39.999996 +v -24.000011 0.000000 -39.999992 +v -40.000004 0.000000 -39.999985 +v -56.000011 0.000000 -39.999977 +v -72.000015 0.000000 -39.999977 +v 72.000000 0.000000 -24.000023 +v 56.000000 0.000000 -24.000019 +v 39.999996 0.000000 -24.000011 +v 23.999996 0.000000 -24.000008 +v 7.999997 0.000000 -24.000002 +v -8.000002 0.000000 -23.999996 +v -24.000006 0.000000 -23.999992 +v -40.000000 0.000000 -23.999987 +v -56.000008 0.000000 -23.999981 +v -72.000008 0.000000 -23.999977 +v 72.000000 0.000000 -8.000024 +v 56.000008 0.000000 -8.000019 +v 40.000004 0.000000 -8.000013 +v 24.000000 0.000000 -8.000008 +v 8.000002 0.000000 -8.000003 +v -7.999997 0.000000 -7.999998 +v -24.000002 0.000000 -7.999992 +v -39.999992 0.000000 -7.999988 +v -56.000000 0.000000 -7.999982 +v -72.000008 0.000000 -7.999977 +v 72.000008 0.000000 7.999981 +v 56.000011 0.000000 7.999985 +v 40.000008 0.000000 7.999990 +v 24.000006 0.000000 7.999996 +v 8.000008 0.000000 8.000002 +v -7.999992 0.000000 8.000006 +v -23.999996 0.000000 8.000011 +v -39.999989 0.000000 8.000017 +v -55.999996 0.000000 8.000023 +v -72.000000 0.000000 8.000027 +v 72.000015 0.000000 23.999973 +v 56.000015 0.000000 23.999977 +v 40.000011 0.000000 23.999985 +v 24.000011 0.000000 23.999989 +v 8.000012 0.000000 23.999992 +v -7.999987 0.000000 24.000000 +v -23.999990 0.000000 24.000004 +v -39.999985 0.000000 24.000008 +v -55.999992 0.000000 24.000015 +v -71.999992 0.000000 24.000019 +v 72.000015 0.000000 39.999981 +v 56.000023 0.000000 39.999985 +v 40.000019 0.000000 39.999992 +v 24.000017 0.000000 39.999996 +v 8.000018 0.000000 40.000000 +v -7.999981 0.000000 40.000008 +v -23.999985 0.000000 40.000011 +v -39.999977 0.000000 40.000015 +v -55.999985 0.000000 40.000023 +v -71.999992 0.000000 40.000027 +v 72.000023 0.000000 55.999985 +v 56.000027 0.000000 55.999992 +v 40.000023 0.000000 55.999992 +v 24.000021 0.000000 56.000000 +v 8.000023 0.000000 56.000008 +v -7.999976 0.000000 56.000008 +v -23.999981 0.000000 56.000015 +v -39.999973 0.000000 56.000023 +v -55.999981 0.000000 56.000023 +v -71.999985 0.000000 56.000031 +v 55.999981 -16.000000 -88.000015 +v 39.999977 -16.000000 -88.000015 +v -8.000023 -16.000000 -88.000000 +v -24.000027 -16.000000 -87.999992 +v -40.000019 -16.000000 -87.999985 +v -56.000027 -16.000000 -87.999985 +v -72.000031 -16.000000 -87.999977 +v 71.999985 -16.000000 -72.000031 +v -72.000023 -16.000000 -71.999985 +v 71.999985 -16.000000 -56.000023 +v -72.000015 -16.000000 -39.999977 +v 72.000000 -16.000000 -24.000023 +v -72.000008 -16.000000 -23.999977 +v 72.000008 -16.000000 7.999981 +v -72.000000 -16.000000 8.000027 +v 72.000015 -16.000000 39.999981 +v 72.000023 -16.000000 55.999985 +v 56.000027 -16.000000 55.999992 +v 40.000023 -16.000000 55.999992 +v 24.000021 -16.000000 56.000000 +v 8.000023 -16.000000 56.000008 +v -7.999976 -16.000000 56.000008 +v 71.999977 -16.000000 -88.000023 +v 23.999975 -16.000000 -88.000008 +v 7.999976 -16.000000 -88.000000 +v 55.999985 -16.000000 -72.000023 +v 39.999981 -16.000000 -72.000015 +v 23.999979 -16.000000 -72.000015 +v 7.999981 -16.000000 -72.000008 +v -8.000018 -16.000000 -72.000000 +v -24.000023 -16.000000 -72.000000 +v -40.000015 -16.000000 -71.999992 +v -56.000023 -16.000000 -71.999985 +v 55.999992 -16.000000 -56.000019 +v 39.999989 -16.000000 -56.000011 +v 23.999985 -16.000000 -56.000008 +v 7.999987 -16.000000 -56.000004 +v -8.000012 -16.000000 -55.999996 +v -24.000017 -16.000000 -55.999992 +v -40.000008 -16.000000 -55.999989 +v -56.000015 -16.000000 -55.999981 +v -72.000023 -16.000000 -55.999977 +v 71.999992 -16.000000 -40.000023 +v 55.999996 -16.000000 -40.000015 +v 39.999992 -16.000000 -40.000011 +v 23.999990 -16.000000 -40.000008 +v 7.999992 -16.000000 -40.000000 +v -8.000008 -16.000000 -39.999996 +v -24.000011 -16.000000 -39.999992 +v -40.000004 -16.000000 -39.999985 +v -56.000011 -16.000000 -39.999977 +v 56.000000 -16.000000 -24.000019 +v 39.999996 -16.000000 -24.000011 +v 23.999996 -16.000000 -24.000008 +v 7.999997 -16.000000 -24.000002 +v -8.000002 -16.000000 -23.999996 +v -24.000006 -16.000000 -23.999992 +v -40.000000 -16.000000 -23.999987 +v -56.000008 -16.000000 -23.999981 +v 72.000000 -16.000000 -8.000024 +v 56.000008 -16.000000 -8.000019 +v 40.000004 -16.000000 -8.000013 +v 24.000000 -16.000000 -8.000008 +v 8.000002 -16.000000 -8.000003 +v -7.999997 -16.000000 -7.999998 +v -24.000002 -16.000000 -7.999992 +v -39.999992 -16.000000 -7.999988 +v -56.000000 -16.000000 -7.999982 +v -72.000008 -16.000000 -7.999977 +v 56.000011 -16.000000 7.999985 +v 40.000008 -16.000000 7.999990 +v 24.000006 -16.000000 7.999996 +v 8.000008 -16.000000 8.000002 +v -7.999992 -16.000000 8.000006 +v -23.999996 -16.000000 8.000011 +v -39.999989 -16.000000 8.000017 +v -55.999996 -16.000000 8.000023 +v 72.000015 -16.000000 23.999973 +v 56.000015 -16.000000 23.999977 +v 40.000011 -16.000000 23.999985 +v 24.000011 -16.000000 23.999989 +v 8.000012 -16.000000 23.999992 +v -7.999987 -16.000000 24.000000 +v -23.999990 -16.000000 24.000004 +v -39.999985 -16.000000 24.000008 +v -55.999992 -16.000000 24.000015 +v -71.999992 -16.000000 24.000019 +v 56.000023 -16.000000 39.999985 +v 40.000019 -16.000000 39.999992 +v 24.000017 -16.000000 39.999996 +v 8.000018 -16.000000 40.000000 +v -7.999981 -16.000000 40.000008 +v -23.999985 -16.000000 40.000011 +v -39.999977 -16.000000 40.000015 +v -55.999985 -16.000000 40.000023 +v -71.999992 -16.000000 40.000027 +v -23.999981 -16.000000 56.000015 +v -39.999973 -16.000000 56.000023 +v -55.999981 -16.000000 56.000023 +v -71.999985 -16.000000 56.000031 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +usemtl Checker_White +s off +f 2/1/1 3/2/1 13/3/1 12/4/1 +f 4/5/1 5/6/1 15/7/1 14/8/1 +f 6/9/1 7/10/1 17/11/1 16/12/1 +f 8/13/1 9/14/1 19/15/1 18/16/1 +f 11/17/1 12/18/1 22/19/1 21/20/1 +f 13/21/1 14/22/1 24/23/1 23/24/1 +f 15/25/1 16/26/1 26/27/1 25/28/1 +f 17/29/1 18/30/1 28/31/1 27/32/1 +f 19/33/1 20/34/1 30/35/1 29/36/1 +f 22/37/1 23/38/1 33/39/1 32/40/1 +f 24/41/1 25/42/1 35/43/1 34/44/1 +f 26/45/1 27/46/1 37/47/1 36/48/1 +f 28/49/1 29/50/1 39/51/1 38/52/1 +f 31/53/1 32/54/1 42/55/1 41/56/1 +f 33/57/1 34/58/1 44/59/1 43/60/1 +f 35/61/1 36/62/1 46/63/1 45/64/1 +f 37/65/1 38/66/1 48/67/1 47/68/1 +f 39/69/1 40/70/1 50/71/1 49/72/1 +f 42/73/1 43/74/1 53/75/1 52/76/1 +f 44/77/1 45/78/1 55/79/1 54/80/1 +f 46/81/1 47/82/1 57/83/1 56/84/1 +f 48/85/1 49/86/1 59/87/1 58/88/1 +f 51/89/1 52/90/1 62/91/1 61/92/1 +f 53/93/1 54/94/1 64/95/1 63/96/1 +f 55/97/1 56/98/1 66/99/1 65/100/1 +f 57/101/1 58/102/1 68/103/1 67/104/1 +f 59/105/1 60/106/1 70/107/1 69/108/1 +f 62/109/1 63/110/1 73/111/1 72/112/1 +f 64/113/1 65/114/1 75/115/1 74/116/1 +f 66/117/1 67/118/1 77/119/1 76/120/1 +f 68/121/1 69/122/1 79/123/1 78/124/1 +f 71/125/1 72/126/1 82/127/1 81/128/1 +f 73/129/1 74/130/1 84/131/1 83/132/1 +f 75/133/1 76/134/1 86/135/1 85/136/1 +f 77/137/1 78/138/1 88/139/1 87/140/1 +f 79/141/1 80/142/1 90/143/1 89/144/1 +f 82/145/1 83/146/1 93/147/1 92/148/1 +f 84/149/1 85/150/1 95/151/1 94/152/1 +f 86/153/1 87/154/1 97/155/1 96/156/1 +f 88/157/1 89/158/1 99/159/1 98/160/1 +f 71/125/2 81/128/2 116/161/2 178/162/2 +f 94/152/3 95/151/3 121/163/3 120/164/3 +f 9/14/4 8/13/4 105/165/4 106/166/4 +f 5/6/4 4/5/4 124/167/4 125/168/4 +f 51/89/2 61/92/2 114/169/2 160/170/2 +f 90/143/5 80/142/5 187/171/5 196/172/5 +f 96/156/3 97/155/3 197/173/3 122/174/3 +f 31/53/2 41/56/2 112/175/2 143/176/2 +f 70/107/5 60/106/5 169/177/5 115/178/5 +f 11/17/2 21/20/2 110/179/2 108/180/2 +f 50/71/5 40/70/5 111/181/5 113/182/5 +f 7/10/4 6/9/4 103/183/4 104/184/4 +f 98/160/3 99/159/3 199/185/3 198/186/3 +f 3/2/4 2/1/4 101/187/4 102/188/4 +f 92/148/3 93/147/3 119/189/3 118/190/3 +f 30/35/5 20/34/5 109/191/5 142/192/5 +f 101/187/1 102/188/1 127/193/1 126/194/1 +f 124/167/1 125/168/1 129/195/1 128/196/1 +f 103/183/1 104/184/1 131/197/1 130/198/1 +f 105/165/1 106/166/1 133/199/1 132/200/1 +f 108/180/1 126/201/1 134/202/1 110/179/1 +f 127/203/1 128/204/1 136/205/1 135/206/1 +f 129/207/1 130/208/1 138/209/1 137/210/1 +f 131/211/1 132/212/1 140/213/1 139/214/1 +f 133/215/1 109/191/1 142/192/1 141/216/1 +f 134/217/1 135/218/1 145/219/1 144/220/1 +f 136/221/1 137/222/1 147/223/1 146/224/1 +f 138/225/1 139/226/1 149/227/1 148/228/1 +f 140/229/1 141/230/1 151/231/1 150/232/1 +f 143/176/1 144/233/1 152/234/1 112/175/1 +f 145/235/1 146/236/1 154/237/1 153/238/1 +f 147/239/1 148/240/1 156/241/1 155/242/1 +f 149/243/1 150/244/1 158/245/1 157/246/1 +f 151/247/1 111/181/1 113/182/1 159/248/1 +f 152/249/1 153/250/1 162/251/1 161/252/1 +f 154/253/1 155/254/1 164/255/1 163/256/1 +f 156/257/1 157/258/1 166/259/1 165/260/1 +f 158/261/1 159/262/1 168/263/1 167/264/1 +f 160/170/1 161/265/1 170/266/1 114/169/1 +f 162/267/1 163/268/1 172/269/1 171/270/1 +f 164/271/1 165/272/1 174/273/1 173/274/1 +f 166/275/1 167/276/1 176/277/1 175/278/1 +f 168/279/1 169/177/1 115/178/1 177/280/1 +f 170/281/1 171/282/1 180/283/1 179/284/1 +f 172/285/1 173/286/1 182/287/1 181/288/1 +f 174/289/1 175/290/1 184/291/1 183/292/1 +f 176/293/1 177/294/1 186/295/1 185/296/1 +f 178/162/1 179/297/1 188/298/1 116/161/1 +f 180/299/1 181/300/1 190/301/1 189/302/1 +f 182/303/1 183/304/1 192/305/1 191/306/1 +f 184/307/1 185/308/1 194/309/1 193/310/1 +f 186/311/1 187/171/1 196/172/1 195/312/1 +f 188/313/1 189/314/1 119/189/1 118/190/1 +f 190/315/1 191/316/1 121/163/1 120/164/1 +f 192/317/1 193/318/1 197/173/1 122/174/1 +f 194/319/1 195/320/1 199/185/1 198/186/1 +usemtl Checker_Black +f 1/321/1 2/322/1 12/323/1 11/324/1 +f 3/325/1 4/326/1 14/327/1 13/328/1 +f 5/329/1 6/330/1 16/331/1 15/332/1 +f 7/333/1 8/334/1 18/335/1 17/336/1 +f 9/337/1 10/338/1 20/339/1 19/340/1 +f 12/341/1 13/342/1 23/343/1 22/344/1 +f 14/345/1 15/346/1 25/347/1 24/348/1 +f 16/349/1 17/350/1 27/351/1 26/352/1 +f 18/353/1 19/354/1 29/355/1 28/356/1 +f 21/357/1 22/358/1 32/359/1 31/360/1 +f 23/361/1 24/362/1 34/363/1 33/364/1 +f 25/365/1 26/366/1 36/367/1 35/368/1 +f 27/369/1 28/370/1 38/371/1 37/372/1 +f 29/373/1 30/374/1 40/375/1 39/376/1 +f 32/377/1 33/378/1 43/379/1 42/380/1 +f 34/381/1 35/382/1 45/383/1 44/384/1 +f 36/385/1 37/386/1 47/387/1 46/388/1 +f 38/389/1 39/390/1 49/391/1 48/392/1 +f 41/393/1 42/394/1 52/395/1 51/396/1 +f 43/397/1 44/398/1 54/399/1 53/400/1 +f 45/401/1 46/402/1 56/403/1 55/404/1 +f 47/405/1 48/406/1 58/407/1 57/408/1 +f 49/409/1 50/410/1 60/411/1 59/412/1 +f 52/413/1 53/414/1 63/415/1 62/416/1 +f 54/417/1 55/418/1 65/419/1 64/420/1 +f 56/421/1 57/422/1 67/423/1 66/424/1 +f 58/425/1 59/426/1 69/427/1 68/428/1 +f 61/429/1 62/430/1 72/431/1 71/432/1 +f 63/433/1 64/434/1 74/435/1 73/436/1 +f 65/437/1 66/438/1 76/439/1 75/440/1 +f 67/441/1 68/442/1 78/443/1 77/444/1 +f 69/445/1 70/446/1 80/447/1 79/448/1 +f 72/449/1 73/450/1 83/451/1 82/452/1 +f 74/453/1 75/454/1 85/455/1 84/456/1 +f 76/457/1 77/458/1 87/459/1 86/460/1 +f 78/461/1 79/462/1 89/463/1 88/464/1 +f 81/465/1 82/466/1 92/467/1 91/468/1 +f 83/469/1 84/470/1 94/471/1 93/472/1 +f 85/473/1 86/474/1 96/475/1 95/476/1 +f 87/477/1 88/478/1 98/479/1 97/480/1 +f 89/481/1 90/482/1 100/483/1 99/484/1 +f 60/411/5 50/410/5 113/485/5 169/486/5 +f 95/476/3 96/475/3 122/487/3 121/488/3 +f 40/375/5 30/374/5 142/489/5 111/490/5 +f 10/338/4 9/337/4 106/491/4 107/492/4 +f 20/339/5 10/338/5 107/492/5 109/493/5 +f 6/330/4 5/329/4 125/494/4 103/495/4 +f 1/321/2 11/324/2 108/496/2 123/497/2 +f 81/465/2 91/468/2 117/498/2 116/499/2 +f 97/480/3 98/479/3 198/500/3 197/501/3 +f 2/322/4 1/321/4 123/497/4 101/502/4 +f 91/468/3 92/467/3 118/503/3 117/498/3 +f 61/429/2 71/432/2 178/504/2 114/505/2 +f 100/483/5 90/482/5 196/506/5 200/507/5 +f 41/393/2 51/396/2 160/508/2 112/509/2 +f 99/484/3 100/483/3 200/507/3 199/510/3 +f 8/334/4 7/333/4 104/511/4 105/512/4 +f 80/447/5 70/446/5 115/513/5 187/514/5 +f 93/472/3 94/471/3 120/515/3 119/516/3 +f 21/357/2 31/360/2 143/517/2 110/518/2 +f 4/326/4 3/325/4 102/519/4 124/520/4 +f 123/497/1 101/502/1 126/521/1 108/496/1 +f 102/519/1 124/520/1 128/522/1 127/523/1 +f 125/494/1 103/495/1 130/524/1 129/525/1 +f 104/511/1 105/512/1 132/526/1 131/527/1 +f 106/491/1 107/492/1 109/493/1 133/528/1 +f 126/529/1 127/530/1 135/531/1 134/532/1 +f 128/533/1 129/534/1 137/535/1 136/536/1 +f 130/537/1 131/538/1 139/539/1 138/540/1 +f 132/541/1 133/542/1 141/543/1 140/544/1 +f 110/518/1 134/545/1 144/546/1 143/517/1 +f 135/547/1 136/548/1 146/549/1 145/550/1 +f 137/551/1 138/552/1 148/553/1 147/554/1 +f 139/555/1 140/556/1 150/557/1 149/558/1 +f 141/559/1 142/489/1 111/490/1 151/560/1 +f 144/561/1 145/562/1 153/563/1 152/564/1 +f 146/565/1 147/566/1 155/567/1 154/568/1 +f 148/569/1 149/570/1 157/571/1 156/572/1 +f 150/573/1 151/574/1 159/575/1 158/576/1 +f 112/509/1 152/577/1 161/578/1 160/508/1 +f 153/579/1 154/580/1 163/581/1 162/582/1 +f 155/583/1 156/584/1 165/585/1 164/586/1 +f 157/587/1 158/588/1 167/589/1 166/590/1 +f 159/591/1 113/485/1 169/486/1 168/592/1 +f 161/593/1 162/594/1 171/595/1 170/596/1 +f 163/597/1 164/598/1 173/599/1 172/600/1 +f 165/601/1 166/602/1 175/603/1 174/604/1 +f 167/605/1 168/606/1 177/607/1 176/608/1 +f 114/505/1 170/609/1 179/610/1 178/504/1 +f 171/611/1 172/612/1 181/613/1 180/614/1 +f 173/615/1 174/616/1 183/617/1 182/618/1 +f 175/619/1 176/620/1 185/621/1 184/622/1 +f 177/623/1 115/513/1 187/514/1 186/624/1 +f 179/625/1 180/626/1 189/627/1 188/628/1 +f 181/629/1 182/630/1 191/631/1 190/632/1 +f 183/633/1 184/634/1 193/635/1 192/636/1 +f 185/637/1 186/638/1 195/639/1 194/640/1 +f 116/499/1 188/641/1 118/503/1 117/498/1 +f 189/642/1 190/643/1 120/515/1 119/516/1 +f 191/644/1 192/645/1 122/487/1 121/488/1 +f 193/646/1 194/647/1 198/500/1 197/501/1 +f 195/648/1 196/506/1 200/507/1 199/510/1 +o Track.001_cube4.001 +v -17.999994 5.499999 -71.999985 +v 18.000006 5.499999 -72.000015 +v 17.999998 5.500001 -88.000015 +v -18.000002 5.500001 -87.999985 +v -18.000002 5.500001 -87.999985 +v 17.999998 5.500001 -88.000015 +v 18.000006 5.499999 -72.000015 +v -17.999994 5.499999 -71.999985 +v 17.099997 1.500001 -88.000015 +v 13.899994 1.500001 -88.000008 +v 13.899994 5.500001 -88.000008 +v 17.099997 5.500001 -88.000015 +v 17.100004 1.499999 -72.000015 +v 17.100004 5.499999 -72.000015 +v 13.900005 1.499999 -72.000008 +v 13.900005 5.499999 -72.000008 +v -13.900006 1.500001 -87.999992 +v -17.100004 1.500001 -87.999985 +v -17.100004 5.500001 -87.999985 +v -13.900006 5.500001 -87.999992 +v -13.899995 1.499999 -71.999992 +v -13.899995 5.499999 -71.999985 +v -17.099997 1.499999 -71.999985 +v -17.099997 5.499999 -71.999985 +v 21.950003 -2.050000 -78.000015 +v -21.949999 -2.050000 -77.999985 +v -21.949999 2.050000 -77.999985 +v 21.950003 2.050000 -78.000015 +v 21.950006 -2.050001 -74.000015 +v 21.950006 2.049999 -74.000015 +v -21.949995 -2.050001 -73.999985 +v -21.949995 2.049999 -73.999985 +v 21.949999 -2.049999 -86.000015 +v -21.950003 -2.049999 -85.999985 +v -21.950003 2.050001 -85.999985 +v 21.949999 2.050001 -86.000015 +v 21.950003 -2.050000 -82.000015 +v 21.950003 2.050000 -82.000015 +v -21.949999 -2.050000 -81.999985 +v -21.949999 2.050000 -81.999985 +v -17.999994 1.499999 -71.999985 +v 18.000006 1.499999 -72.000015 +v 17.999998 1.500001 -88.000015 +v -18.000002 1.500001 -87.999985 +v -18.000002 1.500001 -87.999985 +v 17.999998 1.500001 -88.000015 +v 18.000006 1.499999 -72.000015 +v -17.999994 1.499999 -71.999985 +vt 0.000000 0.742188 +vt 0.234375 0.742188 +vt 0.234375 0.867188 +vt 0.000000 0.867188 +vt 0.000000 0.742188 +vt 0.234375 0.742188 +vt 0.234375 0.867188 +vt 0.000000 0.867188 +vt 0.406250 0.507812 +vt 0.429688 0.507812 +vt 0.429688 0.539062 +vt 0.406250 0.539062 +vt 0.000000 0.507812 +vt 0.125000 0.507812 +vt 0.125000 0.539062 +vt 0.000000 0.539062 +vt 0.406250 0.507812 +vt 0.429688 0.507812 +vt 0.429688 0.539062 +vt 0.406250 0.539062 +vt 0.000000 0.507812 +vt 0.125000 0.507812 +vt 0.125000 0.539062 +vt 0.000000 0.539062 +vt 0.406250 0.507812 +vt 0.429688 0.507812 +vt 0.429688 0.539062 +vt 0.406250 0.539062 +vt 0.000000 0.507812 +vt 0.125000 0.507812 +vt 0.125000 0.539062 +vt 0.000000 0.539062 +vt 0.406250 0.507812 +vt 0.429688 0.507812 +vt 0.429688 0.539062 +vt 0.406250 0.539062 +vt 0.000000 0.507812 +vt 0.125000 0.507812 +vt 0.125000 0.539062 +vt 0.000000 0.539062 +vt 0.000000 0.929688 +vt 0.296875 0.929688 +vt 0.296875 0.960938 +vt 0.000000 0.960938 +vt 0.304688 0.929688 +vt 0.335938 0.929688 +vt 0.335938 0.960938 +vt 0.304688 0.960938 +vt 0.000000 0.929688 +vt 0.296875 0.929688 +vt 0.296875 0.960938 +vt 0.000000 0.960938 +vt 0.304688 0.929688 +vt 0.335938 0.929688 +vt 0.335938 0.960938 +vt 0.304688 0.960938 +vt 0.000000 0.968750 +vt 0.296875 0.968750 +vt 0.296875 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.890625 +vt 0.296875 0.890625 +vt 0.296875 0.921875 +vt 0.000000 0.921875 +vt 0.000000 0.929688 +vt 0.296875 0.929688 +vt 0.296875 0.960938 +vt 0.000000 0.960938 +vt 0.304688 0.929688 +vt 0.335938 0.929688 +vt 0.335938 0.960938 +vt 0.304688 0.960938 +vt 0.000000 0.929688 +vt 0.296875 0.929688 +vt 0.296875 0.960938 +vt 0.000000 0.960938 +vt 0.304688 0.929688 +vt 0.335938 0.929688 +vt 0.335938 0.960938 +vt 0.304688 0.960938 +vt 0.000000 0.968750 +vt 0.296875 0.968750 +vt 0.296875 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.890625 +vt 0.296875 0.890625 +vt 0.296875 0.921875 +vt 0.000000 0.921875 +vt 0.000000 0.742188 +vt 0.234375 0.742188 +vt 0.234375 0.867188 +vt 0.000000 0.867188 +vt 0.000000 0.742188 +vt 0.234375 0.742188 +vt 0.234375 0.867188 +vt 0.000000 0.867188 +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 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +usemtl m_0.001 +s 1 +f 201/649/6 202/650/6 203/651/6 204/652/6 +f 205/653/7 206/654/7 207/655/7 208/656/7 +f 209/657/8 210/658/8 211/659/8 212/660/8 +f 213/661/9 209/662/9 212/663/9 214/664/9 +f 215/665/10 213/666/10 214/667/10 216/668/10 +f 210/669/11 215/670/11 216/671/11 211/672/11 +f 217/673/8 218/674/8 219/675/8 220/676/8 +f 221/677/9 217/678/9 220/679/9 222/680/9 +f 223/681/10 221/682/10 222/683/10 224/684/10 +f 218/685/11 223/686/11 224/687/11 219/688/11 +f 225/689/8 226/690/8 227/691/8 228/692/8 +f 229/693/9 225/694/9 228/695/9 230/696/9 +f 231/697/10 229/698/10 230/699/10 232/700/10 +f 226/701/11 231/702/11 232/703/11 227/704/11 +f 232/705/6 230/706/6 228/707/6 227/708/6 +f 226/709/7 225/710/7 229/711/7 231/712/7 +f 233/713/8 234/714/8 235/715/8 236/716/8 +f 237/717/9 233/718/9 236/719/9 238/720/9 +f 239/721/10 237/722/10 238/723/10 240/724/10 +f 234/725/11 239/726/11 240/727/11 235/728/11 +f 240/729/6 238/730/6 236/731/6 235/732/6 +f 234/733/7 233/734/7 237/735/7 239/736/7 +f 241/737/6 242/738/6 243/739/6 244/740/6 +f 245/741/7 246/742/7 247/743/7 248/744/7 +o Cube.017_Cube.003 +v -8.000000 0.000000 8.000000 +v -8.000000 16.000000 8.000000 +v -8.000000 0.000000 -8.000000 +v -8.000000 16.000000 -8.000000 +v 8.000000 0.000000 8.000000 +v 8.000000 16.000000 8.000000 +v 8.000000 0.000000 -8.000000 +v 8.000000 16.000000 -8.000000 +v -8.000000 32.000000 8.000000 +v -8.000000 32.000000 -8.000000 +v 8.000000 32.000000 -8.000000 +v 8.000000 32.000000 8.000000 +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.625000 0.750000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +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 +usemtl None +s off +f 249/745/12 250/746/12 252/747/12 251/748/12 +f 251/748/13 252/747/13 256/749/13 255/750/13 +f 255/750/14 256/749/14 254/751/14 253/752/14 +f 253/752/15 254/751/15 250/753/15 249/754/15 +f 251/755/16 255/750/16 253/752/16 249/756/16 +f 250/753/15 254/751/15 260/757/15 257/758/15 +f 259/759/17 258/760/17 257/761/17 260/757/17 +f 256/749/13 252/747/13 258/762/13 259/759/13 +f 254/751/14 256/749/14 259/759/14 260/757/14 +f 252/747/12 250/746/12 257/763/12 258/762/12 +o Cube.026_Cube.004 +v -8.000000 0.000000 -40.000000 +v -8.000000 16.000000 -40.000000 +v -8.000000 0.000000 -56.000000 +v -8.000000 16.000000 -56.000000 +v 8.000000 0.000000 -40.000000 +v 8.000000 16.000000 -40.000000 +v 8.000000 0.000000 -56.000000 +v 8.000000 16.000000 -56.000000 +v -8.000000 32.000000 -40.000000 +v -8.000000 32.000000 -56.000000 +v 8.000000 32.000000 -56.000000 +v 8.000000 32.000000 -40.000000 +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.625000 0.750000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +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 +usemtl None +s off +f 261/764/18 262/765/18 264/766/18 263/767/18 +f 263/767/19 264/766/19 268/768/19 267/769/19 +f 267/769/20 268/768/20 266/770/20 265/771/20 +f 265/771/21 266/770/21 262/772/21 261/773/21 +f 263/774/22 267/769/22 265/771/22 261/775/22 +f 262/772/21 266/770/21 272/776/21 269/777/21 +f 271/778/23 270/779/23 269/780/23 272/776/23 +f 268/768/19 264/766/19 270/781/19 271/778/19 +f 266/770/20 268/768/20 271/778/20 272/776/20 +f 264/766/18 262/765/18 269/782/18 270/781/18 +o Cube.035_Cube.021 +v -0.437500 0.750000 0.437500 +v -0.437500 1.250000 0.437500 +v -0.437500 0.750000 -0.437500 +v -0.437500 1.250000 -0.437500 +v 0.437500 0.750000 0.437500 +v 0.437500 1.250000 0.437500 +v 0.437500 0.750000 -0.437500 +v 0.437500 1.250000 -0.437500 +v -0.312500 0.437500 0.562500 +v -0.250000 1.250000 0.250000 +v -0.250000 1.500000 0.250000 +v -0.250000 1.250000 -0.250000 +v -0.250000 1.500000 -0.250000 +v 0.250000 1.250000 0.250000 +v 0.250000 1.500000 0.250000 +v 0.250000 1.250000 -0.250000 +v 0.250000 1.500000 -0.250000 +v 0.224112 0.588388 0.312500 +v 0.224112 0.588388 0.125000 +v 0.312500 0.500000 0.312500 +v 0.312500 0.500000 0.125000 +v 0.489277 0.853553 0.312500 +v 0.489277 0.853553 0.125000 +v 0.577665 0.765165 0.125000 +v 0.577665 0.765165 0.312500 +v -0.224112 0.588388 0.312500 +v -0.224112 0.588388 0.125000 +v -0.312500 0.500000 0.312500 +v -0.312500 0.500000 0.125000 +v -0.489277 0.853553 0.312500 +v -0.489277 0.853553 0.125000 +v -0.577665 0.765165 0.125000 +v -0.577665 0.765165 0.312500 +v 0.224112 0.588388 -0.312500 +v 0.224112 0.588388 -0.125000 +v 0.312500 0.500000 -0.312500 +v 0.312500 0.500000 -0.125000 +v 0.489277 0.853553 -0.312500 +v 0.489277 0.853553 -0.125000 +v 0.577665 0.765165 -0.125000 +v 0.577665 0.765165 -0.312500 +v -0.224112 0.588388 -0.312500 +v -0.224112 0.588388 -0.125000 +v -0.312500 0.500000 -0.312500 +v -0.312500 0.500000 -0.125000 +v -0.489277 0.853553 -0.312500 +v -0.489277 0.853553 -0.125000 +v -0.577665 0.765165 -0.125000 +v -0.577665 0.765165 -0.312500 +v 0.937500 0.687500 -0.500000 +v 0.937500 1.312500 -0.500000 +v 0.937500 0.687500 0.500000 +v 0.937500 1.312500 0.500000 +v 0.312500 0.687500 -0.500000 +v 0.312500 1.312500 -0.500000 +v 0.312500 0.687500 0.500000 +v 0.312500 1.312500 0.500000 +v -0.937500 0.687500 -0.500000 +v -0.937500 1.312500 -0.500000 +v -0.937500 0.687500 0.500000 +v -0.937500 1.312500 0.500000 +v -0.312500 0.687500 -0.500000 +v -0.312500 1.312500 -0.500000 +v -0.312500 0.687500 0.500000 +v -0.312500 1.312500 0.500000 +v 0.750000 0.750000 -1.353553 +v 0.750000 1.103553 -1.000000 +v 0.750000 0.396447 -1.000000 +v 0.750000 0.750000 -0.646447 +v 0.375000 0.750000 -1.353553 +v 0.375000 1.103553 -1.000000 +v 0.375000 0.396447 -1.000000 +v 0.375000 0.750000 -0.646447 +v -0.750000 0.750000 -1.353553 +v -0.750000 1.103553 -1.000000 +v -0.750000 0.396447 -1.000000 +v -0.750000 0.750000 -0.646447 +v -0.375000 0.750000 -1.353553 +v -0.375000 1.103553 -1.000000 +v -0.375000 0.396447 -1.000000 +v -0.375000 0.750000 -0.646447 +v 0.750000 0.750000 1.353553 +v 0.750000 1.103553 1.000000 +v 0.750000 0.396447 1.000000 +v 0.750000 0.750000 0.646446 +v 0.375000 0.750000 1.353553 +v 0.375000 1.103553 1.000000 +v 0.375000 0.396447 1.000000 +v 0.375000 0.750000 0.646446 +v -0.750000 0.750000 1.353553 +v -0.750000 1.103553 1.000000 +v -0.750000 0.396447 1.000000 +v -0.750000 0.750000 0.646446 +v -0.375000 0.750000 1.353553 +v -0.375000 1.103553 1.000000 +v -0.375000 0.396447 1.000000 +v -0.375000 0.750000 0.646446 +v 0.437500 0.838388 -0.734835 +v 0.437500 1.015165 -0.911612 +v 0.687500 0.838388 -0.734835 +v 0.687500 1.015165 -0.911612 +v 0.437500 1.457107 -0.469670 +v 0.437500 1.280330 -0.292893 +v 0.687500 1.280330 -0.292893 +v 0.687500 1.457107 -0.469670 +v -0.437500 0.838388 -0.734835 +v -0.437500 1.015165 -0.911612 +v -0.687500 0.838388 -0.734835 +v -0.687500 1.015165 -0.911612 +v -0.437500 1.457107 -0.469670 +v -0.437500 1.280330 -0.292893 +v -0.687500 1.280330 -0.292893 +v -0.687500 1.457107 -0.469670 +v 0.437500 0.838388 0.734835 +v 0.437500 1.015165 0.911612 +v 0.687500 0.838388 0.734835 +v 0.687500 1.015165 0.911612 +v 0.437500 1.457107 0.469670 +v 0.437500 1.280330 0.292893 +v 0.687500 1.280330 0.292893 +v 0.687500 1.457107 0.469670 +v -0.437500 0.838388 0.734835 +v -0.437500 1.015165 0.911612 +v -0.687500 0.838388 0.734835 +v -0.687500 1.015165 0.911612 +v -0.437500 1.457107 0.469670 +v -0.437500 1.280330 0.292893 +v -0.687500 1.280330 0.292893 +v -0.687500 1.457107 0.469670 +v 0.312500 0.437500 -1.312500 +v 0.312500 1.062500 -1.312500 +v 0.312500 0.437500 -0.687500 +v 0.312500 1.062500 -0.687500 +v -0.312500 0.437500 -1.312500 +v -0.312500 1.062500 -1.312500 +v -0.312500 0.437500 -0.687500 +v -0.312500 1.062500 -0.687500 +v -0.093750 1.062500 -0.906250 +v -0.093750 1.250000 -0.906250 +v -0.093750 1.062500 -1.093750 +v -0.093750 1.250000 -1.093750 +v 0.093750 1.062500 -0.906250 +v 0.093750 1.250000 -0.906250 +v 0.093750 1.062500 -1.093750 +v 0.093750 1.250000 -1.093750 +v 0.312500 0.437500 1.312500 +v 0.312500 1.062500 1.312500 +v 0.312500 0.437500 0.687500 +v 0.312500 1.062500 0.687500 +v -0.312500 0.437500 1.312500 +v -0.312500 1.062500 1.312500 +v -0.312500 0.437500 0.687500 +v -0.312500 1.062500 0.687500 +v -0.093750 1.062500 0.906250 +v -0.093750 1.250000 0.906250 +v -0.093750 1.062500 1.093750 +v -0.093750 1.250000 1.093750 +v 0.093750 1.062500 0.906250 +v 0.093750 1.250000 0.906250 +v 0.093750 1.062500 1.093750 +v 0.093750 1.250000 1.093750 +v 0.312500 0.437500 1.312500 +v 0.312500 1.062500 1.312500 +v 0.312500 0.437500 0.687500 +v 0.312500 1.062500 0.687500 +v -0.312500 0.437500 1.312500 +v -0.312500 1.062500 1.312500 +v -0.312500 0.437500 0.687500 +v -0.312500 1.062500 0.687500 +v -0.093750 1.062500 0.906250 +v -0.093750 1.250000 0.906250 +v -0.093750 1.062500 1.093750 +v -0.093750 1.250000 1.093750 +v 0.093750 1.062500 0.906250 +v 0.093750 1.250000 0.906250 +v 0.093750 1.062500 1.093750 +v 0.093750 1.250000 1.093750 +v 0.312500 0.437500 -1.312500 +v 0.312500 1.062500 -1.312500 +v 0.312500 0.437500 -0.687500 +v 0.312500 1.062500 -0.687500 +v -0.312500 0.437500 -1.312500 +v -0.312500 1.062500 -1.312500 +v -0.312500 0.437500 -0.687500 +v -0.312500 1.062500 -0.687500 +v -0.093750 1.062500 -0.906250 +v -0.093750 1.250000 -0.906250 +v -0.093750 1.062500 -1.093750 +v -0.093750 1.250000 -1.093750 +v 0.093750 1.062500 -0.906250 +v 0.093750 1.250000 -0.906250 +v 0.093750 1.062500 -1.093750 +v 0.093750 1.250000 -1.093750 +v -0.312500 0.437500 -0.562500 +v 0.312500 0.437500 0.562500 +v 0.312500 1.062500 0.562500 +v 0.312500 0.437500 -0.562500 +v 0.312500 1.062500 -0.562500 +v -0.312500 1.062500 0.562500 +v -0.312500 1.062500 -0.562500 +vt 0.687500 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.562500 +vt 0.687500 0.562500 +vt 0.312500 0.312500 +vt 0.312500 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.687500 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.562500 +vt 0.687500 0.562500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.312500 0.562500 +vt 0.312500 0.312500 +vt 0.000000 0.562500 +vt 0.437500 0.562500 +vt 0.437500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.562500 +vt 0.000000 0.562500 +vt 1.000000 0.687500 +vt 1.000000 1.000000 +vt 0.687500 1.000000 +vt 0.687500 0.687500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.562500 +vt 0.000000 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.718750 0.718750 +vt 0.968750 0.718750 +vt 0.968750 0.968750 +vt 0.718750 0.968750 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.906250 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.562500 +vt 0.906250 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.562500 +vt 0.906250 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.906250 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.625000 -0.000000 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.625000 -0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.625000 -0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.625000 -0.000000 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 1.000000 0.687500 +vt 0.687500 0.687500 +vt 0.687500 1.000000 +vt 1.000000 1.000000 +vt 0.000000 -0.000000 +vt 0.000000 0.562500 +vt 0.312500 0.562500 +vt 0.312500 0.000000 +vt 0.000000 -0.000000 +vt 0.000000 0.562500 +vt 0.312500 0.562500 +vt 0.312500 0.000000 +vt 0.625000 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.500000 +vt 0.625000 0.500000 +vt 0.812500 0.187500 +vt 0.812500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.937500 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.937500 0.500000 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.187500 +vt 0.968750 0.500000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.968750 1.000000 +vt -0.000000 0.500000 +vt -0.000000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.812500 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.812500 0.500000 +vt 0.937500 1.000000 +vt 0.937500 0.500000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.500000 0.187500 +vt 0.812500 0.187500 +vt 0.812500 0.500000 +vt 0.500000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 0.656250 1.000000 +vt 0.656250 0.500000 +vt -0.000000 0.500000 +vt -0.000000 1.000000 +vt 0.000000 0.250000 +vt 0.250000 0.250000 +vt 0.250000 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.000000 0.250000 +vt 0.250000 0.250000 +vt 0.250000 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 -0.000000 +vt 0.000000 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.250000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.000000 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.250000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.000000 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.250000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.000000 0.250000 +vt 0.000000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.250000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.218750 0.250000 +vt 0.218750 -0.000000 +vt 0.031250 -0.000000 +vt 0.031250 0.250000 +vt 0.000000 0.250000 +vt 0.250000 0.250000 +vt 0.250000 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.000000 0.250000 +vt 0.250000 0.250000 +vt 0.250000 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 -0.000000 +vt 0.218750 0.250000 +vt 0.031250 0.250000 +vt 0.031250 -0.000000 +vt 0.218750 -0.000000 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.187500 +vt 0.250000 0.062500 +vt 0.375000 0.062500 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.250000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.250000 0.500000 +vt 0.375000 0.500000 +vt 0.250000 0.062500 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.062500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.250000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.250000 0.500000 +vt 0.375000 0.500000 +vt 0.250000 0.062500 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.062500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.375000 0.187500 +vt 0.375000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.187500 +vt 0.250000 0.062500 +vt 0.375000 0.062500 +vt 0.375000 0.187500 +vt 0.250000 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.812500 0.468750 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.812500 0.468750 +vt 0.812500 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.468750 +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.7071 -0.7071 0.0000 +vn -0.7071 -0.7071 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_Body +s off +f 273/783/24 274/784/24 276/785/24 275/786/24 +f 275/787/25 276/788/25 280/789/25 279/790/25 +f 279/791/26 280/792/26 278/793/26 277/794/26 +f 277/795/27 278/796/27 274/797/27 273/798/27 +f 275/799/28 279/800/28 277/801/28 273/802/28 +f 280/792/29 276/803/29 274/804/29 278/793/29 +f 281/805/24 471/806/24 472/807/24 466/808/24 +f 467/809/27 468/810/27 471/811/27 281/812/27 +f 466/813/28 469/814/28 467/815/28 281/816/28 +f 282/817/24 283/818/24 285/819/24 284/820/24 +f 284/821/25 285/822/25 289/823/25 288/824/25 +f 288/825/26 289/826/26 287/827/26 286/828/26 +f 286/829/27 287/830/27 283/831/27 282/832/27 +f 289/833/29 285/834/29 283/835/29 287/836/29 +f 291/837/25 295/838/25 296/839/25 293/840/25 +f 293/840/30 296/839/30 297/841/30 292/842/30 +f 292/843/27 297/844/27 294/845/27 290/846/27 +f 299/847/25 301/848/25 304/849/25 303/850/25 +f 301/848/31 300/851/31 305/852/31 304/849/31 +f 300/853/27 298/854/27 302/855/27 305/856/27 +f 307/857/27 309/858/27 312/859/27 311/860/27 +f 309/858/30 308/861/30 313/862/30 312/859/30 +f 308/863/25 306/864/25 310/865/25 313/866/25 +f 315/867/27 319/868/27 320/869/27 317/870/27 +f 317/870/31 320/869/31 321/871/31 316/872/31 +f 316/873/25 321/874/25 318/875/25 314/876/25 +f 402/877/26 403/878/26 405/879/26 404/880/26 +f 404/881/27 405/882/27 409/883/27 408/884/27 +f 408/885/24 409/886/24 407/887/24 406/888/24 +f 406/889/25 407/887/25 403/890/25 402/891/25 +f 404/892/28 408/893/28 406/894/28 402/895/28 +f 409/883/29 405/896/29 403/897/29 407/898/29 +f 418/899/26 420/900/26 421/901/26 419/902/26 +f 420/903/25 424/904/25 425/905/25 421/906/25 +f 424/907/24 422/908/24 423/909/24 425/910/24 +f 422/911/27 418/912/27 419/913/27 423/909/27 +f 420/914/28 418/915/28 422/916/28 424/917/28 +f 425/905/29 423/918/29 419/919/29 421/920/29 +f 434/921/26 436/922/26 437/923/26 435/924/26 +f 436/925/25 440/926/25 441/927/25 437/928/25 +f 440/929/24 438/930/24 439/931/24 441/932/24 +f 438/933/27 434/934/27 435/935/27 439/931/27 +f 436/936/28 434/937/28 438/938/28 440/939/28 +f 441/927/29 439/940/29 435/941/29 437/942/29 +f 450/943/26 451/944/26 453/945/26 452/946/26 +f 452/947/27 453/948/27 457/949/27 456/950/27 +f 456/951/24 457/952/24 455/953/24 454/954/24 +f 454/955/25 455/953/25 451/956/25 450/957/25 +f 452/958/28 456/959/28 454/960/28 450/961/28 +f 457/949/29 453/962/29 451/963/29 455/964/29 +f 469/965/25 466/966/25 472/967/25 470/968/25 +f 467/969/26 469/970/26 470/971/26 468/972/26 +f 472/973/29 471/974/29 468/975/29 470/976/29 +usemtl Bogey_Body_2 +f 322/977/26 323/978/26 325/979/26 324/980/26 +f 324/981/27 325/982/27 329/983/27 328/984/27 +f 328/985/24 329/986/24 327/987/24 326/988/24 +f 326/989/25 327/990/25 323/991/25 322/992/25 +f 324/993/28 328/994/28 326/995/28 322/996/28 +f 329/997/29 325/979/29 323/978/29 327/998/29 +f 330/999/24 332/1000/24 333/1001/24 331/1002/24 +f 332/1003/27 336/1004/27 337/1005/27 333/1006/27 +f 336/1007/26 334/1008/26 335/1009/26 337/1010/26 +f 334/1011/25 330/1012/25 331/1013/25 335/1014/25 +f 332/1015/28 330/1016/28 334/1017/28 336/1018/28 +f 337/1019/29 335/1020/29 331/1002/29 333/1001/29 +f 338/1021/26 339/1022/26 341/1023/26 340/1024/26 +f 340/1025/32 341/1026/32 345/1027/32 344/1028/32 +f 344/1029/24 345/1030/24 343/1031/24 342/1032/24 +f 342/1033/33 343/1034/33 339/1035/33 338/1036/33 +f 340/1037/34 344/1038/34 342/1039/34 338/1040/34 +f 345/1041/35 341/1042/35 339/1043/35 343/1044/35 +f 346/1045/24 348/1046/24 349/1047/24 347/1048/24 +f 348/1049/32 352/1050/32 353/1051/32 349/1052/32 +f 352/1053/26 350/1054/26 351/1055/26 353/1056/26 +f 350/1057/33 346/1058/33 347/1059/33 351/1060/33 +f 348/1061/34 346/1062/34 350/1063/34 352/1064/34 +f 353/1065/35 351/1066/35 347/1067/35 349/1068/35 +f 354/1069/26 356/1070/26 357/1071/26 355/1072/26 +f 356/1073/34 360/1074/34 361/1075/34 357/1076/34 +f 360/1077/24 358/1078/24 359/1079/24 361/1080/24 +f 358/1081/35 354/1082/35 355/1083/35 359/1084/35 +f 356/1085/32 354/1086/32 358/1087/32 360/1088/32 +f 361/1089/33 359/1090/33 355/1091/33 357/1092/33 +f 362/1093/24 363/1094/24 365/1095/24 364/1096/24 +f 364/1097/34 365/1098/34 369/1099/34 368/1100/34 +f 368/1101/26 369/1102/26 367/1103/26 366/1104/26 +f 366/1105/35 367/1106/35 363/1107/35 362/1108/35 +f 364/1109/32 368/1110/32 366/1111/32 362/1112/32 +f 369/1113/33 365/1114/33 363/1115/33 367/1116/33 +f 371/1117/33 374/1118/33 377/1119/33 373/1120/33 +f 373/1121/26 377/1122/26 376/1123/26 372/1124/26 +f 372/1125/32 376/1126/32 375/1127/32 370/1128/32 +f 375/1129/35 376/1130/35 377/1131/35 374/1132/35 +f 370/1133/24 375/1134/24 374/1118/24 371/1117/24 +f 379/1135/33 381/1136/33 385/1137/33 382/1138/33 +f 381/1139/24 380/1140/24 384/1141/24 385/1142/24 +f 380/1143/32 378/1144/32 383/1145/32 384/1146/32 +f 383/1147/35 382/1148/35 385/1149/35 384/1150/35 +f 378/1151/26 379/1135/26 382/1138/26 383/1152/26 +f 387/1153/35 389/1154/35 393/1155/35 390/1156/35 +f 389/1157/26 388/1158/26 392/1159/26 393/1160/26 +f 388/1161/34 386/1162/34 391/1163/34 392/1164/34 +f 391/1165/33 390/1166/33 393/1167/33 392/1168/33 +f 386/1169/24 387/1153/24 390/1156/24 391/1170/24 +f 395/1171/35 398/1172/35 401/1173/35 397/1174/35 +f 397/1175/24 401/1176/24 400/1177/24 396/1178/24 +f 396/1179/34 400/1180/34 399/1181/34 394/1182/34 +f 399/1183/33 400/1184/33 401/1185/33 398/1186/33 +f 394/1187/26 399/1188/26 398/1172/26 395/1171/26 +usemtl wheel_Large +f 410/1189/24 411/1190/24 413/1191/24 412/1192/24 +f 412/1193/25 413/1194/25 417/1195/25 416/1196/25 +f 416/1197/26 417/1198/26 415/1199/26 414/1200/26 +f 414/1201/27 415/1202/27 411/1203/27 410/1204/27 +f 417/1205/29 413/1206/29 411/1207/29 415/1202/29 +f 426/1208/24 428/1209/24 429/1210/24 427/1211/24 +f 428/1212/27 432/1213/27 433/1214/27 429/1215/27 +f 432/1216/26 430/1217/26 431/1218/26 433/1219/26 +f 430/1220/25 426/1221/25 427/1222/25 431/1223/25 +f 433/1224/29 431/1223/29 427/1225/29 429/1226/29 +f 442/1227/24 444/1228/24 445/1229/24 443/1230/24 +f 444/1231/27 448/1232/27 449/1233/27 445/1234/27 +f 448/1235/26 446/1236/26 447/1237/26 449/1238/26 +f 446/1239/25 442/1240/25 443/1241/25 447/1242/25 +f 449/1243/29 447/1242/29 443/1244/29 445/1245/29 +f 458/1246/24 459/1247/24 461/1248/24 460/1249/24 +f 460/1250/25 461/1251/25 465/1252/25 464/1253/25 +f 464/1254/26 465/1255/26 463/1256/26 462/1257/26 +f 462/1258/27 463/1259/27 459/1260/27 458/1261/27 +f 465/1262/29 461/1263/29 459/1264/29 463/1259/29 +o Cube.029_Cube.049 +v 0.750000 0.449926 0.000000 +v 1.062500 0.387426 0.160477 +v 1.062500 0.387426 0.000000 +v 0.750000 0.318146 0.318146 +v 0.875000 0.160477 0.387426 +v 0.875000 0.186365 0.449926 +v 1.062500 0.160477 0.387426 +v 1.062500 0.273951 0.273951 +v 0.875000 0.387426 0.160477 +v 0.875000 0.449926 0.186365 +v 0.750000 0.449926 0.186365 +v 0.750000 0.000000 0.449926 +v 0.875000 -0.186365 0.449926 +v 1.062500 0.000000 0.387426 +v 0.750000 0.186365 0.449926 +v 0.750000 -0.318145 0.318146 +v 1.062500 -0.387426 0.160477 +v 1.062500 -0.273951 0.273951 +v 0.875000 -0.160477 0.387426 +v 1.062500 -0.160477 0.387426 +v 0.750000 -0.186365 0.449926 +v 0.750000 -0.449926 0.000000 +v 1.062500 -0.387426 0.000000 +v 0.875000 -0.387426 0.160477 +v 0.875000 -0.449926 0.186365 +v 0.750000 -0.449926 0.186365 +v 0.750000 -0.318145 -0.318146 +v 0.875000 -0.186365 -0.449926 +v 1.062500 -0.273951 -0.273951 +v 0.875000 -0.387426 -0.160477 +v 0.875000 -0.449926 -0.186365 +v 1.062500 -0.387426 -0.160477 +v 0.750000 -0.449926 -0.186365 +v 0.750000 0.000000 -0.449926 +v 0.875000 0.160477 -0.387426 +v 1.062500 0.160477 -0.387426 +v 0.750000 0.186365 -0.449926 +v 1.062500 0.000000 -0.387426 +v 0.875000 -0.160477 -0.387426 +v 1.062500 -0.160477 -0.387426 +v 0.750000 -0.186365 -0.449926 +v 0.750000 0.318146 -0.318146 +v 0.875000 0.387426 -0.160477 +v 0.875000 0.449926 -0.186365 +v 1.062500 0.387426 -0.160477 +v 0.750000 -0.000000 0.000000 +v 0.750000 0.449926 -0.186365 +v 1.062500 -0.000000 0.000000 +v 1.062500 0.273951 -0.273951 +v 0.875000 0.186365 -0.449926 +v 1.187500 -0.125000 -0.125000 +v 1.187500 0.125000 -0.125000 +v 1.187500 -0.125000 0.124999 +v 1.187500 0.125000 0.124999 +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 -0.750000 0.449926 0.000000 +v -1.062500 0.387426 0.160477 +v -1.062500 0.387426 0.000000 +v -0.750000 0.318146 0.318146 +v -0.875000 0.160477 0.387426 +v -0.875000 0.186365 0.449926 +v -1.062500 0.160477 0.387426 +v -1.062500 0.273951 0.273951 +v -0.875000 0.387426 0.160477 +v -0.875000 0.449926 0.186365 +v -0.750000 0.449926 0.186365 +v -0.750000 0.000000 0.449926 +v -0.875000 -0.186365 0.449926 +v -1.062500 0.000000 0.387426 +v -0.750000 0.186365 0.449926 +v -0.750000 -0.318145 0.318146 +v -1.062500 -0.387426 0.160477 +v -1.062500 -0.273951 0.273951 +v -0.875000 -0.160477 0.387426 +v -1.062500 -0.160477 0.387426 +v -0.750000 -0.186365 0.449926 +v -0.750000 -0.449926 0.000000 +v -1.062500 -0.387426 0.000000 +v -0.875000 -0.387426 0.160477 +v -0.875000 -0.449926 0.186365 +v -0.750000 -0.449926 0.186365 +v -0.750000 -0.318145 -0.318146 +v -0.875000 -0.186365 -0.449926 +v -1.062500 -0.273951 -0.273951 +v -0.875000 -0.387426 -0.160477 +v -0.875000 -0.449926 -0.186365 +v -1.062500 -0.387426 -0.160477 +v -0.750000 -0.449926 -0.186365 +v -0.750000 0.000000 -0.449926 +v -0.875000 0.160477 -0.387426 +v -1.062500 0.160477 -0.387426 +v -0.750000 0.186365 -0.449926 +v -1.062500 0.000000 -0.387426 +v -0.875000 -0.160477 -0.387426 +v -1.062500 -0.160477 -0.387426 +v -0.750000 -0.186365 -0.449926 +v -0.750000 0.318146 -0.318146 +v -0.875000 0.387426 -0.160477 +v -0.875000 0.449926 -0.186365 +v -1.062500 0.387426 -0.160477 +v -0.750000 -0.000000 0.000000 +v -0.750000 0.449926 -0.186365 +v -1.062500 -0.000000 0.000000 +v -1.062500 0.273951 -0.273951 +v -0.875000 0.186365 -0.449926 +v -1.187500 -0.125000 -0.125000 +v -1.187500 0.125000 -0.125000 +v -1.187500 -0.125000 0.124999 +v -1.187500 0.125000 0.124999 +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 0.875000 0.387426 0.000000 +v 0.875000 0.449926 0.000000 +v 0.875000 0.273951 0.273951 +v 0.875000 0.318146 0.318146 +v 0.875000 0.000000 0.387426 +v 0.875000 0.000000 0.449926 +v 0.875000 -0.273951 0.273951 +v 0.875000 -0.318145 0.318146 +v 0.875000 -0.387426 -0.000000 +v 0.875000 -0.449926 0.000000 +v 0.875000 -0.273951 -0.273951 +v 0.875000 -0.318145 -0.318145 +v 0.875000 0.000000 -0.387426 +v 0.875000 0.000000 -0.449926 +v 0.875000 0.273951 -0.273951 +v 0.875000 0.318146 -0.318145 +v -0.875000 0.000000 0.387426 +v -0.875000 0.000000 0.449926 +v -0.875000 0.273951 0.273951 +v -0.875000 0.318146 0.318146 +v -0.875000 0.387426 0.000000 +v -0.875000 0.449926 0.000000 +v -0.875000 0.273951 -0.273951 +v -0.875000 0.318146 -0.318145 +v -0.875000 0.000000 -0.387426 +v -0.875000 0.000000 -0.449926 +v -0.875000 -0.273951 -0.273951 +v -0.875000 -0.318145 -0.318145 +v -0.875000 -0.387426 -0.000000 +v -0.875000 -0.449926 0.000000 +v -0.875000 -0.273951 0.273951 +v -0.875000 -0.318145 0.318146 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vt 0.625000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 0.000000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.375000 0.000000 +vt 0.625000 0.375000 +vt 0.375000 0.625000 +vt 0.375000 0.375000 +vt 0.375000 0.625000 +vt 0.625000 0.375000 +vt 0.375000 0.375000 +vt 0.625000 0.625000 +vt 0.625000 0.625000 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.593750 +vt 0.812500 0.781250 +vt 0.812500 0.562500 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.731773 0.843750 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.906250 0.937500 +vt 0.812500 1.000000 +vt 0.812500 0.937500 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.687500 +vt 0.731773 0.656250 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.812500 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.937500 +vt 0.731773 0.843750 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.593750 +vt 0.812500 0.562500 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.906250 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.812500 0.843750 +vt 0.731773 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.906250 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 1.000000 +vt 0.906250 0.937500 +vt 0.812500 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.906250 1.000000 +vt 0.906250 0.937500 +vt 0.731773 0.656250 +vt 0.812500 0.687500 +vt 0.812500 0.656250 +vt 0.731773 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.781250 +vt 0.718750 0.781250 +vt 0.893227 0.781250 +vt 0.906250 0.781250 +vt 0.731773 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.893227 0.656250 +vt 0.893227 0.843750 +vt 0.812500 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.843750 +vt 0.812500 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.718750 1.000000 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.718750 1.000000 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.843750 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.843750 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.843750 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 0.937500 +vt 0.812500 1.000000 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.893227 0.843750 +vt 0.718750 1.000000 +vt 0.718750 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.906250 0.937500 +vt 0.718750 0.687500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 0.937500 +vt 0.718750 0.687500 +vt 0.812500 0.937500 +vt 0.906250 0.937500 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 0.937500 +vt 0.893227 0.656250 +vt 0.906250 0.687500 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.843750 +vt 0.812500 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.843750 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.843750 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.812500 1.000000 +vt 0.718750 0.687500 +vt 0.731773 0.937500 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.906250 0.687500 +vt 0.893227 0.937500 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +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 00_Shaft +s off +f 530/1265/36 523/1266/36 529/1267/36 +f 526/1268/37 530/1269/37 528/1270/37 +f 527/1271/38 523/1272/38 525/1273/38 +f 526/1274/39 527/1275/39 525/1276/39 +f 581/1277/36 588/1278/36 587/1279/36 +f 588/1280/37 584/1281/37 586/1282/37 +f 581/1283/38 585/1284/38 583/1285/38 +f 585/1286/39 584/1287/39 583/1288/39 +f 530/1265/36 524/1289/36 523/1266/36 +f 526/1268/37 524/1290/37 530/1269/37 +f 527/1271/38 529/1291/38 523/1272/38 +f 526/1274/39 528/1292/39 527/1275/39 +f 581/1277/36 582/1293/36 588/1278/36 +f 588/1280/37 582/1294/37 584/1281/37 +f 581/1283/38 587/1295/38 585/1284/38 +f 585/1286/39 586/1296/39 584/1287/39 +usemtl 00_Shaft_end +f 524/1297/40 525/1298/40 523/1299/40 +f 583/1300/41 582/1301/41 581/1302/41 +f 524/1297/40 526/1303/40 525/1298/40 +f 583/1300/41 584/1304/41 582/1301/41 +usemtl wheel_Large +f 516/1305/37 473/1306/37 590/1307/37 +f 590/1308/40 481/1309/40 589/1310/40 +f 474/1311/40 520/1312/40 475/1313/40 +f 518/1314/41 483/1315/41 473/1316/41 +f 517/1317/40 475/1313/40 520/1312/40 +f 518/1314/41 473/1316/41 519/1318/41 +f 475/1319/37 481/1320/37 474/1321/37 +f 592/1322/42 483/1323/42 476/1324/42 +f 592/1325/40 477/1326/40 591/1327/40 +f 479/1328/40 520/1312/40 480/1329/40 +f 518/1314/41 487/1330/41 476/1331/41 +f 474/1332/40 480/1329/40 520/1312/40 +f 518/1314/41 476/1331/41 483/1333/41 +f 480/1334/42 477/1335/42 479/1336/42 +f 478/1337/39 484/1338/39 594/1339/39 +f 594/1340/40 491/1341/40 593/1342/40 +f 492/1343/40 520/1312/40 486/1344/40 +f 518/1314/41 493/1345/41 484/1346/41 +f 479/1347/40 486/1344/40 520/1312/40 +f 518/1314/41 484/1346/41 487/1348/41 +f 593/1349/39 492/1350/39 486/1351/39 +f 596/1352/43 493/1353/43 488/1354/43 +f 596/1355/40 496/1356/40 595/1357/40 +f 489/1358/40 520/1312/40 490/1359/40 +f 518/1314/41 498/1360/41 488/1361/41 +f 492/1362/40 490/1359/40 520/1312/40 +f 518/1314/41 488/1361/41 493/1363/41 +f 490/1364/43 496/1365/43 489/1366/43 +f 598/1367/38 498/1368/38 494/1369/38 +f 598/1370/40 502/1371/40 597/1372/40 +f 504/1373/40 520/1312/40 495/1374/40 +f 518/1314/41 505/1375/41 494/1376/41 +f 489/1377/40 495/1374/40 520/1312/40 +f 518/1314/41 494/1376/41 498/1378/41 +f 597/1379/38 504/1380/38 495/1381/38 +f 503/1382/44 499/1383/44 600/1384/44 +f 600/1385/40 511/1386/40 599/1387/40 +f 512/1388/40 520/1312/40 501/1389/40 +f 518/1314/41 513/1390/41 499/1391/41 +f 504/1392/40 501/1389/40 520/1312/40 +f 518/1314/41 499/1391/41 505/1393/41 +f 599/1394/44 512/1395/44 501/1396/44 +f 500/1397/36 506/1398/36 602/1399/36 +f 602/1400/40 507/1401/40 601/1402/40 +f 508/1403/40 520/1312/40 510/1404/40 +f 518/1314/41 509/1405/41 506/1406/41 +f 512/1407/40 510/1404/40 520/1312/40 +f 518/1314/41 506/1406/41 513/1408/41 +f 601/1409/36 508/1410/36 510/1411/36 +f 604/1412/45 509/1413/45 514/1414/45 +f 604/1415/40 515/1416/40 603/1417/40 +f 517/1418/40 520/1312/40 521/1419/40 +f 518/1314/41 519/1420/41 514/1421/41 +f 508/1422/40 521/1419/40 520/1312/40 +f 518/1314/41 514/1421/41 509/1423/41 +f 603/1424/45 517/1425/45 521/1426/45 +f 531/1427/37 574/1428/37 610/1429/37 +f 539/1430/41 610/1431/41 609/1432/41 +f 532/1433/41 533/1434/41 578/1435/41 +f 576/1436/40 531/1437/40 541/1438/40 +f 575/1439/41 578/1435/41 533/1434/41 +f 576/1436/40 577/1440/40 531/1437/40 +f 533/1441/37 539/1442/37 609/1443/37 +f 608/1444/42 541/1445/42 540/1446/42 +f 535/1447/41 608/1448/41 607/1449/41 +f 537/1450/41 538/1451/41 578/1435/41 +f 576/1436/40 534/1452/40 545/1453/40 +f 532/1454/41 578/1435/41 538/1451/41 +f 576/1436/40 541/1455/40 534/1452/40 +f 538/1456/42 535/1457/42 607/1458/42 +f 542/1459/39 536/1460/39 606/1461/39 +f 549/1462/41 606/1463/41 605/1464/41 +f 550/1465/41 544/1466/41 578/1435/41 +f 576/1436/40 542/1467/40 551/1468/40 +f 537/1469/41 578/1435/41 544/1466/41 +f 576/1436/40 545/1470/40 542/1467/40 +f 550/1471/39 605/1472/39 544/1473/39 +f 546/1474/43 543/1475/43 620/1476/43 +f 554/1477/41 620/1478/41 619/1479/41 +f 547/1480/41 548/1481/41 578/1435/41 +f 576/1436/40 546/1482/40 556/1483/40 +f 550/1484/41 578/1435/41 548/1481/41 +f 576/1436/40 551/1485/40 546/1482/40 +f 548/1486/43 554/1487/43 619/1488/43 +f 618/1489/38 556/1490/38 555/1491/38 +f 560/1492/41 618/1493/41 617/1494/41 +f 562/1495/41 553/1496/41 578/1435/41 +f 576/1436/40 552/1497/40 563/1498/40 +f 547/1499/41 578/1435/41 553/1496/41 +f 576/1436/40 556/1500/40 552/1497/40 +f 562/1501/38 617/1502/38 553/1503/38 +f 557/1504/44 561/1505/44 616/1506/44 +f 569/1507/41 616/1508/41 615/1509/41 +f 570/1510/41 559/1511/41 578/1435/41 +f 576/1436/40 557/1512/40 571/1513/40 +f 562/1514/41 578/1435/41 559/1511/41 +f 576/1436/40 563/1515/40 557/1512/40 +f 570/1516/44 615/1517/44 559/1518/44 +f 564/1519/36 558/1520/36 614/1521/36 +f 565/1522/41 614/1523/41 613/1524/41 +f 566/1525/41 568/1526/41 578/1435/41 +f 576/1436/40 564/1527/40 567/1528/40 +f 570/1529/41 578/1435/41 568/1526/41 +f 576/1436/40 571/1530/40 564/1527/40 +f 566/1531/36 613/1532/36 568/1533/36 +f 612/1534/45 567/1535/45 580/1536/45 +f 573/1537/41 612/1538/41 611/1539/41 +f 575/1540/41 579/1541/41 578/1435/41 +f 576/1436/40 572/1542/40 577/1543/40 +f 566/1544/41 578/1435/41 579/1541/41 +f 576/1436/40 567/1545/40 572/1542/40 +f 575/1546/45 611/1547/45 579/1548/45 +f 515/1549/40 590/1308/40 589/1310/40 +f 517/1550/37 589/1551/37 475/1319/37 +f 590/1307/37 483/1552/37 482/1553/37 +f 481/1554/40 592/1325/40 591/1327/40 +f 474/1555/42 591/1556/42 480/1334/42 +f 592/1322/42 487/1557/42 478/1558/42 +f 477/1559/40 594/1340/40 593/1342/40 +f 477/1560/39 486/1351/39 479/1561/39 +f 594/1339/39 493/1562/39 485/1563/39 +f 491/1564/40 596/1355/40 595/1357/40 +f 491/1565/43 490/1364/43 492/1566/43 +f 596/1352/43 498/1567/43 497/1568/43 +f 496/1569/40 598/1370/40 597/1372/40 +f 496/1570/38 495/1381/38 489/1571/38 +f 503/1572/38 494/1369/38 505/1573/38 +f 502/1574/40 600/1385/40 599/1387/40 +f 502/1575/44 501/1396/44 504/1576/44 +f 600/1384/44 513/1577/44 500/1578/44 +f 511/1579/40 602/1400/40 601/1402/40 +f 511/1580/36 510/1411/36 512/1581/36 +f 522/1582/36 506/1398/36 509/1583/36 +f 508/1584/45 603/1424/45 521/1426/45 +f 604/1412/45 519/1585/45 516/1586/45 +f 535/1587/41 606/1463/41 536/1588/41 +f 544/1473/39 535/1589/39 537/1590/39 +f 551/1591/39 606/1461/39 543/1592/39 +f 539/1593/41 608/1448/41 540/1594/41 +f 532/1595/42 607/1458/42 539/1596/42 +f 545/1597/42 608/1444/42 536/1598/42 +f 573/1599/41 610/1431/41 574/1600/41 +f 575/1601/37 609/1443/37 573/1602/37 +f 541/1603/37 610/1429/37 540/1604/37 +f 565/1605/41 612/1538/41 580/1606/41 +f 566/1607/45 611/1547/45 565/1608/45 +f 577/1609/45 612/1534/45 574/1610/45 +f 569/1611/41 614/1523/41 558/1612/41 +f 568/1533/36 569/1613/36 570/1614/36 +f 580/1615/36 564/1519/36 614/1521/36 +f 560/1616/41 616/1508/41 561/1617/41 +f 559/1518/44 560/1618/44 562/1619/44 +f 571/1620/44 616/1506/44 558/1621/44 +f 554/1622/41 618/1493/41 555/1623/41 +f 553/1503/38 554/1624/38 547/1625/38 +f 561/1626/38 552/1627/38 618/1489/38 +f 549/1628/41 620/1478/41 543/1629/41 +f 548/1486/43 549/1630/43 550/1631/43 +f 556/1632/43 620/1476/43 555/1633/43 +f 516/1305/37 519/1634/37 473/1306/37 +f 590/1308/40 482/1635/40 481/1309/40 +f 475/1319/37 589/1551/37 481/1320/37 +f 592/1322/42 482/1636/42 483/1323/42 +f 592/1325/40 478/1637/40 477/1326/40 +f 480/1334/42 591/1556/42 477/1335/42 +f 478/1337/39 487/1638/39 484/1338/39 +f 594/1340/40 485/1639/40 491/1341/40 +f 593/1349/39 491/1640/39 492/1350/39 +f 596/1352/43 485/1641/43 493/1353/43 +f 596/1355/40 497/1642/40 496/1356/40 +f 490/1364/43 595/1643/43 496/1365/43 +f 598/1367/38 497/1644/38 498/1368/38 +f 598/1370/40 503/1645/40 502/1371/40 +f 597/1379/38 502/1646/38 504/1380/38 +f 503/1382/44 505/1647/44 499/1383/44 +f 600/1385/40 500/1648/40 511/1386/40 +f 599/1394/44 511/1649/44 512/1395/44 +f 500/1397/36 513/1650/36 506/1398/36 +f 602/1400/40 522/1651/40 507/1401/40 +f 601/1409/36 507/1652/36 508/1410/36 +f 604/1412/45 522/1653/45 509/1413/45 +f 603/1417/40 507/1654/40 604/1415/40 +f 507/1654/40 522/1655/40 604/1415/40 +f 604/1415/40 516/1656/40 515/1416/40 +f 603/1424/45 515/1657/45 517/1425/45 +f 531/1427/37 577/1658/37 574/1428/37 +f 539/1430/41 540/1659/41 610/1431/41 +f 533/1441/37 532/1660/37 539/1442/37 +f 608/1444/42 534/1661/42 541/1445/42 +f 535/1447/41 536/1662/41 608/1448/41 +f 538/1456/42 537/1663/42 535/1457/42 +f 542/1459/39 545/1664/39 536/1460/39 +f 549/1462/41 543/1665/41 606/1463/41 +f 550/1471/39 549/1666/39 605/1472/39 +f 546/1474/43 551/1667/43 543/1475/43 +f 554/1477/41 555/1668/41 620/1478/41 +f 548/1486/43 547/1669/43 554/1487/43 +f 618/1489/38 552/1627/38 556/1490/38 +f 560/1492/41 561/1670/41 618/1493/41 +f 562/1501/38 560/1671/38 617/1502/38 +f 557/1504/44 563/1672/44 561/1505/44 +f 569/1507/41 558/1673/41 616/1508/41 +f 570/1516/44 569/1674/44 615/1517/44 +f 564/1519/36 571/1675/36 558/1520/36 +f 565/1522/41 580/1676/41 614/1523/41 +f 566/1531/36 565/1677/36 613/1532/36 +f 612/1534/45 572/1678/45 567/1535/45 +f 573/1537/41 574/1679/41 612/1538/41 +f 575/1546/45 573/1680/45 611/1547/45 +f 515/1549/40 516/1681/40 590/1308/40 +f 517/1550/37 515/1682/37 589/1551/37 +f 590/1307/37 473/1306/37 483/1552/37 +f 481/1554/40 482/1683/40 592/1325/40 +f 474/1555/42 481/1684/42 591/1556/42 +f 592/1322/42 476/1324/42 487/1557/42 +f 477/1559/40 478/1685/40 594/1340/40 +f 477/1560/39 593/1349/39 486/1351/39 +f 594/1339/39 484/1338/39 493/1562/39 +f 491/1564/40 485/1686/40 596/1355/40 +f 491/1565/43 595/1643/43 490/1364/43 +f 596/1352/43 488/1354/43 498/1567/43 +f 496/1569/40 497/1687/40 598/1370/40 +f 496/1570/38 597/1379/38 495/1381/38 +f 503/1572/38 598/1367/38 494/1369/38 +f 502/1574/40 503/1688/40 600/1385/40 +f 502/1575/44 599/1394/44 501/1396/44 +f 600/1384/44 499/1383/44 513/1577/44 +f 511/1579/40 500/1689/40 602/1400/40 +f 511/1580/36 601/1409/36 510/1411/36 +f 522/1582/36 602/1399/36 506/1398/36 +f 508/1584/45 507/1690/45 603/1424/45 +f 604/1412/45 514/1414/45 519/1585/45 +f 535/1587/41 605/1464/41 606/1463/41 +f 544/1473/39 605/1472/39 535/1589/39 +f 551/1591/39 542/1459/39 606/1461/39 +f 539/1593/41 607/1449/41 608/1448/41 +f 532/1595/42 538/1456/42 607/1458/42 +f 545/1597/42 534/1661/42 608/1444/42 +f 573/1599/41 609/1432/41 610/1431/41 +f 575/1601/37 533/1441/37 609/1443/37 +f 541/1603/37 531/1427/37 610/1429/37 +f 565/1605/41 611/1539/41 612/1538/41 +f 566/1607/45 579/1548/45 611/1547/45 +f 577/1609/45 572/1678/45 612/1534/45 +f 569/1611/41 613/1524/41 614/1523/41 +f 568/1533/36 613/1532/36 569/1613/36 +f 580/1615/36 567/1691/36 564/1519/36 +f 560/1616/41 615/1509/41 616/1508/41 +f 559/1518/44 615/1517/44 560/1618/44 +f 571/1620/44 557/1504/44 616/1506/44 +f 554/1622/41 617/1494/41 618/1493/41 +f 553/1503/38 617/1502/38 554/1624/38 +f 561/1626/38 563/1692/38 552/1627/38 +f 549/1628/41 619/1479/41 620/1478/41 +f 548/1486/43 619/1488/43 549/1630/43 +f 556/1632/43 546/1474/43 620/1476/43 +o Cube.050_Cube.042 +v 0.437500 0.687500 0.318750 +v 0.437500 1.375000 0.318750 +v 0.437500 0.687500 -0.318750 +v 0.437500 1.375000 -0.318750 +v 0.750000 0.687500 0.318750 +v 0.750000 1.375000 0.318750 +v 0.750000 0.687500 -0.318750 +v 0.750000 1.375000 -0.318750 +v -0.437500 0.687500 0.318750 +v -0.437500 1.375000 0.318750 +v -0.437500 0.687500 -0.318750 +v -0.437500 1.375000 -0.318750 +v -0.750000 0.687500 0.318750 +v -0.750000 1.375000 0.318750 +v -0.750000 0.687500 -0.318750 +v -0.750000 1.375000 -0.318750 +v 0.937500 0.687500 1.375000 +v 0.937500 1.312500 1.375000 +v 0.937500 0.687500 0.750000 +v 0.937500 1.312500 0.750000 +v 1.312500 0.687500 1.375000 +v 1.312500 1.312500 1.375000 +v 1.312500 0.687500 0.750000 +v 1.312500 1.312500 0.750000 +v 1.249999 0.750000 0.687500 +v 1.249999 1.250000 0.687500 +v 1.249999 0.750000 0.750000 +v 1.249999 1.250000 0.750000 +v 0.999999 0.750000 0.687500 +v 0.999999 1.250000 0.687500 +v 0.999999 0.750000 0.750000 +v 0.999999 1.250000 0.750000 +v 0.999999 1.250000 1.375000 +v 0.999999 0.750000 1.375000 +v 0.999999 1.250000 1.437500 +v 0.999999 0.750000 1.437500 +v 1.249999 1.250000 1.375000 +v 1.249999 0.750000 1.375000 +v 1.249999 1.250000 1.437500 +v 1.249999 0.750000 1.437500 +v -0.937500 0.687500 1.375000 +v -0.937500 1.312500 1.375000 +v -0.937500 0.687500 0.750000 +v -0.937500 1.312500 0.750000 +v -1.312500 0.687500 1.375000 +v -1.312500 1.312500 1.375000 +v -1.312500 0.687500 0.750000 +v -1.312500 1.312500 0.750000 +v -1.249999 0.750000 0.687500 +v -1.249999 1.250000 0.687500 +v -1.249999 0.750000 0.750000 +v -1.249999 1.250000 0.750000 +v -0.999999 0.750000 0.687500 +v -0.999999 1.250000 0.687500 +v -0.999999 0.750000 0.750000 +v -0.999999 1.250000 0.750000 +v -0.999999 1.250000 1.375000 +v -0.999999 0.750000 1.375000 +v -0.999999 1.250000 1.437500 +v -0.999999 0.750000 1.437500 +v -1.249999 1.250000 1.375000 +v -1.249999 0.750000 1.375000 +v -1.249999 1.250000 1.437500 +v -1.249999 0.750000 1.437500 +v 0.937500 0.687500 -1.375000 +v 0.937500 1.312500 -1.375000 +v 0.937500 0.687500 -0.750000 +v 0.937500 1.312500 -0.750000 +v 1.312500 0.687500 -1.375000 +v 1.312500 1.312500 -1.375000 +v 1.312500 0.687500 -0.750000 +v 1.312500 1.312500 -0.750000 +v 1.249999 0.750000 -0.687500 +v 1.249999 1.250000 -0.687500 +v 1.249999 0.750000 -0.750000 +v 1.249999 1.250000 -0.750000 +v 0.999999 0.750000 -0.687500 +v 0.999999 1.250000 -0.687500 +v 0.999999 0.750000 -0.750000 +v 0.999999 1.250000 -0.750000 +v 0.999999 1.250000 -1.375000 +v 0.999999 0.750000 -1.375000 +v 0.999999 1.250000 -1.437500 +v 0.999999 0.750000 -1.437500 +v 1.249999 1.250000 -1.375000 +v 1.249999 0.750000 -1.375000 +v 1.249999 1.250000 -1.437500 +v 1.249999 0.750000 -1.437500 +v -0.937500 0.687500 -1.375000 +v -0.937500 1.312500 -1.375000 +v -0.937500 0.687500 -0.750000 +v -0.937500 1.312500 -0.750000 +v -1.312500 0.687500 -1.375000 +v -1.312500 1.312500 -1.375000 +v -1.312500 0.687500 -0.750000 +v -1.312500 1.312500 -0.750000 +v -1.249999 0.750000 -0.687500 +v -1.249999 1.250000 -0.687500 +v -1.249999 0.750000 -0.750000 +v -1.249999 1.250000 -0.750000 +v -0.999999 0.750000 -0.687500 +v -0.999999 1.250000 -0.687500 +v -0.999999 0.750000 -0.750000 +v -0.999999 1.250000 -0.750000 +v -0.999999 1.250000 -1.375000 +v -0.999999 0.750000 -1.375000 +v -0.999999 1.250000 -1.437500 +v -0.999999 0.750000 -1.437500 +v -1.249999 1.250000 -1.375000 +v -1.249999 0.750000 -1.375000 +v -1.249999 1.250000 -1.437500 +v -1.249999 0.750000 -1.437500 +v -0.437500 0.750000 0.437500 +v -0.437500 1.250000 0.437500 +v -0.437500 0.750000 -0.437500 +v -0.437500 1.250000 -0.437500 +v 0.437500 0.750000 0.437500 +v 0.437500 1.250000 0.437500 +v 0.437500 0.750000 -0.437500 +v 0.437500 1.250000 -0.437500 +v -0.312500 0.437500 0.562500 +v -0.312500 1.062500 0.562500 +v -0.312500 0.437500 -0.562500 +v -0.312500 1.062500 -0.562500 +v 0.312500 0.437500 0.562500 +v 0.312500 1.062500 0.562500 +v 0.312500 0.437500 -0.562500 +v 0.312500 1.062500 -0.562500 +v -0.250000 1.250000 0.250000 +v -0.250000 1.500000 0.250000 +v -0.250000 1.250000 -0.250000 +v -0.250000 1.500000 -0.250000 +v 0.250000 1.250000 0.250000 +v 0.250000 1.500000 0.250000 +v 0.250000 1.250000 -0.250000 +v 0.250000 1.500000 -0.250000 +v 0.224112 0.588388 0.312500 +v 0.224112 0.588388 0.125000 +v 0.312500 0.500000 0.312500 +v 0.312500 0.500000 0.125000 +v 0.489277 0.853553 0.312500 +v 0.489277 0.853553 0.125000 +v 0.577665 0.765165 0.125000 +v 0.577665 0.765165 0.312500 +v -0.224112 0.588388 0.312500 +v -0.224112 0.588388 0.125000 +v -0.312500 0.500000 0.312500 +v -0.312500 0.500000 0.125000 +v -0.489277 0.853553 0.312500 +v -0.489277 0.853553 0.125000 +v -0.577665 0.765165 0.125000 +v -0.577665 0.765165 0.312500 +v 0.224112 0.588388 -0.312500 +v 0.224112 0.588388 -0.125000 +v 0.312500 0.500000 -0.312500 +v 0.312500 0.500000 -0.125000 +v 0.489277 0.853553 -0.312500 +v 0.489277 0.853553 -0.125000 +v 0.577665 0.765165 -0.125000 +v 0.577665 0.765165 -0.312500 +v -0.224112 0.588388 -0.312500 +v -0.224112 0.588388 -0.125000 +v -0.312500 0.500000 -0.312500 +v -0.312500 0.500000 -0.125000 +v -0.489277 0.853553 -0.312500 +v -0.489277 0.853553 -0.125000 +v -0.577665 0.765165 -0.125000 +v -0.577665 0.765165 -0.312500 +v 0.312500 0.437500 -1.312500 +v 0.312500 1.062500 -1.312500 +v 0.312500 0.437500 -0.687500 +v 0.312500 1.062500 -0.687500 +v -0.312500 0.437500 -1.312500 +v -0.312500 1.062500 -1.312500 +v -0.312500 0.437500 -0.687500 +v -0.312500 1.062500 -0.687500 +v -0.093750 1.062500 -0.906250 +v -0.093750 1.250000 -0.906250 +v -0.093750 1.062500 -1.093750 +v -0.093750 1.250000 -1.093750 +v 0.093750 1.062500 -0.906250 +v 0.093750 1.250000 -0.906250 +v 0.093750 1.062500 -1.093750 +v 0.093750 1.250000 -1.093750 +v 0.312500 0.437500 1.312500 +v 0.312500 1.062500 1.312500 +v 0.312500 0.437500 0.687500 +v 0.312500 1.062500 0.687500 +v -0.312500 0.437500 1.312500 +v -0.312500 1.062500 1.312500 +v -0.312500 0.437500 0.687500 +v -0.312500 1.062500 0.687500 +v -0.093750 1.062500 0.906250 +v -0.093750 1.250000 0.906250 +v -0.093750 1.062500 1.093750 +v -0.093750 1.250000 1.093750 +v 0.093750 1.062500 0.906250 +v 0.093750 1.250000 0.906250 +v 0.093750 1.062500 1.093750 +v 0.093750 1.250000 1.093750 +v 0.750000 0.500000 -1.250000 +v 0.750000 1.000000 -1.250000 +v 0.750000 0.500000 -0.750000 +v 0.750000 1.000000 -0.750000 +v 0.437500 0.500000 -1.250000 +v 0.437500 1.000000 -1.250000 +v 0.437500 0.500000 -0.750000 +v 0.437500 1.000000 -0.750000 +v -0.750000 0.500000 -1.250000 +v -0.750000 1.000000 -1.250000 +v -0.750000 0.500000 -0.750000 +v -0.750000 1.000000 -0.750000 +v -0.437500 0.500000 -1.250000 +v -0.437500 1.000000 -1.250000 +v -0.437500 0.500000 -0.750000 +v -0.437500 1.000000 -0.750000 +v 0.750000 0.500000 1.250000 +v 0.750000 1.000000 1.250000 +v 0.750000 0.500000 0.750000 +v 0.750000 1.000000 0.750000 +v 0.437500 0.500000 1.250000 +v 0.437500 1.000000 1.250000 +v 0.437500 0.500000 0.750000 +v 0.437500 1.000000 0.750000 +v -0.750000 0.500000 1.250000 +v -0.750000 1.000000 1.250000 +v -0.750000 0.500000 0.750000 +v -0.750000 1.000000 0.750000 +v -0.437500 0.500000 1.250000 +v -0.437500 1.000000 1.250000 +v -0.437500 0.500000 0.750000 +v -0.437500 1.000000 0.750000 +v 0.500000 1.000000 -1.062500 +v 0.687500 1.000000 -1.062500 +v 0.500000 1.310930 -0.311848 +v 0.687500 1.310930 -0.311848 +v -0.500000 1.000000 -1.062500 +v -0.687500 1.000000 -1.062500 +v -0.500000 1.310930 -0.311848 +v -0.687500 1.310930 -0.311848 +v 0.500000 1.000000 1.062500 +v 0.687500 1.000000 1.062500 +v 0.500000 1.310930 0.311848 +v 0.687500 1.310930 0.311848 +v -0.500000 1.000000 1.062500 +v -0.687500 1.000000 1.062500 +v -0.500000 1.310930 0.311848 +v -0.687500 1.310930 0.311848 +v 0.500000 0.656250 0.939394 +v 0.687500 0.656250 0.939394 +v 0.500000 0.656250 -1.060606 +v 0.687500 0.656250 -1.060606 +v 0.500000 0.656250 -0.060606 +v 0.687500 0.656250 -0.060606 +v -0.500000 0.593750 0.939394 +v -0.687500 0.593750 0.939394 +v -0.500000 0.593750 -1.060606 +v -0.687500 0.593750 -1.060606 +v -0.500000 0.593750 -0.060606 +v -0.687500 0.593750 -0.060606 +v 0.500000 0.942259 -1.038583 +v 0.687500 0.942259 -1.038583 +v 0.500000 1.253189 -0.287931 +v 0.687500 1.253189 -0.287931 +v -0.500000 0.942259 -1.038583 +v -0.687500 0.942259 -1.038583 +v -0.500000 1.253189 -0.287931 +v -0.687500 1.253189 -0.287931 +v 0.500000 0.942259 1.038583 +v 0.687500 0.942259 1.038583 +v 0.500000 1.253189 0.287931 +v 0.687500 1.253189 0.287931 +v -0.500000 0.942259 1.038583 +v -0.687500 0.942259 1.038583 +v -0.500000 1.253189 0.287931 +v -0.687500 1.253189 0.287931 +v 0.500000 0.593750 0.939394 +v 0.687500 0.593750 0.939394 +v 0.500000 0.593750 -1.060606 +v 0.687500 0.593750 -1.060606 +v 0.500000 0.593750 -0.060606 +v 0.687500 0.593750 -0.060606 +v -0.500000 0.531250 0.939394 +v -0.687500 0.531250 0.939394 +v -0.500000 0.531250 -1.060606 +v -0.687500 0.531250 -1.060606 +v -0.500000 0.531250 -0.060606 +v -0.687500 0.531250 -0.060606 +v 0.000000 0.562500 -0.937500 +v 0.000000 0.562500 -1.187500 +v -0.750000 0.375000 -0.937500 +v 0.000000 0.375000 -0.937500 +v 0.000000 0.375000 -1.187500 +v -1.059359 0.949524 -0.937500 +v -1.059359 0.949524 -1.187500 +v -0.750000 0.375000 -1.187500 +v -1.191942 0.816942 -0.937500 +v -1.191942 0.816942 -1.187500 +v -0.672335 0.562500 -0.937500 +v -0.672335 0.562500 -1.187500 +v 0.750000 0.375000 -0.937500 +v 1.059359 0.949524 -0.937500 +v 1.059359 0.949524 -1.187500 +v 0.750000 0.375000 -1.187500 +v 1.191942 0.816942 -0.937500 +v 1.191942 0.816942 -1.187500 +v 0.672335 0.562500 -0.937500 +v 0.672335 0.562500 -1.187500 +v 0.000000 0.562500 0.937500 +v 0.000000 0.562500 1.187500 +v -0.750000 0.375000 0.937500 +v 0.000000 0.375000 0.937500 +v 0.000000 0.375000 1.187500 +v -1.059359 0.949524 0.937500 +v -1.059359 0.949524 1.187500 +v -0.750000 0.375000 1.187500 +v -1.191942 0.816942 0.937500 +v -1.191942 0.816942 1.187500 +v -0.672335 0.562500 0.937500 +v -0.672335 0.562500 1.187500 +v 0.750000 0.375000 0.937500 +v 1.059359 0.949524 0.937500 +v 1.059359 0.949524 1.187500 +v 0.750000 0.375000 1.187500 +v 1.191942 0.816942 0.937500 +v 1.191942 0.816942 1.187500 +v 0.672335 0.562500 0.937500 +v 0.672335 0.562500 1.187500 +vt 0.812500 0.656250 +vt 0.812500 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.656250 +vt 0.968750 0.656250 +vt 0.968750 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.656250 +vt 0.968750 0.656250 +vt 0.968750 1.000000 +vt 0.500000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.656250 +vt 0.500000 0.656250 +vt 0.500000 0.500000 +vt 0.812500 0.656250 +vt 0.500000 0.656250 +vt 0.500000 1.000000 +vt 0.812500 1.000000 +vt 0.968750 0.656250 +vt 0.812500 0.656250 +vt 0.812500 1.000000 +vt 0.968750 1.000000 +vt 0.968750 0.656250 +vt 0.968750 1.000000 +vt 0.812500 0.500000 +vt 0.500000 0.500000 +vt 0.812500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.656250 +vt 0.812500 0.656250 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.187500 0.000000 +vt 0.187500 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.187500 +vt 0.000000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.500000 +vt -0.000000 0.187500 +vt 0.187500 0.000000 +vt 0.500000 -0.000000 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.375000 0.937500 +vt 0.375000 0.687500 +vt 0.500000 0.687500 +vt 0.500000 0.937500 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 1.000000 0.375000 +vt 1.000000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.000000 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.000000 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt -0.000000 0.187500 +vt 0.000000 0.500000 +vt 0.500000 -0.000000 +vt 0.187500 0.000000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.375000 0.937500 +vt 0.500000 0.937500 +vt 0.500000 0.687500 +vt 0.375000 0.687500 +vt 0.843750 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 1.000000 0.625000 +vt 1.000000 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.000000 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.000000 +vt 0.500000 0.500000 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt -0.000000 0.187500 +vt 0.000000 0.500000 +vt 0.500000 -0.000000 +vt 0.187500 0.000000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.375000 0.937500 +vt 0.500000 0.937500 +vt 0.500000 0.687500 +vt 0.375000 0.687500 +vt 0.843750 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 1.000000 0.625000 +vt 1.000000 0.375000 +vt 0.843750 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.375000 +vt 0.843750 0.375000 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.656250 +vt 1.000000 0.625000 +vt 0.875000 0.625000 +vt 0.875000 0.656250 +vt 0.500000 0.187500 +vt 0.187500 0.187500 +vt 0.187500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.187500 0.000000 +vt 0.187500 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.500000 0.187500 +vt 0.000000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.500000 +vt -0.000000 0.187500 +vt 0.187500 0.000000 +vt 0.500000 -0.000000 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.375000 0.937500 +vt 0.375000 0.687500 +vt 0.500000 0.687500 +vt 0.500000 0.937500 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 1.000000 0.375000 +vt 1.000000 0.625000 +vt 0.843750 0.625000 +vt 0.843750 0.375000 +vt 0.875000 0.375000 +vt 0.875000 0.625000 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 1.000000 0.656250 +vt 0.875000 0.656250 +vt 0.875000 0.625000 +vt 1.000000 0.625000 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.250000 +vt 0.750000 0.250000 +vt 0.812500 0.000000 +vt 0.812500 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.500000 0.000000 +vt 0.500000 0.000000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.812500 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.812500 0.000000 +vt 0.750000 0.500000 +vt 0.750000 0.250000 +vt 0.500000 0.250000 +vt 0.500000 0.500000 +vt 0.812500 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.812500 0.250000 +vt 0.656250 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.500000 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.812500 0.250000 +vt 0.812500 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.750000 0.500000 +vt 0.750000 0.250000 +vt 0.500000 0.250000 +vt 0.500000 0.500000 +vt 0.812500 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.812500 0.250000 +vt 0.656250 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.500000 0.000000 +vt 0.500000 0.250000 +vt 0.656250 0.250000 +vt 0.812500 0.250000 +vt 0.812500 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.750000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.250000 +vt 0.750000 0.250000 +vt 0.812500 0.000000 +vt 0.812500 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.656250 0.000000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.500000 0.000000 +vt 0.500000 0.000000 +vt 0.656250 0.250000 +vt 0.500000 0.250000 +vt 0.812500 0.250000 +vt 0.656250 0.250000 +vt 0.656250 0.000000 +vt 0.812500 0.000000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.375000 +vt 0.718750 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.718750 0.468750 +vt 0.718750 0.375000 +vt 0.812500 0.468750 +vt 0.812500 0.375000 +vt 0.375000 0.125000 +vt 0.375000 0.000000 +vt -0.000000 0.000000 +vt 0.000000 0.125000 +vt 0.000000 0.218750 +vt 0.336167 0.218750 +vt 0.336167 0.000000 +vt 0.336167 0.125000 +vt 0.000000 0.125000 +vt -0.000000 0.000000 +vt 0.375000 0.125000 +vt 0.336167 0.218750 +vt 0.000000 0.218750 +vt 0.000000 0.125000 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.687500 0.218750 +vt 0.413832 0.218750 +vt 0.687500 0.125000 +vt 0.413833 0.218750 +vt 0.687500 0.218750 +vt 0.413833 0.125000 +vt 0.413832 0.000000 +vt 0.687500 0.000000 +vt 0.687500 0.125000 +vt 0.375000 0.125000 +vt 0.375000 0.000000 +vt 0.336167 0.218750 +vt 0.336167 0.000000 +vt 0.336167 0.125000 +vt 0.375000 0.125000 +vt 0.336167 0.218750 +vt 0.687500 0.000000 +vt 0.687500 0.125000 +vt 0.687500 0.218750 +vt 0.687500 0.125000 +vt 0.413832 0.218750 +vt 0.687500 0.218750 +vt 0.413833 0.218750 +vt 0.413833 0.125000 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.413832 0.000000 +vt 0.375000 0.125000 +vt 0.000000 0.125000 +vt -0.000000 0.000000 +vt 0.375000 0.000000 +vt 0.000000 0.218750 +vt 0.336167 0.218750 +vt 0.336167 0.000000 +vt -0.000000 0.000000 +vt 0.000000 0.125000 +vt 0.336167 0.125000 +vt 0.375000 0.125000 +vt 0.000000 0.125000 +vt 0.000000 0.218750 +vt 0.336167 0.218750 +vt 0.687500 0.000000 +vt 0.687500 0.125000 +vt 0.687500 0.218750 +vt 0.687500 0.125000 +vt 0.413832 0.218750 +vt 0.687500 0.218750 +vt 0.413833 0.218750 +vt 0.413833 0.125000 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.413832 0.000000 +vt 0.375000 0.125000 +vt 0.375000 0.000000 +vt 0.336167 0.218750 +vt 0.336167 0.000000 +vt 0.336167 0.125000 +vt 0.375000 0.125000 +vt 0.336167 0.218750 +vt 0.687500 0.125000 +vt 0.687500 0.000000 +vt 0.687500 0.218750 +vt 0.413832 0.218750 +vt 0.687500 0.125000 +vt 0.413833 0.218750 +vt 0.687500 0.218750 +vt 0.413833 0.125000 +vt 0.413832 0.000000 +vt 0.687500 0.000000 +vt 0.687500 0.125000 +vt 0.687500 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.562500 +vt 0.687500 0.562500 +vt 0.312500 0.312500 +vt 0.312500 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.687500 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.562500 +vt 0.687500 0.562500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.312500 0.562500 +vt 0.312500 0.312500 +vt 0.000000 0.562500 +vt 0.437500 0.562500 +vt 0.437500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.562500 +vt 0.000000 0.562500 +vt 1.000000 0.687500 +vt 1.000000 1.000000 +vt 0.687500 1.000000 +vt 0.687500 0.687500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.562500 +vt 0.000000 0.562500 +vt 1.000000 0.687500 +vt 1.000000 1.000000 +vt 0.687500 1.000000 +vt 0.687500 0.687500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.562500 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.562500 +vt 0.000000 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.968750 0.562500 +vt 0.968750 0.687500 +vt 0.718750 0.687500 +vt 0.718750 0.562500 +vt 0.718750 0.718750 +vt 0.968750 0.718750 +vt 0.968750 0.968750 +vt 0.718750 0.968750 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.906250 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.562500 +vt 0.906250 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.906250 0.562500 +vt 0.906250 0.312500 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.750000 0.562500 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.812500 0.562500 +vt 0.906250 0.312500 +vt 0.906250 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.562500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.312500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.312500 0.312500 +vt 0.625000 -0.000000 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.312500 +vt 0.625000 0.312500 +vt 0.625000 0.000000 +vt 0.625000 -0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.625000 0.000000 +vt 0.625000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.000000 +vt 0.625000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.312500 +vt 0.343750 0.031250 +vt 0.593750 0.031250 +vt 0.593750 0.281250 +vt 0.343750 0.281250 +vt 0.343750 0.031250 +vt 0.343750 0.281250 +vt 0.593750 0.281250 +vt 0.593750 0.031250 +vt 0.343750 0.031250 +vt 0.343750 0.281250 +vt 0.593750 0.281250 +vt 0.593750 0.031250 +vt 0.343750 0.031250 +vt 0.593750 0.031250 +vt 0.593750 0.281250 +vt 0.343750 0.281250 +vt 0.312500 0.187500 +vt 0.312500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.187500 +vt 0.687500 0.187500 +vt 0.875000 0.187500 +vt 0.875000 1.000000 +vt 0.687500 1.000000 +vt 0.312500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.187500 +vt 0.312500 0.187500 +vt 0.687500 1.000000 +vt 0.687500 0.187500 +vt 0.875000 0.187500 +vt 0.875000 1.000000 +vt 0.312500 0.000000 +vt 0.125000 0.000000 +vt 0.125000 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.000000 +vt 0.125000 0.000000 +vt 0.125000 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 0.000000 +vt 0.125000 1.000000 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 0.000000 +vt 0.312500 0.187500 +vt 0.125000 0.187500 +vt 0.125000 1.000000 +vt 0.312500 1.000000 +vt 0.687500 0.187500 +vt 0.687500 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.187500 +vt 0.312500 1.000000 +vt 0.312500 0.187500 +vt 0.125000 0.187500 +vt 0.125000 1.000000 +vt 0.687500 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.187500 +vt 0.687500 0.187500 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.000000 +vt 0.312500 0.000000 +vt 0.125000 1.000000 +vt 0.125000 0.000000 +vt 0.312500 1.000000 +vt 0.312500 0.000000 +vt 0.125000 0.000000 +vt 0.312500 1.000000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.7071 -0.7071 0.0000 +vn -0.7071 0.7071 0.0000 +vn 0.0000 0.9239 -0.3827 +vn 0.0000 0.9239 0.3827 +vn 0.0000 -0.9239 0.3827 +vn 0.0000 -0.9239 -0.3827 +vn 0.0000 -0.3827 -0.9239 +vn 0.0000 0.3827 0.9239 +vn 0.0000 -0.3827 0.9239 +vn 0.0000 0.3827 -0.9239 +usemtl Bogey_Piston +s off +f 621/1693/46 622/1694/46 624/1695/46 623/1696/46 +f 623/1697/47 624/1698/47 628/1699/47 627/1700/47 +f 625/1701/48 626/1702/48 622/1694/48 621/1693/48 +f 623/1696/49 627/1703/49 625/1704/49 621/1693/49 +f 628/1705/50 624/1706/50 622/1707/50 626/1708/50 +f 629/1709/51 631/1710/51 632/1711/51 630/1712/51 +f 631/1713/47 635/1714/47 636/1715/47 632/1716/47 +f 633/1717/48 629/1709/48 630/1712/48 634/1718/48 +f 631/1710/49 629/1709/49 633/1719/49 635/1720/49 +f 636/1721/50 634/1722/50 630/1723/50 632/1724/50 +f 637/1725/46 638/1726/46 640/1727/46 639/1728/46 +f 639/1729/47 640/1730/47 644/1731/47 643/1732/47 +f 643/1733/51 644/1734/51 642/1735/51 641/1736/51 +f 639/1737/49 643/1738/49 641/1739/49 637/1740/49 +f 644/1734/50 640/1741/50 638/1742/50 642/1735/50 +f 641/1736/48 642/1735/48 638/1743/48 637/1744/48 +f 650/1745/49 646/1746/49 648/1747/49 652/1748/49 +f 650/1749/48 649/1750/48 645/1751/48 646/1752/48 +f 652/1753/51 651/1754/51 649/1755/51 650/1745/51 +f 645/1756/50 649/1757/50 651/1758/50 647/1759/50 +f 646/1760/46 645/1761/46 647/1762/46 648/1763/46 +f 653/1764/46 654/1765/46 656/1766/46 655/1767/46 +f 655/1767/48 656/1766/48 660/1768/48 659/1769/48 +f 659/1770/51 660/1771/51 658/1772/51 657/1773/51 +f 655/1767/50 659/1769/50 657/1774/50 653/1775/50 +f 660/1776/49 656/1777/49 654/1778/49 658/1779/49 +f 661/1780/51 663/1781/51 664/1782/51 662/1783/51 +f 663/1784/47 667/1785/47 668/1786/47 664/1787/47 +f 667/1788/46 665/1789/46 666/1790/46 668/1791/46 +f 663/1792/49 661/1793/49 665/1794/49 667/1795/49 +f 668/1791/50 666/1790/50 662/1796/50 664/1797/50 +f 665/1789/48 661/1798/48 662/1799/48 666/1790/48 +f 674/1800/49 676/1801/49 672/1802/49 670/1803/49 +f 674/1804/48 670/1805/48 669/1806/48 673/1807/48 +f 676/1808/46 674/1800/46 673/1809/46 675/1810/46 +f 669/1811/50 671/1812/50 675/1813/50 673/1814/50 +f 670/1815/51 672/1816/51 671/1817/51 669/1818/51 +f 677/1819/51 679/1820/51 680/1821/51 678/1822/51 +f 679/1820/48 683/1823/48 684/1824/48 680/1821/48 +f 683/1825/46 681/1826/46 682/1827/46 684/1828/46 +f 679/1820/50 677/1829/50 681/1830/50 683/1823/50 +f 684/1831/49 682/1832/49 678/1833/49 680/1834/49 +f 685/1835/46 687/1836/46 688/1837/46 686/1838/46 +f 687/1839/48 691/1840/48 692/1841/48 688/1842/48 +f 691/1843/51 689/1844/51 690/1845/51 692/1846/51 +f 687/1847/49 685/1848/49 689/1849/49 691/1850/49 +f 692/1846/50 690/1845/50 686/1851/50 688/1852/50 +f 689/1844/47 685/1853/47 686/1854/47 690/1845/47 +f 698/1855/49 700/1856/49 696/1857/49 694/1858/49 +f 698/1859/47 694/1860/47 693/1861/47 697/1862/47 +f 700/1863/51 698/1855/51 697/1864/51 699/1865/51 +f 693/1866/50 695/1867/50 699/1868/50 697/1869/50 +f 694/1870/46 696/1871/46 695/1872/46 693/1873/46 +f 701/1874/46 703/1875/46 704/1876/46 702/1877/46 +f 703/1875/47 707/1878/47 708/1879/47 704/1876/47 +f 707/1880/51 705/1881/51 706/1882/51 708/1883/51 +f 703/1875/50 701/1884/50 705/1885/50 707/1878/50 +f 708/1886/49 706/1887/49 702/1888/49 704/1889/49 +f 709/1890/51 710/1891/51 712/1892/51 711/1893/51 +f 711/1894/48 712/1895/48 716/1896/48 715/1897/48 +f 715/1898/46 716/1899/46 714/1900/46 713/1901/46 +f 711/1902/49 715/1903/49 713/1904/49 709/1905/49 +f 716/1899/50 712/1906/50 710/1907/50 714/1900/50 +f 713/1901/47 714/1900/47 710/1908/47 709/1909/47 +f 722/1910/49 718/1911/49 720/1912/49 724/1913/49 +f 722/1914/47 721/1915/47 717/1916/47 718/1917/47 +f 724/1918/46 723/1919/46 721/1920/46 722/1910/46 +f 717/1921/50 721/1922/50 723/1923/50 719/1924/50 +f 718/1925/51 717/1926/51 719/1927/51 720/1928/51 +f 725/1929/51 726/1930/51 728/1931/51 727/1932/51 +f 727/1932/47 728/1931/47 732/1933/47 731/1934/47 +f 731/1935/46 732/1936/46 730/1937/46 729/1938/46 +f 727/1932/50 731/1934/50 729/1939/50 725/1940/50 +f 732/1941/49 728/1942/49 726/1943/49 730/1944/49 +f 821/1945/51 822/1946/51 824/1947/51 823/1948/51 +f 823/1949/48 824/1950/48 828/1951/48 827/1952/48 +f 825/1953/47 826/1954/47 822/1955/47 821/1956/47 +f 823/1957/49 827/1952/49 825/1958/49 821/1959/49 +f 828/1960/50 824/1961/50 822/1962/50 826/1963/50 +f 829/1964/46 831/1965/46 832/1966/46 830/1967/46 +f 831/1968/48 835/1969/48 836/1970/48 832/1971/48 +f 833/1972/47 829/1973/47 830/1974/47 834/1975/47 +f 831/1976/49 829/1977/49 833/1978/49 835/1969/49 +f 836/1979/50 834/1980/50 830/1981/50 832/1982/50 +f 837/1983/51 839/1984/51 840/1985/51 838/1986/51 +f 839/1987/47 843/1988/47 844/1989/47 840/1990/47 +f 841/1991/48 837/1992/48 838/1993/48 842/1994/48 +f 839/1995/49 837/1996/49 841/1997/49 843/1988/49 +f 844/1998/50 842/1999/50 838/2000/50 840/2001/50 +f 845/2002/46 846/2003/46 848/2004/46 847/2005/46 +f 847/2006/47 848/2007/47 852/2008/47 851/2009/47 +f 849/2010/48 850/2011/48 846/2012/48 845/2013/48 +f 847/2014/49 851/2009/49 849/2015/49 845/2016/49 +f 852/2017/50 848/2018/50 846/2019/50 850/2020/50 +usemtl wheel_Large +f 797/2021/46 798/2022/46 800/2023/46 799/2024/46 +f 799/2025/47 800/2026/47 804/2027/47 803/2028/47 +f 803/2029/51 804/2030/51 802/2031/51 801/2032/51 +f 801/2033/48 802/2034/48 798/2035/48 797/2036/48 +f 804/2037/50 800/2038/50 798/2039/50 802/2034/50 +f 813/2040/46 815/2041/46 816/2042/46 814/2043/46 +f 815/2044/48 819/2045/48 820/2046/48 816/2047/48 +f 819/2048/51 817/2049/51 818/2050/51 820/2051/51 +f 817/2052/47 813/2053/47 814/2054/47 818/2055/47 +f 820/2056/50 818/2055/50 814/2057/50 816/2058/50 +f 911/2059/49 916/2060/49 913/2061/49 912/2062/49 +f 909/2063/48 919/2064/48 911/2059/48 912/2062/48 +f 920/2065/50 919/2066/50 909/2067/50 910/2068/50 +f 916/2069/47 920/2070/47 910/2071/47 913/2072/47 +f 911/2059/52 917/2073/52 918/2074/52 916/2060/52 +f 915/2075/47 920/2076/47 916/2069/47 918/2077/47 +f 911/2059/48 919/2078/48 914/2079/48 917/2073/48 +f 919/2080/53 920/2081/53 915/2082/53 914/2083/53 +f 921/2084/49 912/2062/49 913/2061/49 924/2085/49 +f 909/2063/48 912/2062/48 921/2084/48 927/2086/48 +f 928/2087/50 910/2068/50 909/2067/50 927/2088/50 +f 924/2089/47 913/2072/47 910/2071/47 928/2090/47 +f 921/2084/54 924/2085/54 926/2091/54 925/2092/54 +f 923/2093/47 926/2094/47 924/2089/47 928/2095/47 +f 921/2084/48 925/2092/48 922/2096/48 927/2097/48 +f 927/2098/55 922/2099/55 923/2100/55 928/2101/55 +f 931/2102/49 932/2103/49 933/2104/49 936/2105/49 +f 929/2106/47 932/2103/47 931/2102/47 939/2107/47 +f 940/2108/50 930/2109/50 929/2110/50 939/2111/50 +f 936/2112/48 933/2113/48 930/2114/48 940/2115/48 +f 931/2102/52 936/2105/52 938/2116/52 937/2117/52 +f 935/2118/48 938/2119/48 936/2112/48 940/2120/48 +f 931/2102/47 937/2117/47 934/2121/47 939/2122/47 +f 939/2123/53 934/2124/53 935/2125/53 940/2126/53 +f 941/2127/49 944/2128/49 933/2104/49 932/2103/49 +f 929/2106/47 947/2129/47 941/2127/47 932/2103/47 +f 948/2130/50 947/2131/50 929/2110/50 930/2109/50 +f 944/2132/48 948/2133/48 930/2114/48 933/2113/48 +f 941/2127/54 945/2134/54 946/2135/54 944/2128/54 +f 943/2136/48 948/2137/48 944/2132/48 946/2138/48 +f 941/2127/47 947/2139/47 942/2140/47 945/2134/47 +f 947/2141/55 948/2142/55 943/2143/55 942/2144/55 +usemtl Bogey_Body +f 733/2145/46 734/2146/46 736/2147/46 735/2148/46 +f 735/2149/47 736/2150/47 740/2151/47 739/2152/47 +f 739/2153/51 740/2154/51 738/2155/51 737/2156/51 +f 737/2157/48 738/2158/48 734/2159/48 733/2160/48 +f 735/2161/49 739/2162/49 737/2163/49 733/2164/49 +f 740/2154/50 736/2165/50 734/2166/50 738/2155/50 +f 741/2167/46 742/2168/46 744/2169/46 743/2170/46 +f 743/2171/47 744/2172/47 748/2173/47 747/2174/47 +f 747/2175/51 748/2176/51 746/2177/51 745/2178/51 +f 745/2179/48 746/2180/48 742/2181/48 741/2182/48 +f 743/2183/49 747/2184/49 745/2185/49 741/2186/49 +f 748/2187/50 744/2188/50 742/2189/50 746/2190/50 +f 749/2191/46 750/2192/46 752/2193/46 751/2194/46 +f 751/2195/47 752/2196/47 756/2197/47 755/2198/47 +f 755/2199/51 756/2200/51 754/2201/51 753/2202/51 +f 753/2203/48 754/2204/48 750/2205/48 749/2206/48 +f 756/2207/50 752/2208/50 750/2209/50 754/2210/50 +f 758/2211/47 762/2212/47 763/2213/47 760/2214/47 +f 760/2214/54 763/2213/54 764/2215/54 759/2216/54 +f 759/2217/48 764/2218/48 761/2219/48 757/2220/48 +f 766/2221/47 768/2222/47 771/2223/47 770/2224/47 +f 768/2222/52 767/2225/52 772/2226/52 771/2223/52 +f 767/2227/48 765/2228/48 769/2229/48 772/2230/48 +f 774/2231/48 776/2232/48 779/2233/48 778/2234/48 +f 776/2232/54 775/2235/54 780/2236/54 779/2233/54 +f 775/2237/47 773/2238/47 777/2239/47 780/2240/47 +f 782/2241/48 786/2242/48 787/2243/48 784/2244/48 +f 784/2244/52 787/2243/52 788/2245/52 783/2246/52 +f 783/2247/47 788/2248/47 785/2249/47 781/2250/47 +f 789/2251/51 790/2252/51 792/2253/51 791/2254/51 +f 791/2255/48 792/2256/48 796/2257/48 795/2258/48 +f 795/2259/46 796/2260/46 794/2261/46 793/2262/46 +f 793/2263/47 794/2261/47 790/2264/47 789/2265/47 +f 791/2266/49 795/2267/49 793/2268/49 789/2269/49 +f 796/2257/50 792/2270/50 790/2271/50 794/2272/50 +f 805/2273/51 807/2274/51 808/2275/51 806/2276/51 +f 807/2277/47 811/2278/47 812/2279/47 808/2280/47 +f 811/2281/46 809/2282/46 810/2283/46 812/2284/46 +f 809/2285/48 805/2286/48 806/2287/48 810/2283/48 +f 807/2288/49 805/2289/49 809/2290/49 811/2291/49 +f 812/2279/50 810/2292/50 806/2293/50 808/2294/50 +f 827/2295/46 828/2296/46 826/2297/46 825/2298/46 +f 835/2299/51 833/2300/51 834/2301/51 836/2302/51 +f 843/2303/46 841/2304/46 842/2305/46 844/2306/46 +f 851/2307/51 852/2308/51 850/2309/51 849/2310/51 +usemtl Belts +f 853/2311/56 855/2312/56 856/2313/56 854/2314/56 +f 857/2315/56 858/2316/56 860/2317/56 859/2318/56 +f 861/2319/57 862/2320/57 864/2321/57 863/2322/57 +f 865/2323/57 867/2324/57 868/2325/57 866/2326/57 +f 873/2327/50 874/2328/50 872/2329/50 871/2330/50 +f 869/2331/50 870/2332/50 874/2333/50 873/2334/50 +f 879/2335/50 877/2336/50 878/2337/50 880/2338/50 +f 875/2339/50 879/2340/50 880/2338/50 876/2341/50 +f 881/2342/58 882/2343/58 884/2344/58 883/2345/58 +f 885/2346/58 887/2347/58 888/2348/58 886/2349/58 +f 889/2350/59 891/2351/59 892/2352/59 890/2353/59 +f 893/2354/59 894/2355/59 896/2356/59 895/2357/59 +f 901/2358/49 899/2359/49 900/2360/49 902/2361/49 +f 897/2362/49 901/2363/49 902/2364/49 898/2365/49 +f 907/2366/49 908/2367/49 906/2368/49 905/2369/49 +f 903/2370/49 904/2371/49 908/2367/49 907/2372/49 +f 853/2311/60 854/2314/60 882/2343/60 881/2342/60 +f 856/2313/61 855/2312/61 883/2345/61 884/2344/61 +f 854/2314/51 856/2313/51 884/2344/51 882/2343/51 +f 855/2312/46 853/2311/46 881/2342/46 883/2345/46 +f 858/2316/60 857/2315/60 885/2346/60 886/2349/60 +f 859/2318/61 860/2317/61 888/2348/61 887/2347/61 +f 860/2317/46 858/2316/46 886/2349/46 888/2348/46 +f 857/2315/51 859/2318/51 887/2347/51 885/2346/51 +f 862/2320/62 861/2319/62 889/2350/62 890/2353/62 +f 863/2322/63 864/2321/63 892/2352/63 891/2351/63 +f 864/2321/51 862/2320/51 890/2353/51 892/2352/51 +f 861/2319/46 863/2322/46 891/2351/46 889/2350/46 +f 865/2323/62 866/2326/62 894/2355/62 893/2354/62 +f 868/2325/63 867/2324/63 895/2357/63 896/2356/63 +f 866/2326/46 868/2325/46 896/2356/46 894/2355/46 +f 867/2324/51 865/2323/51 893/2354/51 895/2357/51 +f 869/2331/46 873/2334/46 901/2363/46 897/2362/46 +f 870/2332/48 869/2331/48 897/2362/48 898/2365/48 +f 872/2329/51 874/2328/51 902/2361/51 900/2360/51 +f 871/2330/47 872/2329/47 900/2360/47 899/2359/47 +f 873/2327/46 871/2330/46 899/2359/46 901/2358/46 +f 874/2333/51 870/2332/51 898/2365/51 902/2364/51 +f 879/2340/51 875/2339/51 903/2370/51 907/2372/51 +f 875/2339/48 876/2341/48 904/2371/48 903/2370/48 +f 880/2338/46 878/2337/46 906/2368/46 908/2367/46 +f 878/2337/47 877/2336/47 905/2369/47 906/2368/47 +f 877/2336/51 879/2335/51 907/2366/51 905/2369/51 +f 876/2341/46 880/2338/46 908/2367/46 904/2371/46 +o Cube.051_Cube.043 +v -3.500000 18.500000 3.500000 +v -3.500000 21.500000 3.500000 +v -3.500000 18.500000 -3.500000 +v -3.500000 21.500000 -3.500000 +v 3.500000 18.500000 3.500000 +v 3.500000 21.500000 3.500000 +v 3.500000 18.500000 -3.500000 +v 3.500000 21.500000 -3.500000 +v -2.500000 17.499998 -2.500000 +v -2.500000 22.499998 -2.500000 +v -2.500000 17.499998 -4.500000 +v -2.500000 22.499998 -4.500000 +v 2.500000 17.499998 -2.500000 +v 2.500000 22.499998 -2.500000 +v 2.500000 17.499998 -4.500000 +v 2.500000 22.499998 -4.500000 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.000000 +vt 0.906250 0.000000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.531250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.375000 +vt 0.531250 0.375000 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.531250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.375000 +vt 0.531250 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +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 +usemtl wheel_Large +s off +f 949/2373/64 950/2374/64 952/2375/64 951/2376/64 +f 951/2377/65 952/2378/65 956/2379/65 955/2380/65 +f 955/2381/66 956/2382/66 954/2383/66 953/2384/66 +f 953/2385/67 954/2386/67 950/2387/67 949/2388/67 +f 951/2389/68 955/2390/68 953/2391/68 949/2392/68 +f 956/2393/69 952/2394/69 950/2387/69 954/2386/69 +f 957/2395/64 958/2396/64 960/2397/64 959/2398/64 +f 959/2399/65 960/2400/65 964/2401/65 963/2402/65 +f 963/2403/66 964/2404/66 962/2405/66 961/2406/66 +f 961/2407/67 962/2408/67 958/2409/67 957/2410/67 +f 959/2411/68 963/2412/68 961/2413/68 957/2414/68 +f 964/2415/69 960/2416/69 958/2417/69 962/2418/69 +o Cube.052_Cube.044 +v -1.500000 21.499998 -4.500000 +v 1.500000 21.499998 -4.500000 +v 1.500000 21.499998 -8.500000 +v 1.500000 18.499998 -8.500000 +v -1.500000 18.499998 -8.500000 +v -1.500000 18.499998 -4.500000 +v 1.500000 18.499998 -4.500000 +v -1.500000 21.499998 -8.500000 +v -2.000000 17.999998 -5.500000 +v -2.000000 21.999998 -5.500000 +v 2.000000 21.999998 -7.500000 +v -2.000000 17.999998 -7.500000 +v 2.000000 17.999998 -5.500000 +v 2.000000 21.999998 -5.500000 +v 2.000000 17.999998 -7.500000 +v -2.000000 21.999998 -7.500000 +v -1.500000 21.499998 -8.500000 +v 1.500000 21.499998 -8.500000 +v 1.500000 21.499998 -12.500000 +v 1.500000 18.499998 -12.500000 +v -1.500000 18.499998 -12.500000 +v -1.500000 18.499998 -8.500000 +v 1.500000 18.499998 -8.500000 +v -1.500000 21.499998 -12.500000 +v -2.000000 17.999998 -9.500000 +v -2.000000 21.999998 -9.500000 +v 2.000000 21.999998 -11.500000 +v -2.000000 17.999998 -11.500000 +v 2.000000 17.999998 -9.500000 +v 2.000000 21.999998 -9.500000 +v 2.000000 17.999998 -11.500000 +v -2.000000 21.999998 -11.500000 +v -1.500000 21.499998 -12.500000 +v 1.500000 21.499998 -12.500000 +v 1.500000 21.499998 -16.500000 +v 1.500000 18.499998 -16.500000 +v -1.500000 18.499998 -16.500000 +v -1.500000 18.499998 -12.500000 +v 1.500000 18.499998 -12.500000 +v -1.500000 21.499998 -16.500000 +v -2.000000 17.999998 -13.500000 +v -2.000000 21.999998 -13.500000 +v 2.000000 21.999998 -15.500000 +v -2.000000 17.999998 -15.500000 +v 2.000000 17.999998 -13.500000 +v 2.000000 21.999998 -13.500000 +v 2.000000 17.999998 -15.500000 +v -2.000000 21.999998 -15.500000 +v -1.500000 21.499998 -16.500000 +v 1.500000 21.499998 -16.500000 +v 1.500000 21.499998 -20.500000 +v 1.500000 18.499998 -20.500000 +v -1.500000 18.499998 -20.500000 +v -1.500000 18.499998 -16.500000 +v 1.500000 18.499998 -16.500000 +v -1.500000 21.499998 -20.500000 +v -2.000000 17.999998 -17.500000 +v -2.000000 21.999998 -17.500000 +v 2.000000 21.999998 -19.500000 +v -2.000000 17.999998 -19.500000 +v 2.000000 17.999998 -17.500000 +v 2.000000 21.999998 -17.500000 +v 2.000000 17.999998 -19.500000 +v -2.000000 21.999998 -19.500000 +v -1.500000 21.499998 -20.500000 +v 1.500000 21.499998 -20.500000 +v 1.500000 21.499998 -24.500000 +v 1.500000 18.499998 -24.500000 +v -1.500000 18.499998 -24.500000 +v -1.500000 18.499998 -20.500000 +v 1.500000 18.499998 -20.500000 +v -1.500000 21.499998 -24.500000 +v -2.000000 17.999998 -21.500000 +v -2.000000 21.999998 -21.500000 +v 2.000000 21.999998 -23.500000 +v -2.000000 17.999998 -23.500000 +v 2.000000 17.999998 -21.500000 +v 2.000000 21.999998 -21.500000 +v 2.000000 17.999998 -23.500000 +v -2.000000 21.999998 -23.500000 +v -1.500000 21.499998 -24.500000 +v 1.500000 21.499998 -24.500000 +v 1.500000 21.499998 -28.500000 +v 1.500000 18.499998 -28.500000 +v -1.500000 18.499998 -28.500000 +v -1.500000 18.499998 -24.500000 +v 1.500000 18.499998 -24.500000 +v -1.500000 21.499998 -28.500000 +v -2.000000 17.999998 -25.500000 +v -2.000000 21.999998 -25.500000 +v 2.000000 21.999998 -27.500000 +v -2.000000 17.999998 -27.500000 +v 2.000000 17.999998 -25.500000 +v 2.000000 21.999998 -25.500000 +v 2.000000 17.999998 -27.500000 +v -2.000000 21.999998 -27.500000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.000000 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.250000 +vt 0.187500 0.250000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +usemtl wheel_Large +s off +f 970/2419/70 965/2420/70 972/2421/70 969/2422/70 +f 966/2423/71 965/2420/71 972/2421/71 967/2424/71 +f 970/2419/72 971/2425/72 968/2426/72 969/2422/72 +f 966/2423/73 971/2425/73 968/2426/73 967/2424/73 +f 973/2427/70 974/2428/70 980/2429/70 976/2430/70 +f 978/2431/71 974/2428/71 980/2429/71 975/2432/71 +f 973/2427/72 977/2433/72 979/2434/72 976/2430/72 +f 978/2431/73 977/2433/73 979/2434/73 975/2432/73 +f 986/2435/70 981/2436/70 988/2437/70 985/2438/70 +f 982/2439/71 981/2436/71 988/2437/71 983/2440/71 +f 986/2435/72 987/2441/72 984/2442/72 985/2438/72 +f 982/2439/73 987/2441/73 984/2442/73 983/2440/73 +f 989/2443/70 990/2444/70 996/2445/70 992/2446/70 +f 994/2447/71 990/2444/71 996/2445/71 991/2448/71 +f 989/2443/72 993/2449/72 995/2450/72 992/2446/72 +f 994/2447/73 993/2449/73 995/2450/73 991/2448/73 +f 1002/2451/70 997/2452/70 1004/2453/70 1001/2454/70 +f 998/2455/71 997/2452/71 1004/2453/71 999/2456/71 +f 1002/2451/72 1003/2457/72 1000/2458/72 1001/2454/72 +f 998/2455/73 1003/2457/73 1000/2458/73 999/2456/73 +f 1005/2459/70 1006/2460/70 1012/2461/70 1008/2462/70 +f 1010/2463/71 1006/2460/71 1012/2461/71 1007/2464/71 +f 1005/2459/72 1009/2465/72 1011/2466/72 1008/2462/72 +f 1010/2463/73 1009/2465/73 1011/2466/73 1007/2464/73 +f 1018/2467/70 1013/2468/70 1020/2469/70 1017/2470/70 +f 1014/2471/71 1013/2468/71 1020/2469/71 1015/2472/71 +f 1018/2467/72 1019/2473/72 1016/2474/72 1017/2470/72 +f 1014/2471/73 1019/2473/73 1016/2474/73 1015/2472/73 +f 1021/2475/70 1022/2476/70 1028/2477/70 1024/2478/70 +f 1026/2479/71 1022/2476/71 1028/2477/71 1023/2480/71 +f 1021/2475/72 1025/2481/72 1027/2482/72 1024/2478/72 +f 1026/2479/73 1025/2481/73 1027/2482/73 1023/2480/73 +f 1034/2483/70 1029/2484/70 1036/2485/70 1033/2486/70 +f 1030/2487/71 1029/2484/71 1036/2485/71 1031/2488/71 +f 1034/2483/72 1035/2489/72 1032/2490/72 1033/2486/72 +f 1030/2487/73 1035/2489/73 1032/2490/73 1031/2488/73 +f 1037/2491/70 1038/2492/70 1044/2493/70 1040/2494/70 +f 1042/2495/71 1038/2492/71 1044/2493/71 1039/2496/71 +f 1037/2491/72 1041/2497/72 1043/2498/72 1040/2494/72 +f 1042/2495/73 1041/2497/73 1043/2498/73 1039/2496/73 +f 1050/2499/70 1045/2500/70 1052/2501/70 1049/2502/70 +f 1046/2503/71 1045/2500/71 1052/2501/71 1047/2504/71 +f 1050/2499/72 1051/2505/72 1048/2506/72 1049/2502/72 +f 1046/2503/73 1051/2505/73 1048/2506/73 1047/2504/73 +f 1053/2507/70 1054/2508/70 1060/2509/70 1056/2510/70 +f 1058/2511/71 1054/2508/71 1060/2509/71 1055/2512/71 +f 1053/2507/72 1057/2513/72 1059/2514/72 1056/2510/72 +f 1058/2511/73 1057/2513/73 1059/2514/73 1055/2512/73 +o Cube.053_Cube.043 +v 3.500001 18.500000 -35.500000 +v 3.500001 21.500000 -35.500000 +v 3.499999 18.500000 -28.499998 +v 3.499999 21.500000 -28.499998 +v -3.499999 18.500000 -35.500000 +v -3.499999 21.500000 -35.500000 +v -3.500001 18.500000 -28.500002 +v -3.500001 21.500000 -28.500002 +v 2.499999 17.499998 -29.500000 +v 2.499999 22.499998 -29.500000 +v 2.499998 17.499998 -27.500000 +v 2.499998 22.499998 -27.500000 +v -2.500000 17.499998 -29.500000 +v -2.500000 22.499998 -29.500000 +v -2.500001 17.499998 -27.500002 +v -2.500001 22.499998 -27.500002 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.218750 +vt 0.906250 0.218750 +vt 0.906250 0.312500 +vt 0.687500 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.000000 +vt 0.906250 0.000000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.531250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.375000 +vt 0.531250 0.375000 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.531250 0.218750 +vt 0.687500 0.218750 +vt 0.687500 0.375000 +vt 0.531250 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.875000 0.375000 +vt 0.718750 0.375000 +vt 0.718750 0.312500 +vt 0.875000 0.312500 +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 +usemtl wheel_Large +s off +f 1061/2515/74 1062/2516/74 1064/2517/74 1063/2518/74 +f 1063/2519/75 1064/2520/75 1068/2521/75 1067/2522/75 +f 1067/2523/76 1068/2524/76 1066/2525/76 1065/2526/76 +f 1065/2527/77 1066/2528/77 1062/2529/77 1061/2530/77 +f 1063/2531/78 1067/2532/78 1065/2533/78 1061/2534/78 +f 1068/2535/79 1064/2536/79 1062/2529/79 1066/2528/79 +f 1069/2537/74 1070/2538/74 1072/2539/74 1071/2540/74 +f 1071/2541/75 1072/2542/75 1076/2543/75 1075/2544/75 +f 1075/2545/76 1076/2546/76 1074/2547/76 1073/2548/76 +f 1073/2549/77 1074/2550/77 1070/2551/77 1069/2552/77 +f 1071/2553/78 1075/2554/78 1073/2555/78 1069/2556/78 +f 1076/2557/79 1072/2558/79 1070/2559/79 1074/2560/79 +o Cube.038_Cube.045 +v 1.062500 0.562500 0.000000 +v 0.750000 0.310660 0.750000 +v 0.750000 0.750000 0.000000 +v 0.875000 0.310660 0.750000 +v 0.875000 0.750000 0.310660 +v 0.875000 0.625000 0.258884 +v 0.750000 0.530330 0.530330 +v 0.875000 0.750000 0.000000 +v 1.062500 0.397747 0.397748 +v 0.875000 0.625000 0.000000 +v 0.750000 0.750000 -0.310660 +v 1.062500 0.232995 0.562500 +v 0.875000 0.530330 0.530330 +v 0.875000 0.441942 0.441942 +v 0.750000 0.750000 0.310660 +v 1.062500 0.562500 0.232995 +v 0.875000 -0.310660 0.750000 +v 0.750000 -0.000000 0.750000 +v 1.062500 -0.000000 0.562500 +v 0.875000 -0.258884 0.625000 +v 1.062500 -0.232995 0.562500 +v 0.875000 -0.000000 0.750000 +v 0.875000 -0.000000 0.625000 +v 0.875000 0.258883 0.625000 +v 0.750000 -0.530330 0.530330 +v 1.062500 -0.397748 0.397748 +v 0.875000 -0.530330 0.530330 +v 0.875000 -0.441942 0.441942 +v 0.750000 -0.310660 0.750000 +v 0.750000 -0.750000 0.000000 +v 1.062500 -0.562500 0.000000 +v 1.062500 -0.562500 -0.232995 +v 0.875000 -0.750000 0.000000 +v 0.875000 -0.625000 0.000000 +v 0.875000 -0.750000 0.310660 +v 0.750000 -0.750000 0.310660 +v 0.875000 -0.625000 0.258884 +v 1.062500 -0.562500 0.232995 +v 0.750000 -0.530330 -0.530330 +v 1.062500 -0.397748 -0.397748 +v 0.875000 -0.258884 -0.625000 +v 1.062500 -0.232995 -0.562500 +v 0.875000 -0.530330 -0.530330 +v 0.875000 -0.441942 -0.441942 +v 0.875000 -0.750000 -0.310660 +v 0.750000 -0.750000 -0.310660 +v 0.875000 -0.625000 -0.258883 +v 0.750000 -0.000000 -0.750000 +v 1.062500 -0.000000 -0.562500 +v 0.875000 -0.000000 -0.750000 +v 0.875000 -0.000000 -0.625000 +v 0.875000 -0.310660 -0.750000 +v 0.750000 -0.310660 -0.750000 +v 0.875000 0.750000 -0.310660 +v 0.750000 -0.000000 0.000000 +v 0.750000 0.530330 -0.530330 +v 1.062500 0.397747 -0.397748 +v 0.875000 0.625000 -0.258883 +v 1.062500 0.562500 -0.232995 +v 0.875000 0.530330 -0.530330 +v 0.875000 0.441942 -0.441942 +v 0.875000 0.310660 -0.750000 +v 0.750000 0.310660 -0.750000 +v 0.875000 0.258883 -0.625000 +v 1.062500 0.232995 -0.562500 +v 1.062500 0.258883 0.625000 +v 1.062500 0.441942 0.441942 +v 1.062500 0.625000 0.258883 +v 1.062500 -0.258884 0.625000 +v 1.062500 -0.000000 0.625000 +v 1.062500 -0.625000 -0.258883 +v 1.062500 -0.625000 0.000000 +v 1.062500 -0.625000 0.258884 +v 1.062500 -0.258884 -0.625000 +v 1.062500 -0.441942 -0.441942 +v 1.062500 0.625000 -0.258883 +v 1.062500 0.441942 -0.441942 +v 1.062500 0.258883 -0.625000 +v 1.062500 0.625000 0.000000 +v 1.062500 -0.441942 0.441942 +v 1.062500 -0.000000 -0.625000 +v -1.062500 0.562500 0.000000 +v -0.750000 0.310660 0.750000 +v -0.750000 0.750000 0.000000 +v -0.875000 0.310660 0.750000 +v -0.875000 0.750000 0.310660 +v -0.875000 0.625000 0.258884 +v -0.750000 0.530330 0.530330 +v -0.875000 0.750000 0.000000 +v -1.062500 0.397747 0.397748 +v -0.875000 0.625000 0.000000 +v -0.750000 0.750000 -0.310660 +v -1.062500 0.232995 0.562500 +v -0.875000 0.530330 0.530330 +v -0.875000 0.441942 0.441942 +v -0.750000 0.750000 0.310660 +v -1.062500 0.562500 0.232995 +v -0.875000 -0.310660 0.750000 +v -0.750000 -0.000000 0.750000 +v -1.062500 -0.000000 0.562500 +v -0.875000 -0.258884 0.625000 +v -1.062500 -0.232995 0.562500 +v -0.875000 -0.000000 0.750000 +v -0.875000 -0.000000 0.625000 +v -0.875000 0.258883 0.625000 +v -0.750000 -0.530330 0.530330 +v -1.062500 -0.397748 0.397748 +v -0.875000 -0.530330 0.530330 +v -0.875000 -0.441942 0.441942 +v -0.750000 -0.310660 0.750000 +v -0.750000 -0.750000 0.000000 +v -1.062500 -0.562500 0.000000 +v -1.062500 -0.562500 -0.232995 +v -0.875000 -0.750000 0.000000 +v -0.875000 -0.625000 0.000000 +v -0.875000 -0.750000 0.310660 +v -0.750000 -0.750000 0.310660 +v -0.875000 -0.625000 0.258884 +v -1.062500 -0.562500 0.232995 +v -0.750000 -0.530330 -0.530330 +v -1.062500 -0.397748 -0.397748 +v -0.875000 -0.258884 -0.625000 +v -1.062500 -0.232995 -0.562500 +v -0.875000 -0.530330 -0.530330 +v -0.875000 -0.441942 -0.441942 +v -0.875000 -0.750000 -0.310660 +v -0.750000 -0.750000 -0.310660 +v -0.875000 -0.625000 -0.258883 +v -0.750000 -0.000000 -0.750000 +v -1.062500 -0.000000 -0.562500 +v -0.875000 -0.000000 -0.750000 +v -0.875000 -0.000000 -0.625000 +v -0.875000 -0.310660 -0.750000 +v -0.750000 -0.310660 -0.750000 +v -0.875000 0.750000 -0.310660 +v -0.750000 -0.000000 0.000000 +v -0.750000 0.530330 -0.530330 +v -1.062500 0.397747 -0.397748 +v -0.875000 0.625000 -0.258883 +v -1.062500 0.562500 -0.232995 +v -0.875000 0.530330 -0.530330 +v -0.875000 0.441942 -0.441942 +v -0.875000 0.310660 -0.750000 +v -0.750000 0.310660 -0.750000 +v -0.875000 0.258883 -0.625000 +v -1.062500 0.232995 -0.562500 +v -1.062500 0.258883 0.625000 +v -1.062500 0.441942 0.441942 +v -1.062500 0.625000 0.258883 +v -1.062500 -0.258884 0.625000 +v -1.062500 -0.000000 0.625000 +v -1.062500 -0.625000 -0.258883 +v -1.062500 -0.625000 0.000000 +v -1.062500 -0.625000 0.258884 +v -1.062500 -0.258884 -0.625000 +v -1.062500 -0.441942 -0.441942 +v -1.062500 0.625000 -0.258883 +v -1.062500 0.441942 -0.441942 +v -1.062500 0.258883 -0.625000 +v -1.062500 0.625000 0.000000 +v -1.062500 -0.441942 0.441942 +v -1.062500 -0.000000 -0.625000 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.812500 0.468750 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.509445 0.884445 +vt 0.593489 0.800630 +vt 0.593651 0.687500 +vt 0.593489 0.574370 +vt 0.509445 0.490555 +vt 0.425630 0.406511 +vt 0.312500 0.406349 +vt 0.199370 0.406511 +vt 0.115555 0.490555 +vt 0.031511 0.574370 +vt 0.031349 0.687500 +vt 0.031511 0.800630 +vt 0.115555 0.884445 +vt 0.199370 0.968489 +vt 0.312500 0.968651 +vt 0.425630 0.968489 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.683058 0.937500 +vt 0.683058 0.843750 +vt 0.812500 0.843750 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.656250 1.000000 +vt 0.657170 0.937500 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.683058 0.781250 +vt 0.812500 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.941942 0.937500 +vt 0.941942 0.843750 +vt 0.968750 1.000000 +vt 0.967830 0.937500 +vt 0.967830 0.843750 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.812500 0.906151 +vt 0.699369 0.905987 +vt 0.687500 0.937498 +vt 0.812500 0.937499 +vt 0.925632 0.905988 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.699370 0.905989 +vt 0.687500 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.906151 +vt 0.699370 0.905989 +vt 0.687500 0.937500 +vt 0.812500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.699369 0.905987 +vt 0.687500 0.937498 +vt 0.812500 0.937499 +vt 0.812500 0.906151 +vt 0.699369 0.905987 +vt 0.687500 0.937498 +vt 0.812500 0.937499 +vt 0.925632 0.905988 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.699370 0.905989 +vt 0.687500 0.937500 +vt 0.812500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.699369 0.905987 +vt 0.687500 0.937498 +vt 0.812500 0.937499 +vt 0.925632 0.905987 +vt 0.937500 0.937500 +vt 0.925632 0.905987 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.699370 0.905989 +vt 0.687500 0.937500 +vt 0.812500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.468750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.509445 0.884445 +vt 0.425630 0.968489 +vt 0.312500 0.968651 +vt 0.199370 0.968489 +vt 0.115555 0.884445 +vt 0.031511 0.800630 +vt 0.031349 0.687500 +vt 0.031511 0.574370 +vt 0.115555 0.490555 +vt 0.199370 0.406511 +vt 0.312500 0.406349 +vt 0.425630 0.406511 +vt 0.509445 0.490555 +vt 0.593489 0.574370 +vt 0.593651 0.687500 +vt 0.593489 0.800630 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.937500 +vt 0.812500 0.843750 +vt 0.683058 0.843750 +vt 0.683058 0.937500 +vt 0.812500 0.937500 +vt 0.657170 0.937500 +vt 0.656250 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.843750 +vt 0.812500 0.781250 +vt 0.683058 0.781250 +vt 0.657170 0.843750 +vt 0.812500 0.843750 +vt 0.657170 0.843750 +vt 0.941942 0.843750 +vt 0.941942 0.937500 +vt 0.967830 0.937500 +vt 0.968750 1.000000 +vt 0.941942 0.781250 +vt 0.967830 0.843750 +vt 0.967830 0.843750 +vt 0.812500 0.906151 +vt 0.812500 0.937499 +vt 0.687500 0.937498 +vt 0.699369 0.905987 +vt 0.925632 0.905988 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.812500 0.937500 +vt 0.687500 0.937500 +vt 0.699370 0.905989 +vt 0.812500 0.906151 +vt 0.812500 0.937500 +vt 0.687500 0.937500 +vt 0.699370 0.905989 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.812500 0.937499 +vt 0.687500 0.937498 +vt 0.699369 0.905987 +vt 0.812500 0.906151 +vt 0.812500 0.937499 +vt 0.687500 0.937498 +vt 0.699369 0.905987 +vt 0.925632 0.905988 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.812500 0.937500 +vt 0.687500 0.937500 +vt 0.699370 0.905989 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.812500 0.937499 +vt 0.687500 0.937498 +vt 0.699369 0.905987 +vt 0.925632 0.905987 +vt 0.937500 0.937500 +vt 0.925632 0.905987 +vt 0.937500 0.937500 +vt 0.812500 0.906151 +vt 0.812500 0.937500 +vt 0.687500 0.937500 +vt 0.699370 0.905989 +vt 0.925630 0.905989 +vt 0.937500 0.937500 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.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.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +usemtl wheel_Large +s off +f 1086/2561/80 1082/2562/80 1144/2563/80 1155/2564/80 +f 1084/2565/80 1079/2566/80 1091/2567/80 1081/2568/80 +f 1084/2569/81 1081/2570/81 1082/2571/81 1086/2572/81 +f 1131/2573/82 1091/2574/82 1079/2575/82 +f 1086/2561/83 1134/2576/83 1152/2577/83 1155/2564/83 +f 1084/2565/83 1079/2566/83 1087/2578/83 1130/2579/83 +f 1084/2569/82 1130/2580/82 1134/2581/82 1086/2572/82 +f 1131/2573/81 1087/2582/81 1079/2575/81 +f 1090/2583/84 1100/2584/84 1142/2585/84 1143/2586/84 +f 1089/2587/84 1083/2588/84 1078/2589/84 1080/2590/84 +f 1089/2591/81 1080/2592/81 1100/2593/81 1090/2594/81 +f 1131/2573/82 1078/2595/82 1083/2596/82 +f 1090/2583/85 1082/2597/85 1144/2598/85 1143/2586/85 +f 1089/2587/85 1083/2588/85 1091/2599/85 1081/2600/85 +f 1089/2591/82 1081/2601/82 1082/2602/82 1090/2594/82 +f 1131/2573/81 1091/2603/81 1083/2596/81 +f 1099/2604/86 1096/2605/86 1145/2606/86 1146/2607/86 +f 1098/2608/86 1094/2609/86 1105/2610/86 1093/2611/86 +f 1098/2612/81 1093/2613/81 1096/2614/81 1099/2615/81 +f 1131/2573/82 1105/2616/82 1094/2617/82 +f 1099/2604/87 1100/2618/87 1142/2619/87 1146/2607/87 +f 1098/2608/87 1094/2609/87 1078/2620/87 1080/2621/87 +f 1098/2612/82 1080/2622/82 1100/2623/82 1099/2615/82 +f 1131/2573/81 1078/2624/81 1094/2617/81 +f 1104/2625/88 1113/2626/88 1149/2627/88 1156/2628/88 +f 1103/2629/88 1101/2630/88 1112/2631/88 1111/2632/88 +f 1103/2633/81 1111/2634/81 1113/2635/81 1104/2636/81 +f 1131/2573/82 1112/2637/82 1101/2638/82 +f 1104/2625/89 1096/2639/89 1145/2640/89 1156/2628/89 +f 1103/2629/89 1101/2630/89 1105/2641/89 1093/2642/89 +f 1103/2633/82 1093/2643/82 1096/2644/82 1104/2636/82 +f 1131/2573/81 1105/2645/81 1101/2638/81 +f 1110/2646/83 1123/2647/83 1147/2648/83 1148/2649/83 +f 1109/2650/83 1106/2651/83 1122/2652/83 1121/2653/83 +f 1109/2654/81 1121/2655/81 1123/2656/81 1110/2657/81 +f 1131/2573/82 1122/2658/82 1106/2659/82 +f 1110/2646/80 1113/2660/80 1149/2661/80 1148/2649/80 +f 1109/2650/80 1106/2651/80 1112/2662/80 1111/2663/80 +f 1109/2654/82 1111/2664/82 1113/2665/82 1110/2657/82 +f 1131/2573/81 1112/2666/81 1106/2659/81 +f 1120/2667/85 1117/2668/85 1150/2669/85 1151/2670/85 +f 1119/2671/85 1115/2672/85 1129/2673/85 1128/2674/85 +f 1119/2675/81 1128/2676/81 1117/2677/81 1120/2678/81 +f 1131/2573/82 1129/2679/82 1115/2680/82 +f 1120/2667/84 1123/2681/84 1147/2682/84 1151/2670/84 +f 1119/2671/84 1115/2672/84 1122/2683/84 1121/2684/84 +f 1119/2675/82 1121/2685/82 1123/2686/82 1120/2678/82 +f 1131/2573/81 1122/2687/81 1115/2680/81 +f 1127/2688/87 1140/2689/87 1154/2690/87 1157/2691/87 +f 1126/2692/87 1124/2693/87 1139/2694/87 1138/2695/87 +f 1126/2696/81 1138/2697/81 1140/2698/81 1127/2699/81 +f 1131/2573/82 1139/2700/82 1124/2701/82 +f 1133/2702/82 1141/2703/82 1125/2704/82 1118/2705/82 1116/2706/82 1108/2707/82 1107/2708/82 1114/2709/82 1102/2710/82 1097/2711/82 1095/2712/82 1088/2713/82 1085/2714/82 1092/2715/82 1077/2716/82 1135/2717/82 +f 1127/2688/86 1117/2718/86 1150/2719/86 1157/2691/86 +f 1126/2692/86 1124/2693/86 1129/2720/86 1128/2721/86 +f 1126/2696/82 1128/2722/82 1117/2723/82 1127/2699/82 +f 1131/2573/81 1129/2724/81 1124/2701/81 +f 1137/2725/89 1134/2726/89 1152/2727/89 1153/2728/89 +f 1136/2729/89 1132/2730/89 1087/2731/89 1130/2732/89 +f 1136/2733/81 1130/2734/81 1134/2735/81 1137/2736/81 +f 1131/2573/82 1087/2737/82 1132/2738/82 +f 1137/2725/88 1140/2739/88 1154/2740/88 1153/2728/88 +f 1136/2729/88 1132/2730/88 1139/2741/88 1138/2742/88 +f 1136/2733/82 1138/2743/82 1140/2744/82 1137/2736/82 +f 1131/2573/81 1139/2745/81 1132/2738/81 +f 1085/2746/82 1088/2747/82 1142/2748/82 1143/2749/82 +f 1092/2750/82 1085/2746/82 1143/2749/82 1144/2751/82 +f 1095/2752/82 1097/2753/82 1145/2754/82 1146/2755/82 +f 1107/2756/82 1108/2757/82 1147/2758/82 1148/2759/82 +f 1114/2760/82 1107/2756/82 1148/2759/82 1149/2761/82 +f 1116/2762/82 1118/2763/82 1150/2764/82 1151/2765/82 +f 1133/2766/82 1135/2767/82 1152/2768/82 1153/2769/82 +f 1141/2770/82 1133/2766/82 1153/2769/82 1154/2771/82 +f 1077/2772/82 1092/2773/82 1144/2774/82 1155/2775/82 +f 1135/2776/82 1077/2772/82 1155/2775/82 1152/2777/82 +f 1088/2778/82 1095/2752/82 1146/2755/82 1142/2779/82 +f 1102/2780/82 1114/2781/82 1149/2782/82 1156/2783/82 +f 1097/2784/82 1102/2780/82 1156/2783/82 1145/2785/82 +f 1108/2786/82 1116/2762/82 1151/2765/82 1147/2787/82 +f 1125/2788/82 1141/2789/82 1154/2790/82 1157/2791/82 +f 1118/2792/82 1125/2788/82 1157/2791/82 1150/2793/82 +f 1167/2794/80 1236/2795/80 1225/2796/80 1163/2797/80 +f 1165/2798/80 1162/2799/80 1172/2800/80 1160/2801/80 +f 1165/2802/82 1167/2803/82 1163/2804/82 1162/2805/82 +f 1212/2806/81 1160/2807/81 1172/2808/81 +f 1167/2794/83 1236/2795/83 1233/2809/83 1215/2810/83 +f 1165/2798/83 1211/2811/83 1168/2812/83 1160/2801/83 +f 1165/2802/81 1167/2803/81 1215/2813/81 1211/2814/81 +f 1212/2806/82 1160/2807/82 1168/2815/82 +f 1171/2816/84 1224/2817/84 1223/2818/84 1181/2819/84 +f 1170/2820/84 1161/2821/84 1159/2822/84 1164/2823/84 +f 1170/2824/82 1171/2825/82 1181/2826/82 1161/2827/82 +f 1212/2806/81 1164/2828/81 1159/2829/81 +f 1171/2816/85 1224/2817/85 1225/2830/85 1163/2831/85 +f 1170/2820/85 1162/2832/85 1172/2833/85 1164/2823/85 +f 1170/2824/81 1171/2825/81 1163/2834/81 1162/2835/81 +f 1212/2806/82 1164/2828/82 1172/2836/82 +f 1180/2837/86 1227/2838/86 1226/2839/86 1177/2840/86 +f 1179/2841/86 1174/2842/86 1186/2843/86 1175/2844/86 +f 1179/2845/82 1180/2846/82 1177/2847/82 1174/2848/82 +f 1212/2806/81 1175/2849/81 1186/2850/81 +f 1180/2837/87 1227/2838/87 1223/2851/87 1181/2852/87 +f 1179/2841/87 1161/2853/87 1159/2854/87 1175/2844/87 +f 1179/2845/81 1180/2846/81 1181/2855/81 1161/2856/81 +f 1212/2806/82 1175/2849/82 1159/2857/82 +f 1185/2858/88 1237/2859/88 1230/2860/88 1194/2861/88 +f 1184/2862/88 1192/2863/88 1193/2864/88 1182/2865/88 +f 1184/2866/82 1185/2867/82 1194/2868/82 1192/2869/82 +f 1212/2806/81 1182/2870/81 1193/2871/81 +f 1185/2858/89 1237/2859/89 1226/2872/89 1177/2873/89 +f 1184/2862/89 1174/2874/89 1186/2875/89 1182/2865/89 +f 1184/2866/81 1185/2867/81 1177/2876/81 1174/2877/81 +f 1212/2806/82 1182/2870/82 1186/2878/82 +f 1191/2879/83 1229/2880/83 1228/2881/83 1204/2882/83 +f 1190/2883/83 1202/2884/83 1203/2885/83 1187/2886/83 +f 1190/2887/82 1191/2888/82 1204/2889/82 1202/2890/82 +f 1212/2806/81 1187/2891/81 1203/2892/81 +f 1191/2879/80 1229/2880/80 1230/2893/80 1194/2894/80 +f 1190/2883/80 1192/2895/80 1193/2896/80 1187/2886/80 +f 1190/2887/81 1191/2888/81 1194/2897/81 1192/2898/81 +f 1212/2806/82 1187/2891/82 1193/2899/82 +f 1201/2900/85 1232/2901/85 1231/2902/85 1198/2903/85 +f 1200/2904/85 1209/2905/85 1210/2906/85 1196/2907/85 +f 1200/2908/82 1201/2909/82 1198/2910/82 1209/2911/82 +f 1212/2806/81 1196/2912/81 1210/2913/81 +f 1201/2900/84 1232/2901/84 1228/2914/84 1204/2915/84 +f 1200/2904/84 1202/2916/84 1203/2917/84 1196/2907/84 +f 1200/2908/81 1201/2909/81 1204/2918/81 1202/2919/81 +f 1212/2806/82 1196/2912/82 1203/2920/82 +f 1208/2921/87 1238/2922/87 1235/2923/87 1221/2924/87 +f 1207/2925/87 1219/2926/87 1220/2927/87 1205/2928/87 +f 1207/2929/82 1208/2930/82 1221/2931/82 1219/2932/82 +f 1212/2806/81 1205/2933/81 1220/2934/81 +f 1214/2935/81 1216/2936/81 1158/2937/81 1173/2938/81 1166/2939/81 1169/2940/81 1176/2941/81 1178/2942/81 1183/2943/81 1195/2944/81 1188/2945/81 1189/2946/81 1197/2947/81 1199/2948/81 1206/2949/81 1222/2950/81 +f 1208/2921/86 1238/2922/86 1231/2951/86 1198/2952/86 +f 1207/2925/86 1209/2953/86 1210/2954/86 1205/2928/86 +f 1207/2929/81 1208/2930/81 1198/2955/81 1209/2956/81 +f 1212/2806/82 1205/2933/82 1210/2957/82 +f 1218/2958/89 1234/2959/89 1233/2960/89 1215/2961/89 +f 1217/2962/89 1211/2963/89 1168/2964/89 1213/2965/89 +f 1217/2966/82 1218/2967/82 1215/2968/82 1211/2969/82 +f 1212/2806/81 1213/2970/81 1168/2971/81 +f 1218/2958/88 1234/2959/88 1235/2972/88 1221/2973/88 +f 1217/2962/88 1219/2974/88 1220/2975/88 1213/2965/88 +f 1217/2966/81 1218/2967/81 1221/2976/81 1219/2977/81 +f 1212/2806/82 1213/2970/82 1220/2978/82 +f 1166/2979/81 1224/2980/81 1223/2981/81 1169/2982/81 +f 1173/2983/81 1225/2984/81 1224/2980/81 1166/2979/81 +f 1176/2985/81 1227/2986/81 1226/2987/81 1178/2988/81 +f 1188/2989/81 1229/2990/81 1228/2991/81 1189/2992/81 +f 1195/2993/81 1230/2994/81 1229/2990/81 1188/2989/81 +f 1197/2995/81 1232/2996/81 1231/2997/81 1199/2998/81 +f 1214/2999/81 1234/3000/81 1233/3001/81 1216/3002/81 +f 1222/3003/81 1235/3004/81 1234/3000/81 1214/2999/81 +f 1158/3005/81 1236/3006/81 1225/3007/81 1173/3008/81 +f 1216/3009/81 1233/3010/81 1236/3006/81 1158/3005/81 +f 1169/3011/81 1223/3012/81 1227/2986/81 1176/2985/81 +f 1183/3013/81 1237/3014/81 1230/3015/81 1195/3016/81 +f 1178/3017/81 1226/3018/81 1237/3014/81 1183/3013/81 +f 1189/3019/81 1228/3020/81 1232/2996/81 1197/2995/81 +f 1206/3021/81 1238/3022/81 1235/3023/81 1222/3024/81 +f 1199/3025/81 1231/3026/81 1238/3022/81 1206/3021/81 +o Cube.039_Cube.046 +v 1.062500 1.062500 0.250000 +v 1.062500 1.187500 0.250000 +v 1.187500 1.062500 0.250000 +v 1.187500 1.187500 0.250000 +v 1.062500 1.062500 1.000000 +v 1.062500 1.187500 1.000000 +v 1.187500 1.187500 1.000000 +v 1.187500 1.062500 1.000000 +v 1.062500 1.062500 -0.250000 +v 1.062500 1.187500 -0.250000 +v 1.187500 1.062500 -0.250000 +v 1.187500 1.187500 -0.250000 +v 1.062500 1.062500 -1.000000 +v 1.062500 1.187500 -1.000000 +v 1.187500 1.187500 -1.000000 +v 1.187500 1.062500 -1.000000 +v 1.062500 0.812500 0.250000 +v 1.062500 0.937500 0.250000 +v 1.187500 0.812500 0.250000 +v 1.187500 0.937500 0.250000 +v 1.062500 0.812500 1.000000 +v 1.062500 0.937500 1.000000 +v 1.187500 0.937500 1.000000 +v 1.187500 0.812500 1.000000 +v 1.062500 0.812500 -0.250000 +v 1.062500 0.937500 -0.250000 +v 1.187500 0.812500 -0.250000 +v 1.187500 0.937500 -0.250000 +v 1.062500 0.812500 -1.000000 +v 1.062500 0.937500 -1.000000 +v 1.187500 0.937500 -1.000000 +v 1.187500 0.812500 -1.000000 +v -1.062500 1.062500 0.250000 +v -1.062500 1.187500 0.250000 +v -1.187500 1.062500 0.250000 +v -1.187500 1.187500 0.250000 +v -1.062500 1.062500 1.000000 +v -1.062500 1.187500 1.000000 +v -1.187500 1.187500 1.000000 +v -1.187500 1.062500 1.000000 +v -1.062500 1.062500 -0.250000 +v -1.062500 1.187500 -0.250000 +v -1.187500 1.062500 -0.250000 +v -1.187500 1.187500 -0.250000 +v -1.062500 1.062500 -1.000000 +v -1.062500 1.187500 -1.000000 +v -1.187500 1.187500 -1.000000 +v -1.187500 1.062500 -1.000000 +v -1.062500 0.812500 0.250000 +v -1.062500 0.937500 0.250000 +v -1.187500 0.812500 0.250000 +v -1.187500 0.937500 0.250000 +v -1.062500 0.812500 1.000000 +v -1.062500 0.937500 1.000000 +v -1.187500 0.937500 1.000000 +v -1.187500 0.812500 1.000000 +v -1.062500 0.812500 -0.250000 +v -1.062500 0.937500 -0.250000 +v -1.187500 0.812500 -0.250000 +v -1.187500 0.937500 -0.250000 +v -1.062500 0.812500 -1.000000 +v -1.062500 0.937500 -1.000000 +v -1.187500 0.937500 -1.000000 +v -1.187500 0.812500 -1.000000 +v 1.062500 0.687500 0.062500 +v 1.062500 1.312500 0.062500 +v 1.062500 0.687500 -0.062500 +v 1.062500 1.312500 -0.062500 +v 1.187500 0.687500 0.062500 +v 1.187500 1.312500 0.062500 +v 1.187500 0.687500 -0.062500 +v 1.187500 1.312500 -0.062500 +v 1.062500 0.562500 -0.187500 +v 1.062500 0.562500 0.187500 +v 1.062500 1.437500 0.187500 +v 1.062500 1.437500 -0.187500 +v 1.187500 1.437500 -0.187500 +v 1.187500 0.562500 -0.187500 +v 1.187500 0.562500 0.187500 +v 1.187500 1.437500 0.187500 +v 1.062500 0.750000 0.250000 +v 1.062500 1.250000 0.250000 +v 1.062500 0.750000 0.125000 +v 1.062500 1.250000 0.125000 +v 1.250000 0.750000 0.250000 +v 1.250000 1.250000 0.250000 +v 1.250000 0.750000 0.125000 +v 1.250000 1.250000 0.125000 +v 1.062500 0.750000 -0.125000 +v 1.062500 1.250000 -0.125000 +v 1.062500 0.750000 -0.250000 +v 1.062500 1.250000 -0.250000 +v 1.250000 0.750000 -0.125000 +v 1.250000 1.250000 -0.125000 +v 1.250000 0.750000 -0.250000 +v 1.250000 1.250000 -0.250000 +v -1.062500 0.687500 0.062500 +v -1.062500 1.312500 0.062500 +v -1.062500 0.687500 -0.062500 +v -1.062500 1.312500 -0.062500 +v -1.187500 0.687500 0.062500 +v -1.187500 1.312500 0.062500 +v -1.187500 0.687500 -0.062500 +v -1.187500 1.312500 -0.062500 +v -1.062500 0.562500 -0.187500 +v -1.062500 0.562500 0.187500 +v -1.062500 1.437500 0.187500 +v -1.062500 1.437500 -0.187500 +v -1.187500 1.437500 -0.187500 +v -1.187500 0.562500 -0.187500 +v -1.187500 0.562500 0.187500 +v -1.187500 1.437500 0.187500 +v -1.062500 0.750000 0.250000 +v -1.062500 1.250000 0.250000 +v -1.062500 0.750000 0.125000 +v -1.062500 1.250000 0.125000 +v -1.250000 0.750000 0.250000 +v -1.250000 1.250000 0.250000 +v -1.250000 0.750000 0.125000 +v -1.250000 1.250000 0.125000 +v -1.062500 0.750000 -0.125000 +v -1.062500 1.250000 -0.125000 +v -1.062500 0.750000 -0.250000 +v -1.062500 1.250000 -0.250000 +v -1.250000 0.750000 -0.125000 +v -1.250000 1.250000 -0.125000 +v -1.250000 0.750000 -0.250000 +v -1.250000 1.250000 -0.250000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.968750 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.906250 0.375000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.937500 0.375000 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 0.937500 0.000000 +vt 0.968750 0.375000 +vt 0.968750 0.000000 +vt 0.906250 0.000000 +vt 0.906250 0.375000 +vt 0.906250 0.375000 +vt 0.906250 0.000000 +vt 0.968750 0.000000 +vt 0.968750 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.375000 +vt 0.250000 0.937500 +vt 0.250000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.937500 +vt 0.062500 0.812500 +vt 0.062500 0.750000 +vt 0.125000 0.750000 +vt 0.125000 0.812500 +vt 0.187500 0.937500 +vt 0.187500 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.937500 +vt 0.125000 0.687500 +vt 0.062500 0.687500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.062500 0.687500 +vt 0.125000 0.687500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.562500 +vt 0.187500 0.500000 +vt 0.187500 0.937500 +vt 0.062500 0.562500 +vt 0.000000 0.500000 +vt 0.062500 0.875000 +vt 0.000000 0.937500 +vt 0.250000 0.875000 +vt 0.250000 0.562500 +vt 0.187500 0.562500 +vt 0.187500 0.875000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.750000 +vt 0.125000 0.750000 +vt 0.187500 0.562500 +vt 0.250000 0.562500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.250000 0.687500 +vt 0.250000 0.937500 +vt 0.343750 0.937500 +vt 0.343750 0.687500 +vt 0.093750 0.937500 +vt 0.343750 1.000000 +vt 0.093750 1.000000 +vt 0.343750 0.687500 +vt 0.343750 0.937500 +vt 0.250000 0.937500 +vt 0.250000 0.687500 +vt 0.125000 0.656250 +vt 0.125000 0.562500 +vt 0.062500 0.562500 +vt 0.062500 0.656250 +vt 0.125000 0.562500 +vt 0.125000 0.656250 +vt 0.062500 0.656250 +vt 0.062500 0.562500 +vt 0.250000 0.687500 +vt 0.250000 0.937500 +vt 0.343750 0.937500 +vt 0.343750 0.687500 +vt 0.093750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 0.937500 +vt 0.093750 0.937500 +vt 0.343750 0.687500 +vt 0.250000 0.937500 +vt 0.250000 0.687500 +vt 0.062500 0.656250 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.656250 +vt 0.062500 0.562500 +vt 0.062500 0.656250 +vt 0.125000 0.656250 +vt 0.125000 0.562500 +vt 0.250000 0.937500 +vt 0.187500 0.937500 +vt 0.187500 0.500000 +vt 0.250000 0.500000 +vt 0.062500 0.812500 +vt 0.125000 0.812500 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.187500 0.937500 +vt 0.250000 0.937500 +vt 0.250000 0.500000 +vt 0.187500 0.500000 +vt 0.125000 0.687500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.687500 +vt 0.062500 0.687500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.687500 +vt 0.125000 0.875000 +vt 0.187500 0.937500 +vt 0.187500 0.500000 +vt 0.125000 0.562500 +vt 0.000000 0.500000 +vt 0.062500 0.562500 +vt 0.062500 0.875000 +vt 0.000000 0.937500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.187500 0.562500 +vt 0.250000 0.562500 +vt 0.125000 0.812500 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.062500 0.812500 +vt 0.187500 0.562500 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.562500 +vt 0.250000 0.687500 +vt 0.343750 0.687500 +vt 0.343750 0.937500 +vt 0.250000 0.937500 +vt 0.093750 0.937500 +vt 0.093750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 0.687500 +vt 0.250000 0.687500 +vt 0.250000 0.937500 +vt 0.343750 0.937500 +vt 0.125000 0.656250 +vt 0.062500 0.656250 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.562500 +vt 0.062500 0.562500 +vt 0.062500 0.656250 +vt 0.125000 0.656250 +vt 0.250000 0.687500 +vt 0.343750 0.687500 +vt 0.343750 0.937500 +vt 0.250000 0.937500 +vt 0.093750 1.000000 +vt 0.093750 0.937500 +vt 0.343750 0.937500 +vt 0.343750 1.000000 +vt 0.343750 0.687500 +vt 0.250000 0.687500 +vt 0.250000 0.937500 +vt 0.062500 0.656250 +vt 0.125000 0.656250 +vt 0.125000 0.562500 +vt 0.062500 0.562500 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.656250 +vt 0.062500 0.656250 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +usemtl Bogey_Piston +s off +f 1241/3027/90 1246/3028/90 1243/3029/90 1239/3030/90 +f 1240/3031/91 1244/3032/91 1245/3033/91 1242/3034/91 +f 1242/3035/92 1245/3036/92 1246/3037/92 1241/3038/92 +f 1239/3039/93 1243/3040/93 1244/3041/93 1240/3042/93 +f 1249/3043/90 1247/3044/90 1251/3045/90 1254/3046/90 +f 1248/3047/91 1250/3048/91 1253/3049/91 1252/3050/91 +f 1250/3051/92 1249/3052/92 1254/3053/92 1253/3054/92 +f 1247/3055/93 1248/3056/93 1252/3057/93 1251/3058/93 +f 1257/3059/90 1262/3060/90 1259/3061/90 1255/3062/90 +f 1256/3063/91 1260/3064/91 1261/3065/91 1258/3066/91 +f 1258/3067/92 1261/3068/92 1262/3069/92 1257/3070/92 +f 1255/3071/93 1259/3072/93 1260/3073/93 1256/3074/93 +f 1265/3075/90 1263/3076/90 1267/3077/90 1270/3078/90 +f 1264/3079/91 1266/3080/91 1269/3081/91 1268/3082/91 +f 1266/3083/92 1265/3084/92 1270/3085/92 1269/3086/92 +f 1263/3087/93 1264/3088/93 1268/3089/93 1267/3090/93 +f 1273/3091/90 1271/3092/90 1275/3093/90 1278/3094/90 +f 1272/3095/91 1274/3096/91 1277/3097/91 1276/3098/91 +f 1274/3099/93 1273/3100/93 1278/3101/93 1277/3102/93 +f 1271/3103/92 1272/3104/92 1276/3105/92 1275/3106/92 +f 1281/3107/90 1286/3108/90 1283/3109/90 1279/3110/90 +f 1280/3111/91 1284/3112/91 1285/3113/91 1282/3114/91 +f 1282/3115/93 1285/3116/93 1286/3117/93 1281/3118/93 +f 1279/3119/92 1283/3120/92 1284/3121/92 1280/3122/92 +f 1289/3123/90 1287/3124/90 1291/3125/90 1294/3126/90 +f 1288/3127/91 1290/3128/91 1293/3129/91 1292/3130/91 +f 1290/3131/93 1289/3132/93 1294/3133/93 1293/3134/93 +f 1287/3135/92 1288/3136/92 1292/3137/92 1291/3138/92 +f 1297/3139/90 1302/3140/90 1299/3141/90 1295/3142/90 +f 1296/3143/91 1300/3144/91 1301/3145/91 1298/3146/91 +f 1298/3147/93 1301/3148/93 1302/3149/93 1297/3150/93 +f 1295/3151/92 1299/3152/92 1300/3153/92 1296/3154/92 +f 1311/3155/94 1314/3156/94 1315/3157/94 1316/3158/94 +f 1305/3159/91 1303/3160/91 1307/3161/91 1309/3162/91 +f 1317/3163/95 1318/3164/95 1313/3165/95 1312/3166/95 +f 1311/3167/90 1316/3168/90 1317/3169/90 1312/3170/90 +f 1315/3171/91 1314/3172/91 1313/3173/91 1318/3174/91 +f 1310/3175/92 1309/3176/92 1316/3177/92 1315/3178/92 +f 1309/3176/92 1307/3179/92 1317/3180/92 1316/3177/92 +f 1308/3181/92 1310/3175/92 1315/3178/92 1318/3182/92 +f 1307/3179/92 1308/3181/92 1318/3182/92 1317/3180/92 +f 1308/3183/94 1307/3184/94 1303/3185/94 1304/3186/94 +f 1310/3187/90 1308/3188/90 1304/3189/90 1306/3190/90 +f 1305/3191/95 1309/3192/95 1310/3193/95 1306/3194/95 +f 1321/3195/94 1322/3196/94 1326/3197/94 1325/3198/94 +f 1325/3199/92 1326/3197/92 1324/3200/92 1323/3201/92 +f 1323/3202/95 1324/3203/95 1320/3204/95 1319/3205/95 +f 1321/3206/90 1325/3207/90 1323/3208/90 1319/3209/90 +f 1326/3210/91 1322/3211/91 1320/3212/91 1324/3213/91 +f 1329/3214/94 1330/3215/94 1334/3216/94 1333/3217/94 +f 1333/3218/92 1334/3219/92 1332/3220/92 1331/3221/92 +f 1331/3222/95 1332/3220/95 1328/3223/95 1327/3224/95 +f 1329/3225/90 1333/3226/90 1331/3227/90 1327/3228/90 +f 1334/3229/91 1330/3230/91 1328/3231/91 1332/3232/91 +f 1343/3233/94 1348/3234/94 1347/3235/94 1346/3236/94 +f 1337/3237/91 1341/3238/91 1339/3239/91 1335/3240/91 +f 1349/3241/95 1344/3242/95 1345/3243/95 1350/3244/95 +f 1343/3245/90 1344/3246/90 1349/3247/90 1348/3248/90 +f 1347/3249/91 1350/3250/91 1345/3251/91 1346/3252/91 +f 1342/3253/93 1347/3254/93 1348/3255/93 1341/3256/93 +f 1341/3256/93 1348/3255/93 1349/3257/93 1339/3258/93 +f 1340/3259/93 1350/3260/93 1347/3254/93 1342/3253/93 +f 1339/3258/93 1349/3257/93 1350/3260/93 1340/3259/93 +f 1340/3261/94 1336/3262/94 1335/3263/94 1339/3264/94 +f 1342/3265/90 1338/3266/90 1336/3267/90 1340/3268/90 +f 1337/3269/95 1338/3270/95 1342/3271/95 1341/3272/95 +f 1353/3273/94 1357/3274/94 1358/3275/94 1354/3276/94 +f 1357/3277/93 1355/3278/93 1356/3279/93 1358/3275/93 +f 1355/3280/95 1351/3281/95 1352/3282/95 1356/3283/95 +f 1353/3284/90 1351/3285/90 1355/3286/90 1357/3287/90 +f 1358/3288/91 1356/3289/91 1352/3290/91 1354/3291/91 +f 1361/3292/94 1365/3293/94 1366/3294/94 1362/3295/94 +f 1365/3296/93 1363/3297/93 1364/3298/93 1366/3299/93 +f 1363/3300/95 1359/3301/95 1360/3302/95 1364/3298/95 +f 1361/3303/90 1359/3304/90 1363/3305/90 1365/3306/90 +f 1366/3307/91 1364/3308/91 1360/3309/91 1362/3310/91 +o Cube.040_Cube.047 +v 1.062500 -0.125000 0.125000 +v 1.062500 0.125000 0.125000 +v 1.062500 -0.125000 -0.125000 +v 1.062500 0.125000 -0.125000 +v 1.312500 0.125000 -0.125000 +v 1.312500 -0.125000 -0.125000 +v 1.312500 -0.125000 0.125000 +v 1.312500 0.125000 0.125000 +v -1.062500 -0.125000 0.125000 +v -1.062500 0.125000 0.125000 +v -1.062500 -0.125000 -0.125000 +v -1.062500 0.125000 -0.125000 +v -1.312500 0.125000 -0.125000 +v -1.312500 -0.125000 -0.125000 +v -1.312500 -0.125000 0.125000 +v -1.312500 0.125000 0.125000 +vt 0.500000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.500000 +vt 0.500000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.500000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.375000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.625000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +usemtl Bogey_Piston +s off +f 1368/3311/96 1374/3312/96 1371/3313/96 1370/3314/96 +f 1367/3315/97 1373/3316/97 1374/3317/97 1368/3318/97 +f 1369/3319/98 1372/3320/98 1373/3321/98 1367/3322/98 +f 1372/3323/99 1371/3324/99 1374/3325/99 1373/3326/99 +f 1370/3327/100 1371/3324/100 1372/3323/100 1369/3328/100 +f 1376/3329/96 1378/3330/96 1379/3331/96 1382/3332/96 +f 1375/3333/97 1376/3334/97 1382/3335/97 1381/3336/97 +f 1377/3337/98 1375/3338/98 1381/3339/98 1380/3340/98 +f 1380/3341/101 1381/3342/101 1382/3343/101 1379/3344/101 +f 1378/3345/100 1377/3346/100 1380/3341/100 1379/3344/100 diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/frame.json b/src/main/resources/assets/create/models/block/track/bogey/old/frame.json new file mode 100644 index 000000000..6ae955972 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/frame.json @@ -0,0 +1,149 @@ +{ + "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": [] + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_axle.json b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_axle.json new file mode 100644 index 000000000..d4ff42239 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_axle.json @@ -0,0 +1,12 @@ +{ + "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" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_axle.obj b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_axle.obj new file mode 100644 index 000000000..88eb6b9f9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_axle.obj @@ -0,0 +1,1433 @@ +# Blender v3.0.0 Release Candidate OBJ File: 'Bogey.blend' +# www.blender.org +mtllib bogey.mtl +o Cube.001_Cube.008 +v 18.999994 10.000000 -18.000006 +v 18.999994 14.000000 -18.000006 +v 18.999996 10.000000 -14.000006 +v 18.999996 14.000000 -14.000006 +v 2.999995 10.000000 -14.000000 +v 2.999995 14.000000 -14.000000 +v 2.999994 10.000000 -18.000000 +v 2.999994 14.000000 -18.000000 +v -18.999996 10.000000 -18.000006 +v -18.999996 14.000000 -18.000006 +v -18.999998 10.000000 -14.000006 +v -18.999998 14.000000 -14.000006 +v -2.999995 10.000000 -14.000000 +v -2.999995 14.000000 -14.000000 +v -2.999994 10.000000 -18.000000 +v -2.999994 14.000000 -18.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 +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 +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 +o Cube.003_Cube.010 +v 8.999998 6.000000 -9.000003 +v 8.999998 19.000000 -9.000003 +v 9.000003 6.000000 8.999997 +v 9.000003 19.000000 8.999997 +v -9.000003 6.000000 -8.999998 +v -9.000003 19.000000 -8.999998 +v -8.999998 6.000000 9.000003 +v -8.999998 19.000000 9.000003 +v 8.999998 6.000000 1.999997 +v 8.999998 19.000000 1.999997 +v -9.000003 6.000000 2.000002 +v -9.000003 19.000000 2.000002 +v 9.000003 6.000000 -2.000003 +v 9.000003 19.000000 -2.000003 +v -8.999998 6.000000 -1.999997 +v -8.999998 19.000000 -1.999997 +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 +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 +usemtl bogey +s off +f 17/41/7 18/42/7 20/43/7 19/44/7 +f 19/45/8 20/46/8 24/47/8 23/48/8 +f 23/49/9 24/50/9 22/51/9 21/52/9 +f 21/53/10 22/54/10 18/55/10 17/56/10 +f 19/57/11 23/58/11 21/59/11 17/60/11 +f 24/61/12 20/62/12 18/63/12 22/64/12 +f 27/65/8 25/66/8 26/67/8 28/68/8 +f 29/69/10 31/70/10 32/71/10 30/72/10 +o Cube.002_Cube.013 +v 8.000000 24.000000 -8.000000 +v 8.000000 32.000000 -8.000000 +v 8.000000 24.000000 8.000000 +v 8.000000 32.000000 8.000000 +v -8.000000 24.000000 -8.000000 +v -8.000000 32.000000 -8.000000 +v -8.000000 24.000000 8.000000 +v -8.000000 32.000000 8.000000 +v 6.000000 16.000000 -6.000000 +v 6.000000 24.000000 -6.000000 +v 6.000000 16.000000 6.000000 +v 6.000000 24.000000 6.000000 +v -6.000000 16.000000 -6.000000 +v -6.000000 24.000000 -6.000000 +v -6.000000 16.000000 6.000000 +v -6.000000 24.000000 6.000000 +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.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 +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 +usemtl shaft +s off +f 33/73/13 34/74/13 36/75/13 35/76/13 +f 35/76/14 36/75/14 40/77/14 39/78/14 +f 39/78/15 40/77/15 38/79/15 37/80/15 +f 37/80/16 38/79/16 34/81/16 33/82/16 +f 35/83/17 39/78/17 37/80/17 33/84/17 +f 40/77/18 36/85/18 34/86/18 38/79/18 +usemtl dark_iron +f 41/87/13 42/88/13 44/89/13 43/90/13 +f 43/90/14 44/89/14 48/91/14 47/92/14 +f 47/92/15 48/91/15 46/93/15 45/94/15 +f 45/94/16 46/93/16 42/95/16 41/96/16 +f 43/97/17 47/92/17 45/94/17 41/98/17 +o Cube.005_Cube.014 +v 4.000000 8.000000 -20.000000 +v 4.000000 16.000000 -20.000000 +v 4.000000 8.000000 -12.000000 +v 4.000000 16.000000 -12.000000 +v -4.000000 8.000000 -20.000000 +v -4.000000 16.000000 -20.000000 +v -4.000000 8.000000 -12.000000 +v -4.000000 16.000000 -12.000000 +v 4.000000 8.000000 20.000000 +v 4.000000 16.000000 20.000000 +v 4.000000 8.000000 12.000000 +v 4.000000 16.000000 12.000000 +v -4.000000 8.000000 20.000000 +v -4.000000 16.000000 20.000000 +v -4.000000 8.000000 12.000000 +v -4.000000 16.000000 12.000000 +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 +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 +usemtl dark_iron +s off +f 49/99/19 50/100/19 52/101/19 51/102/19 +f 51/102/20 52/101/20 56/103/20 55/104/20 +f 55/104/21 56/103/21 54/105/21 53/106/21 +f 53/106/22 54/105/22 50/107/22 49/108/22 +f 51/109/23 55/104/23 53/106/23 49/110/23 +f 56/103/24 52/111/24 50/112/24 54/105/24 +f 57/113/19 59/114/19 60/115/19 58/116/19 +f 59/114/22 63/117/22 64/118/22 60/115/22 +f 63/117/21 61/119/21 62/120/21 64/118/21 +f 61/119/20 57/121/20 58/122/20 62/120/20 +f 59/123/23 57/124/23 61/119/23 63/117/23 +f 64/118/24 62/120/24 58/125/24 60/126/24 +o Cube.007_Cube.016 +v 15.999998 12.000000 -8.000006 +v 15.999998 20.000000 -8.000006 +v 16.000002 12.000000 7.999994 +v 16.000002 20.000000 7.999994 +v 8.999997 12.000000 -8.000003 +v 8.999997 20.000000 -8.000003 +v 9.000003 12.000000 7.999997 +v 9.000003 20.000000 7.999997 +v -15.999998 12.000000 -8.000006 +v -15.999998 20.000000 -8.000006 +v -16.000002 12.000000 7.999994 +v -16.000002 20.000000 7.999994 +v -8.999997 12.000000 -8.000003 +v -8.999997 20.000000 -8.000003 +v -9.000003 12.000000 7.999997 +v -9.000003 20.000000 7.999997 +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 +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 +usemtl dark_iron +s off +f 65/127/25 66/128/25 68/129/25 67/130/25 +f 67/130/26 68/129/26 72/131/26 71/132/26 +f 71/132/27 72/131/27 70/133/27 69/134/27 +f 69/134/28 70/133/28 66/135/28 65/136/28 +f 67/137/29 71/132/29 69/134/29 65/138/29 +f 72/131/30 68/139/30 66/140/30 70/133/30 +f 73/141/27 75/142/27 76/143/27 74/144/27 +f 75/142/26 79/145/26 80/146/26 76/143/26 +f 79/145/25 77/147/25 78/148/25 80/146/25 +f 77/147/28 73/149/28 74/150/28 78/148/28 +f 75/151/29 73/152/29 77/147/29 79/145/29 +f 80/146/30 78/148/30 74/153/30 76/154/30 +o Cube.008_Cube.018 +v 14.000000 18.445293 -13.314461 +v 14.000000 5.554706 -13.314461 +v 14.000000 5.554706 -18.685539 +v 14.000000 9.314461 -22.445293 +v 17.000000 18.445293 -18.685539 +v 17.000000 18.445293 -13.314461 +v 17.000000 14.685539 -9.554706 +v 17.000000 9.314461 -9.554706 +v 17.000000 5.554706 -13.314461 +v 17.000000 5.554706 -18.685539 +v 17.000000 9.314461 -22.445293 +v 17.000000 14.685539 -22.445293 +v 14.000000 14.685539 -22.445293 +v 14.000000 9.314461 -9.554706 +v 14.000000 14.685539 -9.554706 +v 14.000000 18.445293 -18.685539 +v 17.000000 11.999998 -16.000000 +v 12.000000 15.222648 -23.734352 +v 12.000000 8.777352 -23.734352 +v 12.000000 4.265646 -19.222647 +v 12.000000 4.265646 -12.777352 +v 14.000000 19.734352 -19.222647 +v 14.000000 19.734352 -12.777352 +v 14.000000 15.222648 -8.265646 +v 14.000000 8.777352 -8.265646 +v 14.000000 4.265646 -12.777352 +v 14.000000 4.265646 -19.222647 +v 14.000000 8.777352 -23.734352 +v 14.000000 15.222648 -23.734352 +v 12.000000 8.777352 -8.265646 +v 12.000000 15.222648 -8.265646 +v 12.000000 19.734352 -12.777352 +v 12.000000 19.734352 -19.222647 +v 14.000000 12.000000 -16.000000 +v 12.000000 12.000000 -15.999999 +v -14.000000 18.445293 -13.314461 +v -14.000000 5.554706 -13.314461 +v -14.000000 5.554706 -18.685539 +v -14.000000 9.314461 -22.445293 +v -17.000000 18.445293 -18.685539 +v -17.000000 18.445293 -13.314461 +v -17.000000 14.685539 -9.554706 +v -17.000000 9.314461 -9.554706 +v -17.000000 5.554706 -13.314461 +v -17.000000 5.554706 -18.685539 +v -17.000000 9.314461 -22.445293 +v -17.000000 14.685539 -22.445293 +v -14.000000 14.685539 -22.445293 +v -14.000000 9.314461 -9.554706 +v -14.000000 14.685539 -9.554706 +v -14.000000 18.445293 -18.685539 +v -17.000000 11.999998 -16.000000 +v -12.000000 15.222648 -23.734352 +v -12.000000 8.777352 -23.734352 +v -12.000000 4.265646 -19.222647 +v -12.000000 4.265646 -12.777352 +v -14.000000 19.734352 -19.222647 +v -14.000000 19.734352 -12.777352 +v -14.000000 15.222648 -8.265646 +v -14.000000 8.777352 -8.265646 +v -14.000000 4.265646 -12.777352 +v -14.000000 4.265646 -19.222647 +v -14.000000 8.777352 -23.734352 +v -14.000000 15.222648 -23.734352 +v -12.000000 8.777352 -8.265646 +v -12.000000 15.222648 -8.265646 +v -12.000000 19.734352 -12.777352 +v -12.000000 19.734352 -19.222647 +v -14.000000 12.000000 -16.000000 +v -12.000000 12.000000 -15.999999 +v 14.000000 18.445293 13.314461 +v 14.000000 5.554706 13.314461 +v 14.000000 5.554706 18.685539 +v 14.000000 9.314461 22.445293 +v 17.000000 18.445293 18.685539 +v 17.000000 18.445293 13.314461 +v 17.000000 14.685539 9.554706 +v 17.000000 9.314461 9.554706 +v 17.000000 5.554706 13.314461 +v 17.000000 5.554706 18.685539 +v 17.000000 9.314461 22.445293 +v 17.000000 14.685539 22.445293 +v 14.000000 14.685539 22.445293 +v 14.000000 9.314461 9.554706 +v 14.000000 14.685539 9.554706 +v 14.000000 18.445293 18.685539 +v 17.000000 11.999998 16.000000 +v 12.000000 15.222648 23.734352 +v 12.000000 8.777352 23.734352 +v 12.000000 4.265646 19.222647 +v 12.000000 4.265646 12.777352 +v 14.000000 19.734352 19.222647 +v 14.000000 19.734352 12.777352 +v 14.000000 15.222648 8.265646 +v 14.000000 8.777352 8.265646 +v 14.000000 4.265646 12.777352 +v 14.000000 4.265646 19.222647 +v 14.000000 8.777352 23.734352 +v 14.000000 15.222648 23.734352 +v 12.000000 8.777352 8.265646 +v 12.000000 15.222648 8.265646 +v 12.000000 19.734352 12.777352 +v 12.000000 19.734352 19.222647 +v 14.000000 12.000000 16.000000 +v 12.000000 12.000000 15.999999 +v -14.000000 18.445293 13.314461 +v -14.000000 5.554706 13.314461 +v -14.000000 5.554706 18.685539 +v -14.000000 9.314461 22.445293 +v -17.000000 18.445293 18.685539 +v -17.000000 18.445293 13.314461 +v -17.000000 14.685539 9.554706 +v -17.000000 9.314461 9.554706 +v -17.000000 5.554706 13.314461 +v -17.000000 5.554706 18.685539 +v -17.000000 9.314461 22.445293 +v -17.000000 14.685539 22.445293 +v -14.000000 14.685539 22.445293 +v -14.000000 9.314461 9.554706 +v -14.000000 14.685539 9.554706 +v -14.000000 18.445293 18.685539 +v -17.000000 11.999998 16.000000 +v -12.000000 15.222648 23.734352 +v -12.000000 8.777352 23.734352 +v -12.000000 4.265646 19.222647 +v -12.000000 4.265646 12.777352 +v -14.000000 19.734352 19.222647 +v -14.000000 19.734352 12.777352 +v -14.000000 15.222648 8.265646 +v -14.000000 8.777352 8.265646 +v -14.000000 4.265646 12.777352 +v -14.000000 4.265646 19.222647 +v -14.000000 8.777352 23.734352 +v -14.000000 15.222648 23.734352 +v -12.000000 8.777352 8.265646 +v -12.000000 15.222648 8.265646 +v -12.000000 19.734352 12.777352 +v -12.000000 19.734352 19.222647 +v -14.000000 12.000000 16.000000 +v -12.000000 12.000000 15.999999 +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 +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 +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 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.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 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +usemtl wheels +s off +f 95/155/31 94/156/31 88/157/31 87/158/31 +f 97/159/32 89/160/32 90/161/32 +f 96/162/33 81/163/33 86/164/33 85/165/33 +f 93/166/34 96/162/34 85/165/34 92/167/34 +f 83/168/35 84/169/35 91/170/35 90/161/35 +f 94/156/36 82/171/36 89/160/36 88/157/36 +f 81/163/37 95/155/37 87/158/37 86/164/37 +f 84/169/38 93/166/38 92/167/38 91/170/38 +f 82/171/39 83/168/39 90/161/39 89/160/39 +f 83/168/40 82/171/40 94/156/40 95/155/40 81/163/40 96/162/40 93/166/40 84/169/40 +f 85/165/32 86/164/32 97/159/32 +f 97/159/32 88/157/32 89/160/32 +f 92/167/32 85/165/32 97/159/32 +f 91/170/32 92/167/32 97/159/32 +f 87/158/32 88/157/32 97/159/32 +f 90/161/32 91/170/32 97/159/32 +f 86/164/32 87/158/32 97/159/32 +f 115/172/40 101/173/40 110/174/40 +f 114/175/32 106/176/32 107/177/32 +f 104/178/31 111/179/31 110/174/31 105/180/31 +f 109/181/34 98/182/34 113/183/34 102/184/34 +f 105/180/36 110/174/36 101/173/36 106/176/36 +f 103/185/37 112/186/37 111/179/37 104/178/37 +f 102/184/33 113/183/33 112/186/33 103/185/33 +f 107/177/35 100/187/35 99/188/35 108/189/35 +f 108/189/38 99/188/38 98/182/38 109/181/38 +f 106/176/39 101/173/39 100/187/39 107/177/39 +f 108/189/32 114/175/32 107/177/32 +f 114/175/32 105/180/32 106/176/32 +f 103/185/32 114/175/32 102/184/32 +f 102/184/32 114/175/32 109/181/32 +f 114/175/32 104/178/32 105/180/32 +f 109/181/32 114/175/32 108/189/32 +f 103/185/32 104/178/32 114/175/32 +f 111/179/40 115/172/40 110/174/40 +f 98/182/40 115/172/40 113/183/40 +f 115/172/40 100/187/40 101/173/40 +f 113/183/40 115/172/40 112/186/40 +f 115/172/40 99/188/40 100/187/40 +f 112/186/40 115/172/40 111/179/40 +f 98/182/40 99/188/40 115/172/40 +f 130/190/31 122/191/31 123/192/31 129/193/31 +f 132/194/40 125/195/40 124/196/40 +f 131/197/33 120/198/33 121/199/33 116/200/33 +f 128/201/34 127/202/34 120/198/34 131/197/34 +f 118/203/35 125/195/35 126/204/35 119/205/35 +f 129/193/36 123/192/36 124/196/36 117/206/36 +f 116/200/37 121/199/37 122/191/37 130/190/37 +f 119/205/38 126/204/38 127/202/38 128/201/38 +f 117/206/39 124/196/39 125/195/39 118/203/39 +f 118/203/32 119/205/32 128/201/32 131/197/32 116/200/32 130/190/32 129/193/32 117/206/32 +f 120/198/40 132/194/40 121/199/40 +f 132/194/40 124/196/40 123/192/40 +f 127/202/40 132/194/40 120/198/40 +f 126/204/40 132/194/40 127/202/40 +f 122/191/40 132/194/40 123/192/40 +f 125/195/40 132/194/40 126/204/40 +f 121/199/40 132/194/40 122/191/40 +f 150/207/32 145/208/32 136/209/32 +f 149/210/40 142/211/40 141/212/40 +f 139/213/31 140/214/31 145/208/31 146/215/31 +f 144/216/34 137/217/34 148/218/34 133/219/34 +f 140/214/36 141/212/36 136/209/36 145/208/36 +f 138/220/37 139/213/37 146/215/37 147/221/37 +f 137/217/33 138/220/33 147/221/33 148/218/33 +f 142/211/35 143/222/35 134/223/35 135/224/35 +f 143/222/38 144/216/38 133/219/38 134/223/38 +f 141/212/39 142/211/39 135/224/39 136/209/39 +f 143/222/40 142/211/40 149/210/40 +f 149/210/40 141/212/40 140/214/40 +f 138/220/40 137/217/40 149/210/40 +f 137/217/40 144/216/40 149/210/40 +f 149/210/40 140/214/40 139/213/40 +f 144/216/40 143/222/40 149/210/40 +f 138/220/40 149/210/40 139/213/40 +f 146/215/32 145/208/32 150/207/32 +f 133/219/32 148/218/32 150/207/32 +f 150/207/32 136/209/32 135/224/32 +f 148/218/32 147/221/32 150/207/32 +f 150/207/32 135/224/32 134/223/32 +f 147/221/32 146/215/32 150/207/32 +f 133/219/32 150/207/32 134/223/32 +f 165/225/38 157/226/38 158/227/38 164/228/38 +f 167/229/32 160/230/32 159/231/32 +f 166/232/33 155/233/33 156/234/33 151/235/33 +f 163/236/37 162/237/37 155/233/37 166/232/37 +f 153/238/36 160/230/36 161/239/36 154/240/36 +f 164/228/35 158/227/35 159/231/35 152/241/35 +f 151/235/34 156/234/34 157/226/34 165/225/34 +f 154/240/31 161/239/31 162/237/31 163/236/31 +f 152/241/39 159/231/39 160/230/39 153/238/39 +f 153/238/40 154/240/40 163/236/40 166/232/40 151/235/40 165/225/40 164/228/40 152/241/40 +f 155/233/32 167/229/32 156/234/32 +f 167/229/32 159/231/32 158/227/32 +f 162/237/32 167/229/32 155/233/32 +f 161/239/32 167/229/32 162/237/32 +f 157/226/32 167/229/32 158/227/32 +f 160/230/32 167/229/32 161/239/32 +f 156/234/32 167/229/32 157/226/32 +f 185/242/40 180/243/40 171/244/40 +f 184/245/32 177/246/32 176/247/32 +f 174/248/38 175/249/38 180/243/38 181/250/38 +f 179/251/37 172/252/37 183/253/37 168/254/37 +f 175/249/35 176/247/35 171/244/35 180/243/35 +f 173/255/34 174/248/34 181/250/34 182/256/34 +f 172/252/33 173/255/33 182/256/33 183/253/33 +f 177/246/36 178/257/36 169/258/36 170/259/36 +f 178/257/31 179/251/31 168/254/31 169/258/31 +f 176/247/39 177/246/39 170/259/39 171/244/39 +f 178/257/32 177/246/32 184/245/32 +f 184/245/32 176/247/32 175/249/32 +f 173/255/32 172/252/32 184/245/32 +f 172/252/32 179/251/32 184/245/32 +f 184/245/32 175/249/32 174/248/32 +f 179/251/32 178/257/32 184/245/32 +f 173/255/32 184/245/32 174/248/32 +f 181/250/40 180/243/40 185/242/40 +f 168/254/40 183/253/40 185/242/40 +f 185/242/40 171/244/40 170/259/40 +f 183/253/40 182/256/40 185/242/40 +f 185/242/40 170/259/40 169/258/40 +f 182/256/40 181/250/40 185/242/40 +f 168/254/40 185/242/40 169/258/40 +f 200/260/38 199/261/38 193/262/38 192/263/38 +f 202/264/40 194/265/40 195/266/40 +f 201/267/33 186/268/33 191/269/33 190/270/33 +f 198/271/37 201/267/37 190/270/37 197/272/37 +f 188/273/36 189/274/36 196/275/36 195/266/36 +f 199/261/35 187/276/35 194/265/35 193/262/35 +f 186/268/34 200/260/34 192/263/34 191/269/34 +f 189/274/31 198/271/31 197/272/31 196/275/31 +f 187/276/39 188/273/39 195/266/39 194/265/39 +f 188/273/32 187/276/32 199/261/32 200/260/32 186/268/32 201/267/32 198/271/32 189/274/32 +f 190/270/40 191/269/40 202/264/40 +f 202/264/40 193/262/40 194/265/40 +f 197/272/40 190/270/40 202/264/40 +f 196/275/40 197/272/40 202/264/40 +f 192/263/40 193/262/40 202/264/40 +f 195/266/40 196/275/40 202/264/40 +f 191/269/40 192/263/40 202/264/40 +f 220/277/32 206/278/32 215/279/32 +f 219/280/40 211/281/40 212/282/40 +f 209/283/38 216/284/38 215/279/38 210/285/38 +f 214/286/37 203/287/37 218/288/37 207/289/37 +f 210/285/35 215/279/35 206/278/35 211/281/35 +f 208/290/34 217/291/34 216/284/34 209/283/34 +f 207/289/33 218/288/33 217/291/33 208/290/33 +f 212/282/36 205/292/36 204/293/36 213/294/36 +f 213/294/31 204/293/31 203/287/31 214/286/31 +f 211/281/39 206/278/39 205/292/39 212/282/39 +f 213/294/40 219/280/40 212/282/40 +f 219/280/40 210/285/40 211/281/40 +f 208/290/40 219/280/40 207/289/40 +f 207/289/40 219/280/40 214/286/40 +f 219/280/40 209/283/40 210/285/40 +f 214/286/40 219/280/40 213/294/40 +f 208/290/40 209/283/40 219/280/40 +f 216/284/32 220/277/32 215/279/32 +f 203/287/32 220/277/32 218/288/32 +f 220/277/32 205/292/32 206/278/32 +f 218/288/32 220/277/32 217/291/32 +f 220/277/32 204/293/32 205/292/32 +f 217/291/32 220/277/32 216/284/32 +f 203/287/32 204/293/32 220/277/32 +o Cube.009_Cube.023 +v 11.000000 12.000000 -21.656855 +v 11.000000 17.656855 -16.000000 +v 11.000000 6.343146 -16.000000 +v 11.000000 12.000000 -10.343145 +v 6.000000 12.000000 -21.656855 +v 6.000000 17.656855 -16.000000 +v 6.000000 6.343146 -16.000000 +v 6.000000 12.000000 -10.343145 +v -11.000000 12.000000 -21.656853 +v -11.000000 17.656853 -16.000000 +v -11.000000 6.343146 -16.000000 +v -11.000000 12.000000 -10.343146 +v -6.000000 12.000000 -21.656853 +v -6.000000 17.656853 -16.000000 +v -6.000000 6.343146 -16.000000 +v -6.000000 12.000000 -10.343146 +v 11.000000 12.000000 21.656853 +v 11.000000 17.656855 15.999998 +v 11.000000 6.343145 15.999998 +v 11.000000 12.000000 10.343143 +v 6.000000 12.000000 21.656853 +v 6.000000 17.656855 15.999998 +v 6.000000 6.343145 15.999998 +v 6.000000 12.000000 10.343143 +v -11.000000 12.000000 21.656853 +v -11.000000 17.656855 15.999998 +v -11.000000 6.343145 15.999998 +v -11.000000 12.000000 10.343143 +v -6.000000 12.000000 21.656853 +v -6.000000 17.656855 15.999998 +v -6.000000 6.343145 15.999998 +v -6.000000 12.000000 10.343143 +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 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.7071 0.7071 +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 +usemtl dark_iron +s off +f 221/295/41 222/296/41 224/297/41 223/298/41 +f 223/298/42 224/297/42 228/299/42 227/300/42 +f 227/300/43 228/299/43 226/301/43 225/302/43 +f 225/302/44 226/301/44 222/303/44 221/304/44 +f 223/305/45 227/300/45 225/302/45 221/306/45 +f 228/299/46 224/307/46 222/308/46 226/301/46 +f 229/309/43 231/310/43 232/311/43 230/312/43 +f 231/310/42 235/313/42 236/314/42 232/311/42 +f 235/313/41 233/315/41 234/316/41 236/314/41 +f 233/315/44 229/317/44 230/318/44 234/316/44 +f 231/319/45 229/320/45 233/315/45 235/313/45 +f 236/314/46 234/316/46 230/321/46 232/322/46 +f 237/323/41 239/324/41 240/325/41 238/326/41 +f 239/324/45 243/327/45 244/328/45 240/325/45 +f 243/327/43 241/329/43 242/330/43 244/328/43 +f 241/329/46 237/331/46 238/332/46 242/330/46 +f 239/333/42 237/334/42 241/329/42 243/327/42 +f 244/328/44 242/330/44 238/335/44 240/336/44 +f 245/337/43 246/338/43 248/339/43 247/340/43 +f 247/340/45 248/339/45 252/341/45 251/342/45 +f 251/342/41 252/341/41 250/343/41 249/344/41 +f 249/344/46 250/343/46 246/345/46 245/346/46 +f 247/347/42 251/342/42 249/344/42 245/348/42 +f 252/341/44 248/349/44 246/350/44 250/343/44 +o Cube.010_Cube.024 +v 6.500000 12.989949 -12.181623 +v 6.500000 15.818377 -15.010050 +v 10.500000 12.989949 -12.181623 +v 10.500000 15.818377 -15.010050 +v 6.500000 14.404163 -16.424263 +v 6.500000 11.575736 -13.595838 +v 10.500000 11.575736 -13.595838 +v 10.500000 14.404163 -16.424263 +v 6.500000 17.939695 -7.231875 +v 6.500000 20.768124 -10.060302 +v 10.500000 17.939695 -7.231875 +v 10.500000 20.768124 -10.060302 +v -6.500000 12.989949 -12.181623 +v -6.500000 15.818377 -15.010050 +v -10.500000 12.989949 -12.181623 +v -10.500000 15.818377 -15.010050 +v -6.500000 14.404163 -16.424263 +v -6.500000 11.575736 -13.595838 +v -10.500000 11.575736 -13.595838 +v -10.500000 14.404163 -16.424263 +v -6.500000 17.939695 -7.231875 +v -6.500000 20.768124 -10.060302 +v -10.500000 17.939695 -7.231875 +v -10.500000 20.768124 -10.060302 +v 6.500000 12.989949 12.181623 +v 6.500000 15.818377 15.010050 +v 10.500000 12.989949 12.181623 +v 10.500000 15.818377 15.010050 +v 6.500000 14.404163 16.424263 +v 6.500000 11.575736 13.595838 +v 10.500000 11.575736 13.595838 +v 10.500000 14.404163 16.424263 +v 6.500000 17.939695 7.231875 +v 6.500000 20.768124 10.060302 +v 10.500000 17.939695 7.231875 +v 10.500000 20.768124 10.060302 +v -6.500000 12.989949 12.181623 +v -6.500000 15.818377 15.010050 +v -10.500000 12.989949 12.181623 +v -10.500000 15.818377 15.010050 +v -6.500000 14.404163 16.424263 +v -6.500000 11.575736 13.595838 +v -10.500000 11.575736 13.595838 +v -10.500000 14.404163 16.424263 +v -6.500000 17.939695 7.231875 +v -6.500000 20.768124 10.060302 +v -10.500000 17.939695 7.231875 +v -10.500000 20.768124 10.060302 +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.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.7071 0.7071 +usemtl dark_iron +s off +f 256/351/47 255/352/47 259/353/47 260/354/47 +f 258/355/48 257/356/48 260/354/48 259/353/48 +f 255/352/49 253/357/49 258/358/49 259/353/49 +f 254/359/50 256/351/50 260/354/50 257/360/50 +f 253/361/51 254/362/51 257/356/51 258/355/51 +f 253/357/49 255/352/49 263/363/49 261/364/49 +f 261/364/52 263/363/52 264/365/52 262/366/52 +f 256/351/50 254/359/50 262/366/50 264/365/50 +f 254/362/51 253/361/51 261/367/51 262/368/51 +f 255/352/47 256/351/47 264/365/47 263/363/47 +f 268/369/51 272/370/51 271/371/51 267/372/51 +f 270/373/48 271/371/48 272/370/48 269/374/48 +f 267/372/49 271/371/49 270/375/49 265/376/49 +f 266/377/50 269/378/50 272/370/50 268/369/50 +f 265/379/47 270/373/47 269/374/47 266/380/47 +f 265/376/49 273/381/49 275/382/49 267/372/49 +f 273/381/52 274/383/52 276/384/52 275/382/52 +f 268/369/50 276/384/50 274/383/50 266/377/50 +f 266/380/47 274/385/47 273/386/47 265/379/47 +f 267/372/51 275/382/51 276/384/51 268/369/51 +f 280/387/47 284/388/47 283/389/47 279/390/47 +f 282/391/49 283/389/49 284/388/49 281/392/49 +f 279/390/48 283/389/48 282/393/48 277/394/48 +f 278/395/52 281/396/52 284/388/52 280/387/52 +f 277/397/51 282/391/51 281/392/51 278/398/51 +f 277/394/48 285/399/48 287/400/48 279/390/48 +f 285/399/50 286/401/50 288/402/50 287/400/50 +f 280/387/52 288/402/52 286/401/52 278/395/52 +f 278/398/51 286/403/51 285/404/51 277/397/51 +f 279/390/47 287/400/47 288/402/47 280/387/47 +f 292/405/51 291/406/51 295/407/51 296/408/51 +f 294/409/49 293/410/49 296/408/49 295/407/49 +f 291/406/48 289/411/48 294/412/48 295/407/48 +f 290/413/52 292/405/52 296/408/52 293/414/52 +f 289/415/47 290/416/47 293/410/47 294/409/47 +f 289/411/48 291/406/48 299/417/48 297/418/48 +f 297/418/50 299/417/50 300/419/50 298/420/50 +f 292/405/52 290/413/52 298/420/52 300/419/52 +f 290/416/47 289/415/47 297/421/47 298/422/47 +f 291/406/51 292/405/51 300/419/51 299/417/51 +o Axis +v 9.000001 13.500000 -1.500000 +v -8.999999 13.500000 -1.500000 +v -8.999999 13.500000 1.500000 +v 9.000001 13.500000 1.500000 +v 9.000001 10.500000 -1.500001 +v 9.000001 10.500000 1.499999 +v -8.999999 10.500000 -1.500001 +v -8.999999 10.500000 1.499999 +v 5.303301 19.424622 -1.499998 +v -7.424621 6.696700 -1.500002 +v -7.424621 6.696699 1.499998 +v 5.303301 19.424622 1.500002 +v 7.424622 17.303301 -1.499999 +v 7.424622 17.303301 1.500001 +v -5.303300 4.575379 -1.500003 +v -5.303300 4.575378 1.499997 +v 7.424622 6.696700 -1.500002 +v -5.303300 19.424622 -1.499998 +v -5.303300 19.424622 1.500002 +v 7.424622 6.696699 1.499998 +v 5.303301 4.575379 -1.500003 +v 5.303301 4.575378 1.499997 +v -7.424621 17.303301 -1.499999 +v -7.424621 17.303301 1.500001 +v 1.500001 21.000000 -1.499997 +v -1.499999 21.000000 -1.499997 +v -1.499999 21.000000 1.500003 +v 1.500001 21.000000 1.500003 +v 1.500001 3.000001 -1.500003 +v 1.500001 2.999999 1.499997 +v -1.499999 3.000001 -1.500003 +v -1.499999 2.999999 1.499997 +v 6.000000 18.000000 -0.999998 +v -6.000000 18.000000 -0.999998 +v -6.000000 18.000000 1.000002 +v 6.000000 18.000000 1.000002 +v 6.000000 6.000000 -1.000002 +v 6.000000 6.000000 0.999998 +v -6.000000 6.000000 -1.000002 +v -6.000000 6.000000 0.999998 +v 4.000000 16.000000 -1.999999 +v -3.999999 16.000000 -1.999999 +v -3.999999 15.999999 2.000001 +v 4.000000 15.999999 2.000001 +v 4.000000 8.000001 -2.000001 +v 4.000000 8.000000 1.999998 +v -3.999999 8.000001 -2.000001 +v -3.999999 8.000000 1.999998 +v 2.000001 10.000000 -9.000000 +v 2.000001 14.000000 -9.000000 +v -1.999999 10.000000 -8.999998 +v -1.999999 14.000000 -8.999998 +v -2.000005 10.000000 -11.999999 +v -2.000005 14.000000 -11.999999 +v 1.999995 10.000000 -12.000000 +v 1.999995 14.000000 -12.000000 +v 2.000001 10.000000 9.000000 +v 2.000001 14.000000 9.000002 +v -1.999999 10.000000 8.999996 +v -1.999999 14.000000 8.999998 +v -2.000005 10.000000 11.999998 +v -2.000005 14.000000 12.000000 +v 1.999995 10.000000 12.000000 +v 1.999995 14.000000 12.000002 +vt 0.437500 0.437500 +vt 1.000000 0.437500 +vt 1.000000 0.531250 +vt 0.437500 0.531250 +vt 0.343750 0.437500 +vt 0.343750 0.531250 +vt 0.437500 0.437500 +vt 1.000000 0.437500 +vt 1.000000 0.531250 +vt 0.437500 0.531250 +vt 0.343750 0.437500 +vt 0.343750 0.531250 +vt 1.000000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.531250 +vt 1.000000 0.531250 +vt 1.000000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.437500 +vt 1.000000 0.437500 +vt 1.000000 0.531250 +vt 0.437500 0.531250 +vt 0.343750 0.437500 +vt 0.343750 0.531250 +vt 0.437500 0.437500 +vt 1.000000 0.437500 +vt 1.000000 0.531250 +vt 0.437500 0.531250 +vt 0.343750 0.437500 +vt 0.343750 0.531250 +vt 1.000000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.531250 +vt 1.000000 0.531250 +vt 1.000000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.437500 +vt 1.000000 0.437500 +vt 1.000000 0.531250 +vt 0.437500 0.531250 +vt 0.343750 0.437500 +vt 0.343750 0.531250 +vt 0.437500 0.437500 +vt 1.000000 0.437500 +vt 1.000000 0.531250 +vt 0.437500 0.531250 +vt 0.343750 0.437500 +vt 0.343750 0.531250 +vt 1.000000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.531250 +vt 1.000000 0.531250 +vt 1.000000 0.625000 +vt 0.437500 0.625000 +vt 0.343750 0.437500 +vt 0.437500 0.437500 +vt 0.437500 0.531250 +vt 0.343750 0.531250 +vt 0.437500 0.437500 +vt 1.000000 0.437500 +vt 1.000000 0.531250 +vt 0.437500 0.531250 +vt 0.343750 0.437500 +vt 0.343750 0.531250 +vt 1.000000 0.437500 +vt 1.000000 0.531250 +vt 1.000000 0.625000 +vt 0.437500 0.625000 +vt 1.000000 0.531250 +vt 1.000000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.531250 +vt 0.000000 0.562500 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.562500 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.562500 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.562500 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.000000 0.625000 +vt 0.250000 0.625000 +vt 0.625000 0.625000 +vt 0.625000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.625000 +vt 0.625000 0.625000 +vt 0.625000 1.000000 +vt 0.250000 1.000000 +vt 0.000000 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.750000 +vt 0.000000 0.750000 +vt 0.250000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.750000 +vt 0.250000 0.750000 +vt 0.250000 1.000000 +vt 0.000000 1.000000 +vt 0.375000 0.875000 +vt 0.625000 0.875000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.375000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.375000 +vt 0.375000 1.000000 +vt 0.375000 0.875000 +vt 0.625000 0.875000 +vt 0.625000 1.000000 +vt 0.375000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.375000 +vt 0.375000 0.375000 +vt 0.375000 0.875000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.875000 +vt 0.375000 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.375000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.875000 +vt 0.375000 0.875000 +vt 0.375000 0.250000 +vt 0.375000 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.250000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.7071 0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.7071 -0.7071 -0.0000 +vn -0.7071 -0.7071 -0.0000 +usemtl wheels +s 1 +f 301/423/53 302/424/53 303/425/53 304/426/53 +f 305/427/54 301/423/54 304/426/54 306/428/54 +f 307/429/55 305/430/55 306/431/55 308/432/55 +f 302/433/56 307/429/56 308/432/56 303/434/56 +f 308/432/57 306/431/57 304/435/57 303/436/57 +f 302/437/58 301/438/58 305/439/58 307/440/58 +f 309/441/59 310/442/59 311/443/59 312/444/59 +f 313/445/60 309/441/60 312/444/60 314/446/60 +f 315/447/61 313/448/61 314/449/61 316/450/61 +f 310/451/62 315/447/62 316/450/62 311/452/62 +f 316/450/57 314/449/57 312/453/57 311/454/57 +f 310/455/58 309/456/58 313/457/58 315/458/58 +f 317/459/60 318/460/60 319/461/60 320/462/60 +f 321/463/61 317/459/61 320/462/61 322/464/61 +f 323/465/62 321/466/62 322/467/62 324/468/62 +f 318/469/59 323/465/59 324/468/59 319/470/59 +f 324/468/57 322/467/57 320/471/57 319/472/57 +f 318/473/58 317/474/58 321/475/58 323/476/58 +f 325/477/53 326/478/53 327/479/53 328/480/53 +f 329/481/54 325/482/54 328/483/54 330/484/54 +f 331/485/55 329/481/55 330/484/55 332/486/55 +f 326/478/56 331/487/56 332/488/56 327/479/56 +f 332/488/57 330/489/57 328/490/57 327/479/57 +f 326/491/58 325/492/58 329/493/58 331/494/58 +f 333/495/53 334/496/53 335/497/53 336/498/53 +f 337/499/54 333/500/54 336/501/54 338/502/54 +f 339/503/55 337/504/55 338/505/55 340/506/55 +f 334/507/56 339/508/56 340/509/56 335/510/56 +f 340/511/57 338/512/57 336/513/57 335/514/57 +f 334/515/58 333/516/58 337/517/58 339/518/58 +f 341/519/53 342/520/53 343/521/53 344/522/53 +f 345/523/54 341/524/54 344/525/54 346/526/54 +f 347/527/55 345/528/55 346/529/55 348/530/55 +f 342/531/56 347/532/56 348/533/56 343/534/56 +f 348/530/57 346/529/57 344/535/57 343/536/57 +f 342/537/58 341/538/58 345/539/58 347/540/58 +usemtl shaft +s off +f 355/541/54 356/542/54 350/543/54 349/544/54 +f 354/545/53 352/546/53 350/547/53 356/548/53 +f 351/549/55 353/550/55 355/551/55 349/552/55 +f 351/553/56 352/554/56 354/555/56 353/556/56 +f 363/557/54 357/558/54 358/559/54 364/560/54 +f 362/561/53 364/562/53 358/563/53 360/564/53 +f 359/565/55 357/566/55 363/567/55 361/568/55 +f 359/569/56 361/570/56 362/571/56 360/572/56 +o Cube.004_Cube.025 +v 18.999994 10.000000 13.999994 +v 18.999994 14.000000 13.999994 +v 18.999996 10.000000 17.999994 +v 18.999996 14.000000 17.999994 +v 2.999995 10.000000 18.000000 +v 2.999995 14.000000 18.000000 +v 2.999994 10.000000 14.000000 +v 2.999994 14.000000 14.000000 +v -18.999996 10.000000 13.999994 +v -18.999996 14.000000 13.999994 +v -18.999998 10.000000 17.999994 +v -18.999998 14.000000 17.999994 +v -2.999995 10.000000 18.000000 +v -2.999995 14.000000 18.000000 +v -2.999994 10.000000 14.000000 +v -2.999994 14.000000 14.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 +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 +usemtl shaft +s off +f 371/573/63 372/574/63 366/575/63 365/576/63 +f 370/577/64 368/578/64 366/579/64 372/580/64 +f 367/581/65 369/582/65 371/583/65 365/584/65 +f 367/585/66 368/586/66 370/587/66 369/588/66 +f 379/589/63 373/590/63 374/591/63 380/592/63 +f 378/593/64 380/594/64 374/595/64 376/596/64 +f 375/597/65 373/598/65 379/599/65 377/600/65 +f 375/601/66 377/602/66 378/603/66 376/604/66 +usemtl shaft_end +f 365/605/67 366/606/67 368/607/67 367/608/67 +f 373/609/68 375/610/68 376/611/68 374/612/68 diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_frame.json b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_frame.json new file mode 100644 index 000000000..ba9bdfba2 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_frame.json @@ -0,0 +1,12 @@ +{ + "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" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_frame.obj b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_frame.obj new file mode 100644 index 000000000..48b9fd047 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_frame.obj @@ -0,0 +1,457 @@ +# 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 diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_wheels.json b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_wheels.json new file mode 100644 index 000000000..44edcbbcc --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_wheels.json @@ -0,0 +1,12 @@ +{ + "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" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_wheels.obj b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_wheels.obj new file mode 100644 index 000000000..30dfd4360 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/kryppers_wheels.obj @@ -0,0 +1,306 @@ +# 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 diff --git a/src/main/resources/assets/create/models/block/track/bogey/old/wheels.json b/src/main/resources/assets/create/models/block/track/bogey/old/wheels.json new file mode 100644 index 000000000..05a420bcb --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/old/wheels.json @@ -0,0 +1,210 @@ +{ + "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] + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/textures.json b/src/main/resources/assets/create/models/block/track/bogey/textures.json new file mode 100644 index 000000000..e22d22f33 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/textures.json @@ -0,0 +1,14 @@ +{ + "parent": "block/block", + "ambientToFullbright": false, + "diffuseLighting": false, + "textures": { + "belt": "create:block/bogey/belt", + "bogey": "create:block/bogey/frame", + "bogey2": "create:block/bogey/frame2", + "piston": "create:block/bogey/piston", + "wheel": "create:block/bogey/wheel", + "axis": "create:block/axis", + "axis_top": "create:block/axis_top" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/bogey/top.json b/src/main/resources/assets/create/models/block/track/bogey/top.json new file mode 100644 index 000000000..bb4c5045d --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/bogey/top.json @@ -0,0 +1,39 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/track", + "3": "create:block/brass_block", + "particle": "create:block/bogey/particle" + }, + "elements": [ + { + "name": "anchor", + "from": [0, 7, 0], + "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"} + } + }, + { + "name": "bottom", + "from": [2, 5, 2], + "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"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/item.json b/src/main/resources/assets/create/models/block/track/item.json new file mode 100644 index 000000000..70775d41b --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/item.json @@ -0,0 +1,120 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube1", + "from": [0, 0.5, 19.75], + "to": [16, 4.5, 22], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [0.125, 7.375, 2.125, 7.875], "texture": "#0"}, + "east": {"uv": [6.5, 7.375, 6.75, 7.875], "texture": "#0"}, + "south": {"uv": [0.125, 7.375, 2.125, 7.875], "texture": "#0"}, + "west": {"uv": [6.5, 7.375, 6.75, 7.875], "texture": "#0"} + } + }, + { + "name": "cube2", + "from": [0, 0.5, -6.25], + "to": [16, 4.5, -4], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [0.125, 7.375, 2.125, 7.875], "texture": "#0"}, + "east": {"uv": [6.5, 7.375, 6.75, 7.875], "texture": "#0"}, + "south": {"uv": [0.125, 7.375, 2.125, 7.875], "texture": "#0"}, + "west": {"uv": [6.5, 7.375, 6.75, 7.875], "texture": "#0"} + } + }, + { + "name": "cube3", + "from": [2, -3.05, -10.95], + "to": [6, 1.05, 26.95], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "east": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "south": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "west": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube4", + "from": [0, 4.5, -6.9], + "to": [16, 4.5, 22.9], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "up": {"uv": [0, 2.125, 3.75, 4.125], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 4.125], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube5", + "from": [0, 0.5, -6.9], + "to": [16, 0.5, 22.9], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "up": {"uv": [0, 2.125, 3.75, 4.125], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 4.125], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube6", + "from": [10, -3.05, -10.95], + "to": [14, 1.05, 26.95], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "east": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "south": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "west": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "rotation": 270, "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [52.67, 16.36, -64.58], + "translation": [4, -1, 0.75], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [52.67, 16.36, -64.58], + "translation": [4, -1, 0.75], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [3, 82, 30], + "translation": [2, 2.75, 0.25], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [3, 82, 30], + "translation": [2, 2.75, 0.25], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 4.25, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0.25, 2.75, 0], + "scale": [0.49, 0.49, 0.49] + }, + "head": { + "translation": [0, 16.75, 0] + }, + "fixed": { + "rotation": [-90, 45, 0], + "translation": [0, 0, -4], + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/neg_diag.json b/src/main/resources/assets/create/models/block/track/neg_diag.json new file mode 100644 index 000000000..cfd7363b9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/neg_diag.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/neg_diag.obj", + "textures": { + "0": "create:block/track", + "particle": "create:block/palettes/stone_types/polished/andesite_cut_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/neg_diag.obj b/src/main/resources/assets/create/models/block/track/neg_diag.obj new file mode 100644 index 000000000..e899782fa --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/neg_diag.obj @@ -0,0 +1,253 @@ +# Made in Blockbench 4.1.1 +mtllib track.mtl + +o cube4 +v 1.803728127812697 0.34375 0.7872621298570349 +v 0.21273787014296497 0.34375 -0.8037281278126969 +v 1.803728127812697 0.34375 0.7872621298570349 +v 0.21273787014296497 0.34375 -0.8037281278126969 +v -0.8037281278126971 0.34375 0.21273787014296508 +v 0.787262129857035 0.34375 1.8037281278126969 +v -0.8037281278126971 0.34375 0.21273787014296508 +v 0.787262129857035 0.34375 1.8037281278126969 +vt 0 0.6875 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0 0.6875 +vt 0 0.8671875 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 6/4/1 1/3/1 2/2/1 5/1/1 +f 7/8/2 4/7/2 3/6/2 8/5/2 +o cube5 +v 1.803728127812697 0.09375 0.7872621298570349 +v 0.21273787014296497 0.09375 -0.8037281278126969 +v 1.803728127812697 0.09375 0.7872621298570349 +v 0.21273787014296497 0.09375 -0.8037281278126969 +v -0.8037281278126971 0.09375 0.21273787014296508 +v 0.787262129857035 0.09375 1.8037281278126969 +v -0.8037281278126971 0.09375 0.21273787014296508 +v 0.787262129857035 0.09375 1.8037281278126969 +vt 0 0.6875 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0 0.6875 +vt 0 0.8671875 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 14/12/3 9/11/3 10/10/3 13/9/3 +f 15/16/4 12/15/4 11/14/4 16/13/4 +o cube1 +v 1.7639533713709539 0.34375 0.7474873734152916 +v 1.6225320151336442 0.34375 0.606066017177982 +v 1.7639533713709539 0.09375 0.7474873734152916 +v 1.6225320151336442 0.09375 0.606066017177982 +v 0.6060660171779821 0.34375 1.6225320151336442 +v 0.7474873734152917 0.34375 1.7639533713709536 +v 0.6060660171779821 0.09375 1.6225320151336442 +v 0.7474873734152917 0.09375 1.7639533713709536 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vn -0.7071067811865476 0 -0.7071067811865475 +vn 0.7071067811865475 0 -0.7071067811865476 +vn 0.7071067811865476 0 0.7071067811865475 +vn -0.7071067811865475 0 0.7071067811865476 +usemtl m_0 +f 20/20/5 23/19/5 21/18/5 18/17/5 +f 19/24/6 20/23/6 18/22/6 17/21/6 +f 24/28/7 19/27/7 17/26/7 22/25/7 +f 23/32/8 24/31/8 22/30/8 21/29/8 +o cube2 +v 0.39393398282201786 0.34375 -0.6225320151336442 +v 0.2525126265847083 0.34375 -0.7639533713709536 +v 0.39393398282201786 0.09375 -0.6225320151336442 +v 0.2525126265847083 0.09375 -0.7639533713709536 +v -0.7639533713709539 0.34375 0.2525126265847084 +v -0.6225320151336442 0.34375 0.39393398282201786 +v -0.7639533713709539 0.09375 0.2525126265847084 +v -0.6225320151336442 0.09375 0.39393398282201786 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vn -0.7071067811865476 0 -0.7071067811865475 +vn 0.7071067811865475 0 -0.7071067811865476 +vn 0.7071067811865476 0 0.7071067811865475 +vn -0.7071067811865475 0 0.7071067811865476 +usemtl m_0 +f 28/36/9 31/35/9 29/34/9 26/33/9 +f 27/40/10 28/39/10 26/38/10 25/37/10 +f 32/44/11 27/43/11 25/42/11 30/41/11 +f 31/48/12 32/47/12 30/46/12 29/45/12 +o cube3 +v 1.2269941594074194 0.12812500000000004 1.7131300714731708 +v -0.7131300714731705 0.12812500000000004 -0.22699415940741896 +v 1.2269941594074194 -0.128125 1.7131300714731708 +v -0.7131300714731705 -0.128125 -0.22699415940741896 +v -0.8899067667698075 0.12812500000000004 -0.050217464110782206 +v 1.0502174641107827 0.12812500000000004 1.8899067667698075 +v -0.8899067667698075 -0.128125 -0.050217464110782206 +v 1.0502174641107827 -0.128125 1.8899067667698075 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0 0.96875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vt 0 0.921875 +vn -0.7071067811865476 0 -0.7071067811865475 +vn 0.7071067811865475 0 -0.7071067811865476 +vn 0.7071067811865476 0 0.7071067811865475 +vn -0.7071067811865475 0 0.7071067811865476 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 36/52/13 39/51/13 37/50/13 34/49/13 +f 35/56/14 36/55/14 34/54/14 33/53/14 +f 40/60/15 35/59/15 33/58/15 38/57/15 +f 39/64/16 40/63/16 38/62/16 37/61/16 +f 38/68/17 33/67/17 34/66/17 37/65/17 +f 39/72/18 36/71/18 35/70/18 40/69/18 +o cube6 +v 1.8899067667698075 0.12812500000000004 1.0502174641107824 +v -0.05021746411078243 0.12812500000000004 -0.8899067667698073 +v 1.8899067667698075 -0.128125 1.0502174641107824 +v -0.05021746411078243 -0.128125 -0.8899067667698073 +v -0.2269941594074193 0.12812500000000004 -0.7131300714731705 +v 1.7131300714731708 0.12812500000000004 1.2269941594074192 +v -0.2269941594074193 -0.128125 -0.7131300714731705 +v 1.7131300714731708 -0.128125 1.2269941594074192 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0 0.96875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vt 0 0.921875 +vn -0.7071067811865476 0 -0.7071067811865475 +vn 0.7071067811865475 0 -0.7071067811865476 +vn 0.7071067811865476 0 0.7071067811865475 +vn -0.7071067811865475 0 0.7071067811865476 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 44/76/19 47/75/19 45/74/19 42/73/19 +f 43/80/20 44/79/20 42/78/20 41/77/20 +f 48/84/21 43/83/21 41/82/21 46/81/21 +f 47/88/22 48/87/22 46/86/22 45/85/22 +f 46/92/23 41/91/23 42/90/23 45/89/23 +f 47/96/24 44/95/24 43/94/24 48/93/24 +o cube7 +v 1.5584504630886136 0.12812500000000004 1.3816737677919764 +v -0.3816737677919766 0.12812500000000004 -0.5584504630886131 +v 1.5584504630886136 -0.128125 1.3816737677919764 +v -0.3816737677919766 -0.128125 -0.5584504630886131 +v -0.5584504630886133 0.12812500000000004 -0.38167376779197626 +v 1.3816737677919766 0.12812500000000004 1.5584504630886133 +v -0.5584504630886133 -0.128125 -0.38167376779197626 +v 1.3816737677919766 -0.128125 1.5584504630886133 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0 0.96875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vt 0 0.921875 +vn -0.7071067811865476 0 -0.7071067811865475 +vn 0.7071067811865475 0 -0.7071067811865476 +vn 0.7071067811865476 0 0.7071067811865475 +vn -0.7071067811865475 0 0.7071067811865476 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 52/100/25 55/99/25 53/98/25 50/97/25 +f 51/104/26 52/103/26 50/102/26 49/101/26 +f 56/108/27 51/107/27 49/106/27 54/105/27 +f 55/112/28 56/111/28 54/110/28 53/109/28 +f 54/116/29 49/115/29 50/114/29 53/113/29 +f 55/120/30 52/119/30 51/118/30 56/117/30 \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/neg_diag_template.json b/src/main/resources/assets/create/models/block/track/neg_diag_template.json new file mode 100644 index 000000000..5baac8570 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/neg_diag_template.json @@ -0,0 +1,96 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [128, 128], + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube4", + "from": [4.5, 13.5, -2], + "to": [27.5, 13.5, 34], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 10, 16]}, + "faces": { + "up": {"uv": [0, 2.125, 3.75, 5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 5], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube5", + "from": [4.5, 9.5, -2], + "to": [27.5, 9.5, 34], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 10, 16]}, + "faces": { + "up": {"uv": [0, 2.125, 3.75, 5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 5], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube1", + "from": [4.5, 9.5, 29.9], + "to": [27.5, 13.5, 33.1], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 10, 16]}, + "faces": { + "north": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"}, + "east": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "south": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"}, + "west": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"} + } + }, + { + "name": "cube2", + "from": [4.5, 9.5, -1.1], + "to": [27.5, 13.5, 2.1], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 10, 16]}, + "faces": { + "north": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"}, + "east": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "south": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"}, + "west": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"} + } + }, + { + "name": "cube3", + "from": [6.5, 5.95, -5.95], + "to": [10.5, 10.05, 37.95], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 10, 16]}, + "faces": { + "north": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "east": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "south": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "west": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube6", + "from": [21.5, 5.95, -5.95], + "to": [25.5, 10.05, 37.95], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 10, 16]}, + "faces": { + "north": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "east": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "south": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "west": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube7", + "from": [14, 5.95, -5.95], + "to": [18, 10.05, 37.95], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 10, 16]}, + "faces": { + "north": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "east": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "south": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "west": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "rotation": 270, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/pos_diag.json b/src/main/resources/assets/create/models/block/track/pos_diag.json new file mode 100644 index 000000000..9e2159d6f --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/pos_diag.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/pos_diag.obj", + "textures": { + "0": "create:block/track", + "particle": "create:block/palettes/stone_types/polished/andesite_cut_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/pos_diag.obj b/src/main/resources/assets/create/models/block/track/pos_diag.obj new file mode 100644 index 000000000..f64e3b110 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/pos_diag.obj @@ -0,0 +1,253 @@ +# Made in Blockbench 4.1.1 +mtllib track.mtl + +o cube4 +v 1.8037281278126969 0.34375 0.21273787014296497 +v 0.7872621298570349 0.34375 -0.8037281278126971 +v 1.8037281278126969 0.34375 0.21273787014296497 +v 0.7872621298570349 0.34375 -0.8037281278126971 +v -0.8037281278126969 0.34375 0.787262129857035 +v 0.21273787014296508 0.34375 1.803728127812697 +v -0.8037281278126969 0.34375 0.787262129857035 +v 0.21273787014296508 0.34375 1.803728127812697 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0 0.6875 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0 0.6875 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 6/4/1 1/3/1 2/2/1 5/1/1 +f 7/8/2 4/7/2 3/6/2 8/5/2 +o cube5 +v 1.8037281278126969 0.09375 0.21273787014296497 +v 0.7872621298570349 0.09375 -0.8037281278126971 +v 1.8037281278126969 0.09375 0.21273787014296497 +v 0.7872621298570349 0.09375 -0.8037281278126971 +v -0.8037281278126969 0.09375 0.787262129857035 +v 0.21273787014296508 0.09375 1.803728127812697 +v -0.8037281278126969 0.09375 0.787262129857035 +v 0.21273787014296508 0.09375 1.803728127812697 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0 0.6875 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.6875 +vt 0 0.6875 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 14/12/3 9/11/3 10/10/3 13/9/3 +f 15/16/4 12/15/4 11/14/4 16/13/4 +o cube1 +v 1.7639533713709536 0.34375 0.2525126265847083 +v 0.7474873734152916 0.34375 -0.7639533713709539 +v 1.7639533713709536 0.09375 0.2525126265847083 +v 0.7474873734152916 0.09375 -0.7639533713709539 +v 0.606066017177982 0.34375 -0.6225320151336442 +v 1.6225320151336442 0.34375 0.39393398282201786 +v 0.606066017177982 0.09375 -0.6225320151336442 +v 1.6225320151336442 0.09375 0.39393398282201786 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vn -0.7071067811865476 0 -0.7071067811865475 +vn 0.7071067811865475 0 -0.7071067811865476 +vn 0.7071067811865476 0 0.7071067811865475 +vn -0.7071067811865475 0 0.7071067811865476 +usemtl m_0 +f 20/20/5 23/19/5 21/18/5 18/17/5 +f 19/24/6 20/23/6 18/22/6 17/21/6 +f 24/28/7 19/27/7 17/26/7 22/25/7 +f 23/32/8 24/31/8 22/30/8 21/29/8 +o cube2 +v 0.39393398282201786 0.34375 1.6225320151336442 +v -0.6225320151336442 0.34375 0.6060660171779821 +v 0.39393398282201786 0.09375 1.6225320151336442 +v -0.6225320151336442 0.09375 0.6060660171779821 +v -0.7639533713709536 0.34375 0.7474873734152917 +v 0.2525126265847084 0.34375 1.7639533713709539 +v -0.7639533713709536 0.09375 0.7474873734152917 +v 0.2525126265847084 0.09375 1.7639533713709539 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0.015625 0.5390625 +vt 0.1953125 0.5390625 +vt 0.1953125 0.5078125 +vt 0.015625 0.5078125 +vn -0.7071067811865476 0 -0.7071067811865475 +vn 0.7071067811865475 0 -0.7071067811865476 +vn 0.7071067811865476 0 0.7071067811865475 +vn -0.7071067811865475 0 0.7071067811865476 +usemtl m_0 +f 28/36/9 31/35/9 29/34/9 26/33/9 +f 27/40/10 28/39/10 26/38/10 25/37/10 +f 32/44/11 27/43/11 25/42/11 30/41/11 +f 31/48/12 32/47/12 30/46/12 29/45/12 +o cube3 +v 1.8899067667698075 0.12812500000000004 -0.05021746411078254 +v 1.7131300714731708 0.12812500000000004 -0.2269941594074194 +v 1.8899067667698075 -0.128125 -0.05021746411078254 +v 1.7131300714731708 -0.128125 -0.2269941594074194 +v -0.22699415940741896 0.12812500000000004 1.7131300714731705 +v -0.050217464110782206 0.12812500000000004 1.8899067667698075 +v -0.22699415940741896 -0.128125 1.7131300714731705 +v -0.050217464110782206 -0.128125 1.8899067667698075 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0 0.96875 +vt 0 0.921875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vn -0.7071067811865476 0 -0.7071067811865475 +vn 0.7071067811865475 0 -0.7071067811865476 +vn 0.7071067811865476 0 0.7071067811865475 +vn -0.7071067811865475 0 0.7071067811865476 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 36/52/13 39/51/13 37/50/13 34/49/13 +f 35/56/14 36/55/14 34/54/14 33/53/14 +f 40/60/15 35/59/15 33/58/15 38/57/15 +f 39/64/16 40/63/16 38/62/16 37/61/16 +f 38/68/17 33/67/17 34/66/17 37/65/17 +f 39/72/18 36/71/18 35/70/18 40/69/18 +o cube6 +v 1.2269941594074192 0.12812500000000004 -0.7131300714731708 +v 1.0502174641107824 0.12812500000000004 -0.8899067667698075 +v 1.2269941594074192 -0.128125 -0.7131300714731708 +v 1.0502174641107824 -0.128125 -0.8899067667698075 +v -0.8899067667698073 0.12812500000000004 1.0502174641107824 +v -0.7131300714731705 0.12812500000000004 1.2269941594074192 +v -0.8899067667698073 -0.128125 1.0502174641107824 +v -0.7131300714731705 -0.128125 1.2269941594074192 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0 0.96875 +vt 0 0.921875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vn -0.7071067811865476 0 -0.7071067811865475 +vn 0.7071067811865475 0 -0.7071067811865476 +vn 0.7071067811865476 0 0.7071067811865475 +vn -0.7071067811865475 0 0.7071067811865476 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 44/76/19 47/75/19 45/74/19 42/73/19 +f 43/80/20 44/79/20 42/78/20 41/77/20 +f 48/84/21 43/83/21 41/82/21 46/81/21 +f 47/88/22 48/87/22 46/86/22 45/85/22 +f 46/92/23 41/91/23 42/90/23 45/89/23 +f 47/96/24 44/95/24 43/94/24 48/93/24 +o cube7 +v 1.5584504630886133 0.12812500000000004 -0.3816737677919766 +v 1.3816737677919764 0.12812500000000004 -0.5584504630886136 +v 1.5584504630886133 -0.128125 -0.3816737677919766 +v 1.3816737677919764 -0.128125 -0.5584504630886136 +v -0.5584504630886131 0.12812500000000004 1.3816737677919766 +v -0.38167376779197626 0.12812500000000004 1.5584504630886133 +v -0.5584504630886131 -0.128125 1.3816737677919766 +v -0.38167376779197626 -0.128125 1.5584504630886133 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0 0.96875 +vt 0 0.921875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vn -0.7071067811865476 0 -0.7071067811865475 +vn 0.7071067811865475 0 -0.7071067811865476 +vn 0.7071067811865476 0 0.7071067811865475 +vn -0.7071067811865475 0 0.7071067811865476 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 52/100/25 55/99/25 53/98/25 50/97/25 +f 51/104/26 52/103/26 50/102/26 49/101/26 +f 56/108/27 51/107/27 49/106/27 54/105/27 +f 55/112/28 56/111/28 54/110/28 53/109/28 +f 54/116/29 49/115/29 50/114/29 53/113/29 +f 55/120/30 52/119/30 51/118/30 56/117/30 \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/pos_diag_template.json b/src/main/resources/assets/create/models/block/track/pos_diag_template.json new file mode 100644 index 000000000..39af01232 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/pos_diag_template.json @@ -0,0 +1,96 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [128, 128], + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube4", + "from": [-2, 13.5, 4.5], + "to": [34, 13.5, 27.5], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 11.5, 16]}, + "faces": { + "up": {"uv": [0, 2.125, 3.75, 5], "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 5], "texture": "#0"} + } + }, + { + "name": "cube5", + "from": [-2, 9.5, 4.5], + "to": [34, 9.5, 27.5], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 11.5, 16]}, + "faces": { + "up": {"uv": [0, 2.125, 3.75, 5], "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 5], "texture": "#0"} + } + }, + { + "name": "cube1", + "from": [29.9, 9.5, 4.5], + "to": [33.1, 13.5, 27.5], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 11.5, 16]}, + "faces": { + "north": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "east": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"}, + "south": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "west": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"} + } + }, + { + "name": "cube2", + "from": [-1.1, 9.5, 4.5], + "to": [2.1, 13.5, 27.5], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 11.5, 16]}, + "faces": { + "north": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "east": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"}, + "south": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "west": {"uv": [0.25, 7.375, 3.125, 7.875], "texture": "#0"} + } + }, + { + "name": "cube3", + "from": [-5.95, 5.95, 21.5], + "to": [37.95, 10.05, 25.5], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 8, 16]}, + "faces": { + "north": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "east": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "south": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "west": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "texture": "#0"} + } + }, + { + "name": "cube6", + "from": [-5.95, 5.95, 6.5], + "to": [37.95, 10.05, 10.5], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 8, 16]}, + "faces": { + "north": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "east": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "south": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "west": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "texture": "#0"} + } + }, + { + "name": "cube7", + "from": [-5.95, 5.95, 14], + "to": [37.95, 10.05, 18], + "rotation": {"angle": 45, "axis": "y", "origin": [16, 8, 16]}, + "faces": { + "north": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "east": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "south": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "west": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/segment_left.json b/src/main/resources/assets/create/models/block/track/segment_left.json new file mode 100644 index 000000000..cb6184e15 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/segment_left.json @@ -0,0 +1,38 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube2", + "from": [-1.6, 0.5, 0], + "to": [1.6, 4.5, 8], + "faces": { + "north": {"uv": [6.5, 7.375, 6.75, 7.875], "texture": "#0"}, + "east": {"uv": [0.375, 7.375, 1.375, 7.875], "texture": "#0"}, + "south": {"uv": [6.5, 7.375, 6.75, 7.875], "texture": "#0"}, + "west": {"uv": [0.375, 7.375, 1.375, 7.875], "texture": "#0"} + } + }, + { + "name": "cube4", + "from": [-2.25, 4.5, 0], + "to": [2.25, 4.5, 8], + "faces": { + "up": {"uv": [3.25, 2.125, 3.75, 3.125], "texture": "#0"}, + "down": {"uv": [3.25, 2.125, 3.75, 3.125], "texture": "#0"} + } + }, + { + "name": "cube5", + "from": [-2.25, 0.5, 0], + "to": [2.25, 0.5, 8], + "faces": { + "up": {"uv": [3.25, 2.125, 3.75, 3.125], "texture": "#0"}, + "down": {"uv": [3.25, 2.125, 3.75, 3.125], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/segment_right.json b/src/main/resources/assets/create/models/block/track/segment_right.json new file mode 100644 index 000000000..7150dd316 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/segment_right.json @@ -0,0 +1,41 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube2", + "from": [-1.6, 0.5, 0], + "to": [1.6, 4.5, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [6.75, 7.375, 6.5, 7.875], "texture": "#0"}, + "east": {"uv": [1.875, 7.375, 0.875, 7.875], "texture": "#0"}, + "south": {"uv": [6.75, 7.375, 6.5, 7.875], "texture": "#0"}, + "west": {"uv": [1.875, 7.375, 0.875, 7.875], "texture": "#0"} + } + }, + { + "name": "cube4", + "from": [-2.25, 4.5, 0], + "to": [2.25, 4.5, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "up": {"uv": [3.75, 2.125, 3.25, 3.125], "texture": "#0"}, + "down": {"uv": [3.75, 2.125, 3.25, 3.125], "texture": "#0"} + } + }, + { + "name": "cube5", + "from": [-2.25, 0.5, 0], + "to": [2.25, 0.5, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "up": {"uv": [3.75, 2.125, 3.25, 3.125], "texture": "#0"}, + "down": {"uv": [3.75, 2.125, 3.25, 3.125], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/station_overlay.json b/src/main/resources/assets/create/models/block/track/station_overlay.json new file mode 100644 index 000000000..c9f2240a7 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/station_overlay.json @@ -0,0 +1,36 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [128, 128], + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube5", + "from": [-14.05, -2.15, 9.9], + "to": [30.05, 2.15, 14.1], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [5.5, 0.625, 10.25, 1.125], "texture": "#0"}, + "east": {"uv": [10.375, 0.625, 10.875, 1.125], "texture": "#0"}, + "south": {"uv": [5.5, 0.625, 10.25, 1.125], "texture": "#0"}, + "west": {"uv": [10.375, 0.625, 10.875, 1.125], "texture": "#0"}, + "up": {"uv": [5.5, 0, 10.25, 0.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5.5, 1.25, 10.25, 1.75], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "cube6", + "from": [-14.05, -2.15, 1.9], + "to": [30.05, 2.15, 6.1], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [5.5, 3.125, 10.25, 3.625], "texture": "#0"}, + "south": {"uv": [5.5, 2.5, 10.25, 3], "texture": "#0"}, + "up": {"uv": [5.5, 1.875, 10.25, 2.375], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5.5, 3.75, 10.25, 4.25], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/station_overlay_ascending.json b/src/main/resources/assets/create/models/block/track/station_overlay_ascending.json new file mode 100644 index 000000000..da08ceeba --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/station_overlay_ascending.json @@ -0,0 +1,44 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [128, 128], + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube5", + "from": [-14.05, 4.85, 15.8], + "to": [30.05, 9.15, 20], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.5, 0.625, 10.25, 1.125], "texture": "#0"}, + "east": {"uv": [10.375, 0.625, 10.875, 1.125], "texture": "#0"}, + "south": {"uv": [5.5, 0.625, 10.25, 1.125], "texture": "#0"}, + "west": {"uv": [10.375, 0.625, 10.875, 1.125], "texture": "#0"}, + "up": {"uv": [5.5, 0, 10.25, 0.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5.5, 1.25, 10.25, 1.75], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "cube6", + "from": [-14.05, 4.85, 8.3], + "to": [30.05, 9.15, 12.5], + "rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 8]}, + "faces": { + "north": {"uv": [5.5, 3.125, 10.25, 3.625], "texture": "#0"}, + "south": {"uv": [5.5, 2.5, 10.25, 3], "texture": "#0"}, + "up": {"uv": [5.5, 1.875, 10.25, 2.375], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5.5, 3.75, 10.25, 4.25], "texture": "#0"} + } + } + ], + "groups": [ + { + "name": "station_overlay_diagonal", + "origin": [8, 8, 8], + "color": 0, + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/station_overlay_diagonal.json b/src/main/resources/assets/create/models/block/track/station_overlay_diagonal.json new file mode 100644 index 000000000..8ba49a6f1 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/station_overlay_diagonal.json @@ -0,0 +1,36 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [128, 128], + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube5", + "from": [-14.05, -2.15, 13.4], + "to": [30.05, 2.15, 17.6], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [5.5, 0.625, 10.25, 1.125], "texture": "#0"}, + "east": {"uv": [10.375, 0.625, 10.875, 1.125], "texture": "#0"}, + "south": {"uv": [5.5, 0.625, 10.25, 1.125], "texture": "#0"}, + "west": {"uv": [10.375, 0.625, 10.875, 1.125], "texture": "#0"}, + "up": {"uv": [5.5, 0, 10.25, 0.5], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5.5, 1.25, 10.25, 1.75], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "cube6", + "from": [-14.05, -2.15, 5.9], + "to": [30.05, 2.15, 10.1], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [5.5, 3.125, 10.25, 3.625], "texture": "#0"}, + "south": {"uv": [5.5, 2.5, 10.25, 3], "texture": "#0"}, + "up": {"uv": [5.5, 1.875, 10.25, 2.375], "rotation": 180, "texture": "#0"}, + "down": {"uv": [5.5, 3.75, 10.25, 4.25], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/tie.json b/src/main/resources/assets/create/models/block/track/tie.json new file mode 100644 index 000000000..a6bff83bb --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/tie.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube6", + "from": [-13.95, -3.05, 2], + "to": [29.95, 1.05, 6], + "faces": { + "north": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "east": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "south": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "west": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/track.mtl b/src/main/resources/assets/create/models/block/track/track.mtl new file mode 100644 index 000000000..651d8d657 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/track.mtl @@ -0,0 +1,4 @@ +# Made in Blockbench 4.1.1 +newmtl m_0 +map_Kd #0 +newmtl none \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/track.png b/src/main/resources/assets/create/models/block/track/track.png new file mode 100644 index 000000000..d9aed3768 Binary files /dev/null and b/src/main/resources/assets/create/models/block/track/track.png differ diff --git a/src/main/resources/assets/create/models/block/track/x_ortho.json b/src/main/resources/assets/create/models/block/track/x_ortho.json new file mode 100644 index 000000000..105959853 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/x_ortho.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/x_ortho.obj", + "textures": { + "0": "create:block/track", + "particle": "create:block/palettes/stone_types/polished/andesite_cut_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/x_ortho.obj b/src/main/resources/assets/create/models/block/track/x_ortho.obj new file mode 100644 index 000000000..5fbd40880 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/x_ortho.obj @@ -0,0 +1,255 @@ +# Made in Blockbench 4.1.1 +mtllib track.mtl + +o cube1 +v 1 0.34375 1.56875 +v 1 0.34375 1.36875 +v 1 0.09375 1.56875 +v 1 0.09375 1.36875 +v 0 0.34375 1.36875 +v 0 0.34375 1.56875 +v 0 0.09375 1.36875 +v 0 0.09375 1.56875 +vt 0 0.5390625 +vt 0.125 0.5390625 +vt 0.125 0.5078125 +vt 0 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0 0.5390625 +vt 0.125 0.5390625 +vt 0.125 0.5078125 +vt 0 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +usemtl m_0 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +o cube2 +v 1 0.34375 -0.36875 +v 1 0.34375 -0.5687500000000001 +v 1 0.09375 -0.36875 +v 1 0.09375 -0.5687500000000001 +v 0 0.34375 -0.5687500000000001 +v 0 0.34375 -0.36875 +v 0 0.09375 -0.5687500000000001 +v 0 0.09375 -0.36875 +vt 0 0.5390625 +vt 0.125 0.5390625 +vt 0.125 0.5078125 +vt 0 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0 0.5390625 +vt 0.125 0.5390625 +vt 0.125 0.5078125 +vt 0 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +usemtl m_0 +f 12/20/5 15/19/5 13/18/5 10/17/5 +f 11/24/6 12/23/6 10/22/6 9/21/6 +f 16/28/7 11/27/7 9/26/7 14/25/7 +f 15/32/8 16/31/8 14/30/8 13/29/8 +o cube3 +v 0.375 0.12812500000000004 1.8718750000000002 +v 0.375 0.12812500000000004 -0.8718750000000002 +v 0.375 -0.128125 1.8718750000000002 +v 0.375 -0.128125 -0.8718750000000002 +v 0.125 0.12812500000000004 -0.8718750000000002 +v 0.125 0.12812500000000004 1.8718750000000002 +v 0.125 -0.128125 -0.8718750000000002 +v 0.125 -0.128125 1.8718750000000002 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0 0.96875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vt 0 0.921875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 20/36/9 23/35/9 21/34/9 18/33/9 +f 19/40/10 20/39/10 18/38/10 17/37/10 +f 24/44/11 19/43/11 17/42/11 22/41/11 +f 23/48/12 24/47/12 22/46/12 21/45/12 +f 22/52/13 17/51/13 18/50/13 21/49/13 +f 23/56/14 20/55/14 19/54/14 24/53/14 +o cube4 +v 1 0.34375 1.625 +v 1 0.34375 -0.625 +v 1 0.34375 1.625 +v 1 0.34375 -0.625 +v 0 0.34375 -0.625 +v 0 0.34375 1.625 +v 0 0.34375 -0.625 +v 0 0.34375 1.625 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 0.7421875 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.7421875 +vt 0.234375 0.8671875 +vt 0.234375 0.7421875 +vt 0 0.7421875 +vt 0 0.8671875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 28/60/15 31/59/15 29/58/15 26/57/15 +f 27/64/16 28/63/16 26/62/16 25/61/16 +f 32/68/17 27/67/17 25/66/17 30/65/17 +f 31/72/18 32/71/18 30/70/18 29/69/18 +f 30/76/19 25/75/19 26/74/19 29/73/19 +f 31/80/20 28/79/20 27/78/20 32/77/20 +o cube5 +v 1 0.09375 1.625 +v 1 0.09375 -0.625 +v 1 0.09375 1.625 +v 1 0.09375 -0.625 +v 0 0.09375 -0.625 +v 0 0.09375 1.625 +v 0 0.09375 -0.625 +v 0 0.09375 1.625 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 0.7421875 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.7421875 +vt 0.234375 0.8671875 +vt 0.234375 0.7421875 +vt 0 0.7421875 +vt 0 0.8671875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 36/84/21 39/83/21 37/82/21 34/81/21 +f 35/88/22 36/87/22 34/86/22 33/85/22 +f 40/92/23 35/91/23 33/90/23 38/89/23 +f 39/96/24 40/95/24 38/94/24 37/93/24 +f 38/100/25 33/99/25 34/98/25 37/97/25 +f 39/104/26 36/103/26 35/102/26 40/101/26 +o cube6 +v 0.875 0.12812500000000004 1.8718750000000002 +v 0.875 0.12812500000000004 -0.8718750000000002 +v 0.875 -0.128125 1.8718750000000002 +v 0.875 -0.128125 -0.8718750000000002 +v 0.625 0.12812500000000004 -0.8718750000000002 +v 0.625 0.12812500000000004 1.8718750000000002 +v 0.625 -0.128125 -0.8718750000000002 +v 0.625 -0.128125 1.8718750000000002 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0 0.96875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vt 0 0.921875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 44/108/27 47/107/27 45/106/27 42/105/27 +f 43/112/28 44/111/28 42/110/28 41/109/28 +f 48/116/29 43/115/29 41/114/29 46/113/29 +f 47/120/30 48/119/30 46/118/30 45/117/30 +f 46/124/31 41/123/31 42/122/31 45/121/31 +f 47/128/32 44/127/32 43/126/32 48/125/32 \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/x_ortho_template.json b/src/main/resources/assets/create/models/block/track/x_ortho_template.json new file mode 100644 index 000000000..6607d5999 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/x_ortho_template.json @@ -0,0 +1,93 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube1", + "from": [8, 9.5, 29.9], + "to": [24, 13.5, 33.1], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [0, 7.375, 2, 7.875], "texture": "#0"}, + "east": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "south": {"uv": [0, 7.375, 2, 7.875], "texture": "#0"}, + "west": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube2", + "from": [8, 9.5, -1.1], + "to": [24, 13.5, 2.1], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [0, 7.375, 2, 7.875], "texture": "#0"}, + "east": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "south": {"uv": [0, 7.375, 2, 7.875], "texture": "#0"}, + "west": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube3", + "from": [10, 5.95, -5.95], + "to": [14, 10.05, 37.95], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "east": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "south": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "west": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube4", + "from": [8, 13.5, -2], + "to": [24, 13.5, 34], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "up": {"uv": [0, 2.125, 3.75, 4.125], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 4.125], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube5", + "from": [8, 9.5, -2], + "to": [24, 9.5, 34], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "up": {"uv": [0, 2.125, 3.75, 4.125], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 4.125], "rotation": 270, "texture": "#0"} + } + }, + { + "name": "cube6", + "from": [18, 5.95, -5.95], + "to": [22, 10.05, 37.95], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 10.33333, 16]}, + "faces": { + "north": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "east": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "south": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "west": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "rotation": 270, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/z_ortho.json b/src/main/resources/assets/create/models/block/track/z_ortho.json new file mode 100644 index 000000000..fe3dcba89 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/z_ortho.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "flip-v": true, + "model": "create:models/block/track/z_ortho.obj", + "textures": { + "0": "create:block/track", + "particle": "create:block/palettes/stone_types/polished/andesite_cut_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/z_ortho.obj b/src/main/resources/assets/create/models/block/track/z_ortho.obj new file mode 100644 index 000000000..3a9185bb9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/z_ortho.obj @@ -0,0 +1,255 @@ +# Made in Blockbench 4.1.1 +mtllib track.mtl + +o cube1 +v 1.56875 0.34375 1 +v 1.56875 0.34375 0 +v 1.56875 0.09375 1 +v 1.56875 0.09375 0 +v 1.36875 0.34375 0 +v 1.36875 0.34375 1 +v 1.36875 0.09375 0 +v 1.36875 0.09375 1 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0 0.5390625 +vt 0.125 0.5390625 +vt 0.125 0.5078125 +vt 0 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0 0.5390625 +vt 0.125 0.5390625 +vt 0.125 0.5078125 +vt 0 0.5078125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +usemtl m_0 +f 4/4/1 7/3/1 5/2/1 2/1/1 +f 3/8/2 4/7/2 2/6/2 1/5/2 +f 8/12/3 3/11/3 1/10/3 6/9/3 +f 7/16/4 8/15/4 6/14/4 5/13/4 +o cube2 +v -0.36875 0.34375 1 +v -0.36875 0.34375 0 +v -0.36875 0.09375 1 +v -0.36875 0.09375 0 +v -0.56875 0.34375 0 +v -0.56875 0.34375 1 +v -0.56875 0.09375 0 +v -0.56875 0.09375 1 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0 0.5390625 +vt 0.125 0.5390625 +vt 0.125 0.5078125 +vt 0 0.5078125 +vt 0.40625 0.5390625 +vt 0.4296875 0.5390625 +vt 0.4296875 0.5078125 +vt 0.40625 0.5078125 +vt 0 0.5390625 +vt 0.125 0.5390625 +vt 0.125 0.5078125 +vt 0 0.5078125 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +usemtl m_0 +f 12/20/5 15/19/5 13/18/5 10/17/5 +f 11/24/6 12/23/6 10/22/6 9/21/6 +f 16/28/7 11/27/7 9/26/7 14/25/7 +f 15/32/8 16/31/8 14/30/8 13/29/8 +o cube3 +v 1.8718750000000002 0.12812500000000004 0.875 +v 1.8718750000000002 0.12812500000000004 0.625 +v 1.8718750000000002 -0.128125 0.875 +v 1.8718750000000002 -0.128125 0.625 +v -0.871875 0.12812500000000004 0.625 +v -0.871875 0.12812500000000004 0.875 +v -0.871875 -0.128125 0.625 +v -0.871875 -0.128125 0.875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0 0.96875 +vt 0 0.921875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 20/36/9 23/35/9 21/34/9 18/33/9 +f 19/40/10 20/39/10 18/38/10 17/37/10 +f 24/44/11 19/43/11 17/42/11 22/41/11 +f 23/48/12 24/47/12 22/46/12 21/45/12 +f 22/52/13 17/51/13 18/50/13 21/49/13 +f 23/56/14 20/55/14 19/54/14 24/53/14 +o cube4 +v 1.625 0.34375 1 +v 1.625 0.34375 0 +v 1.625 0.34375 1 +v 1.625 0.34375 0 +v -0.625 0.34375 0 +v -0.625 0.34375 1 +v -0.625 0.34375 0 +v -0.625 0.34375 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.7421875 +vt 0 0.7421875 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.7421875 +vt 0 0.7421875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 28/60/15 31/59/15 29/58/15 26/57/15 +f 27/64/16 28/63/16 26/62/16 25/61/16 +f 32/68/17 27/67/17 25/66/17 30/65/17 +f 31/72/18 32/71/18 30/70/18 29/69/18 +f 30/76/19 25/75/19 26/74/19 29/73/19 +f 31/80/20 28/79/20 27/78/20 32/77/20 +o cube5 +v 1.625 0.09375 1 +v 1.625 0.09375 0 +v 1.625 0.09375 1 +v 1.625 0.09375 0 +v -0.625 0.09375 0 +v -0.625 0.09375 1 +v -0.625 0.09375 0 +v -0.625 0.09375 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 1 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.7421875 +vt 0 0.7421875 +vt 0 0.8671875 +vt 0.234375 0.8671875 +vt 0.234375 0.7421875 +vt 0 0.7421875 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 36/84/21 39/83/21 37/82/21 34/81/21 +f 35/88/22 36/87/22 34/86/22 33/85/22 +f 40/92/23 35/91/23 33/90/23 38/89/23 +f 39/96/24 40/95/24 38/94/24 37/93/24 +f 38/100/25 33/99/25 34/98/25 37/97/25 +f 39/104/26 36/103/26 35/102/26 40/101/26 +o cube6 +v 1.8718750000000002 0.12812500000000004 0.375 +v 1.8718750000000002 0.12812500000000004 0.125 +v 1.8718750000000002 -0.128125 0.375 +v 1.8718750000000002 -0.128125 0.125 +v -0.871875 0.12812500000000004 0.125 +v -0.871875 0.12812500000000004 0.375 +v -0.871875 -0.128125 0.125 +v -0.871875 -0.128125 0.375 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 0.9609375 +vt 0.296875 0.9609375 +vt 0.296875 0.9296875 +vt 0 0.9296875 +vt 0.3046875 0.9609375 +vt 0.3359375 0.9609375 +vt 0.3359375 0.9296875 +vt 0.3046875 0.9296875 +vt 0 1 +vt 0.296875 1 +vt 0.296875 0.96875 +vt 0 0.96875 +vt 0 0.921875 +vt 0.296875 0.921875 +vt 0.296875 0.890625 +vt 0 0.890625 +vn 0 0 -1 +vn 1 0 0 +vn 0 0 1 +vn -1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl m_0 +f 44/108/27 47/107/27 45/106/27 42/105/27 +f 43/112/28 44/111/28 42/110/28 41/109/28 +f 48/116/29 43/115/29 41/114/29 46/113/29 +f 47/120/30 48/119/30 46/118/30 45/117/30 +f 46/124/31 41/123/31 42/122/31 45/121/31 +f 47/128/32 44/127/32 43/126/32 48/125/32 \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track/z_ortho_template.json b/src/main/resources/assets/create/models/block/track/z_ortho_template.json new file mode 100644 index 000000000..c015a5b02 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track/z_ortho_template.json @@ -0,0 +1,87 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/track", + "particle": "create:block/track" + }, + "elements": [ + { + "name": "cube1", + "from": [29.9, 9.5, 8], + "to": [33.1, 13.5, 24], + "faces": { + "north": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "east": {"uv": [0, 7.375, 2, 7.875], "texture": "#0"}, + "south": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "west": {"uv": [0, 7.375, 2, 7.875], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#0"} + } + }, + { + "name": "cube2", + "from": [-1.1, 9.5, 8], + "to": [2.1, 13.5, 24], + "faces": { + "north": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "east": {"uv": [0, 7.375, 2, 7.875], "texture": "#0"}, + "south": {"uv": [6.5, 7.375, 6.875, 7.875], "texture": "#0"}, + "west": {"uv": [0, 7.375, 2, 7.875], "texture": "#0"}, + "up": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#0"} + } + }, + { + "name": "cube3", + "from": [-5.95, 5.95, 18], + "to": [37.95, 10.05, 22], + "faces": { + "north": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "east": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "south": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "west": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "texture": "#0"} + } + }, + { + "name": "cube4", + "from": [-2, 13.5, 8], + "to": [34, 13.5, 24], + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "up": {"uv": [0, 2.125, 3.75, 4.125], "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 4.125], "texture": "#0"} + } + }, + { + "name": "cube5", + "from": [-2, 9.5, 8], + "to": [34, 9.5, 24], + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#0"}, + "up": {"uv": [0, 2.125, 3.75, 4.125], "texture": "#0"}, + "down": {"uv": [0, 2.125, 3.75, 4.125], "texture": "#0"} + } + }, + { + "name": "cube6", + "from": [-5.95, 5.95, 10], + "to": [37.95, 10.05, 14], + "faces": { + "north": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "east": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "south": {"uv": [0, 0.625, 4.75, 1.125], "texture": "#0"}, + "west": {"uv": [4.875, 0.625, 5.375, 1.125], "texture": "#0"}, + "up": {"uv": [0, 0, 4.75, 0.5], "texture": "#0"}, + "down": {"uv": [0, 1.25, 4.75, 1.75], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track_station/block.json b/src/main/resources/assets/create/models/block/track_station/block.json new file mode 100644 index 000000000..7e512a456 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track_station/block.json @@ -0,0 +1,185 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "texture_size": [32, 32], + "textures": { + "0": "create:block/train_workstation_base", + "1": "create:block/train_station", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "name": "Workstation_base", + "from": [0, 0, 0], + "to": [16, 5, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-0.5, 0, 0]}, + "faces": { + "north": {"uv": [0, 8, 8, 10.5], "texture": "#0"}, + "east": {"uv": [0, 8, 8, 10.5], "texture": "#0"}, + "south": {"uv": [0, 8, 8, 10.5], "texture": "#0"}, + "west": {"uv": [0, 8, 8, 10.5], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#0"} + } + }, + { + "name": "top", + "from": [3, 6, 8], + "to": [4, 7, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 1.5, -1]}, + "faces": { + "north": {"uv": [0.5, 6.5, 1, 7], "texture": "#1"}, + "east": {"uv": [0.5, 6.5, 1, 7], "texture": "#1"}, + "south": {"uv": [0.5, 6.5, 1, 7], "texture": "#1"}, + "west": {"uv": [0.5, 6.5, 1, 7], "texture": "#1"}, + "up": {"uv": [0.5, 6.5, 1, 7], "texture": "#1"}, + "down": {"uv": [0.5, 6.5, 1, 7], "texture": "#1"} + } + }, + { + "name": "ink_vial", + "from": [2, 5, 7], + "to": [5, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [0.5, 1, -1.5]}, + "faces": { + "north": {"uv": [3.5, 8.5, 5, 9], "texture": "#1"}, + "east": {"uv": [3.5, 8.5, 5, 9], "texture": "#1"}, + "south": {"uv": [3.5, 8.5, 5, 9], "texture": "#1"}, + "west": {"uv": [3.5, 8.5, 5, 9], "texture": "#1"}, + "up": {"uv": [3.5, 8.5, 5, 10], "texture": "#1"}, + "down": {"uv": [3.5, 8.5, 5, 10], "texture": "#1"} + } + }, + { + "name": "Paper", + "from": [5.5, 5.1, 3.75], + "to": [12.5, 5.1, 12.75], + "rotation": {"angle": -45, "axis": "y", "origin": [7.5, 7, 11]}, + "faces": { + "up": {"uv": [0, 5.5, 3.5, 10], "texture": "#1"}, + "down": {"uv": [0, 5.5, 3.5, 10], "texture": "#1"} + } + }, + { + "name": "pen2", + "from": [3.25, 6.75, 8], + "to": [3.25, 10.75, 9], + "rotation": {"angle": 22.5, "axis": "z", "origin": [4, 7.5, 8.5]}, + "faces": { + "east": {"uv": [5, 8, 5.5, 10], "texture": "#1"}, + "west": {"uv": [5, 8, 5.5, 10], "texture": "#1"} + } + }, + { + "name": "pen1", + "from": [2.75, 6.75, 8.5], + "to": [3.75, 10.75, 8.5], + "rotation": {"angle": 22.5, "axis": "z", "origin": [4, 7.5, 8.5]}, + "faces": { + "north": {"uv": [5, 8, 5.5, 10], "texture": "#1"}, + "south": {"uv": [5, 8, 5.5, 10], "texture": "#1"} + } + }, + { + "name": "cabinet", + "from": [2, 5, 0], + "to": [14, 16, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -2]}, + "faces": { + "north": {"uv": [6, 0, 12, 5.5], "texture": "#1"}, + "east": {"uv": [12, 0, 14, 5.5], "texture": "#1"}, + "south": {"uv": [0, 0, 6, 5.5], "texture": "#1"}, + "west": {"uv": [12, 0, 14, 5.5], "texture": "#1"}, + "up": {"uv": [6, 5.5, 12, 7.5], "texture": "#1"} + } + }, + { + "name": "scroll1", + "from": [4, 6, 3], + "to": [6, 8, 6], + "rotation": {"angle": -22.5, "axis": "y", "origin": [5, 7, 4]}, + "faces": { + "north": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "east": {"uv": [4, 5.5, 5.5, 6.5], "texture": "#1"}, + "south": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "west": {"uv": [3.5, 5.5, 5, 6.5], "texture": "#1"}, + "up": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "scroll2", + "from": [4, 11.5, 2.5], + "to": [6, 13.5, 5.5], + "rotation": {"angle": -22.5, "axis": "z", "origin": [5, 12.5, 2]}, + "faces": { + "north": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "east": {"uv": [4, 5.5, 5.5, 6.5], "texture": "#1"}, + "south": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "west": {"uv": [3.5, 5.5, 5, 6.5], "texture": "#1"}, + "up": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "scroll3", + "from": [10, 10.75, 2.25], + "to": [12, 12.75, 5.25], + "rotation": {"angle": -22.5, "axis": "x", "origin": [11, 12.5, 2]}, + "faces": { + "north": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "east": {"uv": [4, 5.5, 5.5, 6.5], "texture": "#1"}, + "south": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "west": {"uv": [3.5, 5.5, 5, 6.5], "texture": "#1"}, + "up": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 45, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + { + "name": "Desk_toppings", + "origin": [0, 0, 0], + "color": 0, + "children": [1, 2, 3, 4, 5] + }, + { + "name": "Cabinet_toppings", + "origin": [8, 8, 8], + "color": 0, + "children": [6, 7, 8, 9] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/track_station/block_assembling.json b/src/main/resources/assets/create/models/block/track_station/block_assembling.json new file mode 100644 index 000000000..5eb22e073 --- /dev/null +++ b/src/main/resources/assets/create/models/block/track_station/block_assembling.json @@ -0,0 +1,137 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "texture_size": [32, 32], + "textures": { + "0": "create:block/train_workstation_base", + "1": "create:block/train_station", + "particle": "create:block/brass_casing" + }, + "elements": [ + { + "name": "Workstation_base", + "from": [0, 0, 0], + "to": [16, 5, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [-0.5, 0, 0]}, + "faces": { + "north": {"uv": [0, 8, 8, 10.5], "texture": "#0"}, + "east": {"uv": [0, 8, 8, 10.5], "texture": "#0"}, + "south": {"uv": [0, 8, 8, 10.5], "texture": "#0"}, + "west": {"uv": [0, 8, 8, 10.5], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [0, 0, 8, 8], "texture": "#0"} + } + }, + { + "name": "Paper", + "from": [0.75, 5.1, 6], + "to": [14.75, 5.1, 14], + "rotation": {"angle": -22.5, "axis": "y", "origin": [7.5, 7, 11]}, + "faces": { + "west": {"uv": [0, 0, 0, 0], "texture": "#1"}, + "up": {"uv": [1, 11, 8, 15], "texture": "#1"} + } + }, + { + "name": "cabinet", + "from": [2, 5, 0], + "to": [14, 16, 4], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, -2]}, + "faces": { + "north": {"uv": [6, 0, 12, 5.5], "texture": "#1"}, + "east": {"uv": [12, 0, 14, 5.5], "texture": "#1"}, + "south": {"uv": [0, 0, 6, 5.5], "texture": "#1"}, + "west": {"uv": [12, 0, 14, 5.5], "texture": "#1"}, + "up": {"uv": [6, 5.5, 12, 7.5], "texture": "#1"} + } + }, + { + "name": "scroll1", + "from": [4, 6, 3], + "to": [6, 8, 6], + "rotation": {"angle": -22.5, "axis": "y", "origin": [5, 7, 4]}, + "faces": { + "north": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "east": {"uv": [4, 5.5, 5.5, 6.5], "texture": "#1"}, + "south": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "west": {"uv": [3.5, 5.5, 5, 6.5], "texture": "#1"}, + "up": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "scroll2", + "from": [4, 11.5, 2.5], + "to": [6, 13.5, 5.5], + "rotation": {"angle": -22.5, "axis": "z", "origin": [5, 12.5, 2]}, + "faces": { + "north": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "east": {"uv": [4, 5.5, 5.5, 6.5], "texture": "#1"}, + "south": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "west": {"uv": [3.5, 5.5, 5, 6.5], "texture": "#1"}, + "up": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"} + } + }, + { + "name": "scroll3", + "from": [10, 10.75, 2.25], + "to": [12, 12.75, 5.25], + "rotation": {"angle": -22.5, "axis": "x", "origin": [11, 12.5, 2]}, + "faces": { + "north": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "east": {"uv": [4, 5.5, 5.5, 6.5], "texture": "#1"}, + "south": {"uv": [5, 5.5, 6, 6.5], "texture": "#1"}, + "west": {"uv": [3.5, 5.5, 5, 6.5], "texture": "#1"}, + "up": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [4, 5.5, 5.5, 6.5], "rotation": 90, "texture": "#1"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 45, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + 0, + { + "name": "Desk_toppings", + "origin": [0, 0, 0], + "color": 0, + "children": [1] + }, + { + "name": "Cabinet_toppings", + "origin": [8, 8, 8], + "color": 0, + "children": [2, 3, 4, 5] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/bogey/belt.png b/src/main/resources/assets/create/textures/block/bogey/belt.png new file mode 100644 index 000000000..9d07a67ac Binary files /dev/null and b/src/main/resources/assets/create/textures/block/bogey/belt.png differ diff --git a/src/main/resources/assets/create/textures/block/bogey/frame.png b/src/main/resources/assets/create/textures/block/bogey/frame.png new file mode 100644 index 000000000..240efd082 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/bogey/frame.png differ diff --git a/src/main/resources/assets/create/textures/block/bogey/frame2.png b/src/main/resources/assets/create/textures/block/bogey/frame2.png new file mode 100644 index 000000000..a1ef4ac14 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/bogey/frame2.png differ diff --git a/src/main/resources/assets/create/textures/block/bogey/particle.png b/src/main/resources/assets/create/textures/block/bogey/particle.png new file mode 100644 index 000000000..681d13ef5 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/bogey/particle.png differ diff --git a/src/main/resources/assets/create/textures/block/bogey/piston.png b/src/main/resources/assets/create/textures/block/bogey/piston.png new file mode 100644 index 000000000..9f89c6504 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/bogey/piston.png differ diff --git a/src/main/resources/assets/create/textures/block/bogey/wheel.png b/src/main/resources/assets/create/textures/block/bogey/wheel.png new file mode 100644 index 000000000..61d09d1e3 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/bogey/wheel.png differ diff --git a/src/main/resources/assets/create/textures/block/track.png b/src/main/resources/assets/create/textures/block/track.png new file mode 100644 index 000000000..e95ba63b5 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/track.png differ diff --git a/src/main/resources/assets/create/textures/block/train_station.png b/src/main/resources/assets/create/textures/block/train_station.png new file mode 100644 index 000000000..a750b4d83 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/train_station.png differ diff --git a/src/main/resources/assets/create/textures/block/train_workstation_base.png b/src/main/resources/assets/create/textures/block/train_workstation_base.png new file mode 100644 index 000000000..da6448cf8 Binary files /dev/null and b/src/main/resources/assets/create/textures/block/train_workstation_base.png differ diff --git a/src/main/resources/assets/create/textures/gui/assemble.png b/src/main/resources/assets/create/textures/gui/assemble.png new file mode 100644 index 000000000..20248dd75 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/assemble.png differ diff --git a/src/main/resources/assets/create/textures/gui/edit_condition.pdn b/src/main/resources/assets/create/textures/gui/edit_condition.pdn new file mode 100644 index 000000000..b6ec2c9a8 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/edit_condition.pdn differ diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index dbe7b52ca..b45cffa31 100644 Binary files a/src/main/resources/assets/create/textures/gui/icons.png and b/src/main/resources/assets/create/textures/gui/icons.png differ diff --git a/src/main/resources/assets/create/textures/gui/schedule.pdn b/src/main/resources/assets/create/textures/gui/schedule.pdn new file mode 100644 index 000000000..e7a90a5e3 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/schedule.pdn differ diff --git a/src/main/resources/assets/create/textures/gui/schedule.png b/src/main/resources/assets/create/textures/gui/schedule.png new file mode 100644 index 000000000..ef7060900 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/schedule.png differ diff --git a/src/main/resources/assets/create/textures/gui/schedule_2.png b/src/main/resources/assets/create/textures/gui/schedule_2.png new file mode 100644 index 000000000..fc0a0f6a2 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/schedule_2.png differ diff --git a/src/main/resources/assets/create/textures/gui/station.pdn b/src/main/resources/assets/create/textures/gui/station.pdn new file mode 100644 index 000000000..b70bd961a Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/station.pdn differ diff --git a/src/main/resources/assets/create/textures/gui/station_assembly.pdn b/src/main/resources/assets/create/textures/gui/station_assembly.pdn new file mode 100644 index 000000000..b26cb90d0 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/station_assembly.pdn differ diff --git a/src/main/resources/assets/create/textures/item/schedule.png b/src/main/resources/assets/create/textures/item/schedule.png new file mode 100644 index 000000000..65f4858c8 Binary files /dev/null and b/src/main/resources/assets/create/textures/item/schedule.png differ diff --git a/src/main/resources/assets/create/textures/item/track.png b/src/main/resources/assets/create/textures/item/track.png new file mode 100644 index 000000000..ad4696de5 Binary files /dev/null and b/src/main/resources/assets/create/textures/item/track.png differ