From 45a591b27badaa6b0291112792d722580c5adcb7 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Fri, 10 Jan 2025 14:47:34 +0100 Subject: [PATCH] parse Sounds into enum at compile time --- pumpkin-data/src/lib.rs | 4 ++++ pumpkin-macros/src/lib.rs | 6 ------ pumpkin-macros/src/sound.rs | 21 --------------------- pumpkin/src/block/blocks/chest.rs | 8 ++++---- pumpkin/src/entity/player.rs | 6 +++--- pumpkin/src/net/combat.rs | 13 ++++++------- 6 files changed, 17 insertions(+), 41 deletions(-) delete mode 100644 pumpkin-macros/src/sound.rs diff --git a/pumpkin-data/src/lib.rs b/pumpkin-data/src/lib.rs index fa4576ae9..98336ed6c 100644 --- a/pumpkin-data/src/lib.rs +++ b/pumpkin-data/src/lib.rs @@ -9,3 +9,7 @@ pub mod screen { pub mod particle { include!(concat!(env!("OUT_DIR"), "/particle.rs")); } + +pub mod sound { + include!(concat!(env!("OUT_DIR"), "/sound.rs")); +} diff --git a/pumpkin-macros/src/lib.rs b/pumpkin-macros/src/lib.rs index da56d51ff..1e20fac91 100644 --- a/pumpkin-macros/src/lib.rs +++ b/pumpkin-macros/src/lib.rs @@ -67,12 +67,6 @@ pub fn pumpkin_block(input: TokenStream, item: TokenStream) -> TokenStream { gen.into() } -mod sound; -#[proc_macro] -pub fn sound(item: TokenStream) -> TokenStream { - sound::sound_impl(item) -} - mod block_state; #[proc_macro] pub fn block_state(item: TokenStream) -> TokenStream { diff --git a/pumpkin-macros/src/sound.rs b/pumpkin-macros/src/sound.rs deleted file mode 100644 index ea2efd88b..000000000 --- a/pumpkin-macros/src/sound.rs +++ /dev/null @@ -1,21 +0,0 @@ -use std::{collections::HashMap, sync::LazyLock}; - -use proc_macro::TokenStream; -use quote::quote; - -static SOUNDS: LazyLock> = LazyLock::new(|| { - serde_json::from_str::>(include_str!("../../assets/sounds.json")) - .expect("Could not parse sounds.json registry.") - .into_iter() - .enumerate() - .map(|(i, s)| (s, i as u16)) - .collect() -}); - -pub(crate) fn sound_impl(item: TokenStream) -> TokenStream { - let input_string = item.to_string(); - let sound_name = input_string.trim_matches('"'); - - let id = *SOUNDS.get(sound_name).expect("Invalid sound"); - quote! { #id }.into() -} diff --git a/pumpkin/src/block/blocks/chest.rs b/pumpkin/src/block/blocks/chest.rs index e47636739..7dda0bcc9 100644 --- a/pumpkin/src/block/blocks/chest.rs +++ b/pumpkin/src/block/blocks/chest.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; -use pumpkin_data::screen::WindowType; +use pumpkin_data::{screen::WindowType, sound::Sound}; use pumpkin_inventory::{Chest, OpenContainer}; -use pumpkin_macros::{pumpkin_block, sound}; +use pumpkin_macros::pumpkin_block; use pumpkin_protocol::{client::play::CBlockAction, codec::var_int::VarInt}; use pumpkin_util::math::position::WorldPosition; use pumpkin_world::{ @@ -114,12 +114,12 @@ impl ChestBlock { if state == ChestState::IsClosed && num_players == 0 { player .world() - .play_block_sound(sound!("block.chest.close"), location) + .play_block_sound(Sound::BlockChestClose as u16, location) .await; } else if state == ChestState::IsOpened && num_players == 1 { player .world() - .play_block_sound(sound!("block.chest.open"), location) + .play_block_sound(Sound::BlockChestOpen as u16, location) .await; } diff --git a/pumpkin/src/entity/player.rs b/pumpkin/src/entity/player.rs index 1c209e6ae..48859a35d 100644 --- a/pumpkin/src/entity/player.rs +++ b/pumpkin/src/entity/player.rs @@ -9,9 +9,9 @@ use std::{ use crossbeam::atomic::AtomicCell; use pumpkin_config::{ADVANCED_CONFIG, BASIC_CONFIG}; +use pumpkin_data::sound::Sound; use pumpkin_entity::{entity_type::EntityType, EntityId}; use pumpkin_inventory::player::PlayerInventory; -use pumpkin_macros::sound; use pumpkin_protocol::server::play::{ SCloseContainer, SCookieResponse as SPCookieResponse, SPlayPingRequest, SPlayerLoaded, }; @@ -317,7 +317,7 @@ impl Player { { world .play_sound( - sound!("entity.player.attack.nodamage"), + Sound::EntityPlayerAttackNodamage as u16, SoundCategory::Players, &pos, ) @@ -326,7 +326,7 @@ impl Player { } world - .play_sound(sound!("entity.player.hurt"), SoundCategory::Players, &pos) + .play_sound(Sound::EntityPlayerHurt as u16, SoundCategory::Players, &pos) .await; let attack_type = AttackType::new(self, attack_cooldown_progress as f32).await; diff --git a/pumpkin/src/net/combat.rs b/pumpkin/src/net/combat.rs index 2ace8a182..d71b1f423 100644 --- a/pumpkin/src/net/combat.rs +++ b/pumpkin/src/net/combat.rs @@ -1,7 +1,6 @@ use std::f32::consts::PI; -use pumpkin_data::particle::Particle; -use pumpkin_macros::sound; +use pumpkin_data::{particle::Particle, sound::Sound}; use pumpkin_protocol::{ client::play::{CEntityVelocity, CParticle}, codec::var_int::VarInt, @@ -122,7 +121,7 @@ pub async fn player_attack_sound(pos: &Vector3, world: &World, attack_type: AttackType::Knockback => { world .play_sound( - sound!("entity.player.attack.knockback"), + Sound::EntityPlayerAttackKnockback as u16, SoundCategory::Players, pos, ) @@ -131,7 +130,7 @@ pub async fn player_attack_sound(pos: &Vector3, world: &World, attack_type: AttackType::Critical => { world .play_sound( - sound!("entity.player.attack.crit"), + Sound::EntityPlayerAttackCrit as u16, SoundCategory::Players, pos, ) @@ -140,7 +139,7 @@ pub async fn player_attack_sound(pos: &Vector3, world: &World, attack_type: AttackType::Sweeping => { world .play_sound( - sound!("entity.player.attack.sweep"), + Sound::EntityPlayerAttackSweep as u16, SoundCategory::Players, pos, ) @@ -149,7 +148,7 @@ pub async fn player_attack_sound(pos: &Vector3, world: &World, attack_type: AttackType::Strong => { world .play_sound( - sound!("entity.player.attack.strong"), + Sound::EntityPlayerAttackStrong as u16, SoundCategory::Players, pos, ) @@ -158,7 +157,7 @@ pub async fn player_attack_sound(pos: &Vector3, world: &World, attack_type: AttackType::Weak => { world .play_sound( - sound!("entity.player.attack.weak"), + Sound::EntityPlayerAttackWeak as u16, SoundCategory::Players, pos, )