From 4beb66008028282a6386a8a33029dab8629a6bfc Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 11 Sep 2022 21:31:24 +0700 Subject: [PATCH] Cargo crate open sound Fixes #41 --- .../ru/dbotthepony/mc/otm/datagen/DataGen.kt | 21 ++++++++++++------ .../mc/otm/datagen/SoundDataProvider.kt | 21 ++++++++++++++++++ .../mc/otm/datagen/lang/English.kt | 2 ++ .../datagen/lang/MatteryLanguageProvider.kt | 2 ++ .../dbotthepony/mc/otm/datagen/tags/Tags.kt | 1 + .../mc/otm/datagen/tags/TagsProvider.kt | 5 +++++ .../otm/block/entity/CargoCrateBlockEntity.kt | 3 +++ .../mc/otm/registry/MSoundEvents.kt | 1 + .../sounds/cargo_crate_open.ogg | Bin 0 -> 9219 bytes 9 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/overdrive_that_matters/sounds/cargo_crate_open.ogg diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt index 0002abb6a..1f8b49ec1 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt @@ -44,13 +44,20 @@ fun modLocation(string: String) = ResourceLocation(DataGen.MOD_ID, string) object DataGen { const val MOD_ID = OverdriveThatMatters.MOD_ID - private lateinit var blockModelProvider: MatteryBlockModelProvider - private lateinit var itemModelProvider: MatteryItemModelProvider - private lateinit var blockStateProvider: MatteryBlockStateProvider - private lateinit var lootTableProvider: LootTables - private lateinit var recipeProvider: MatteryRecipeProvider - private lateinit var lootModifier: LootModifiers - private lateinit var languageProvider: MatteryLanguageProvider + var blockModelProvider: MatteryBlockModelProvider by WriteOnce() + private set + var itemModelProvider: MatteryItemModelProvider by WriteOnce() + private set + var blockStateProvider: MatteryBlockStateProvider by WriteOnce() + private set + var lootTableProvider: LootTables by WriteOnce() + private set + var recipeProvider: MatteryRecipeProvider by WriteOnce() + private set + var lootModifier: LootModifiers by WriteOnce() + private set + var languageProvider: MatteryLanguageProvider by WriteOnce() + private set fun decorativeCubeAll(vararg blocks: Block) { blockModelProvider.decorativeCubeAll(*blocks) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt index 15dfba907..afe5d6f31 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt @@ -1,11 +1,16 @@ package ru.dbotthepony.mc.otm.datagen import net.minecraft.resources.ResourceLocation +import net.minecraft.sounds.SoundEvent import net.minecraftforge.common.data.SoundDefinition import net.minecraftforge.common.data.SoundDefinitionsProvider import net.minecraftforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.registry.MSoundEvents +fun SoundDefinition.subtitle(value: SoundEvent): SoundDefinition { + return subtitle("otm.sound." + value.location.path) +} + class SoundDataProvider(event: GatherDataEvent) : SoundDefinitionsProvider(event.generator, DataGen.MOD_ID, event.existingFileHelper) { override fun registerSounds() { add(MSoundEvents.PLASMA_WEAPON_OVERHEAT, @@ -19,5 +24,21 @@ class SoundDataProvider(event: GatherDataEvent) : SoundDefinitionsProvider(event add(MSoundEvents.RIFLE_SHOT, definition().subtitle("otm.sound.rifle_shot") .with(SoundDefinition.Sound.sound(modLocation("item/rifle_shot"), SoundDefinition.SoundType.SOUND))) + + simple(MSoundEvents.CARGO_CRATE_OPEN) + } + + private inline fun add(value: SoundEvent, block: SoundDefinition.() -> Unit) { + add(value, definition().subtitle(value).also(block)) + } + + private fun add(value: SoundEvent, path: String) { + add(value) { + with(SoundDefinition.Sound.sound(modLocation(path), SoundDefinition.SoundType.SOUND)) + } + } + + private fun simple(value: SoundEvent) { + add(value, value.location.path) } } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 5fbeaf3c2..fae7acd02 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -44,6 +44,8 @@ private fun sounds(provider: MatteryLanguageProvider) { sound("rifle_shot", "Plasma rifle fires") sound("plasma_weapon_overheat", "Plasma weapon overheats") sound("player_become_android", "Player became android") + + sound(MSoundEvents.CARGO_CRATE_OPEN, "Cargo crate opened") } } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt index 7ee15bcb0..49a5bf39c 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt @@ -6,6 +6,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap import net.minecraft.data.DataGenerator import net.minecraft.network.chat.MutableComponent import net.minecraft.network.chat.contents.TranslatableContents +import net.minecraft.sounds.SoundEvent import net.minecraft.world.effect.MobEffect import net.minecraft.world.entity.EntityType import net.minecraft.world.item.DyeColor @@ -71,6 +72,7 @@ class MatteryLanguageProvider(private val gen: DataGenerator) { fun misc(key: String, value: String) = slave.add("otm.$key", value) fun gui(key: String, value: String) = slave.add("otm.gui.$key", value) fun sound(key: String, value: String) = slave.add("otm.sound.$key", value) + fun sound(key: SoundEvent, value: String) = slave.add("otm.sound.${key.location.path}", value) } inner class Colors( diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt index f19004f0d..b44c001d3 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt @@ -5,6 +5,7 @@ import net.minecraft.world.item.Tiers import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry +import ru.dbotthepony.mc.otm.registry.MSoundEvents fun addTags(tagsProvider: TagsProvider) { tagsProvider.items.forge("pistons").add(Items.PISTON) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt index a9c30bacd..bbf0e3876 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt @@ -4,11 +4,13 @@ import it.unimi.dsi.fastutil.objects.ObjectArraySet import net.minecraft.core.Registry import net.minecraft.resources.ResourceLocation import net.minecraft.tags.BlockTags +import net.minecraft.tags.GameEventTags import net.minecraft.tags.TagKey import net.minecraft.world.item.Item import net.minecraft.world.item.Tier import net.minecraft.world.item.Tiers import net.minecraft.world.level.block.Block +import net.minecraft.world.level.gameevent.GameEvent import net.minecraftforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.datagen.DataGen import net.minecraft.data.tags.TagsProvider as MinecraftTagsProvider @@ -211,6 +213,9 @@ class TagsProvider( val rawOres = items.forge("raw_ores") val wires = items.forge("wires") + val gameEvents = Delegate(Registry.GAME_EVENT) + val vibrations = gameEvents.appender(GameEventTags.VIBRATIONS) + init { event.generator.addProvider(true, blocks) event.generator.addProvider(true, items) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt index 2e5f503e1..c7c661762 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt @@ -4,6 +4,7 @@ import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.nbt.CompoundTag import net.minecraft.network.chat.Component +import net.minecraft.sounds.SoundSource import net.minecraft.world.Container import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player @@ -21,6 +22,7 @@ import ru.dbotthepony.mc.otm.menu.CargoCrateMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.registry.MSoundEvents class CargoCrateBlockEntity( p_155229_: BlockPos, @@ -36,6 +38,7 @@ class CargoCrateBlockEntity( fun onPlayerOpen() { if (interactingPlayers++ == 0) { level?.setBlock(blockPos, blockState.setValue(CargoCrateBlock.IS_OPEN, true), Block.UPDATE_CLIENTS) + level?.playSound(null, blockPos, MSoundEvents.CARGO_CRATE_OPEN, SoundSource.BLOCKS, 1f, 0.8f + (level?.random?.nextFloat() ?: 1f) * 0.2f) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MSoundEvents.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MSoundEvents.kt index d7e3a0c21..011baf9d0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MSoundEvents.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MSoundEvents.kt @@ -18,6 +18,7 @@ object MSoundEvents { val RIFLE_SHOT: SoundEvent by make("item.rifle_shot") val PLASMA_WEAPON_OVERHEAT: SoundEvent by make("item.plasma_weapon_overheat") val PLAYER_BECOME_ANDROID: SoundEvent by make("player_become_android") + val CARGO_CRATE_OPEN: SoundEvent by make("cargo_crate_open") internal fun register(bus: IEventBus) { registry.register(bus) diff --git a/src/main/resources/assets/overdrive_that_matters/sounds/cargo_crate_open.ogg b/src/main/resources/assets/overdrive_that_matters/sounds/cargo_crate_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ec76a6cba0c43550bb011b5e9dfa33ed486a2061 GIT binary patch literal 9219 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 literal 0 HcmV?d00001