Subcreatica, Part II

- Diving helmets now display a timer near the hotbar when underwater
- Copper backtanks now play an effect when accumulated air is maxed
- Copper backtank blocks can now be waterlogged
- Copper backtank cogs now animate
- Fixed subtitle of equip sounds
This commit is contained in:
simibubi 2021-05-04 18:04:00 +02:00
parent 3c4e504f61
commit b38dd90431
31 changed files with 445 additions and 185 deletions

View file

@ -53,7 +53,7 @@ b59324f051f21d8ce1a48a08f4721a61a3c414d6 assets/create/blockstates/chute.json
e5e3757e99c139d67b2a70288466d8a74d818841 assets/create/blockstates/cogwheel.json e5e3757e99c139d67b2a70288466d8a74d818841 assets/create/blockstates/cogwheel.json
36f54136a7756c97f71bc6b47ef4e8e575e72879 assets/create/blockstates/content_observer.json 36f54136a7756c97f71bc6b47ef4e8e575e72879 assets/create/blockstates/content_observer.json
cfea7283f0ebd2432d67e80a523f2a12e24c0bd5 assets/create/blockstates/controller_rail.json cfea7283f0ebd2432d67e80a523f2a12e24c0bd5 assets/create/blockstates/controller_rail.json
2a956df55577ce02384af372a15f41ec626b84b0 assets/create/blockstates/copper_backtank.json 961b615124ea9a5a5735e8a79f81a702de7da2cf assets/create/blockstates/copper_backtank.json
f8eff64c75fc599e9a44a003f54ae9931cd8ce7c assets/create/blockstates/copper_block.json f8eff64c75fc599e9a44a003f54ae9931cd8ce7c assets/create/blockstates/copper_block.json
cabf6b8c59eb0e3d56a0a5a856ca058bb3200882 assets/create/blockstates/copper_casing.json cabf6b8c59eb0e3d56a0a5a856ca058bb3200882 assets/create/blockstates/copper_casing.json
3355a852cdc717e257ca19b3db836068964733e3 assets/create/blockstates/copper_ore.json 3355a852cdc717e257ca19b3db836068964733e3 assets/create/blockstates/copper_ore.json
@ -408,20 +408,20 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
a6d814f94926d88764c38862cc4ece9c367e023b assets/create/lang/en_ud.json a6d814f94926d88764c38862cc4ece9c367e023b assets/create/lang/en_ud.json
80e3112fe5ab12a9bbe7c272ab50904eee351f44 assets/create/lang/en_us.json 95f238e0df097f74a7845a58a02d27c3989305ce assets/create/lang/en_us.json
9b8c1f501cb57098f3ac67c8fd4532246a0c59bb assets/create/lang/unfinished/de_de.json e03638c344f9f80f5cee92c5e4ce4986478e65a5 assets/create/lang/unfinished/de_de.json
9d0482aa7a410bdb9b44bb7c1e24bda0343e1306 assets/create/lang/unfinished/es_es.json dae908c13b54fa5123bad98dd38ba35d58edaaf0 assets/create/lang/unfinished/es_es.json
6e401a93ef63da54673d125892893468f04931be assets/create/lang/unfinished/es_mx.json bf9142028bbd21a4441381c06c3b4557e60e49c5 assets/create/lang/unfinished/es_mx.json
466fe4336c8c45fab9027e18103f8c7ef5c94fef assets/create/lang/unfinished/fr_fr.json e4f70996f672bc50e8cfeaccd150075c0a07a917 assets/create/lang/unfinished/fr_fr.json
62d87f787237fbf2ace70eafb536cf5283c4dd16 assets/create/lang/unfinished/it_it.json 34c1226afddeaf7824fc1aaf65f40505b3811a91 assets/create/lang/unfinished/it_it.json
e83d8ed48ebf35ce6ba3fac10efff80ce9ffc050 assets/create/lang/unfinished/ja_jp.json 17a4ed49d461a537ca8e59fc95d12909780105d7 assets/create/lang/unfinished/ja_jp.json
448bdf719bd40bb4cb8f013d29e1c65c1277f4ff assets/create/lang/unfinished/ko_kr.json dd1e77bf533b4bf0e7fa358d48ce5643d08b21c3 assets/create/lang/unfinished/ko_kr.json
a4229b2f23223f31a1b869d5a07ff61128ddd2e8 assets/create/lang/unfinished/nl_nl.json 0faf1940b7c9664be63d02b3685ed0252528a9ce assets/create/lang/unfinished/nl_nl.json
9d1594172ba55eab5b96bd48f5204b082493e5e8 assets/create/lang/unfinished/pl_pl.json 996e1392e3ffcdb6d41a66cf6bd752e301c52b12 assets/create/lang/unfinished/pl_pl.json
ba271a34ebf9c23c239fcdf94d71623bfcaaefb1 assets/create/lang/unfinished/pt_br.json 49e35e88d59fb49cb1889e960a18371d0616b963 assets/create/lang/unfinished/pt_br.json
0c78fdaa30db8d54122bb055167ee41e4d1e010c assets/create/lang/unfinished/ru_ru.json af5ee82802fc0e42012c575cd9da1cf36b88b035 assets/create/lang/unfinished/ru_ru.json
899752fff0af288e71fb1f7c771910395c701477 assets/create/lang/unfinished/zh_cn.json 63db3153b522775cad4f91eb509e14568bfb0c3c assets/create/lang/unfinished/zh_cn.json
a7189982351b90b3cde43529a0fbdef696bda22e assets/create/lang/unfinished/zh_tw.json f533c7c7c1cc2b11908377bd807ff006902d5e34 assets/create/lang/unfinished/zh_tw.json
487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json
b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json
3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json
@ -1651,8 +1651,8 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear
866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json
a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json
b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json
7b73f40a65af0c2288c886928c609ec783c0fc40 assets/create/sounds.json 3fd540489a0038a78c6b02f81e89d95e53596b2b assets/create/sounds.json
0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json
187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json
0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json
83c046bd200623933545c9e4326f782fb02c87fa data/create/advancements/arm_blaze_burner.json 83c046bd200623933545c9e4326f782fb02c87fa data/create/advancements/arm_blaze_burner.json

