From 13f0823ccb1c14e71e10f6cf868a3a73fc683fd2 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 14 Apr 2021 23:40:42 +0200 Subject: [PATCH] Sound Registry Refactor - Improved registration and datagen for custom and combined sounds --- src/generated/resources/.cache/cache | 28 +- .../resources/assets/create/lang/en_us.json | 20 +- .../assets/create/lang/unfinished/de_de.json | 12 +- .../assets/create/lang/unfinished/es_es.json | 12 +- .../assets/create/lang/unfinished/es_mx.json | 22 +- .../assets/create/lang/unfinished/fr_fr.json | 14 +- .../assets/create/lang/unfinished/it_it.json | 12 +- .../assets/create/lang/unfinished/ja_jp.json | 12 +- .../assets/create/lang/unfinished/ko_kr.json | 12 +- .../assets/create/lang/unfinished/nl_nl.json | 22 +- .../assets/create/lang/unfinished/pt_br.json | 22 +- .../assets/create/lang/unfinished/ru_ru.json | 12 +- .../assets/create/lang/unfinished/zh_cn.json | 12 +- .../assets/create/lang/unfinished/zh_tw.json | 12 +- .../resources/assets/create/sounds.json | 127 +++--- .../com/simibubi/create/AllSoundEvents.java | 384 ++++++++++++++---- src/main/java/com/simibubi/create/Create.java | 2 +- .../press/MechanicalPressTileEntity.java | 16 +- .../chassis/AbstractChassisBlock.java | 5 +- .../chassis/StickerTileEntity.java | 4 +- .../glue/SuperGlueEntity.java | 4 +- .../piston/MechanicalPistonBlock.java | 3 +- .../processing/burner/BlazeBurnerHandler.java | 3 +- .../zapper/ZapperInteractionHandler.java | 13 +- .../curiosities/zapper/ZapperItem.java | 4 +- .../zapper/ZapperRenderHandler.java | 23 +- .../block/SchematicannonTileEntity.java | 33 +- .../foundation/data/AllLangPartials.java | 2 + .../assets/create/lang/default/messages.json | 13 +- .../assets/create/sounds/creeperclock.ogg | Bin 17248 -> 0 bytes .../assets/create/sounds/pigclock.ogg | Bin 17404 -> 0 bytes 31 files changed, 541 insertions(+), 319 deletions(-) delete mode 100644 src/main/resources/assets/create/sounds/creeperclock.ogg delete mode 100644 src/main/resources/assets/create/sounds/pigclock.ogg diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 511caf924..57c600fff 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -407,19 +407,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 768a724d6c921cb92790364cf7a692fe8742a885 assets/create/lang/en_ud.json -3060ba1eee371d642e0590c3d6e99c2be397c7f5 assets/create/lang/en_us.json -e3b0bc11cc7b208d248ad339caeebf91aa51a5ef assets/create/lang/unfinished/de_de.json -3b3e7b694b75ab50acfe911935f80da0b3234010 assets/create/lang/unfinished/es_es.json -20d7a808b485b9140bce1c4c483c7fc2218a0611 assets/create/lang/unfinished/es_mx.json -1e9f530d590556eac0c4d08750d3ebbd83b504f2 assets/create/lang/unfinished/fr_fr.json -a604e3bf8d1b28d4f77cd4fb5b63f5d58988a507 assets/create/lang/unfinished/it_it.json -371ef25dcdbd268d1f96d19ccd56413c93425ced assets/create/lang/unfinished/ja_jp.json -7206826ff926de6a04145a17928c00ea28762404 assets/create/lang/unfinished/ko_kr.json -411d5197f3b5eb75ef7033685fb24df1c02a959f assets/create/lang/unfinished/nl_nl.json -59756083e6d04f649e860fed9b13657fa12f919b assets/create/lang/unfinished/pt_br.json -efae854418421a1ce80494d1da800e778f17afe8 assets/create/lang/unfinished/ru_ru.json -58fb522692bf7b15d8fb851f0a807fab04620d45 assets/create/lang/unfinished/zh_cn.json -1e2f8564c19f2fe35ce91e65831b72ab44bedea1 assets/create/lang/unfinished/zh_tw.json +5f5c7ddeea65263977262ae9eef8284a27b342ed assets/create/lang/en_us.json +784fce1f5ae7d571449e8c2645aedca2ae54017d assets/create/lang/unfinished/de_de.json +72dc91f3968daa908451a91514573fa081ba1011 assets/create/lang/unfinished/es_es.json +e7f818f6250f6a9bcb68d29e3c4a42f4d97d191f assets/create/lang/unfinished/es_mx.json +a3c830d49cb7fbc3942c316859ffe46304dcbb07 assets/create/lang/unfinished/fr_fr.json +8263ba5d778e8d8a3255319ab08cee080930345d assets/create/lang/unfinished/it_it.json +76d31adf175b248b9a4b63d7b02005155a0e961f assets/create/lang/unfinished/ja_jp.json +78fc9b2f5695019465930da7b3d20b519d53d128 assets/create/lang/unfinished/ko_kr.json +c3d24b55cf0f6a4a3ff673e3a07872f055a8747a assets/create/lang/unfinished/nl_nl.json +dee268b4a8c1aace69527b8064b40590a8c63165 assets/create/lang/unfinished/pt_br.json +651af36f14adb7851c1a78551bd6631847893b8c assets/create/lang/unfinished/ru_ru.json +67dde4056c63b166a48bd9b6dec95ef42d28f826 assets/create/lang/unfinished/zh_cn.json +1f3e13923f4d9285b14d494576a10589fe2f3c6d 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 @@ -1648,7 +1648,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json +56fa207f8d0d76e0435252d13dbe4b967c61aa89 assets/create/sounds.json 5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 518dafa17..d1b3fbc05 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1147,16 +1147,18 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.subtitle.schematicannon_launch_block": "Schematicannon shoots", - "create.subtitle.schematicannon_finish": "Schematicannon finishes", + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.schematicannon_launch_block": "Schematicannon fires", + "create.subtitle.schematicannon_finish": "Schematicannon dings", "create.subtitle.slime_added": "Slime squishes", - "create.subtitle.mechanical_press_activation": "Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "Metal clanks", - "create.subtitle.blockzapper_place": "Blocks zap into place", - "create.subtitle.blockzapper_confirm": "Affirmative Ding", - "create.subtitle.blockzapper_deny": "Declining Boop", - "create.subtitle.block_funnel_eat": "Funnel CHOMPS", - "create.subtitle.blaze_munch": "Blaze munches happily", + "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", + "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "Declining boop", + "create.subtitle.blockzapper_confirm": "Affirmative ding", + "create.subtitle.blockzapper_place": "Blockzapper zaps", + "create.subtitle.blaze_munch": "Blaze Burner munches", "_": "->------------------------] Item Descriptions [------------------------<-", 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 5ae626464..95a8d3798 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: 912", + "_": "Missing Localizations: 913", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: Benutze /killtps start um den Server Tick künstlich zu verlangsamen", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", "create.subtitle.schematicannon_finish": "Bauplankanone endet", "create.subtitle.slime_added": "Schleim matscht", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", - "create.subtitle.mechanical_press_item_break": "Metall klonkt", - "create.subtitle.blockzapper_place": "Blöcke zappen an Ort und Stelle", - "create.subtitle.blockzapper_confirm": "Bestätigendes Ding", "create.subtitle.blockzapper_deny": "Ablehnendes Boop", - "create.subtitle.block_funnel_eat": "Trichter MAMPFT", + "create.subtitle.blockzapper_confirm": "Bestätigendes Ding", + "create.subtitle.blockzapper_place": "Blöcke zappen an Ort und Stelle", "create.subtitle.blaze_munch": "Lohe kaut glücklich", 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 bc5243a6f..7e7cb004f 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: 605", + "_": "Missing Localizations: 606", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: usar /killtps start para ralentizar artificialmente el tick del servidor", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", "create.subtitle.slime_added": "Slime aplastado", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", - "create.subtitle.mechanical_press_item_break": "Clanks de metal", - "create.subtitle.blockzapper_place": "Los bloques se colocan en su sitio", - "create.subtitle.blockzapper_confirm": "Ding afirmativo", "create.subtitle.blockzapper_deny": "Boop declinante", - "create.subtitle.block_funnel_eat": "CHOMPS del embudo", + "create.subtitle.blockzapper_confirm": "Ding afirmativo", + "create.subtitle.blockzapper_place": "Los bloques se colocan en su sitio", "create.subtitle.blaze_munch": "Blaze mastica felizmente", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 3762a7784..4b84a79b7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1265", + "_": "Missing Localizations: 1264", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,16 +1148,18 @@ "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", - "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", - "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", - "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", - "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", - "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze munches happily", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", + "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "_": "->------------------------] Item Descriptions [------------------------<-", 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 5483fc944..a32f5fc41 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: 1162", + "_": "Missing Localizations: 1163", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,16 +1148,18 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", "create.subtitle.schematicannon_finish": "Fin de schémacanon", "create.subtitle.slime_added": "Bruit de slime", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", - "create.subtitle.mechanical_press_item_break": "Cliquetis de métal", - "create.subtitle.blockzapper_place": "Blocs se zappant en place", - "create.subtitle.blockzapper_confirm": "Ding d'affirmation", "create.subtitle.blockzapper_deny": "Boop de déclin", - "create.subtitle.block_funnel_eat": "Croc d'entonoir", - "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze munches happily", + "create.subtitle.blockzapper_confirm": "Ding d'affirmation", + "create.subtitle.blockzapper_place": "Blocs se zappant en place", + "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "_": "->------------------------] Item Descriptions [------------------------<-", 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 eb2b66aa9..513a746b0 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: 622", + "_": "Missing Localizations: 623", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: usa /killtps avvia per rallentare artificialmente il tick del server", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", "create.subtitle.slime_added": "Slime schiacciato", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", - "create.subtitle.mechanical_press_item_break": "Rumori metallici", - "create.subtitle.blockzapper_place": "Posiziona blocchi nello spazio", - "create.subtitle.blockzapper_confirm": "Ding affermativo", "create.subtitle.blockzapper_deny": "Boop in calo", - "create.subtitle.block_funnel_eat": "CHOMPS a imbuto", + "create.subtitle.blockzapper_confirm": "Ding affermativo", + "create.subtitle.blockzapper_place": "Posiziona blocchi nello spazio", "create.subtitle.blaze_munch": "Il blaze lo gusta felicemente", 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 6d72dd15e..cf30a6689 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: 604", + "_": "Missing Localizations: 605", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: /killtps start を使用して、サーバーのティックを意図的に遅くします", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", - "create.subtitle.mechanical_press_item_break": "金属がガチャンと鳴る", - "create.subtitle.blockzapper_place": "ブロックを発射して設置する", - "create.subtitle.blockzapper_confirm": "成功音", "create.subtitle.blockzapper_deny": "失敗音", - "create.subtitle.block_funnel_eat": "ファンネルが大口で食べる", + "create.subtitle.blockzapper_confirm": "成功音", + "create.subtitle.blockzapper_place": "ブロックを発射して設置する", "create.subtitle.blaze_munch": "ブレイズの咀嚼音", 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 eaf34157c..0a6b50b23 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: 675", + "_": "Missing Localizations: 676", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", "create.subtitle.slime_added": "슬라임이 철퍽거림", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "압착기가 가동됨", - "create.subtitle.mechanical_press_item_break": "금속이 부딫힘", - "create.subtitle.blockzapper_place": "블록이 순간이동됨", - "create.subtitle.blockzapper_confirm": "확인 효과음", "create.subtitle.blockzapper_deny": "취소 효과음", - "create.subtitle.block_funnel_eat": "깔때기가 흡입함", + "create.subtitle.blockzapper_confirm": "확인 효과음", + "create.subtitle.blockzapper_place": "블록이 순간이동됨", "create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함", 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 5e5a64a3b..c009d1345 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: 1554", + "_": "Missing Localizations: 1553", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,16 +1148,18 @@ "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", - "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", - "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", - "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", - "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", - "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze munches happily", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", + "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "_": "->------------------------] Item Descriptions [------------------------<-", 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 0dc83de7c..ccc17dea3 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: 1608", + "_": "Missing Localizations: 1607", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,16 +1148,18 @@ "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", - "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", - "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", - "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", - "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", - "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze munches happily", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", + "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", "_": "->------------------------] Item Descriptions [------------------------<-", 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 d6f607918..149af24c6 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: 519", + "_": "Missing Localizations: 520", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: используйте /killtps start <Время тика>, чтобы искусственно замедлить тик сервера", "create.command.killTPSCommand.argument.tickTime": "Время тика", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", "create.subtitle.slime_added": "Намазывание слизи", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "Механический пресс активирован", - "create.subtitle.mechanical_press_item_break": "Лязг металла", - "create.subtitle.blockzapper_place": "Блок запрыгивает на место", - "create.subtitle.blockzapper_confirm": "Утвердительный динь", "create.subtitle.blockzapper_deny": "Тихий буп", - "create.subtitle.block_funnel_eat": "Воронкообразный чмопс", + "create.subtitle.blockzapper_confirm": "Утвердительный динь", + "create.subtitle.blockzapper_place": "Блок запрыгивает на место", "create.subtitle.blaze_munch": "Всполох радостно жуёт", 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 dbc9bb269..35d5ecf4e 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: 619", + "_": "Missing Localizations: 620", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 来手动降低服务器TPS速度", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", "create.subtitle.schematicannon_finish": "蓝图加农炮:完成任务", "create.subtitle.slime_added": "粘液:挤碎声", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "辊压机:工作中", - "create.subtitle.mechanical_press_item_break": "金属碰撞", - "create.subtitle.blockzapper_place": "放置方块", - "create.subtitle.blockzapper_confirm": "选择方块", "create.subtitle.blockzapper_deny": "放置失败", - "create.subtitle.block_funnel_eat": "漏斗:吞食", + "create.subtitle.blockzapper_confirm": "选择方块", + "create.subtitle.blockzapper_place": "放置方块", "create.subtitle.blaze_munch": "烈焰人:开心地咀嚼着", 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 9920312ed..3a3155431 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: 624", + "_": "Missing Localizations: 625", "_": "->------------------------] Game Elements [------------------------<-", @@ -1148,15 +1148,17 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 來手動降低伺服器TPS", "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "_": "->------------------------] Subtitles [------------------------<-", + "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", "create.subtitle.slime_added": "黏液擠壓", + "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.mechanical_press_activation": "液壓機工作", - "create.subtitle.mechanical_press_item_break": "金屬碰撞", - "create.subtitle.blockzapper_place": "放置方塊", - "create.subtitle.blockzapper_confirm": "選擇方塊", "create.subtitle.blockzapper_deny": "放置失敗", - "create.subtitle.block_funnel_eat": "漏斗吸收", + "create.subtitle.blockzapper_confirm": "選擇方塊", + "create.subtitle.blockzapper_place": "放置方塊", "create.subtitle.blaze_munch": "烈焰使者開心地吃著", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index a420c4ac2..f53419501 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -1,69 +1,12 @@ { - "pigclock": { - "sounds": [ - "create:pigclock" - ], - "subtitle": "create.subtitle.pigclock" - }, - "creeperclock": { - "sounds": [ - "create:creeperclock" - ], - "subtitle": "create.subtitle.creeperclock" - }, - "schematicannon_launch_block": { + "blaze_munch": { "sounds": [ { - "name": "minecraft:entity.generic.explode", + "name": "minecraft:entity.generic.eat", "type": "event" } ], - "subtitle": "create.subtitle.schematicannon_launch_block" - }, - "schematicannon_finish": { - "sounds": [ - { - "name": "minecraft:block.note_block.bell", - "type": "event" - } - ], - "subtitle": "create.subtitle.schematicannon_finish" - }, - "slime_added": { - "sounds": [ - { - "name": "minecraft:block.slime_block.place", - "type": "event" - } - ], - "subtitle": "create.subtitle.slime_added" - }, - "mechanical_press_activation": { - "sounds": [ - { - "name": "minecraft:block.anvil.land", - "type": "event" - } - ], - "subtitle": "create.subtitle.mechanical_press_activation" - }, - "mechanical_press_item_break": { - "sounds": [ - { - "name": "minecraft:entity.item.break", - "type": "event" - } - ], - "subtitle": "create.subtitle.mechanical_press_item_break" - }, - "blockzapper_place": { - "sounds": [ - { - "name": "minecraft:block.note_block.basedrum", - "type": "event" - } - ], - "subtitle": "create.subtitle.blockzapper_place" + "subtitle": "create.subtitle.blaze_munch" }, "blockzapper_confirm": { "sounds": [ @@ -83,22 +26,74 @@ ], "subtitle": "create.subtitle.blockzapper_deny" }, - "block_funnel_eat": { + "blockzapper_place": { "sounds": [ { - "name": "minecraft:entity.generic.eat", + "name": "minecraft:block.note_block.basedrum", "type": "event" } ], - "subtitle": "create.subtitle.block_funnel_eat" + "subtitle": "create.subtitle.blockzapper_place" }, - "blaze_munch": { + "mechanical_press_activation": { "sounds": [ { - "name": "minecraft:entity.generic.eat", + "name": "minecraft:block.netherite_block.hit", "type": "event" } ], - "subtitle": "create.subtitle.blaze_munch" + "subtitle": "create.subtitle.mechanical_press_activation" + }, + "mechanical_press_activation_compounded_1": { + "sounds": [ + { + "name": "minecraft:entity.item.break", + "type": "event" + } + ] + }, + "mechanical_press_activation_belt": { + "sounds": [ + { + "name": "minecraft:block.wool.hit", + "type": "event" + } + ], + "subtitle": "create.subtitle.mechanical_press_activation_belt" + }, + "mechanical_press_activation_belt_compounded_1": { + "sounds": [ + { + "name": "minecraft:entity.item.break", + "type": "event" + } + ] + }, + "schematicannon_finish": { + "sounds": [ + { + "name": "minecraft:block.note_block.bell", + "type": "event" + } + ], + "subtitle": "create.subtitle.schematicannon_finish" + }, + "schematicannon_launch_block": { + "sounds": [ + { + "name": "minecraft:entity.generic.explode", + "type": "event" + } + ], + "subtitle": "create.subtitle.schematicannon_launch_block" + }, + "slime_added": { + "sounds": [ + { + "name": "minecraft:block.slime_block.place", + "type": "event" + } + ], + "subtitle": "create.subtitle.slime_added" } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 8b71097aa..721bdc982 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -2,127 +2,347 @@ package com.simibubi.create; import java.io.IOException; import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Pair; import net.minecraft.data.DataGenerator; import net.minecraft.data.DirectoryCache; import net.minecraft.data.IDataProvider; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.registries.IForgeRegistry; -public enum AllSoundEvents implements IDataProvider { +//@EventBusSubscriber(bus = Bus.FORGE) +public class AllSoundEvents { - CUCKOO_PIG("pigclock"), - CUCKOO_CREEPER("creeperclock"), + public static Map entries = Maps.newHashMap(); + public static final SoundEntry - SCHEMATICANNON_LAUNCH_BLOCK(SoundEvents.ENTITY_GENERIC_EXPLODE), - SCHEMATICANNON_FINISH(SoundEvents.BLOCK_NOTE_BLOCK_BELL), - SLIME_ADDED(SoundEvents.BLOCK_SLIME_BLOCK_PLACE), - MECHANICAL_PRESS_ACTIVATION(SoundEvents.BLOCK_ANVIL_LAND), - MECHANICAL_PRESS_ITEM_BREAK(SoundEvents.ENTITY_ITEM_BREAK), - BLOCKZAPPER_PLACE(SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM), - BLOCKZAPPER_CONFIRM(SoundEvents.BLOCK_NOTE_BLOCK_BELL), - BLOCKZAPPER_DENY(SoundEvents.BLOCK_NOTE_BLOCK_BASS), - BLOCK_FUNNEL_EAT(SoundEvents.ENTITY_GENERIC_EAT), - BLAZE_MUNCH(SoundEvents.ENTITY_GENERIC_EAT) + SCHEMATICANNON_LAUNCH_BLOCK = create("schematicannon_launch_block").subtitle("Schematicannon fires") + .playExisting(SoundEvents.ENTITY_GENERIC_EXPLODE, .1f, 1.1f) + .category(SoundCategory.BLOCKS) + .build(), - ; + SCHEMATICANNON_FINISH = create("schematicannon_finish").subtitle("Schematicannon dings") + .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BELL, 1, .7f) + .category(SoundCategory.BLOCKS) + .build(), - String id; - SoundEvent event, child; - private DataGenerator generator; + SLIME_ADDED = create("slime_added").subtitle("Slime squishes") + .playExisting(SoundEvents.BLOCK_SLIME_BLOCK_PLACE) + .category(SoundCategory.BLOCKS) + .build(), - // For adding our own sounds at assets/create/sounds/name.ogg - AllSoundEvents() { - id = Lang.asId(name()); - } + MECHANICAL_PRESS_ACTIVATION = create("mechanical_press_activation").subtitle("Mechanical Press clangs") + .playExisting(SoundEvents.BLOCK_NETHERITE_BLOCK_HIT, .5f, 1.25f) + .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .15f, .75f) + .category(SoundCategory.BLOCKS) + .build(), - AllSoundEvents(String name) { - id = name; - } + MECHANICAL_PRESS_ACTIVATION_ON_BELT = + create("mechanical_press_activation_belt").subtitle("Mechanical Press bonks") + .playExisting(SoundEvents.BLOCK_WOOL_HIT, .75f, 1f) + .playExisting(SoundEvents.ENTITY_ITEM_BREAK, .15f, .75f) + .category(SoundCategory.BLOCKS) + .build(), - // For wrapping a existing sound with new subtitle - AllSoundEvents(SoundEvent child) { - this(); - this.child = child; - } + BLOCKZAPPER_PLACE = create("blockzapper_place").subtitle("Blockzapper zaps") + .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM) + .category(SoundCategory.PLAYERS) + .build(), - // subtitles are taken from the lang file (create.subtitle.sound_event_name) + BLOCKZAPPER_CONFIRM = create("blockzapper_confirm").subtitle("Affirmative ding") + .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BELL, 0.5f, 0.8f) + .category(SoundCategory.PLAYERS) + .build(), - public SoundEvent get() { - return event; - } + BLOCKZAPPER_DENY = create("blockzapper_deny").subtitle("Declining boop") + .playExisting(SoundEvents.BLOCK_NOTE_BLOCK_BASS, 1f, 0.5f) + .category(SoundCategory.PLAYERS) + .build(), - private String getEventName() { - return id; - } + BLAZE_MUNCH = create("blaze_munch").subtitle("Blaze Burner munches") + .playExisting(SoundEvents.ENTITY_GENERIC_EAT, .5f, 1f) + .category(SoundCategory.BLOCKS) + .build(); - public AllSoundEvents generator(DataGenerator generator) { - this.generator = generator; - return this; + public static SoundEntryBuilder create(String id) { + return new SoundEntryBuilder(id); } public static void register(RegistryEvent.Register event) { IForgeRegistry registry = event.getRegistry(); - - for (AllSoundEvents entry : values()) { - - ResourceLocation rec = new ResourceLocation(Create.ID, entry.getEventName()); - SoundEvent sound = new SoundEvent(rec).setRegistryName(rec); - registry.register(sound); - entry.event = sound; - } + for (SoundEntry entry : entries.values()) + entry.register(registry); } - public void generate(Path path, DirectoryCache cache) { - Gson GSON = (new GsonBuilder()).setPrettyPrinting() - .disableHtmlEscaping() - .create(); - path = path.resolve("assets/create"); + public static JsonElement provideLangEntries() { + JsonObject object = new JsonObject(); + for (SoundEntry entry : entries.values()) + object.addProperty(entry.getSubtitleKey(), entry.getSubtitle()); + return object; + } - try { - JsonObject json = new JsonObject(); - for (AllSoundEvents soundEvent : values()) { - JsonObject entry = new JsonObject(); - JsonArray arr = new JsonArray(); - if (soundEvent.child != null) { - // wrapper - JsonObject s = new JsonObject(); - s.addProperty("name", soundEvent.child.getName() - .toString()); - s.addProperty("type", "event"); - arr.add(s); - } else { - // own sound - arr.add(Create.ID + ":" + soundEvent.getEventName()); - } - entry.add("sounds", arr); - entry.addProperty("subtitle", Create.ID + ".subtitle." + soundEvent.getEventName()); - json.add(soundEvent.getEventName(), entry); + public static SoundEntryProvider provider(DataGenerator generator) { + return new SoundEntryProvider(generator); + } + +// @SubscribeEvent +// public static void cancelSubtitlesOfCompoundedSounds(PlaySoundEvent event) { +// ResourceLocation soundLocation = event.getSound().getSoundLocation(); +// if (!soundLocation.getNamespace().equals(Create.ID)) +// return; +// if (soundLocation.getPath().contains("_compounded_") +// event.setResultSound(); +// +// } + + private static class SoundEntryProvider implements IDataProvider { + + private DataGenerator generator; + + public SoundEntryProvider(DataGenerator generator) { + this.generator = generator; + } + + @Override + public void act(DirectoryCache cache) throws IOException { + generate(generator.getOutputFolder(), cache); + } + + @Override + public String getName() { + return "Create's Custom Sounds"; + } + + public void generate(Path path, DirectoryCache cache) { + Gson GSON = (new GsonBuilder()).setPrettyPrinting() + .disableHtmlEscaping() + .create(); + path = path.resolve("assets/create"); + + try { + JsonObject json = new JsonObject(); + entries.entrySet() + .stream() + .sorted(Map.Entry.comparingByKey()) + .forEach(entry -> { + entry.getValue() + .write(json); + }); + IDataProvider.save(GSON, cache, json, path.resolve("sounds.json")); + + } catch (IOException e) { + e.printStackTrace(); } - IDataProvider.save(GSON, cache, json, path.resolve("sounds.json")); - - } catch (IOException e) { - e.printStackTrace(); } } - @Override - public void act(DirectoryCache cache) throws IOException { - generate(generator.getOutputFolder(), cache); + static class SoundEntryBuilder { + + protected String id; + protected String subtitle = "unregistered"; + protected SoundCategory category = SoundCategory.BLOCKS; + List>> wrappedEvents; + + public SoundEntryBuilder(String id) { + wrappedEvents = Lists.newArrayList(); + this.id = id; + } + + public SoundEntryBuilder subtitle(String subtitle) { + this.subtitle = subtitle; + return this; + } + + public SoundEntryBuilder category(SoundCategory category) { + this.category = category; + return this; + } + + public SoundEntryBuilder playExisting(SoundEvent event, float volume, float pitch) { + wrappedEvents.add(Pair.of(event, Couple.create(volume, pitch))); + return this; + } + + public SoundEntryBuilder playExisting(SoundEvent event) { + return playExisting(event, 1, 1); + } + + public SoundEntry build() { + SoundEntry entry = wrappedEvents.isEmpty() ? new CustomSoundEntry(id, subtitle, category) + : new WrappedSoundEntry(id, subtitle, wrappedEvents, category); + entries.put(entry.getLocation(), entry); + return entry; + } + } - @Override - public String getName() { - return "Create's Custom Sound: " + name(); + public static abstract class SoundEntry { + + protected String id; + protected String subtitle; + protected SoundCategory category; + + public SoundEntry(String id, String subtitle, SoundCategory category) { + this.id = id; + this.subtitle = subtitle; + this.category = category; + } + + public abstract void register(IForgeRegistry registry); + + public abstract void write(JsonObject json); + + public String getSubtitleKey() { + return Create.ID + ".subtitle." + id; + } + + public String getId() { + return id; + } + + public ResourceLocation getLocation() { + return Create.asResource(id); + } + + public String getSubtitle() { + return subtitle; + } + + public void playOnServer(World world, BlockPos pos) { + playOnServer(world, pos, 1, 1); + } + + public void playOnServer(World world, BlockPos pos, float volume, float pitch) { + play(world, null, pos, volume, pitch); + } + + public void play(World world, PlayerEntity entity, BlockPos pos) { + play(world, entity, pos, 1, 1); + } + + public void playFrom(Entity entity) { + playFrom(entity, 1, 1); + } + + public void playFrom(Entity entity, float volume, float pitch) { + if (!entity.isSilent()) + play(entity.world, null, entity.getBlockPos(), volume, pitch); + } + + public void play(World world, PlayerEntity entity, BlockPos pos, float volume, float pitch) { + play(world, entity, pos.getX(), pos.getY(), pos.getZ(), volume, pitch); + } + + abstract void play(World world, PlayerEntity entity, double x, double y, double z, float volume, float pitch); + } + + static class WrappedSoundEntry extends SoundEntry { + + private List>> wrappedEvents; + private List>> compiledEvents; + + public WrappedSoundEntry(String id, String subtitle, List>> wrappedEvents, + SoundCategory category) { + super(id, subtitle, category); + this.wrappedEvents = wrappedEvents; + compiledEvents = Lists.newArrayList(); + } + + @Override + public void register(IForgeRegistry registry) { + for (int i = 0; i < wrappedEvents.size(); i++) { + ResourceLocation location = Create.asResource(getIdOf(i)); + SoundEvent sound = new SoundEvent(location).setRegistryName(location); + registry.register(sound); + compiledEvents.add(Pair.of(sound, wrappedEvents.get(i) + .getSecond())); + } + } + + protected String getIdOf(int i) { + return i == 0 ? id : id + "_compounded_" + i; + } + + @Override + public void write(JsonObject json) { + for (int i = 0; i < wrappedEvents.size(); i++) { + Pair> pair = wrappedEvents.get(i); + JsonObject entry = new JsonObject(); + JsonArray list = new JsonArray(); + JsonObject s = new JsonObject(); + s.addProperty("name", pair.getFirst() + .getName() + .toString()); + s.addProperty("type", "event"); + list.add(s); + entry.add("sounds", list); + if (i == 0) + entry.addProperty("subtitle", getSubtitleKey()); + json.add(getIdOf(i), entry); + } + } + + @Override + void play(World world, PlayerEntity entity, double x, double y, double z, float volume, float pitch) { + for (Pair> pair : compiledEvents) { + Couple volPitch = pair.getSecond(); + world.playSound(entity, x, y, z, pair.getFirst(), category, volPitch.getFirst() * volume, + volPitch.getSecond() * pitch); + } + } + } + + static class CustomSoundEntry extends SoundEntry { + + protected SoundEvent event; + + public CustomSoundEntry(String id, String subtitle, SoundCategory category) { + super(id, subtitle, category); + } + + @Override + public void register(IForgeRegistry registry) { + ResourceLocation location = getLocation(); + SoundEvent sound = new SoundEvent(location).setRegistryName(location); + registry.register(sound); + } + + @Override + public void write(JsonObject json) { + JsonObject entry = new JsonObject(); + JsonArray list = new JsonArray(); + list.add(getLocation().toString()); + entry.add("sounds", list); + entry.addProperty("subtitle", getSubtitleKey()); + json.add(id, entry); + } + + @Override + void play(World world, PlayerEntity entity, double x, double y, double z, float volume, float pitch) { + world.playSound(entity, x, y, z, event, category, volume, pitch); + } + + } + } diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 8d7e91f5f..6cd979ead 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -143,7 +143,7 @@ public class Create { DataGenerator gen = event.getGenerator(); gen.addProvider(new AllAdvancements(gen)); gen.addProvider(new LangMerger(gen)); - gen.addProvider(AllSoundEvents.BLAZE_MUNCH.generator(gen)); + gen.addProvider(AllSoundEvents.provider(gen)); gen.addProvider(new StandardRecipeGen(gen)); gen.addProvider(new MechanicalCraftingRecipeGen(gen)); ProcessingRecipeGen.registerAll(gen); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java index 8fba222f7..e37bcd83c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java @@ -23,6 +23,8 @@ import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.inventory.IInventory; @@ -35,7 +37,6 @@ import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.NonNullList; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; @@ -182,12 +183,11 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { applyPressingInWorld(); if (onBasin()) applyCompactingOnBasin(); - if (!world.isRemote) { - world.playSound(null, getPos(), AllSoundEvents.MECHANICAL_PRESS_ITEM_BREAK.get(), SoundCategory.BLOCKS, - .5f, 1f); - world.playSound(null, getPos(), AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.get(), SoundCategory.BLOCKS, - .125f, 1f); - } + + if (world.getBlockState(pos.down(2)).getSoundType() == SoundType.CLOTH) + AllSoundEvents.MECHANICAL_PRESS_ACTIVATION_ON_BELT.playOnServer(world, pos); + else + AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.playOnServer(world, pos); } if (!world.isRemote && runningTicks > CYCLE) { @@ -266,7 +266,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { AllTriggers.triggerForNearbyPlayers(AllTriggers.BONK, world, pos, 4); entityScanCooldown = 0; - + if (!bulk) break; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java index ad32300e6..2156411af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java @@ -18,7 +18,6 @@ import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.vector.Vector3d; @@ -65,7 +64,7 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0); return ActionResultType.SUCCESS; } - worldIn.playSound(null, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, .5f, 1); + AllSoundEvents.SLIME_ADDED.playOnServer(worldIn, pos, .5f, 1); state = state.with(glueableSide, true); } } @@ -86,7 +85,7 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements return ActionResultType.SUCCESS; } - worldIn.playSound(null, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, .5f, 1); + AllSoundEvents.SLIME_ADDED.playOnServer(worldIn, pos, .5f, 1); worldIn.setBlockState(pos, state.with(affectedSide, isSlimeBall)); return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java index d6402c34c..34d4a421f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java @@ -18,7 +18,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; -import net.minecraft.util.SoundCategory; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; @@ -91,8 +90,7 @@ public class StickerTileEntity extends SmartTileEntity implements IInstanceRende @OnlyIn(Dist.CLIENT) public void playSound(boolean attach) { - world.playSound(Minecraft.getInstance().player, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, - 0.35F, attach ? 0.75F : 0.2f); + AllSoundEvents.SLIME_ADDED.play(world, Minecraft.getInstance().player, pos, 0.35f, attach ? 0.75f : 0.2f); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index dc89ef02e..593062e4e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -96,12 +96,12 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat if (onValidSurface()) { AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this), new GlueEffectPacket(getHangingPosition(), getFacingDirection().getOpposite(), false)); - playSound(AllSoundEvents.SLIME_ADDED.get(), 0.5F, 0.5F); + AllSoundEvents.SLIME_ADDED.playFrom(this, 0.5F, 0.5F); } } public void playPlaceSound() { - playSound(AllSoundEvents.SLIME_ADDED.get(), 0.5F, 0.75F); + AllSoundEvents.SLIME_ADDED.playFrom(this, 0.5F, 0.75F); } protected void updateFacingWithBoundingBox() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java index a0eb4546c..2c13bebb7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonBlock.java @@ -22,7 +22,6 @@ import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.IStringSerializable; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.shapes.ISelectionContext; @@ -88,7 +87,7 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock implement worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0); return ActionResultType.SUCCESS; } - worldIn.playSound(null, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, .5f, 1); + AllSoundEvents.SLIME_ADDED.playOnServer(worldIn, pos, .5f, 1); if (!player.isCreative()) player.getHeldItem(handIn) .shrink(1); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java index eb0f9b6e9..07582c253 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerHandler.java @@ -5,7 +5,6 @@ import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerTil import net.minecraft.entity.projectile.EggEntity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; @@ -52,7 +51,7 @@ public class BlazeBurnerHandler { heater.notifyUpdate(); } - world.playSound(null, heater.getPos(), AllSoundEvents.BLAZE_MUNCH.get(), SoundCategory.BLOCKS, .5F, 1F); + AllSoundEvents.BLAZE_MUNCH.playOnServer(world, heater.getPos()); } } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java index bb2f34074..5b1de8daf 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperInteractionHandler.java @@ -15,7 +15,6 @@ import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.StairsShape; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceContext; @@ -33,7 +32,8 @@ public class ZapperInteractionHandler { public static void leftClickingBlocksWithTheZapperSelectsTheBlock(PlayerInteractEvent.LeftClickBlock event) { if (event.getWorld().isRemote) return; - ItemStack heldItem = event.getPlayer().getHeldItemMainhand(); + ItemStack heldItem = event.getPlayer() + .getHeldItemMainhand(); if (heldItem.getItem() instanceof ZapperItem && trySelect(heldItem, event.getPlayer())) { event.setCancellationResult(ActionResultType.FAIL); event.setCanceled(true); @@ -87,10 +87,8 @@ public class ZapperInteractionHandler { data.remove("id"); } CompoundNBT tag = stack.getOrCreateTag(); - if (tag.contains("BlockUsed") - && NBTUtil.readBlockState( - stack.getTag().getCompound("BlockUsed")) == newState - && Objects.equals(data, tag.get("BlockData"))) { + if (tag.contains("BlockUsed") && NBTUtil.readBlockState(stack.getTag() + .getCompound("BlockUsed")) == newState && Objects.equals(data, tag.get("BlockData"))) { return false; } @@ -99,9 +97,8 @@ public class ZapperInteractionHandler { tag.remove("BlockData"); else tag.put("BlockData", data); - player.world.playSound(null, player.getBlockPos(), AllSoundEvents.BLOCKZAPPER_CONFIRM.get(), - SoundCategory.BLOCKS, 0.5f, 0.8f); + AllSoundEvents.BLOCKZAPPER_CONFIRM.playOnServer(player.world, player.getBlockPos()); return true; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java index 993f96d4c..ac7229898 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperItem.java @@ -30,7 +30,6 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import net.minecraft.util.HandSide; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceContext; @@ -144,8 +143,7 @@ public abstract class ZapperItem extends Item { // Check if can be used ITextComponent msg = validateUsage(item); if (msg != null) { - world.playSound(player, player.getBlockPos(), AllSoundEvents.BLOCKZAPPER_DENY.get(), SoundCategory.BLOCKS, - 1f, 0.5f); + AllSoundEvents.BLOCKZAPPER_DENY.play(world, player, player.getBlockPos()); player.sendStatusMessage(msg.copy().formatted(TextFormatting.RED), true); return new ActionResult<>(ActionResultType.FAIL, item); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java index ce065f62e..bcf8f8e5c 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/ZapperRenderHandler.java @@ -21,7 +21,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Hand; import net.minecraft.util.HandSide; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; @@ -82,21 +81,21 @@ public class ZapperRenderHandler { lastRightHandAnimation = rightHandAnimation; leftHandAnimation *= 0.8f; rightHandAnimation *= 0.8f; - + if (cachedBeams == null) cachedBeams = new LinkedList<>(); - + cachedBeams.removeIf(b -> b.itensity < .1f); if (cachedBeams.isEmpty()) return; - + cachedBeams.forEach(beam -> { CreateClient.outliner.endChasingLine(beam, beam.start, beam.end, 1 - beam.itensity) - .disableNormals() - .colored(0xffffff) - .lineWidth(beam.itensity * 1 / 8f); + .disableNormals() + .colored(0xffffff) + .lineWidth(beam.itensity * 1 / 8f); }); - + cachedBeams.forEach(b -> b.itensity *= .6f); } @@ -115,8 +114,8 @@ public class ZapperRenderHandler { public static void playSound(Hand hand, BlockPos position) { float pitch = hand == Hand.MAIN_HAND ? 2f : 0.9f; - Minecraft.getInstance().world.playSound(position, AllSoundEvents.BLOCKZAPPER_PLACE.get(), SoundCategory.BLOCKS, - 0.8f, pitch, false); + Minecraft mc = Minecraft.getInstance(); + AllSoundEvents.BLOCKZAPPER_PLACE.play(mc.world, mc.player, position, 0.8f, pitch); } public static void addBeam(LaserBeam beam) { @@ -166,7 +165,7 @@ public class ZapperRenderHandler { float f4 = -0.4F * MathHelper.sin(event.getSwingProgress() * (float) Math.PI); float f5 = MathHelper.sin(event.getSwingProgress() * event.getSwingProgress() * (float) Math.PI); float f6 = MathHelper.sin(f1 * (float) Math.PI); - + ms.translate(f * (f2 + 0.64000005F - .1f), f3 + -0.4F + equipProgress * -0.6F, f4 + -0.71999997F + .3f + recoil); ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(f * 75.0F)); @@ -181,7 +180,7 @@ public class ZapperRenderHandler { ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(f * -135.0F)); ms.translate(f * 5.6F, 0.0F, 0.0F); ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(f * 40.0F)); - + PlayerRenderer playerrenderer = (PlayerRenderer) mc.getRenderManager() .getRenderer(abstractclientplayerentity); if (rightHand) { diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java index f8983ad48..8a06c2464 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java @@ -55,7 +55,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.AxisDirection; -import net.minecraft.util.SoundCategory; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MutableBoundingBox; @@ -409,7 +408,8 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC ItemRequirement requirement; if (entityMode) { - requirement = ItemRequirement.of(blockReader.getEntities().collect(Collectors.toList()) + requirement = ItemRequirement.of(blockReader.getEntities() + .collect(Collectors.toList()) .get(printingEntityIndex)); } else { @@ -459,7 +459,8 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC ItemStack icon = requirement.isEmpty() || requiredItems.isEmpty() ? ItemStack.EMPTY : requiredItems.get(0); if (entityMode) - launchEntity(target, icon, blockReader.getEntities().collect(Collectors.toList()) + launchEntity(target, icon, blockReader.getEntities() + .collect(Collectors.toList()) .get(printingEntityIndex)); else if (AllBlocks.BELT.has(blockState)) { TileEntity te = blockReader.getTileEntity(currentPos.add(schematicAnchor)); @@ -646,7 +647,8 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC } protected void advanceCurrentPos() { - List entities = blockReader.getEntities().collect(Collectors.toList()); + List entities = blockReader.getEntities() + .collect(Collectors.toList()); if (printingEntityIndex != -1) { printingEntityIndex++; @@ -692,8 +694,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC statusMsg = "finished"; resetPrinter(); target = getPos().add(1, 0, 0); - world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), AllSoundEvents.SCHEMATICANNON_FINISH.get(), - SoundCategory.BLOCKS, 1, .7f); + AllSoundEvents.SCHEMATICANNON_FINISH.playOnServer(world, pos); sendUpdate = true; } @@ -875,8 +876,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC } public void playFiringSound() { - world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), AllSoundEvents.SCHEMATICANNON_LAUNCH_BLOCK.get(), - SoundCategory.BLOCKS, .1f, 1.1f); + AllSoundEvents.SCHEMATICANNON_LAUNCH_BLOCK.playOnServer(world, pos); } public void sendToContainer(PacketBuffer buffer) { @@ -919,14 +919,15 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC checklist.require(requirement); blocksToPlace++; } - blockReader.getEntities().forEach(entity -> { - ItemRequirement requirement = ItemRequirement.of(entity); - if (requirement.isEmpty()) - return; - if (requirement.isInvalid()) - return; - checklist.require(requirement); - }); + blockReader.getEntities() + .forEach(entity -> { + ItemRequirement requirement = ItemRequirement.of(entity); + if (requirement.isEmpty()) + return; + if (requirement.isInvalid()) + return; + checklist.require(requirement); + }); } checklist.gathered.clear(); diff --git a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java index 6c71f4d97..9904c53b4 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java +++ b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.data; import com.google.common.base.Supplier; import com.google.gson.JsonElement; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.utility.FilesHelper; @@ -11,6 +12,7 @@ public enum AllLangPartials { ADVANCEMENTS("Advancements"), MESSAGES("UI & Messages"), + SUBTITLES("Subtitles", AllSoundEvents::provideLangEntries), TOOLTIPS("Item Descriptions"), PONDER("Ponder Content", PonderRegistry::provideLangEntries), diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 9f5f45fb3..59eb8ceb6 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -501,17 +501,6 @@ "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Server tick is back to regular speed :D", "create.command.killTPSCommand.status.usage.0": "[Create]: use /killtps stop to bring back server tick to regular speed", "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", - "create.command.killTPSCommand.argument.tickTime": "tickTime", - - "create.subtitle.schematicannon_launch_block": "Schematicannon shoots", - "create.subtitle.schematicannon_finish": "Schematicannon finishes", - "create.subtitle.slime_added": "Slime squishes", - "create.subtitle.mechanical_press_activation": "Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "Metal clanks", - "create.subtitle.blockzapper_place": "Blocks zap into place", - "create.subtitle.blockzapper_confirm": "Affirmative Ding", - "create.subtitle.blockzapper_deny": "Declining Boop", - "create.subtitle.block_funnel_eat": "Funnel CHOMPS", - "create.subtitle.blaze_munch": "Blaze munches happily" + "create.command.killTPSCommand.argument.tickTime": "tickTime" } \ No newline at end of file diff --git a/src/main/resources/assets/create/sounds/creeperclock.ogg b/src/main/resources/assets/create/sounds/creeperclock.ogg deleted file mode 100644 index fbcb1cf3fe349cfac997be78f4a7f3c7dfc2768a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17248 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 diff --git a/src/main/resources/assets/create/sounds/pigclock.ogg b/src/main/resources/assets/create/sounds/pigclock.ogg deleted file mode 100644 index daa7c7f64beb1de2d31bacfbc569d31d832a53c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17404 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 i5x{O6C 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