From 9391700c261c0a193cca3e7036605fe403908fd1 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 20 Apr 2021 02:19:12 +0200 Subject: [PATCH] SoundScapes, Part I - Sounds for depots, funnels, cogwheels and generic kinetic rumbling, also fans --- src/generated/resources/.cache/cache | 28 ++-- .../resources/assets/create/lang/en_us.json | 12 +- .../assets/create/lang/unfinished/de_de.json | 14 +- .../assets/create/lang/unfinished/es_es.json | 14 +- .../assets/create/lang/unfinished/es_mx.json | 14 +- .../assets/create/lang/unfinished/fr_fr.json | 14 +- .../assets/create/lang/unfinished/it_it.json | 14 +- .../assets/create/lang/unfinished/ja_jp.json | 14 +- .../assets/create/lang/unfinished/ko_kr.json | 14 +- .../assets/create/lang/unfinished/nl_nl.json | 14 +- .../assets/create/lang/unfinished/pt_br.json | 14 +- .../assets/create/lang/unfinished/ru_ru.json | 14 +- .../assets/create/lang/unfinished/zh_cn.json | 14 +- .../assets/create/lang/unfinished/zh_tw.json | 14 +- .../resources/assets/create/sounds.json | 41 +++++ .../java/com/simibubi/create/AllBlocks.java | 3 + .../com/simibubi/create/AllSoundEvents.java | 56 ++++++- .../contraptions/base/KineticTileEntity.java | 61 +++++-- .../components/fan/AirCurrent.java | 47 +++++- .../components/fan/AirCurrentSound.java | 48 ++++++ .../advanced/GantryShaftTileEntity.java | 5 + .../elementary/SimpleKineticTileEntity.java | 10 +- .../relays/gearbox/GearboxTileEntity.java | 5 + .../logistics/block/depot/DepotBehaviour.java | 11 +- .../block/depot/SharedDepotBlockMethods.java | 2 + .../block/funnel/FunnelTileEntity.java | 8 +- .../simibubi/create/events/ClientEvents.java | 11 +- .../foundation/sound/ContinuousSound.java | 55 +++++++ .../foundation/sound/RepeatingSound.java | 39 +++++ .../create/foundation/sound/SoundScape.java | 88 ++++++++++ .../create/foundation/sound/SoundScapes.java | 150 ++++++++++++++++++ .../resources/assets/create/sounds/cogs.ogg | Bin 0 -> 75155 bytes 32 files changed, 747 insertions(+), 101 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java create mode 100644 src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java create mode 100644 src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java create mode 100644 src/main/java/com/simibubi/create/foundation/sound/SoundScape.java create mode 100644 src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java create mode 100644 src/main/resources/assets/create/sounds/cogs.ogg diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index dc18e2d28..c1ddae6db 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 97e9ee471ea650f6b7f3d3f39f00201cd5ad752d assets/create/lang/en_ud.json -3878d0d84b9575728bd299385af2a61bd3a84243 assets/create/lang/en_us.json -33296621c4421a2dc329a3739d8efafbb3b5b57a assets/create/lang/unfinished/de_de.json -052248ce9880cb3db937fed06c6d46a3ca77d1b4 assets/create/lang/unfinished/es_es.json -05d9d186ad4888c2dcb1eb08fe9b78e1e5482cd7 assets/create/lang/unfinished/es_mx.json -dea56d5fcda7baf23d5938b43c1770b5cd76c6f6 assets/create/lang/unfinished/fr_fr.json -56513c7dd8f8ce309b0f77019a2b1b0a55c0cf38 assets/create/lang/unfinished/it_it.json -888191ed07af611597d5ff852ca3d6cb6bf803b7 assets/create/lang/unfinished/ja_jp.json -95fcbeeffd2ced25371f86c9529d4108bf26f930 assets/create/lang/unfinished/ko_kr.json -03e170a7196c4c76942e8b6fde2b0a0b9b877113 assets/create/lang/unfinished/nl_nl.json -a1e092ee4a6eb19568f36535f183afe1d326f0cf assets/create/lang/unfinished/pt_br.json -74b3356506bdb4bf7046768bd7735fa95057d61a assets/create/lang/unfinished/ru_ru.json -ce16cef5a488c2f86def742ca2e436cb42e18552 assets/create/lang/unfinished/zh_cn.json -b55d5abac95ba2649f656857f54b39f98e686767 assets/create/lang/unfinished/zh_tw.json +af76eb706726692eaf7f9f50f40c9278a10c539d assets/create/lang/en_us.json +ec771f0345e4148458035ec8cd4bffc480b45f47 assets/create/lang/unfinished/de_de.json +8ff19eddb1cbf42e3f16abc3968b7554b45d0769 assets/create/lang/unfinished/es_es.json +d7b6c821789f32ed7c4324bb17502cf75ee8b219 assets/create/lang/unfinished/es_mx.json +f4fd19eb4e2d60947b675efe7bc9b27dc7036cd4 assets/create/lang/unfinished/fr_fr.json +c219fafeb713fb4e13a5c1c5fa6a0268fe35cc5f assets/create/lang/unfinished/it_it.json +c44d961f8bb66645257d03dd1f44447cc529cf7b assets/create/lang/unfinished/ja_jp.json +723457b7ff8a06e3d50870e33fa0e5a0db16f9a6 assets/create/lang/unfinished/ko_kr.json +32bffbc8b9b6d02793aaa7328de2ca7c178d87dc assets/create/lang/unfinished/nl_nl.json +27a2d533fa7be9e9e982a1c4b93bb0e5c01e6bf0 assets/create/lang/unfinished/pt_br.json +878bab030e26e6c26fdd5199284aa23d2fb79cc5 assets/create/lang/unfinished/ru_ru.json +7648680dd52bb8f0ba04de23038c0530d37fe7fc assets/create/lang/unfinished/zh_cn.json +624b2a537ee44a2493806414a512805a5683d155 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 -f98bf9f870ac5ee5b31c12a20739773c5fee4949 assets/create/sounds.json +736b2475009be0a214894aad0a42cc2760d2f982 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 76da8e5cb..9983acfaa 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1152,15 +1152,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Schematicannon fires", - "create.subtitle.schematicannon_finish": "Schematicannon dings", + "create.subtitle.cogs": "Cogwheels rumble", "create.subtitle.slime_added": "Slime squishes", "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.depot_slide": "Item slides", "create.subtitle.blockzapper_place": "Blockzapper zaps", "create.subtitle.blaze_munch": "Blaze Burner munches", + "create.subtitle.schematicannon_launch_block": "Schematicannon fires", + "create.subtitle.funnel_flap": "Funnel Flaps", + "create.subtitle.schematicannon_finish": "Schematicannon dings", + "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "Declining boop", + "create.subtitle.depot_plop": "Item lands", "_": "->------------------------] 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 fef0fbea0..a6bd5c9e5 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: 914", + "_": "Missing Localizations: 918", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", - "create.subtitle.schematicannon_finish": "Bauplankanone endet", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "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.blockzapper_deny": "Ablehnendes Boop", "create.subtitle.blockzapper_confirm": "Bestätigendes Ding", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "Blöcke zappen an Ort und Stelle", "create.subtitle.blaze_munch": "Lohe kaut glücklich", + "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "Bauplankanone endet", + "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", + "create.subtitle.blockzapper_deny": "Ablehnendes Boop", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", 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 17ad4bdce..badc0e300 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: 607", + "_": "Missing Localizations: 611", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", - "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "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.blockzapper_deny": "Boop declinante", "create.subtitle.blockzapper_confirm": "Ding afirmativo", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "Los bloques se colocan en su sitio", "create.subtitle.blaze_munch": "Blaze mastica felizmente", + "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", + "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", + "create.subtitle.blockzapper_deny": "Boop declinante", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", 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 e362b5565..c09524579 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: 1269", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", "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.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] 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 586f39174..5604fb0ba 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: 1164", + "_": "Missing Localizations: 1168", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", - "create.subtitle.schematicannon_finish": "Fin de schémacanon", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "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.blockzapper_deny": "Boop de déclin", "create.subtitle.blockzapper_confirm": "Ding d'affirmation", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "Blocs se zappant en place", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", + "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "Fin de schémacanon", + "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", + "create.subtitle.blockzapper_deny": "Boop de déclin", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] 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 f627cf5c9..e7b579942 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: 624", + "_": "Missing Localizations: 628", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", - "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "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.blockzapper_deny": "Boop in calo", "create.subtitle.blockzapper_confirm": "Ding affermativo", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "Posiziona blocchi nello spazio", "create.subtitle.blaze_munch": "Il blaze lo gusta felicemente", + "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", + "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", + "create.subtitle.blockzapper_deny": "Boop in calo", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", 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 99d078dda..710906f08 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: 606", + "_": "Missing Localizations: 610", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", - "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", - "create.subtitle.blockzapper_deny": "失敗音", "create.subtitle.blockzapper_confirm": "成功音", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "ブロックを発射して設置する", "create.subtitle.blaze_munch": "ブレイズの咀嚼音", + "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", + "create.subtitle.mechanical_press_activation": "メカニカルプレスが作動する", + "create.subtitle.blockzapper_deny": "失敗音", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", 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 103772bb5..6e1ab4253 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: 677", + "_": "Missing Localizations: 681", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", - "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "슬라임이 철퍽거림", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "압착기가 가동됨", - "create.subtitle.blockzapper_deny": "취소 효과음", "create.subtitle.blockzapper_confirm": "확인 효과음", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "블록이 순간이동됨", "create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함", + "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", + "create.subtitle.mechanical_press_activation": "압착기가 가동됨", + "create.subtitle.blockzapper_deny": "취소 효과음", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", 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 3e5158e17..4a9af2145 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: 1558", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", "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.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] 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 3cb760892..8b04c7e28 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: 1612", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", "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.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "UNLOCALIZED: Blockzapper zaps", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", + "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", + "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining boop", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] 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 0cc11a18b..c2af4c0e5 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: 521", + "_": "Missing Localizations: 525", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", - "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "Намазывание слизи", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "Механический пресс активирован", - "create.subtitle.blockzapper_deny": "Тихий буп", "create.subtitle.blockzapper_confirm": "Утвердительный динь", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "Блок запрыгивает на место", "create.subtitle.blaze_munch": "Всполох радостно жуёт", + "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", + "create.subtitle.mechanical_press_activation": "Механический пресс активирован", + "create.subtitle.blockzapper_deny": "Тихий буп", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", 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 63960b6ec..9c8df949e 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: 621", + "_": "Missing Localizations: 625", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", - "create.subtitle.schematicannon_finish": "蓝图加农炮:完成任务", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "粘液:挤碎声", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "辊压机:工作中", - "create.subtitle.blockzapper_deny": "放置失败", "create.subtitle.blockzapper_confirm": "选择方块", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "放置方块", "create.subtitle.blaze_munch": "烈焰人:开心地咀嚼着", + "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "蓝图加农炮:完成任务", + "create.subtitle.mechanical_press_activation": "辊压机:工作中", + "create.subtitle.blockzapper_deny": "放置失败", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", 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 53ea0ab80..3b992fa9f 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: 626", + "_": "Missing Localizations: 630", "_": "->------------------------] Game Elements [------------------------<-", @@ -1153,15 +1153,19 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", - "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", "create.subtitle.slime_added": "黏液擠壓", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.mechanical_press_activation": "液壓機工作", - "create.subtitle.blockzapper_deny": "放置失敗", "create.subtitle.blockzapper_confirm": "選擇方塊", + "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", "create.subtitle.blockzapper_place": "放置方塊", "create.subtitle.blaze_munch": "烈焰使者開心地吃著", + "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", + "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", + "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", + "create.subtitle.mechanical_press_activation": "液壓機工作", + "create.subtitle.blockzapper_deny": "放置失敗", + "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "_": "->------------------------] Item Descriptions [------------------------<-", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index bfba50746..e9103988e 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -35,6 +35,47 @@ ], "subtitle": "create.subtitle.blockzapper_place" }, + "cogs": { + "sounds": [ + "create:cogs" + ], + "subtitle": "create.subtitle.cogs" + }, + "depot_plop": { + "sounds": [ + { + "name": "minecraft:entity.item_frame.add_item", + "type": "event" + } + ], + "subtitle": "create.subtitle.depot_plop" + }, + "depot_slide": { + "sounds": [ + { + "name": "minecraft:block.sand.break", + "type": "event" + } + ], + "subtitle": "create.subtitle.depot_slide" + }, + "funnel_flap": { + "sounds": [ + { + "name": "minecraft:entity.item_frame.rotate_item", + "type": "event" + } + ], + "subtitle": "create.subtitle.funnel_flap" + }, + "funnel_flap_compounded_1": { + "sounds": [ + { + "name": "minecraft:block.wool.place", + "type": "event" + } + ] + }, "mechanical_press_activation": { "sounds": [ { diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 5065e7bdb..fb06bd42f 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -447,6 +447,7 @@ public class AllBlocks { public static final BlockEntry BASIN = REGISTRATE.block("basin", BasinBlock::new) .initialProperties(SharedProperties::stone) + .properties(p -> p.sound(SoundType.NETHERITE)) .blockstate(new BasinGenerator()::generate) .onRegister(addMovementBehaviour(new BasinMovementBehaviour())) .item() @@ -496,6 +497,7 @@ public class AllBlocks { public static final BlockEntry CHUTE = REGISTRATE.block("chute", ChuteBlock::new) .initialProperties(SharedProperties::softMetal) + .properties(p -> p.sound(SoundType.NETHERITE)) .addLayer(() -> RenderType::getCutoutMipped) .blockstate(new ChuteGenerator()::generate) .item(ChuteItem::new) @@ -504,6 +506,7 @@ public class AllBlocks { public static final BlockEntry SMART_CHUTE = REGISTRATE.block("smart_chute", SmartChuteBlock::new) .initialProperties(SharedProperties::softMetal) + .properties(p -> p.sound(SoundType.NETHERITE)) .blockstate((c, p) -> BlockStateGen.simpleBlock(c, p, AssetLookup.forPowered(c, p))) .item() .transform(customItemModel("_", "block")) diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index 78e387233..b12e726d4 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -45,6 +45,22 @@ public class AllSoundEvents { .category(SoundCategory.BLOCKS) .build(), + DEPOT_SLIDE = create("depot_slide").subtitle("Item slides") + .playExisting(SoundEvents.BLOCK_SAND_BREAK, .125f, 1.5f) + .category(SoundCategory.BLOCKS) + .build(), + + DEPOT_PLOP = create("depot_plop").subtitle("Item lands") + .playExisting(SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, .25f, 1.25f) + .category(SoundCategory.BLOCKS) + .build(), + + FUNNEL_FLAP = create("funnel_flap").subtitle("Funnel Flaps") + .playExisting(SoundEvents.ENTITY_ITEM_FRAME_ROTATE_ITEM, .125f, 1.5f) + .playExisting(SoundEvents.BLOCK_WOOL_BREAK, .0425f, .75f) + .category(SoundCategory.BLOCKS) + .build(), + SLIME_ADDED = create("slime_added").subtitle("Slime squishes") .playExisting(SoundEvents.BLOCK_SLIME_BLOCK_PLACE) .category(SoundCategory.BLOCKS) @@ -78,6 +94,10 @@ public class AllSoundEvents { .category(SoundCategory.PLAYERS) .build(), + COGS = create("cogs").subtitle("Cogwheels rumble") + .category(SoundCategory.BLOCKS) + .build(), + BLAZE_MUNCH = create("blaze_munch").subtitle("Blaze Burner munches") .playExisting(SoundEvents.ENTITY_GENERIC_EAT, .5f, 1f) .category(SoundCategory.BLOCKS) @@ -212,6 +232,8 @@ public class AllSoundEvents { public abstract void write(JsonObject json); + public abstract SoundEvent getMainEvent(); + public String getSubtitleKey() { return Create.ID + ".subtitle." + id; } @@ -255,6 +277,12 @@ public class AllSoundEvents { abstract void play(World world, PlayerEntity entity, double x, double y, double z, float volume, float pitch); + public void playAt(World world, BlockPos pos, float volume, float pitch, boolean fade) { + playAt(world, pos.getX(), pos.getY(), pos.getZ(), volume, pitch, fade); + } + + public abstract void playAt(World world, double x, double y, double z, float volume, float pitch, boolean fade); + } static class WrappedSoundEntry extends SoundEntry { @@ -280,6 +308,12 @@ public class AllSoundEvents { } } + @Override + public SoundEvent getMainEvent() { + return compiledEvents.get(0) + .getFirst(); + } + protected String getIdOf(int i) { return i == 0 ? id : id + "_compounded_" + i; } @@ -311,6 +345,15 @@ public class AllSoundEvents { volPitch.getSecond() * pitch); } } + + @Override + public void playAt(World world, double x, double y, double z, float volume, float pitch, boolean fade) { + for (Pair> pair : compiledEvents) { + Couple volPitch = pair.getSecond(); + world.playSound(x, y, z, pair.getFirst(), category, volPitch.getFirst() * volume, + volPitch.getSecond() * pitch, fade); + } + } } static class CustomSoundEntry extends SoundEntry { @@ -324,8 +367,12 @@ public class AllSoundEvents { @Override public void register(IForgeRegistry registry) { ResourceLocation location = getLocation(); - SoundEvent sound = new SoundEvent(location).setRegistryName(location); - registry.register(sound); + registry.register(event = new SoundEvent(location).setRegistryName(location)); + } + + @Override + public SoundEvent getMainEvent() { + return event; } @Override @@ -343,6 +390,11 @@ public class AllSoundEvents { world.playSound(entity, x, y, z, event, category, volume, pitch); } + @Override + public void playAt(World world, double x, double y, double z, float volume, float pitch, boolean fade) { + world.playSound(x, y, z, event, category, volume, pitch, fade); + } + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index eed822ab4..d6dfbbdeb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -15,10 +15,12 @@ import com.simibubi.create.content.contraptions.base.IRotate.StressImpact; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation; import com.simibubi.create.content.contraptions.relays.elementary.ICogWheel; +import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; +import com.simibubi.create.foundation.sound.SoundScapes; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Lang; @@ -36,12 +38,14 @@ import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; public abstract class KineticTileEntity extends SmartTileEntity implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation, IInstanceRendered { @@ -93,6 +97,7 @@ public abstract class KineticTileEntity extends SmartTileEntity if (world.isRemote) { cachedBoundingBox = null; // cache the bounding box for every frame between ticks + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.tickAudio()); return; } @@ -391,21 +396,28 @@ public abstract class KineticTileEntity extends SmartTileEntity boolean notFastEnough = !isSpeedRequirementFulfilled() && getSpeed() != 0; if (overStressed && AllConfigs.CLIENT.enableOverstressedTooltip.get()) { - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.stressometer.overstressed").formatted(GOLD))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.stressometer.overstressed") + .formatted(GOLD))); ITextComponent hint = Lang.translate("gui.contraptions.network_overstressed"); List cutString = TooltipHelper.cutTextComponent(hint, GRAY, TextFormatting.WHITE); for (int i = 0; i < cutString.size(); i++) - tooltip.add(componentSpacing.copy().append(cutString.get(i))); + tooltip.add(componentSpacing.copy() + .append(cutString.get(i))); return true; } if (notFastEnough) { - tooltip.add(componentSpacing.copy().append(Lang.translate("tooltip.speedRequirement").formatted(GOLD))); - ITextComponent hint = Lang.translate("gui.contraptions.not_fast_enough", I18n.format(getBlockState().getBlock() - .getTranslationKey())); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("tooltip.speedRequirement") + .formatted(GOLD))); + ITextComponent hint = + Lang.translate("gui.contraptions.not_fast_enough", I18n.format(getBlockState().getBlock() + .getTranslationKey())); List cutString = TooltipHelper.cutTextComponent(hint, GRAY, TextFormatting.WHITE); for (int i = 0; i < cutString.size(); i++) - tooltip.add(componentSpacing.copy().append(cutString.get(i))); + tooltip.add(componentSpacing.copy() + .append(cutString.get(i))); return true; } @@ -418,13 +430,21 @@ public abstract class KineticTileEntity extends SmartTileEntity float stressAtBase = calculateStressApplied(); if (calculateStressApplied() != 0 && StressImpact.isEnabled()) { - tooltip.add(componentSpacing.copy().append(Lang.translate("gui.goggles.kinetic_stats"))); - tooltip.add(componentSpacing.copy().append(Lang.translate("tooltip.stressImpact").formatted(TextFormatting.GRAY))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("gui.goggles.kinetic_stats"))); + tooltip.add(componentSpacing.copy() + .append(Lang.translate("tooltip.stressImpact") + .formatted(TextFormatting.GRAY))); float stressTotal = stressAtBase * Math.abs(getTheoreticalSpeed()); - tooltip.add(componentSpacing.copy().append(new StringTextComponent(" " + IHaveGoggleInformation.format(stressTotal)) - .append(Lang.translate("generic.unit.stress")).append(" ").formatted(TextFormatting.AQUA)).append(Lang.translate("gui.goggles.at_current_speed").formatted(TextFormatting.DARK_GRAY))); + tooltip.add(componentSpacing.copy() + .append(new StringTextComponent(" " + IHaveGoggleInformation.format(stressTotal)) + .append(Lang.translate("generic.unit.stress")) + .append(" ") + .formatted(TextFormatting.AQUA)) + .append(Lang.translate("gui.goggles.at_current_speed") + .formatted(TextFormatting.DARK_GRAY))); added = true; } @@ -537,6 +557,7 @@ public abstract class KineticTileEntity extends SmartTileEntity } protected AxisAlignedBB cachedBoundingBox; + @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { if (cachedBoundingBox == null) { @@ -548,4 +569,24 @@ public abstract class KineticTileEntity extends SmartTileEntity protected AxisAlignedBB makeRenderBoundingBox() { return super.getRenderBoundingBox(); } + + @OnlyIn(Dist.CLIENT) + public void tickAudio() { + float componentSpeed = Math.abs(getSpeed()); + if (componentSpeed == 0) + return; + float pitch = MathHelper.clamp((componentSpeed / 256f) + .45f, .5f, 1.25f); + + if (isNoisy()) + SoundScapes.playGeneralKineticAmbience(pos, pitch); + + Block block = getBlockState().getBlock(); + if (ICogWheel.isSmallCog(block) || ICogWheel.isSmallCog(block) || block instanceof GearboxBlock) + SoundScapes.playCogwheelAmbience(pos, pitch); + } + + protected boolean isNoisy() { + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java index 88d8a91c1..e0b48858b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java @@ -19,6 +19,7 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.item.ItemEntity; @@ -39,6 +40,9 @@ import net.minecraft.util.math.shapes.VoxelShapes; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3i; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; public class AirCurrent { @@ -58,6 +62,8 @@ public class AirCurrent { new ArrayList<>(); protected List caughtEntities = new ArrayList<>(); + static boolean isClientPlayerInAirCurrent; + public AirCurrent(IAirCurrentSource source) { this.source = source; } @@ -70,7 +76,8 @@ public class AirCurrent { if (world != null && world.isRemote) { float offset = pushing ? 0.5f : maxDistance + .5f; Vector3d pos = VecHelper.getCenterOf(source.getAirCurrentPos()) - .add(Vector3d.of(facing.getDirectionVec()).scale(offset)); + .add(Vector3d.of(facing.getDirectionVec()) + .scale(offset)); if (world.rand.nextFloat() < AllConfigs.CLIENT.fanParticleDensity.get()) world.addParticle(new AirFlowParticleData(source.getAirCurrentPos()), pos.x, pos.y, pos.z, 0, 0, 0); } @@ -108,6 +115,8 @@ public class AirCurrent { entity.setMotion(previousMotion.add(new Vector3d(xIn, yIn, zIn).scale(1 / 8f))); entity.fallDistance = 0; + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, + () -> () -> enableClientPlayerSound(entity, MathHelper.clamp(speed / 128f * .4f, 0.01f, .4f))); if (entity instanceof ServerPlayerEntity) ((ServerPlayerEntity) entity).connection.floatingTickCount = 0; @@ -115,7 +124,8 @@ public class AirCurrent { entityDistance -= .5f; InWorldProcessing.Type processingType = getSegmentAt((float) entityDistance); if (entity instanceof ServerPlayerEntity) - AllTriggers.triggerFor(AllTriggers.FAN_PROCESSING.constructTriggerFor(processingType), (PlayerEntity) entity); + AllTriggers.triggerFor(AllTriggers.FAN_PROCESSING.constructTriggerFor(processingType), + (PlayerEntity) entity); if (processingType == null || processingType == Type.NONE) { continue; @@ -343,7 +353,40 @@ public class AirCurrent { InWorldProcessing.Type type; int startOffset; int endOffset; + } + @OnlyIn(Dist.CLIENT) + static AirCurrentSound flyingSound = null; + + @OnlyIn(Dist.CLIENT) + private static void enableClientPlayerSound(Entity e, float maxVolume) { + if (e != Minecraft.getInstance() + .getRenderViewEntity()) + return; + + isClientPlayerInAirCurrent = true; + + float pitch = (float) MathHelper.clamp(e.getMotion() + .length() * .5f, .5f, 2f); + + if (flyingSound == null || flyingSound.isDonePlaying()) { + flyingSound = new AirCurrentSound(SoundEvents.ITEM_ELYTRA_FLYING, pitch); + Minecraft.getInstance() + .getSoundHandler() + .play(flyingSound); + } + flyingSound.setPitch(pitch); + flyingSound.fadeIn(maxVolume); + } + + @OnlyIn(Dist.CLIENT) + public static void tickClientPlayerSounds() { + if (!AirCurrent.isClientPlayerInAirCurrent && flyingSound != null) + if (flyingSound.isFaded()) + flyingSound.stop(); + else + flyingSound.fadeOut(); + isClientPlayerInAirCurrent = false; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java new file mode 100644 index 000000000..7a9c4a7db --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrentSound.java @@ -0,0 +1,48 @@ +package com.simibubi.create.content.contraptions.components.fan; + +import net.minecraft.client.audio.TickableSound; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; + +public class AirCurrentSound extends TickableSound { + + private float pitch; + + protected AirCurrentSound(SoundEvent p_i46532_1_, float pitch) { + super(p_i46532_1_, SoundCategory.BLOCKS); + this.pitch = pitch; + volume = 0.01f; + repeat = true; + repeatDelay = 0; + global = true; + } + + @Override + public void tick() {} + + public void setPitch(float pitch) { + this.pitch = pitch; + } + + public void fadeIn(float maxVolume) { + volume = Math.min(maxVolume, volume + .05f); + } + + public void fadeOut() { + volume = Math.max(0, volume - .05f); + } + + public boolean isFaded() { + return volume == 0; + } + + @Override + public float getPitch() { + return pitch; + } + + public void stop() { + setDone(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java index dbdeeb073..681a01269 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java @@ -99,5 +99,10 @@ public class GantryShaftTileEntity extends KineticTileEntity { return 0; return MathHelper.clamp(-getSpeed() / 512f, -.49f, .49f); } + + @Override + protected boolean isNoisy() { + return false; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java index 2c3f47a6a..5c651a8a7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java @@ -20,9 +20,8 @@ public class SimpleKineticTileEntity extends KineticTileEntity { @Override public void addBehaviours(List behaviours) { - behaviours.add( - new BracketedTileEntityBehaviour(this, state -> state.getBlock() instanceof AbstractShaftBlock).withTrigger( - state -> AllTriggers.BRACKET_APPLY_TRIGGER.constructTriggerFor(state.getBlock()))); + behaviours.add(new BracketedTileEntityBehaviour(this, state -> state.getBlock() instanceof AbstractShaftBlock) + .withTrigger(state -> AllTriggers.BRACKET_APPLY_TRIGGER.constructTriggerFor(state.getBlock()))); super.addBehaviours(behaviours); } @@ -44,4 +43,9 @@ public class SimpleKineticTileEntity extends KineticTileEntity { return neighbours; } + @Override + protected boolean isNoisy() { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxTileEntity.java index e30eee6cc..add94d709 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxTileEntity.java @@ -10,4 +10,9 @@ public class GearboxTileEntity extends DirectionalShaftHalvesTileEntity { super(type); } + @Override + protected boolean isNoisy() { + return false; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java index 0e67f64fc..02748a50d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBehaviour.java @@ -7,6 +7,7 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.block.funnel.AbstractFunnelBlock; @@ -274,8 +275,16 @@ public class DepotBehaviour extends TileEntityBehaviour { return returned; } - if (!simulate) + if (!simulate) { + if (this.isEmpty()) { + if (heldItem.insertedFrom.getAxis() + .isHorizontal()) + AllSoundEvents.DEPOT_SLIDE.playOnServer(getWorld(), getPos()); + else + AllSoundEvents.DEPOT_PLOP.playOnServer(getWorld(), getPos()); + } this.heldItem = heldItem; + } return ItemStack.EMPTY; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java index 390938f33..c22ac8df3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/SharedDepotBlockMethods.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.block.depot; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; @@ -60,6 +61,7 @@ public class SharedDepotBlockMethods { transported.beltPosition = .25f; behaviour.setHeldItem(transported); player.setHeldItem(hand, ItemStack.EMPTY); + AllSoundEvents.DEPOT_SLIDE.playOnServer(world, pos); } behaviour.tileEntity.notifyUpdate(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index e77b5e2cb..02464be74 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -4,6 +4,7 @@ import java.lang.ref.WeakReference; import java.util.List; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; @@ -61,7 +62,8 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn BlockState state = getBlockState(); if (!FunnelBlock.isFunnel(state)) return Mode.INVALID; - if (state.method_28500(BlockStateProperties.POWERED).orElse(false)) + if (state.method_28500(BlockStateProperties.POWERED) + .orElse(false)) return Mode.PAUSED; if (state.getBlock() instanceof BeltFunnelBlock) { Shape shape = state.get(BeltFunnelBlock.SHAPE); @@ -156,7 +158,8 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn .isVertical(); boolean up = facing == Direction.UP; - outputPos = outputPos.add(Vector3d.of(facing.getDirectionVec()).scale(vertical ? up ? .15f : .5f : .25f)); + outputPos = outputPos.add(Vector3d.of(facing.getDirectionVec()) + .scale(vertical ? up ? .15f : .5f : .25f)); if (!vertical) outputPos = outputPos.subtract(0, .45f, 0); @@ -283,6 +286,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn AllPackets.channel.send(packetTarget(), new FunnelFlapPacket(this, inward)); } else { flap.set(inward ? 1 : -1); + AllSoundEvents.FUNNEL_FLAP.playAt(world, pos, 1, 1, true); } } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 88d13aece..67a92c975 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -10,6 +10,7 @@ import com.simibubi.create.Create; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.base.IRotate; +import com.simibubi.create.content.contraptions.components.fan.AirCurrent; import com.simibubi.create.content.contraptions.components.flywheel.engine.EngineBlock; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisRangeDisplay; @@ -38,6 +39,7 @@ import com.simibubi.create.foundation.render.KineticRenderer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.RenderWork; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.sound.SoundScapes; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkRenderer; @@ -87,12 +89,15 @@ public class ClientEvents { @SubscribeEvent public static void onTick(ClientTickEvent event) { World world = Minecraft.getInstance().world; - if (event.phase == Phase.START) - return; - if (!isGameActive()) return; + + if (event.phase == Phase.START) { + AirCurrent.tickClientPlayerSounds(); + return; + } + SoundScapes.tick(); AnimationTickHolder.tick(); FastRenderDispatcher.tick(); ScrollValueHandler.tick(); diff --git a/src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java b/src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java new file mode 100644 index 000000000..6055b26db --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/sound/ContinuousSound.java @@ -0,0 +1,55 @@ +package com.simibubi.create.foundation.sound; + +import net.minecraft.client.audio.TickableSound; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; + +public class ContinuousSound extends TickableSound { + + private float sharedPitch; + private SoundScape scape; + private float relativeVolume; + + protected ContinuousSound(SoundEvent event, SoundScape scape, float sharedPitch, float relativeVolume) { + super(event, SoundCategory.AMBIENT); + this.scape = scape; + this.sharedPitch = sharedPitch; + this.relativeVolume = relativeVolume; + this.repeat = true; + this.repeatDelay = 0; + this.global = false; + } + + public void remove() { + setDone(); + } + + @Override + public float getVolume() { + return scape.getVolume() * relativeVolume; + } + + @Override + public float getPitch() { + return sharedPitch; + } + + @Override + public double getX() { + return scape.getMeanPos().x; + } + + @Override + public double getY() { + return scape.getMeanPos().y; + } + + @Override + public double getZ() { + return scape.getMeanPos().z; + } + + @Override + public void tick() {} + +} diff --git a/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java b/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java new file mode 100644 index 000000000..0c8d4c97e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/sound/RepeatingSound.java @@ -0,0 +1,39 @@ +package com.simibubi.create.foundation.sound; + +import com.simibubi.create.foundation.utility.AnimationTickHolder; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.vector.Vector3d; + +public class RepeatingSound { + + private SoundEvent event; + private float sharedPitch; + private int repeatDelay; + private SoundScape scape; + private float relativeVolume; + + public RepeatingSound(SoundEvent event, SoundScape scape, float sharedPitch, float relativeVolume, + int repeatDelay) { + this.event = event; + this.scape = scape; + this.sharedPitch = sharedPitch; + this.relativeVolume = relativeVolume; + this.repeatDelay = Math.max(1, repeatDelay); + } + + public void tick() { + if (AnimationTickHolder.getTicks() % repeatDelay != 0) + return; + + ClientWorld world = Minecraft.getInstance().world; + Vector3d meanPos = scape.getMeanPos(); + + world.playSound(meanPos.x, meanPos.y, meanPos.z, event, SoundCategory.AMBIENT, + scape.getVolume() * relativeVolume, sharedPitch, true); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java new file mode 100644 index 000000000..d674a9205 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java @@ -0,0 +1,88 @@ +package com.simibubi.create.foundation.sound; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; +import com.simibubi.create.foundation.sound.SoundScapes.PitchGroup; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.vector.Vector3d; + +class SoundScape { + List continuous; + List repeating; + private float pitch; + private AmbienceGroup group; + private Vector3d meanPos; + private PitchGroup pitchGroup; + + public SoundScape(float pitch, AmbienceGroup group) { + this.pitchGroup = SoundScapes.getGroupFromPitch(pitch); + this.pitch = pitch; + this.group = group; + continuous = new ArrayList<>(); + repeating = new ArrayList<>(); + } + + public SoundScape continuous(SoundEvent sound, float relativeVolume, float relativePitch) { + return add(new ContinuousSound(sound, this, pitch * relativePitch, relativeVolume)); + } + + public SoundScape repeating(SoundEvent sound, float relativeVolume, float relativePitch, int delay) { + return add(new RepeatingSound(sound, this, pitch * relativePitch, relativeVolume, delay)); + } + + public SoundScape add(ContinuousSound continuousSound) { + continuous.add(continuousSound); + return this; + } + + public SoundScape add(RepeatingSound repeatingSound) { + repeating.add(repeatingSound); + return this; + } + + public void play() { + continuous.forEach(Minecraft.getInstance() + .getSoundHandler()::play); + } + + public void tick() { + if (AnimationTickHolder.getTicks() % SoundScapes.UPDATE_INTERVAL == 0) + meanPos = null; + repeating.forEach(RepeatingSound::tick); + } + + public void remove() { + continuous.forEach(ContinuousSound::remove); + } + + public Vector3d getMeanPos() { + return meanPos == null ? meanPos = determineMeanPos() : meanPos; + } + + private Vector3d determineMeanPos() { + meanPos = Vector3d.ZERO; + int amount = 0; + for (BlockPos blockPos : SoundScapes.getAllLocations(group, pitchGroup)) { + meanPos = meanPos.add(VecHelper.getCenterOf(blockPos)); + amount++; + } + if (amount == 0) + return meanPos; + return meanPos.scale(1f / amount); + } + + public float getVolume() { + int soundCount = SoundScapes.getSoundCount(group, pitchGroup); + float argMax = (float) SoundScapes.SOUND_VOLUME_ARG_MAX; + return MathHelper.clamp(soundCount / (argMax * 10f), 0, .05f); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java new file mode 100644 index 000000000..163e6d2e9 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java @@ -0,0 +1,150 @@ +package com.simibubi.create.foundation.sound; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.function.BiFunction; + +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; + +public class SoundScapes { + + static final int MAX_AMBIENT_SOURCE_DISTANCE = 16; + static final int UPDATE_INTERVAL = 5; + static final int SOUND_VOLUME_ARG_MAX = 15; + + enum AmbienceGroup { + + KINETIC(SoundScapes::kinetic), COG(SoundScapes::cogwheel) + + ; + + private BiFunction factory; + + private AmbienceGroup(BiFunction factory) { + this.factory = factory; + } + + public SoundScape instantiate(float pitch) { + return factory.apply(pitch, this); + } + + } + + private static SoundScape kinetic(float pitch, AmbienceGroup group) { + return new SoundScape(pitch, group).continuous(SoundEvents.ENTITY_MINECART_INSIDE, .25f, 1); + } + + private static SoundScape cogwheel(float pitch, AmbienceGroup group) { + return new SoundScape(pitch, group).continuous(AllSoundEvents.COGS.getMainEvent(), 3, 1); + } + + enum PitchGroup { + VERY_LOW, LOW, NORMAL, HIGH, VERY_HIGH + } + + private static Map>> counter = new IdentityHashMap<>(); + private static Map, SoundScape> activeSounds = new HashMap<>(); + + public static void playGeneralKineticAmbience(BlockPos pos, float pitch) { + if (!outOfRange(pos)) + addSound(AmbienceGroup.KINETIC, pos, pitch); + } + + public static void playCogwheelAmbience(BlockPos pos, float pitch) { + if (!outOfRange(pos)) + addSound(AmbienceGroup.COG, pos, pitch); + } + + public static void tick() { + activeSounds.values() + .forEach(SoundScape::tick); + + if (AnimationTickHolder.getTicks() % UPDATE_INTERVAL != 0) + return; + + for (Iterator, SoundScape>> iterator = activeSounds.entrySet() + .iterator(); iterator.hasNext();) { + + Entry, SoundScape> entry = iterator.next(); + Pair key = entry.getKey(); + SoundScape value = entry.getValue(); + + if (getSoundCount(key.getFirst(), key.getSecond()) == 0) { + value.remove(); + iterator.remove(); + } + } + + counter.values() + .forEach(m -> m.values() + .forEach(Set::clear)); + } + + public static void addSound(AmbienceGroup group, BlockPos pos, float pitch) { + PitchGroup groupFromPitch = getGroupFromPitch(pitch); + Set set = counter.computeIfAbsent(group, ag -> new IdentityHashMap<>()) + .computeIfAbsent(groupFromPitch, pg -> new HashSet<>()); + set.add(pos); + + Pair pair = Pair.of(group, groupFromPitch); + activeSounds.computeIfAbsent(pair, $ -> { + SoundScape soundScape = group.instantiate(pitch); + soundScape.play(); + return soundScape; + }); + } + + public static void clean() { + BlockPos playerLocation = getCameraPos(); + for (Map> map : counter.values()) + for (Set set : map.values()) + set.removeIf(p -> !playerLocation.withinDistance(p, MAX_AMBIENT_SOURCE_DISTANCE)); + } + + protected static boolean outOfRange(BlockPos pos) { + return !getCameraPos().withinDistance(pos, MAX_AMBIENT_SOURCE_DISTANCE); + } + + protected static BlockPos getCameraPos() { + Entity renderViewEntity = Minecraft.getInstance().renderViewEntity; + if (renderViewEntity == null) + return BlockPos.ZERO; + BlockPos playerLocation = renderViewEntity.getBlockPos(); + return playerLocation; + } + + public static int getSoundCount(AmbienceGroup group, PitchGroup pitchGroup) { + return getAllLocations(group, pitchGroup).size(); + } + + public static Set getAllLocations(AmbienceGroup group, PitchGroup pitchGroup) { + return counter.getOrDefault(group, Collections.emptyMap()) + .getOrDefault(pitchGroup, Collections.emptySet()); + } + + public static PitchGroup getGroupFromPitch(float pitch) { + if (pitch < .70) + return PitchGroup.VERY_LOW; + if (pitch < .90) + return PitchGroup.LOW; + if (pitch < 1.10) + return PitchGroup.NORMAL; + if (pitch < 1.30) + return PitchGroup.HIGH; + return PitchGroup.VERY_HIGH; + } + +} diff --git a/src/main/resources/assets/create/sounds/cogs.ogg b/src/main/resources/assets/create/sounds/cogs.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fd2c78b49488ca0f9499770a7b1563cec9600e96 GIT binary patch literal 75155 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 Ly5EIw7BTRDMVA-U literal 0 HcmV?d00001