View file

@ -1,17 +1,32 @@
{ {
"variants": { "variants": {
"facing=north": { "facing=north,waterlogged=false": {
"model": "create:block/copper_backtank/block" "model": "create:block/copper_backtank/block"
}, },
"facing=south": { "facing=south,waterlogged=false": {
"model": "create:block/copper_backtank/block", "model": "create:block/copper_backtank/block",
"y": 180 "y": 180
}, },
"facing=west": { "facing=west,waterlogged=false": {
"model": "create:block/copper_backtank/block", "model": "create:block/copper_backtank/block",
"y": 270 "y": 270
}, },
"facing=east": { "facing=east,waterlogged=false": {
"model": "create:block/copper_backtank/block",
"y": 90
},
"facing=north,waterlogged=true": {
"model": "create:block/copper_backtank/block"
},
"facing=south,waterlogged=true": {
"model": "create:block/copper_backtank/block",
"y": 180
},
"facing=west,waterlogged=true": {
"model": "create:block/copper_backtank/block",
"y": 270
},
"facing=east,waterlogged=true": {
"model": "create:block/copper_backtank/block", "model": "create:block/copper_backtank/block",
"y": 90 "y": 90
} }

View file

@ -1146,6 +1146,7 @@
"create.subtitle.blaze_munch": "Blaze Burner munches", "create.subtitle.blaze_munch": "Blaze Burner munches",
"create.subtitle.schematicannon_launch_block": "Schematicannon fires", "create.subtitle.schematicannon_launch_block": "Schematicannon fires",
"create.subtitle.funnel_flap": "Funnel Flaps", "create.subtitle.funnel_flap": "Funnel Flaps",
"create.subtitle.copper_armor_equip": "Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Schematicannon dings", "create.subtitle.schematicannon_finish": "Schematicannon dings",
"create.subtitle.scroll_value": "Scroll-input clicks", "create.subtitle.scroll_value": "Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Mechanical Press clangs", "create.subtitle.mechanical_press_activation": "Mechanical Press clangs",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 939", "_": "Missing Localizations: 940",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "Lohe kaut glücklich", "create.subtitle.blaze_munch": "Lohe kaut glücklich",
"create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Bauplankanone endet", "create.subtitle.schematicannon_finish": "Bauplankanone endet",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 640", "_": "Missing Localizations: 641",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "Blaze mastica felizmente", "create.subtitle.blaze_munch": "Blaze mastica felizmente",
"create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Acabados de Schematicannon", "create.subtitle.schematicannon_finish": "Acabados de Schematicannon",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1263", "_": "Missing Localizations: 1264",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches",
"create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1191", "_": "Missing Localizations: 1192",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches",
"create.subtitle.schematicannon_launch_block": "Tir de schémacanon", "create.subtitle.schematicannon_launch_block": "Tir de schémacanon",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Fin de schémacanon", "create.subtitle.schematicannon_finish": "Fin de schémacanon",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 657", "_": "Missing Localizations: 658",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "Il blaze lo gusta felicemente", "create.subtitle.blaze_munch": "Il blaze lo gusta felicemente",
"create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Finiture cannoneschematico", "create.subtitle.schematicannon_finish": "Finiture cannoneschematico",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 21", "_": "Missing Localizations: 22",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "ブレイズの咀嚼音", "create.subtitle.blaze_munch": "ブレイズの咀嚼音",
"create.subtitle.schematicannon_launch_block": "概略図砲が発射する", "create.subtitle.schematicannon_launch_block": "概略図砲が発射する",
"create.subtitle.funnel_flap": "ファンネルがはためく", "create.subtitle.funnel_flap": "ファンネルがはためく",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "概略図砲が作業を終える", "create.subtitle.schematicannon_finish": "概略図砲が作業を終える",
"create.subtitle.scroll_value": "スクロールのカチカチ音", "create.subtitle.scroll_value": "スクロールのカチカチ音",
"create.subtitle.mechanical_press_activation": "メカニカルプレスがガーンと鳴る", "create.subtitle.mechanical_press_activation": "メカニカルプレスがガーンと鳴る",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 710", "_": "Missing Localizations: 711",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함", "create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함",
"create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "청사진 대포가 끝남", "create.subtitle.schematicannon_finish": "청사진 대포가 끝남",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "압착기가 가동됨", "create.subtitle.mechanical_press_activation": "압착기가 가동됨",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1574", "_": "Missing Localizations: 1575",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches",
"create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 35", "_": "Missing Localizations: 36",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "Płomyk szczęśliwie przeżuwa", "create.subtitle.blaze_munch": "Płomyk szczęśliwie przeżuwa",
"create.subtitle.schematicannon_launch_block": "Schematoarmata strzela", "create.subtitle.schematicannon_launch_block": "Schematoarmata strzela",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Schematoarmata skończyła", "create.subtitle.schematicannon_finish": "Schematoarmata skończyła",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Mechaniczna prasa się uruchamia", "create.subtitle.mechanical_press_activation": "Mechaniczna prasa się uruchamia",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 1626", "_": "Missing Localizations: 1627",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches",
"create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 554", "_": "Missing Localizations: 555",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "Всполох радостно жуёт", "create.subtitle.blaze_munch": "Всполох радостно жуёт",
"create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "Механический пресс активирован", "create.subtitle.mechanical_press_activation": "Механический пресс активирован",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 40", "_": "Missing Localizations: 41",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "烈焰人:咀嚼", "create.subtitle.blaze_munch": "烈焰人:咀嚼",
"create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "蓝图加农炮:叮", "create.subtitle.schematicannon_finish": "蓝图加农炮:叮",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "辊压机:工作中", "create.subtitle.mechanical_press_activation": "辊压机:工作中",

View file

@ -1,5 +1,5 @@
{ {
"_": "Missing Localizations: 659", "_": "Missing Localizations: 660",
"_": "->------------------------] Game Elements [------------------------<-", "_": "->------------------------] Game Elements [------------------------<-",
@ -1147,6 +1147,7 @@
"create.subtitle.blaze_munch": "烈焰使者開心地吃著", "create.subtitle.blaze_munch": "烈焰使者開心地吃著",
"create.subtitle.schematicannon_launch_block": "藍圖大炮發射", "create.subtitle.schematicannon_launch_block": "藍圖大炮發射",
"create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps",
"create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks",
"create.subtitle.schematicannon_finish": "藍圖大炮完成任務", "create.subtitle.schematicannon_finish": "藍圖大炮完成任務",
"create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks",
"create.subtitle.mechanical_press_activation": "液壓機工作", "create.subtitle.mechanical_press_activation": "液壓機工作",

View file

@ -49,6 +49,15 @@
], ],
"subtitle": "create.subtitle.contraption_disassemble" "subtitle": "create.subtitle.contraption_disassemble"
}, },
"copper_armor_equip": {
"sounds": [
{
"name": "minecraft:item.armor.equip_gold",
"type": "event"
}
],
"subtitle": "create.subtitle.copper_armor_equip"
},
"crafter_click": { "crafter_click": {
"sounds": [ "sounds": [
{ {

View file

@ -28,8 +28,8 @@
"trigger": "create:bracket_apply", "trigger": "create:bracket_apply",
"conditions": { "conditions": {
"accepted_entries": [ "accepted_entries": [
"create:cogwheel", "create:large_cogwheel",
"create:large_cogwheel" "create:cogwheel"
] ]
} }
}, },

View file

@ -100,6 +100,7 @@ public class AllBlockPartials {
EJECTOR_TOP = get("weighted_ejector/top"), EJECTOR_TOP = get("weighted_ejector/top"),
COPPER_BACKTANK_SHAFT = get("copper_backtank/block_shaft_input"), COPPER_BACKTANK_SHAFT = get("copper_backtank/block_shaft_input"),
COPPER_BACKTANK_COGS = get("copper_backtank/block_cogs"),
COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"), COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"),
COUPLING_RING = getEntity("minecart_coupling/ring"), COUPLING_RING = getEntity("minecart_coupling/ring"),

View file

@ -1,10 +1,10 @@
package com.simibubi.create; package com.simibubi.create;
import static com.simibubi.create.AllTags.forgeItemTag;
import static com.simibubi.create.AllTags.AllItemTags.CREATE_INGOTS; import static com.simibubi.create.AllTags.AllItemTags.CREATE_INGOTS;
import static com.simibubi.create.AllTags.AllItemTags.CRUSHED_ORES; import static com.simibubi.create.AllTags.AllItemTags.CRUSHED_ORES;
import static com.simibubi.create.AllTags.AllItemTags.NUGGETS; import static com.simibubi.create.AllTags.AllItemTags.NUGGETS;
import static com.simibubi.create.AllTags.AllItemTags.PLATES; import static com.simibubi.create.AllTags.AllItemTags.PLATES;
import static com.simibubi.create.AllTags.forgeItemTag;
import static com.simibubi.create.content.AllSections.CURIOSITIES; import static com.simibubi.create.content.AllSections.CURIOSITIES;
import static com.simibubi.create.content.AllSections.KINETICS; import static com.simibubi.create.content.AllSections.KINETICS;
import static com.simibubi.create.content.AllSections.LOGISTICS; import static com.simibubi.create.content.AllSections.LOGISTICS;
@ -261,23 +261,24 @@ public class AllItems {
REGISTRATE.startSection(CURIOSITIES); REGISTRATE.startSection(CURIOSITIES);
} }
public static final ItemEntry<TreeFertilizerItem> TREE_FERTILIZER =
REGISTRATE.item("tree_fertilizer", TreeFertilizerItem::new)
.register();
public static final ItemEntry<? extends CopperArmorItem> public static final ItemEntry<? extends CopperArmorItem>
DIVING_HELMET = REGISTRATE.item("diving_helmet", DivingHelmetItem::new) COPPER_BACKTANK =
.register(), REGISTRATE
COPPER_BACKTANK = REGISTRATE
.item("copper_backtank", p -> new CopperBacktankItem(p, new BlockItem(AllBlocks.COPPER_BACKTANK.get(), p))) .item("copper_backtank", p -> new CopperBacktankItem(p, new BlockItem(AllBlocks.COPPER_BACKTANK.get(), p)))
.model(AssetLookup.<CopperBacktankItem>customGenericItemModel("_", "item")) .model(AssetLookup.<CopperBacktankItem>customGenericItemModel("_", "item"))
.register(), .register(),
DIVING_HELMET = REGISTRATE.item("diving_helmet", DivingHelmetItem::new)
.register(),
DIVING_BOOTS = REGISTRATE.item("diving_boots", DivingBootsItem::new) DIVING_BOOTS = REGISTRATE.item("diving_boots", DivingBootsItem::new)
.register(); .register();
public static final ItemEntry<TreeFertilizerItem> TREE_FERTILIZER =
REGISTRATE.item("tree_fertilizer", TreeFertilizerItem::new)
.register();
// Schematics // Schematics
static { static {

View file

@ -148,6 +148,11 @@ public class AllSoundEvents {
.category(SoundCategory.BLOCKS) .category(SoundCategory.BLOCKS)
.build(), .build(),
COPPER_ARMOR_EQUIP = create("copper_armor_equip").subtitle("Diving equipment clinks")
.playExisting(SoundEvents.ITEM_ARMOR_EQUIP_GOLD, 1f, 1f)
.category(SoundCategory.PLAYERS)
.build(),
BLAZE_MUNCH = create("blaze_munch").subtitle("Blaze Burner munches") BLAZE_MUNCH = create("blaze_munch").subtitle("Blaze Burner munches")
.playExisting(SoundEvents.ENTITY_GENERIC_EAT, .5f, 1f) .playExisting(SoundEvents.ENTITY_GENERIC_EAT, .5f, 1f)
.category(SoundCategory.BLOCKS) .category(SoundCategory.BLOCKS)
@ -163,6 +168,11 @@ public class AllSoundEvents {
entry.register(registry); entry.register(registry);
} }
public static void prepare() {
for (SoundEntry entry : entries.values())
entry.prepare();
}
public static JsonElement provideLangEntries() { public static JsonElement provideLangEntries() {
JsonObject object = new JsonObject(); JsonObject object = new JsonObject();
for (SoundEntry entry : entries.values()) for (SoundEntry entry : entries.values())
@ -278,6 +288,8 @@ public class AllSoundEvents {
this.category = category; this.category = category;
} }
public abstract void prepare();
public abstract void register(IForgeRegistry<SoundEvent> registry); public abstract void register(IForgeRegistry<SoundEvent> registry);
public abstract void write(JsonObject json); public abstract void write(JsonObject json);
@ -348,16 +360,21 @@ public class AllSoundEvents {
} }
@Override @Override
public void register(IForgeRegistry<SoundEvent> registry) { public void prepare() {
for (int i = 0; i < wrappedEvents.size(); i++) { for (int i = 0; i < wrappedEvents.size(); i++) {
ResourceLocation location = Create.asResource(getIdOf(i)); ResourceLocation location = Create.asResource(getIdOf(i));
SoundEvent sound = new SoundEvent(location).setRegistryName(location); SoundEvent sound = new SoundEvent(location).setRegistryName(location);
registry.register(sound);
compiledEvents.add(Pair.of(sound, wrappedEvents.get(i) compiledEvents.add(Pair.of(sound, wrappedEvents.get(i)
.getSecond())); .getSecond()));
} }
} }
@Override
public void register(IForgeRegistry<SoundEvent> registry) {
for (Pair<SoundEvent, Couple<Float>> pair : compiledEvents)
registry.register(pair.getFirst());
}
@Override @Override
public SoundEvent getMainEvent() { public SoundEvent getMainEvent() {
return compiledEvents.get(0) return compiledEvents.get(0)
@ -415,9 +432,14 @@ public class AllSoundEvents {
} }
@Override @Override
public void register(IForgeRegistry<SoundEvent> registry) { public void prepare() {
ResourceLocation location = getLocation(); ResourceLocation location = getLocation();
registry.register(event = new SoundEvent(location).setRegistryName(location)); event = new SoundEvent(location).setRegistryName(location);
}
@Override
public void register(IForgeRegistry<SoundEvent> registry) {
registry.register(event);
} }
@Override @Override

View file

@ -78,6 +78,7 @@ public class Create {
IEventBus modEventBus = FMLJavaModLoadingContext.get() IEventBus modEventBus = FMLJavaModLoadingContext.get()
.getModEventBus(); .getModEventBus();
AllSoundEvents.prepare();
AllBlocks.register(); AllBlocks.register();
AllItems.register(); AllItems.register();
AllFluids.register(); AllFluids.register();

View file

@ -3,21 +3,20 @@ package com.simibubi.create.content.curiosities.armor;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.AllSoundEvents;
import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.IArmorMaterial; import net.minecraft.item.IArmorMaterial;
import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.LazyValue; import net.minecraft.util.LazyValue;
import net.minecraft.util.SoundEvent; import net.minecraft.util.SoundEvent;
import net.minecraft.util.SoundEvents;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
public enum AllArmorMaterials implements IArmorMaterial { public enum AllArmorMaterials implements IArmorMaterial {
COPPER("copper", 7, new int[] { 1, 3, 5, 2 }, 25, SoundEvents.ITEM_ARMOR_EQUIP_GOLD, 0.0F, 0.0F, () -> { COPPER("copper", 7, new int[] { 1, 3, 4, 2 }, 25, AllSoundEvents.COPPER_ARMOR_EQUIP.getMainEvent(), 0.0F, 0.0F,
return Ingredient.fromItems(AllItems.COPPER_INGOT.get()); () -> Ingredient.fromItems(AllItems.COPPER_INGOT.get()))
})
; ;

View file

@ -1,13 +1,20 @@
package com.simibubi.create.content.curiosities.armor; package com.simibubi.create.content.curiosities.armor;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.CreateClient; import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ColorHelper;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.IRenderTypeBuffer.Impl; import net.minecraft.client.renderer.IRenderTypeBuffer.Impl;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
@ -19,7 +26,11 @@ import net.minecraft.client.renderer.entity.model.BipedModel;
import net.minecraft.client.renderer.entity.model.EntityModel; import net.minecraft.client.renderer.entity.model.EntityModel;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.Pose; import net.minecraft.entity.Pose;
import net.minecraft.tags.FluidTags;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.StringUtils;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
public class CopperBacktankArmorLayer<T extends LivingEntity, M extends EntityModel<T>> extends LayerRenderer<T, M> { public class CopperBacktankArmorLayer<T extends LivingEntity, M extends EntityModel<T>> extends LayerRenderer<T, M> {
@ -50,14 +61,28 @@ public class CopperBacktankArmorLayer<T extends LivingEntity, M extends EntityMo
BlockState renderedState = AllBlocks.COPPER_BACKTANK.getDefaultState() BlockState renderedState = AllBlocks.COPPER_BACKTANK.getDefaultState()
.with(CopperBacktankBlock.HORIZONTAL_FACING, Direction.SOUTH); .with(CopperBacktankBlock.HORIZONTAL_FACING, Direction.SOUTH);
RenderType renderType = RenderType.getSolid(); RenderType renderType = RenderType.getSolid();
SuperByteBuffer backtank = CreateClient.bufferCache.renderBlock(renderedState); SuperByteBuffer backtank = CreateClient.bufferCache.renderBlock(renderedState);
SuperByteBuffer cogs =
CreateClient.bufferCache.renderPartial(AllBlockPartials.COPPER_BACKTANK_COGS, renderedState);
model.bipedBody.rotate(ms); model.bipedBody.rotate(ms);
ms.translate(-1 / 2f, 10 / 16f, 1f); ms.translate(-1 / 2f, 10 / 16f, 1f);
ms.scale(1, -1, -1); ms.scale(1, -1, -1);
backtank.light(light) backtank.light(light)
.renderInto(ms, buffer.getBuffer(renderType)); .renderInto(ms, buffer.getBuffer(renderType));
cogs.matrixStacker()
.centre()
.rotateY(180)
.unCentre()
.translate(0, 6.5f / 16, 11f / 16)
.rotate(Direction.EAST, AngleHelper.rad(2 * AnimationTickHolder.getRenderTime(entity.world) % 360))
.translate(0, -6.5f / 16, -11f / 16);
cogs.light(light)
.renderInto(ms, buffer.getBuffer(renderType));
if (buffer instanceof Impl) if (buffer instanceof Impl)
((Impl) buffer).draw(renderType); ((Impl) buffer).draw(renderType);
ms.pop(); ms.pop();
@ -78,4 +103,39 @@ public class CopperBacktankArmorLayer<T extends LivingEntity, M extends EntityMo
new CopperBacktankArmorLayer<>((LivingRenderer<?, ?>) entityRenderer); new CopperBacktankArmorLayer<>((LivingRenderer<?, ?>) entityRenderer);
} }
public static void renderRemainingAirOverlay(MatrixStack ms, Impl buffers, int light, int overlay, float pt) {
ClientPlayerEntity player = Minecraft.getInstance().player;
if (player == null)
return;
if (player.isSpectator() || player.isCreative())
return;
if (!player.getPersistentData()
.contains("VisualBacktankAir"))
return;
if (!player.areEyesInFluid(FluidTags.WATER))
return;
int timeLeft = player.getPersistentData()
.getInt("VisualBacktankAir");
ms.push();
MainWindow window = Minecraft.getInstance()
.getWindow();
ms.translate(window.getScaledWidth() / 2 + 90, window.getScaledHeight() - 53, 0);
ITextComponent text = new StringTextComponent(StringUtils.ticksToElapsedTime(timeLeft * 20));
GuiGameElement.of(AllItems.COPPER_BACKTANK.asStack())
.at(0, 0)
.render(ms);
int color = 0xFF_FFFFFF;
if (timeLeft < 60 && timeLeft % 2 == 0) {
color = ColorHelper.mixColors(0xFF_FF0000, color, Math.max(timeLeft / 60f, .25f));
}
Minecraft.getInstance().fontRenderer.drawWithShadow(ms, text, 16, 5, color);
buffers.draw();
ms.pop();
}
} }

View file

@ -8,31 +8,74 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock;
import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ITE;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.IWaterLoggable;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.fluid.FluidState;
import net.minecraft.fluid.Fluids;
import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItem;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.pathfinding.PathType;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResultType; import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader; import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayer;
public class CopperBacktankBlock extends HorizontalKineticBlock implements ITE<CopperBacktankTileEntity> { public class CopperBacktankBlock extends HorizontalKineticBlock
implements ITE<CopperBacktankTileEntity>, IWaterLoggable {
public CopperBacktankBlock(Properties properties) { public CopperBacktankBlock(Properties properties) {
super(properties); super(properties);
setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false));
}
@Override
public FluidState getFluidState(BlockState state) {
return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false)
: Fluids.EMPTY.getDefaultState();
}
@Override
protected void fillStateContainer(Builder<Block, BlockState> builder) {
builder.add(BlockStateProperties.WATERLOGGED);
super.fillStateContainer(builder);
}
@Override
public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState,
IWorld world, BlockPos pos, BlockPos neighbourPos) {
if (state.get(BlockStateProperties.WATERLOGGED)) {
world.getPendingFluidTicks()
.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
}
return state;
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
FluidState ifluidstate = context.getWorld()
.getFluidState(context.getPos());
return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED,
Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER));
} }
@Override @Override
@ -63,14 +106,20 @@ public class CopperBacktankBlock extends HorizontalKineticBlock implements ITE<C
@Override @Override
public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand p_225533_5_, public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand p_225533_5_,
BlockRayTraceResult p_225533_6_) { BlockRayTraceResult p_225533_6_) {
if (player == null)
return ActionResultType.PASS;
if (player instanceof FakePlayer) if (player instanceof FakePlayer)
return ActionResultType.PASS; return ActionResultType.PASS;
if (player.getHeldItemMainhand().getItem() instanceof BlockItem) if (player.isSneaking())
return ActionResultType.PASS;
if (player.getHeldItemMainhand()
.getItem() instanceof BlockItem)
return ActionResultType.PASS; return ActionResultType.PASS;
if (!player.getItemStackFromSlot(EquipmentSlotType.CHEST) if (!player.getItemStackFromSlot(EquipmentSlotType.CHEST)
.isEmpty()) .isEmpty())
return ActionResultType.PASS; return ActionResultType.PASS;
if (!world.isRemote) { if (!world.isRemote) {
world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, .75f, 1);
player.setItemStackToSlot(EquipmentSlotType.CHEST, getItem(world, pos, state)); player.setItemStackToSlot(EquipmentSlotType.CHEST, getItem(world, pos, state));
world.destroyBlock(pos, false); world.destroyBlock(pos, false);
} }
@ -108,4 +157,9 @@ public class CopperBacktankBlock extends HorizontalKineticBlock implements ITE<C
return CopperBacktankTileEntity.class; return CopperBacktankTileEntity.class;
} }
@Override
public boolean allowsMovement(BlockState state, IBlockReader reader, BlockPos pos, PathType type) {
return false;
}
} }

