diff --git a/assets/sound_category.json b/assets/sound_category.json new file mode 100644 index 000000000..e33cd2f1f --- /dev/null +++ b/assets/sound_category.json @@ -0,0 +1 @@ +["MASTER","MUSIC","RECORDS","WEATHER","BLOCKS","HOSTILE","NEUTRAL","PLAYERS","AMBIENT","VOICE"] \ No newline at end of file diff --git a/pumpkin-data/build/build.rs b/pumpkin-data/build/build.rs index f893d9125..83f87d75e 100644 --- a/pumpkin-data/build/build.rs +++ b/pumpkin-data/build/build.rs @@ -1,5 +1,7 @@ +use quote::quote; use std::{env, fs, path::Path, process::Command}; +use heck::ToPascalCase; use proc_macro2::{Span, TokenStream}; use syn::Ident; @@ -9,6 +11,7 @@ mod packet; mod particle; mod screen; mod sound; +mod sound_category; pub fn main() { write_generated_file(packet::build(), "packet.rs"); @@ -17,6 +20,19 @@ pub fn main() { write_generated_file(sound::build(), "sound.rs"); write_generated_file(chunk_status::build(), "chunk_status.rs"); write_generated_file(game_event::build(), "game_event.rs"); + write_generated_file(sound_category::build(), "sound_category.rs"); +} + +pub fn array_to_tokenstream(array: Vec) -> TokenStream { + let mut variants = TokenStream::new(); + + for item in array.iter() { + let name = ident(item.to_pascal_case()); + variants.extend([quote! { + #name, + }]); + } + variants } pub fn write_generated_file(content: TokenStream, out_file: &str) { diff --git a/pumpkin-data/build/game_event.rs b/pumpkin-data/build/game_event.rs index aed8bf0ca..61912aacb 100644 --- a/pumpkin-data/build/game_event.rs +++ b/pumpkin-data/build/game_event.rs @@ -1,23 +1,16 @@ -use heck::ToPascalCase; use proc_macro2::TokenStream; use quote::quote; -use crate::ident; +use crate::array_to_tokenstream; pub(crate) fn build() -> TokenStream { println!("cargo:rerun-if-changed=assets/game_event.json"); - let game_event: Vec = + let game_events: Vec = serde_json::from_str(include_str!("../../assets/game_event.json")) .expect("Failed to parse game_event.json"); - let mut variants = TokenStream::new(); + let variants = array_to_tokenstream(game_events); - for event in game_event.iter() { - let name = ident(event.to_pascal_case()); - variants.extend([quote! { - #name, - }]); - } quote! { #[repr(u8)] pub enum GameEvent { diff --git a/pumpkin-data/build/particle.rs b/pumpkin-data/build/particle.rs index a36d13fb9..e8913b901 100644 --- a/pumpkin-data/build/particle.rs +++ b/pumpkin-data/build/particle.rs @@ -1,24 +1,15 @@ -use heck::ToPascalCase; use proc_macro2::TokenStream; use quote::quote; -use crate::ident; +use crate::array_to_tokenstream; pub(crate) fn build() -> TokenStream { println!("cargo:rerun-if-changed=assets/particles.json"); let particle: Vec = serde_json::from_str(include_str!("../../assets/particles.json")) .expect("Failed to parse particles.json"); - let mut variants = TokenStream::new(); + let variants = array_to_tokenstream(particle); - for (id, particle) in particle.iter().enumerate() { - let id = id as u8; - let name = ident(particle.to_pascal_case()); - - variants.extend([quote! { - #name = #id, - }]); - } quote! { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[repr(u8)] diff --git a/pumpkin-data/build/screen.rs b/pumpkin-data/build/screen.rs index a029b14b0..5aa9223db 100644 --- a/pumpkin-data/build/screen.rs +++ b/pumpkin-data/build/screen.rs @@ -1,24 +1,15 @@ -use heck::ToPascalCase; use proc_macro2::TokenStream; use quote::quote; -use crate::ident; +use crate::array_to_tokenstream; pub(crate) fn build() -> TokenStream { println!("cargo:rerun-if-changed=assets/screens.json"); let screens: Vec = serde_json::from_str(include_str!("../../assets/screens.json")) .expect("Failed to parse screens.json"); - let mut variants = TokenStream::new(); + let variants = array_to_tokenstream(screens); - for (id, screen) in screens.iter().enumerate() { - let id = id as u8; - let name = ident(screen.to_pascal_case()); - - variants.extend([quote! { - #name = #id, - }]); - } quote! { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[repr(u8)] diff --git a/pumpkin-data/build/sound.rs b/pumpkin-data/build/sound.rs index 20ae5987b..257cf1e66 100644 --- a/pumpkin-data/build/sound.rs +++ b/pumpkin-data/build/sound.rs @@ -1,24 +1,15 @@ -use heck::ToPascalCase; use proc_macro2::TokenStream; use quote::quote; -use crate::ident; +use crate::array_to_tokenstream; pub(crate) fn build() -> TokenStream { println!("cargo:rerun-if-changed=assets/sounds.json"); let sound: Vec = serde_json::from_str(include_str!("../../assets/sounds.json")) .expect("Failed to parse sounds.json"); - let mut variants = TokenStream::new(); + let variants = array_to_tokenstream(sound); - for (id, sound) in sound.iter().enumerate() { - let id = id as u16; - let name = ident(sound.to_pascal_case()); - - variants.extend([quote! { - #name = #id, - }]); - } quote! { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[repr(u16)] diff --git a/pumpkin-data/build/sound_category.rs b/pumpkin-data/build/sound_category.rs new file mode 100644 index 000000000..09a83cc2f --- /dev/null +++ b/pumpkin-data/build/sound_category.rs @@ -0,0 +1,20 @@ +use proc_macro2::TokenStream; +use quote::quote; + +use crate::array_to_tokenstream; + +pub(crate) fn build() -> TokenStream { + println!("cargo:rerun-if-changed=assets/sound_category.json"); + + let sound_categories: Vec = + serde_json::from_str(include_str!("../../assets/sound_category.json")) + .expect("Failed to parse sound_category.json"); + let variants = array_to_tokenstream(sound_categories); + + quote! { + #[repr(u8)] + pub enum SoundCategory { + #variants + } + } +} diff --git a/pumpkin-data/src/lib.rs b/pumpkin-data/src/lib.rs index f6fa0cd86..1ffd43534 100644 --- a/pumpkin-data/src/lib.rs +++ b/pumpkin-data/src/lib.rs @@ -21,3 +21,7 @@ pub mod chunk_status { pub mod game_event { include!(concat!(env!("OUT_DIR"), "/game_event.rs")); } + +pub mod sound_category { + include!(concat!(env!("OUT_DIR"), "/sound_category.rs")); +} diff --git a/pumpkin-protocol/src/client/play/c_entity_sound_effect.rs b/pumpkin-protocol/src/client/play/c_entity_sound_effect.rs index c750a6d3d..5ffc357c2 100644 --- a/pumpkin-protocol/src/client/play/c_entity_sound_effect.rs +++ b/pumpkin-protocol/src/client/play/c_entity_sound_effect.rs @@ -1,8 +1,8 @@ use bytes::BufMut; -use pumpkin_data::packet::clientbound::PLAY_SOUND_ENTITY; +use pumpkin_data::{packet::clientbound::PLAY_SOUND_ENTITY, sound_category::SoundCategory}; use pumpkin_macros::client_packet; -use crate::{bytebuf::ByteBufMut, ClientPacket, IDOrSoundEvent, SoundCategory, SoundEvent, VarInt}; +use crate::{bytebuf::ByteBufMut, ClientPacket, IDOrSoundEvent, SoundEvent, VarInt}; #[client_packet(PLAY_SOUND_ENTITY)] pub struct CEntitySoundEffect { diff --git a/pumpkin-protocol/src/client/play/c_sound_effect.rs b/pumpkin-protocol/src/client/play/c_sound_effect.rs index 095785376..7555edc0d 100644 --- a/pumpkin-protocol/src/client/play/c_sound_effect.rs +++ b/pumpkin-protocol/src/client/play/c_sound_effect.rs @@ -1,8 +1,8 @@ use bytes::BufMut; -use pumpkin_data::packet::clientbound::PLAY_SOUND; +use pumpkin_data::{packet::clientbound::PLAY_SOUND, sound_category::SoundCategory}; use pumpkin_macros::client_packet; -use crate::{bytebuf::ByteBufMut, ClientPacket, IDOrSoundEvent, SoundCategory, SoundEvent, VarInt}; +use crate::{bytebuf::ByteBufMut, ClientPacket, IDOrSoundEvent, SoundEvent, VarInt}; #[client_packet(PLAY_SOUND)] pub struct CSoundEffect { diff --git a/pumpkin-protocol/src/lib.rs b/pumpkin-protocol/src/lib.rs index d152b3208..02b8600a9 100644 --- a/pumpkin-protocol/src/lib.rs +++ b/pumpkin-protocol/src/lib.rs @@ -65,19 +65,6 @@ impl TryFrom for ConnectionState { } } -pub enum SoundCategory { - Master, - Music, - Records, - Weather, - Blocks, - Hostile, - Neutral, - Players, - Ambient, - Voice, -} - #[derive(Serialize)] pub struct IDOrSoundEvent { pub id: VarInt, diff --git a/pumpkin/src/entity/player.rs b/pumpkin/src/entity/player.rs index c7677299f..3ab8f494f 100644 --- a/pumpkin/src/entity/player.rs +++ b/pumpkin/src/entity/player.rs @@ -9,7 +9,7 @@ use std::{ use crossbeam::atomic::AtomicCell; use pumpkin_config::{ADVANCED_CONFIG, BASIC_CONFIG}; -use pumpkin_data::sound::Sound; +use pumpkin_data::{sound::Sound, sound_category::SoundCategory}; use pumpkin_entity::{entity_type::EntityType, EntityId}; use pumpkin_inventory::player::PlayerInventory; use pumpkin_protocol::server::play::{ @@ -29,7 +29,7 @@ use pumpkin_protocol::{ SPlayerRotation, SSetCreativeSlot, SSetHeldItem, SSetPlayerGround, SSwingArm, SUseItem, SUseItemOn, }, - RawPacket, ServerPacket, SoundCategory, + RawPacket, ServerPacket, }; use pumpkin_protocol::{client::play::CUpdateTime, codec::var_int::VarInt}; use pumpkin_protocol::{ diff --git a/pumpkin/src/net/combat.rs b/pumpkin/src/net/combat.rs index caf30b26b..7be7dcabb 100644 --- a/pumpkin/src/net/combat.rs +++ b/pumpkin/src/net/combat.rs @@ -1,10 +1,9 @@ use std::f32::consts::PI; -use pumpkin_data::{particle::Particle, sound::Sound}; +use pumpkin_data::{particle::Particle, sound::Sound, sound_category::SoundCategory}; use pumpkin_protocol::{ client::play::{CEntityVelocity, CParticle}, codec::var_int::VarInt, - SoundCategory, }; use pumpkin_util::math::vector3::Vector3; use pumpkin_world::item::ItemStack; diff --git a/pumpkin/src/world/mod.rs b/pumpkin/src/world/mod.rs index 1f7fe097a..a8501631d 100644 --- a/pumpkin/src/world/mod.rs +++ b/pumpkin/src/world/mod.rs @@ -11,16 +11,13 @@ use crate::{ }; use level_time::LevelTime; use pumpkin_config::BasicConfiguration; -use pumpkin_data::sound::Sound; +use pumpkin_data::{sound::Sound, sound_category::SoundCategory}; use pumpkin_entity::{entity_type::EntityType, pose::EntityPose, EntityId}; +use pumpkin_protocol::client::play::{CBlockUpdate, CRespawn, CSoundEffect, CWorldEvent}; use pumpkin_protocol::{ client::play::CLevelEvent, codec::{identifier::Identifier, var_int::VarInt}, }; -use pumpkin_protocol::{ - client::play::{CBlockUpdate, CRespawn, CSoundEffect, CWorldEvent}, - SoundCategory, -}; use pumpkin_protocol::{ client::play::{ CChunkData, CGameEvent, CLogin, CPlayerInfoUpdate, CRemoveEntities, CRemovePlayerInfo,