View file

@ -1,12 +1,19 @@
package com.simibubi.create.content.curiosities.armor; package com.simibubi.create.content.curiosities.armor;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.render.PartialBufferer; import com.simibubi.create.foundation.render.PartialBufferer;
import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.util.Direction;
public class CopperBacktankRenderer extends KineticTileEntityRenderer { public class CopperBacktankRenderer extends KineticTileEntityRenderer {
@ -14,6 +21,26 @@ public class CopperBacktankRenderer extends KineticTileEntityRenderer {
super(dispatcher); super(dispatcher);
} }
@Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
super.renderSafe(te, partialTicks, ms, buffer, light, overlay);
SuperByteBuffer cogs =
CreateClient.bufferCache.renderPartial(AllBlockPartials.COPPER_BACKTANK_COGS, te.getBlockState());
cogs.matrixStacker()
.centre()
.rotateY(180 + AngleHelper.horizontalAngle(te.getBlockState()
.get(CopperBacktankBlock.HORIZONTAL_FACING)))
.unCentre()
.translate(0, 6.5f / 16, 11f / 16)
.rotate(Direction.EAST,
AngleHelper.rad(te.getSpeed() / 4f * AnimationTickHolder.getRenderTime(te.getWorld()) % 360))
.translate(0, -6.5f / 16, -11f / 16);
cogs.light(light)
.renderInto(ms, buffer.getBuffer(RenderType.getSolid()));
}
@Override @Override
protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { protected SuperByteBuffer getRotatedModel(KineticTileEntity te) {
return PartialBufferer.get(AllBlockPartials.COPPER_BACKTANK_SHAFT, te.getBlockState()); return PartialBufferer.get(AllBlockPartials.COPPER_BACKTANK_SHAFT, te.getBlockState());

View file

@ -1,6 +1,7 @@
package com.simibubi.create.content.curiosities.armor; package com.simibubi.create.content.curiosities.armor;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.particle.AirParticleData; import com.simibubi.create.content.contraptions.particle.AirParticleData;
@ -11,6 +12,7 @@ import net.minecraft.block.BlockState;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.particles.ParticleTypes; import net.minecraft.particles.ParticleTypes;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.INameable; import net.minecraft.util.INameable;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3d;
@ -37,16 +39,12 @@ public class CopperBacktankTileEntity extends KineticTileEntity implements IName
return; return;
} }
Integer max = AllConfigs.SERVER.curiosities.maxAirInBacktank.get(); int max = getMaxAir();
if (world.isRemote) { if (world.isRemote) {
Vector3d centerOf = VecHelper.getCenterOf(pos); Vector3d centerOf = VecHelper.getCenterOf(pos);
Vector3d v = VecHelper.offsetRandomly(centerOf, Create.random, .65f); Vector3d v = VecHelper.offsetRandomly(centerOf, Create.random, .65f);
Vector3d m = centerOf.subtract(v); Vector3d m = centerOf.subtract(v);
if (airLevel == max) { if (airLevel != max)
if (Create.random.nextFloat() < 1 / 8f) {
world.addParticle(ParticleTypes.HAPPY_VILLAGER, v.x, v.y, v.z, 0, 0, 0);
}
} else
world.addParticle(new AirParticleData(1, .05f), v.x, v.y, v.z, m.x, m.y, m.z); world.addParticle(new AirParticleData(1, .05f), v.x, v.y, v.z, m.x, m.y, m.z);
return; return;
} }
@ -62,6 +60,10 @@ public class CopperBacktankTileEntity extends KineticTileEntity implements IName
airLevelTimer = MathHelper.clamp((int) (128f - abs / 5f) - 108, 0, 20); airLevelTimer = MathHelper.clamp((int) (128f - abs / 5f) - 108, 0, 20);
} }
protected int getMaxAir() {
return AllConfigs.SERVER.curiosities.maxAirInBacktank.get();
}
public int getAirLevel() { public int getAirLevel() {
return airLevel; return airLevel;
} }
@ -91,10 +93,26 @@ public class CopperBacktankTileEntity extends KineticTileEntity implements IName
@Override @Override
protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) {
super.fromTag(state, compound, clientPacket); super.fromTag(state, compound, clientPacket);
int prev = airLevel;
airLevel = compound.getInt("Air"); airLevel = compound.getInt("Air");
airLevelTimer = compound.getInt("Timer"); airLevelTimer = compound.getInt("Timer");
if (compound.contains("CustomName", 8)) if (compound.contains("CustomName", 8))
this.customName = ITextComponent.Serializer.fromJson(compound.getString("CustomName")); this.customName = ITextComponent.Serializer.fromJson(compound.getString("CustomName"));
if (prev != 0 && prev != airLevel && airLevel == getMaxAir() && clientPacket)
playFilledEffect();
}
protected void playFilledEffect() {
AllSoundEvents.CONFIRM.playAt(world, pos, 0.4f, 1, true);
Vector3d baseMotion = new Vector3d(.25, 0.1, 0);
Vector3d baseVec = VecHelper.getCenterOf(pos);
for (int i = 0; i < 360; i += 10) {
Vector3d m = VecHelper.rotate(baseMotion, i, Axis.Y);
Vector3d v = baseVec.add(m.normalize()
.scale(.25f));
world.addParticle(ParticleTypes.SPIT, v.x, v.y, v.z, m.x, m.y, m.z);
}
} }
@Override @Override
@ -104,4 +122,9 @@ public class CopperBacktankTileEntity extends KineticTileEntity implements IName
.getTranslationKey()); .getTranslationKey());
} }
@Override
public boolean shouldRenderAsTE() {
return true;
}
} }

View file

@ -8,6 +8,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.potion.EffectInstance; import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects; import net.minecraft.potion.Effects;
import net.minecraft.world.World;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@ -22,11 +23,13 @@ public class DivingHelmetItem extends CopperArmorItem {
@SubscribeEvent @SubscribeEvent
public static void breatheUnderwater(LivingUpdateEvent event) { public static void breatheUnderwater(LivingUpdateEvent event) {
LivingEntity entity = event.getEntityLiving(); LivingEntity entity = event.getEntityLiving();
boolean second = entity.world.getGameTime() % 20 == 0; World world = entity.world;
boolean second = world.getGameTime() % 20 == 0;
boolean drowning = entity.getAir() == 0; boolean drowning = entity.getAir() == 0;
if (!second && !drowning) if (world.isRemote)
return; entity.getPersistentData()
.remove("VisualBacktankAir");
if (!AllItems.DIVING_HELMET.get() if (!AllItems.DIVING_HELMET.get()
.isWornBy(entity)) .isWornBy(entity))
@ -52,6 +55,11 @@ public class DivingHelmetItem extends CopperArmorItem {
if (drowning) if (drowning)
entity.setAir(10); entity.setAir(10);
if (world.isRemote)
entity.getPersistentData()
.putInt("VisualBacktankAir", airRemaining);
if (!second) if (!second)
return; return;

View file

@ -23,6 +23,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra
import com.simibubi.create.content.contraptions.components.turntable.TurntableHandler; import com.simibubi.create.content.contraptions.components.turntable.TurntableHandler;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler;
import com.simibubi.create.content.curiosities.armor.CopperBacktankArmorLayer;
import com.simibubi.create.content.curiosities.tools.ExtendoGripRenderHandler; import com.simibubi.create.content.curiosities.tools.ExtendoGripRenderHandler;
import com.simibubi.create.content.curiosities.zapper.ZapperItem; import com.simibubi.create.content.curiosities.zapper.ZapperItem;
import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler; import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler;
@ -55,6 +56,7 @@ import com.simibubi.create.foundation.utility.worldWrappers.WrappedClientWorld;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.IRenderTypeBuffer.Impl;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluid;
@ -200,12 +202,20 @@ public class ClientEvents {
@SubscribeEvent @SubscribeEvent
public static void onRenderOverlay(RenderGameOverlayEvent.Post event) { public static void onRenderOverlay(RenderGameOverlayEvent.Post event) {
MatrixStack ms = event.getMatrixStack();
Impl buffers = Minecraft.getInstance()
.getBufferBuilders()
.getEntityVertexConsumers();
int light = 0xF000F0;
int overlay = OverlayTexture.DEFAULT_UV;
float pt = event.getPartialTicks();
if (event.getType() == ElementType.AIR)
CopperBacktankArmorLayer.renderRemainingAirOverlay(ms, buffers, light, overlay, pt);
if (event.getType() != ElementType.HOTBAR) if (event.getType() != ElementType.HOTBAR)
return; return;
onRenderHotbar(event.getMatrixStack(), Minecraft.getInstance() onRenderHotbar(ms, buffers, light, overlay, pt);
.getBufferBuilders()
.getEntityVertexConsumers(), 0xF000F0, OverlayTexture.DEFAULT_UV, event.getPartialTicks());
} }
public static void onRenderHotbar(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, public static void onRenderHotbar(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay,

View file

@ -5,110 +5,6 @@
"particle": "create:block/copper_backtank" "particle": "create:block/copper_backtank"
}, },
"elements": [ "elements": [
{
"from": [5, 4, 10.5],
"to": [7, 9, 11.5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"},
"east": {"uv": [6.5, 11.5, 7, 14], "texture": "#0"},
"south": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"},
"west": {"uv": [5.5, 11.5, 6, 14], "texture": "#0"},
"up": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"down": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"}
}
},
{
"from": [5, 4, 10.5],
"to": [7, 9, 11.5],
"rotation": {"angle": 45, "axis": "x", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"},
"east": {"uv": [6.5, 11.5, 7, 14], "texture": "#0"},
"south": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"},
"west": {"uv": [5.5, 11.5, 6, 14], "texture": "#0"},
"up": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"down": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"}
}
},
{
"from": [5, 6, 8.5],
"to": [7, 7, 13.5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [6.5, 11.5, 7, 14], "rotation": 270, "texture": "#0"},
"south": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"west": {"uv": [5.5, 11.5, 6, 14], "rotation": 90, "texture": "#0"},
"up": {"uv": [6.5, 11.5, 5.5, 14], "rotation": 180, "texture": "#0"},
"down": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"}
}
},
{
"from": [5, 6, 8.5],
"to": [7, 7, 13.5],
"rotation": {"angle": 45, "axis": "x", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [6.5, 11.5, 7, 14], "rotation": 270, "texture": "#0"},
"south": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"west": {"uv": [5.5, 11.5, 6, 14], "rotation": 90, "texture": "#0"},
"up": {"uv": [6.5, 11.5, 5.5, 14], "rotation": 180, "texture": "#0"},
"down": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"}
}
},
{
"from": [9, 4, 10.5],
"to": [11, 9, 11.5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"},
"east": {"uv": [5.5, 11.5, 6, 14], "texture": "#0"},
"south": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"},
"west": {"uv": [6.5, 11.5, 7, 14], "texture": "#0"},
"up": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"}
}
},
{
"from": [9, 4, 10.5],
"to": [11, 9, 11.5],
"rotation": {"angle": 45, "axis": "x", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"},
"east": {"uv": [5.5, 11.5, 6, 14], "texture": "#0"},
"south": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"},
"west": {"uv": [6.5, 11.5, 7, 14], "texture": "#0"},
"up": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"}
}
},
{
"from": [9, 6, 8.5],
"to": [11, 7, 13.5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"east": {"uv": [5.5, 11.5, 6, 14], "rotation": 270, "texture": "#0"},
"south": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [6.5, 11.5, 7, 14], "rotation": 90, "texture": "#0"},
"up": {"uv": [5.5, 11.5, 6.5, 14], "rotation": 180, "texture": "#0"},
"down": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"}
}
},
{
"from": [9, 6, 8.5],
"to": [11, 7, 13.5],
"rotation": {"angle": 45, "axis": "x", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"east": {"uv": [5.5, 11.5, 6, 14], "rotation": 270, "texture": "#0"},
"south": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [6.5, 11.5, 7, 14], "rotation": 90, "texture": "#0"},
"up": {"uv": [5.5, 11.5, 6.5, 14], "rotation": 180, "texture": "#0"},
"down": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"}
}
},
{ {
"from": [5, 0, 5], "from": [5, 0, 5],
"to": [11, 4, 11], "to": [11, 4, 11],
@ -164,15 +60,10 @@
} }
], ],
"groups": [ "groups": [
{
"name": "Gears",
"origin": [1, 2.5, 0.5],
"children": [0, 1, 2, 3, 4, 5, 6, 7]
},
{ {
"name": "Tank", "name": "Tank",
"origin": [0, 0, 0], "origin": [0, 0, 0],
"children": [8, 9, 10, 11, 12] "children": [0, 1, 2, 3, 4]
}, },
{ {
"name": "Axle", "name": "Axle",

View file

@ -0,0 +1,125 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/copper_backtank",
"particle": "create:block/copper_backtank"
},
"elements": [
{
"from": [5, 4, 10.5],
"to": [7, 9, 11.5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"},
"east": {"uv": [6.5, 11.5, 7, 14], "texture": "#0"},
"south": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"},
"west": {"uv": [5.5, 11.5, 6, 14], "texture": "#0"},
"up": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"down": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"}
}
},
{
"from": [5, 4, 10.5],
"to": [7, 9, 11.5],
"rotation": {"angle": 45, "axis": "x", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"},
"east": {"uv": [6.5, 11.5, 7, 14], "texture": "#0"},
"south": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"},
"west": {"uv": [5.5, 11.5, 6, 14], "texture": "#0"},
"up": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"down": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"}
}
},
{
"from": [5, 6, 8.5],
"to": [7, 7, 13.5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [6.5, 11.5, 7, 14], "rotation": 270, "texture": "#0"},
"south": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"west": {"uv": [5.5, 11.5, 6, 14], "rotation": 90, "texture": "#0"},
"up": {"uv": [6.5, 11.5, 5.5, 14], "rotation": 180, "texture": "#0"},
"down": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"}
}
},
{
"from": [5, 6, 8.5],
"to": [7, 7, 13.5],
"rotation": {"angle": 45, "axis": "x", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [6.5, 11.5, 7, 14], "rotation": 270, "texture": "#0"},
"south": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"west": {"uv": [5.5, 11.5, 6, 14], "rotation": 90, "texture": "#0"},
"up": {"uv": [6.5, 11.5, 5.5, 14], "rotation": 180, "texture": "#0"},
"down": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"}
}
},
{
"from": [9, 4, 10.5],
"to": [11, 9, 11.5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"},
"east": {"uv": [5.5, 11.5, 6, 14], "texture": "#0"},
"south": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"},
"west": {"uv": [6.5, 11.5, 7, 14], "texture": "#0"},
"up": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"}
}
},
{
"from": [9, 4, 10.5],
"to": [11, 9, 11.5],
"rotation": {"angle": 45, "axis": "x", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11.5, 6.5, 14], "texture": "#0"},
"east": {"uv": [5.5, 11.5, 6, 14], "texture": "#0"},
"south": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"},
"west": {"uv": [6.5, 11.5, 7, 14], "texture": "#0"},
"up": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"}
}
},
{
"from": [9, 6, 8.5],
"to": [11, 7, 13.5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"east": {"uv": [5.5, 11.5, 6, 14], "rotation": 270, "texture": "#0"},
"south": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [6.5, 11.5, 7, 14], "rotation": 90, "texture": "#0"},
"up": {"uv": [5.5, 11.5, 6.5, 14], "rotation": 180, "texture": "#0"},
"down": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"}
}
},
{
"from": [9, 6, 8.5],
"to": [11, 7, 13.5],
"rotation": {"angle": 45, "axis": "x", "origin": [8, 6.5, 11]},
"faces": {
"north": {"uv": [5.5, 11, 6.5, 11.5], "texture": "#0"},
"east": {"uv": [5.5, 11.5, 6, 14], "rotation": 270, "texture": "#0"},
"south": {"uv": [5.5, 11, 6.5, 11.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [6.5, 11.5, 7, 14], "rotation": 90, "texture": "#0"},
"up": {"uv": [5.5, 11.5, 6.5, 14], "rotation": 180, "texture": "#0"},
"down": {"uv": [6.5, 11.5, 5.5, 14], "texture": "#0"}
}
}
],
"groups": [
{
"name": "Gears",
"origin": [1, 2.5, 0.5],
"children": [0, 1, 2, 3, 4, 5, 6, 7]
},
{
"name": "Axle",
"origin": [8, 8, 8],
"children": []
}
]
}