From 1208e67f36ae750abfe4cf50d7f8649b32f00991 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Fri, 10 Jan 2025 14:31:43 +0100 Subject: [PATCH] parse screen into enum at compile time --- pumpkin-data/Cargo.toml | 1 + pumpkin-data/src/lib.rs | 4 +++ pumpkin-inventory/Cargo.toml | 2 +- pumpkin-inventory/src/lib.rs | 41 +--------------------- pumpkin-inventory/src/open_container.rs | 5 +-- pumpkin-macros/src/lib.rs | 5 --- pumpkin-macros/src/screen.rs | 21 ----------- pumpkin/Cargo.toml | 1 + pumpkin/src/block/blocks/chest.rs | 3 +- pumpkin/src/block/blocks/crafting_table.rs | 5 +-- pumpkin/src/block/blocks/furnace.rs | 2 +- pumpkin/src/block/blocks/mod.rs | 3 +- pumpkin/src/net/container.rs | 3 +- 13 files changed, 21 insertions(+), 75 deletions(-) delete mode 100644 pumpkin-macros/src/screen.rs diff --git a/pumpkin-data/Cargo.toml b/pumpkin-data/Cargo.toml index 747a5818a..7fa999011 100644 --- a/pumpkin-data/Cargo.toml +++ b/pumpkin-data/Cargo.toml @@ -8,6 +8,7 @@ build = "build/build.rs" serde.workspace = true serde_json.workspace = true +heck = "0.5.0" proc-macro2 = "1.0" quote = "1.0" syn = "2.0" \ No newline at end of file diff --git a/pumpkin-data/src/lib.rs b/pumpkin-data/src/lib.rs index c7f10b1b0..2c97d8d02 100644 --- a/pumpkin-data/src/lib.rs +++ b/pumpkin-data/src/lib.rs @@ -1,3 +1,7 @@ pub mod packet { include!(concat!(env!("OUT_DIR"), "/packet.rs")); } + +pub mod screen { + include!(concat!(env!("OUT_DIR"), "/screen.rs")); +} diff --git a/pumpkin-inventory/Cargo.toml b/pumpkin-inventory/Cargo.toml index 2d30c0592..a83fd927e 100644 --- a/pumpkin-inventory/Cargo.toml +++ b/pumpkin-inventory/Cargo.toml @@ -5,10 +5,10 @@ edition.workspace = true [dependencies] pumpkin-protocol = { path = "../pumpkin-protocol" } +pumpkin-data = { path = "../pumpkin-data" } pumpkin-world = { path = "../pumpkin-world" } pumpkin-registry = {path = "../pumpkin-registry"} -pumpkin-macros = { path = "../pumpkin-macros" } pumpkin-util = { path = "../pumpkin-util" } log.workspace = true diff --git a/pumpkin-inventory/src/lib.rs b/pumpkin-inventory/src/lib.rs index 92fc4fc5f..22f25f0ba 100644 --- a/pumpkin-inventory/src/lib.rs +++ b/pumpkin-inventory/src/lib.rs @@ -1,6 +1,6 @@ use crate::container_click::MouseClick; use crate::player::PlayerInventory; -use pumpkin_macros::screen; +use pumpkin_data::screen::WindowType; use pumpkin_world::item::ItemStack; pub mod container_click; @@ -14,45 +14,6 @@ pub mod window_property; pub use error::InventoryError; pub use open_container::*; -#[derive(Debug, Clone, Copy, Eq, PartialEq)] -#[repr(u8)] -pub enum WindowType { - // not used - Generic9x1 = screen!("generic_9x1"), - // not used - Generic9x2 = screen!("generic_9x2"), - // General-purpose 3-row inventory. Used by Chest, minecart with chest, ender chest, and barrel - Generic9x3 = screen!("generic_9x3"), - // not used - Generic9x4 = screen!("generic_9x4"), - // not used - Generic9x5 = screen!("generic_9x5"), - // Used by large chests - Generic9x6 = screen!("generic_9x6"), - // General-purpose 3-by-3 square inventory, used by Dispenser and Dropper - Generic3x3 = screen!("generic_3x3"), - // General-purpose 3-by-3 square inventory, used by the Crafter - Craft3x3 = screen!("crafter_3x3"), - Anvil = screen!("anvil"), - Beacon = screen!("beacon"), - BlastFurnace = screen!("blast_furnace"), - BrewingStand = screen!("brewing_stand"), - CraftingTable = screen!("crafting"), - EnchantmentTable = screen!("enchantment"), - Furnace = screen!("furnace"), - Grindstone = screen!("grindstone"), - // Hopper or minecart with hopper - Hopper = screen!("hopper"), - Lectern = screen!("lectern"), - Loom = screen!("loom"), - // Villager, Wandering Trader - Merchant = screen!("merchant"), - ShulkerBox = screen!("shulker_box"), - SmithingTable = screen!("smithing"), - Smoker = screen!("smoker"), - CartographyTable = screen!("cartography_table"), - Stonecutter = screen!("stonecutter"), -} pub struct ContainerStruct([Option; SLOTS]); // Container needs Sync + Send to be able to be in async Server diff --git a/pumpkin-inventory/src/open_container.rs b/pumpkin-inventory/src/open_container.rs index b4f725c14..1659c9d46 100644 --- a/pumpkin-inventory/src/open_container.rs +++ b/pumpkin-inventory/src/open_container.rs @@ -1,5 +1,6 @@ use crate::crafting::check_if_matches_crafting; -use crate::{Container, WindowType}; +use crate::Container; +use pumpkin_data::screen::WindowType; use pumpkin_util::math::position::WorldPosition; use pumpkin_world::block::block_registry::Block; use pumpkin_world::item::ItemStack; @@ -125,7 +126,7 @@ pub struct CraftingTable { impl Container for CraftingTable { fn window_type(&self) -> &'static WindowType { - &WindowType::CraftingTable + &WindowType::Crafting } fn window_name(&self) -> &'static str { diff --git a/pumpkin-macros/src/lib.rs b/pumpkin-macros/src/lib.rs index baa458603..e818019b1 100644 --- a/pumpkin-macros/src/lib.rs +++ b/pumpkin-macros/src/lib.rs @@ -67,11 +67,6 @@ pub fn pumpkin_block(input: TokenStream, item: TokenStream) -> TokenStream { gen.into() } -mod screen; -#[proc_macro] -pub fn screen(item: TokenStream) -> TokenStream { - screen::screen_impl(item) -} mod sound; #[proc_macro] pub fn sound(item: TokenStream) -> TokenStream { diff --git a/pumpkin-macros/src/screen.rs b/pumpkin-macros/src/screen.rs deleted file mode 100644 index 8cf59c7cc..000000000 --- a/pumpkin-macros/src/screen.rs +++ /dev/null @@ -1,21 +0,0 @@ -use std::{collections::HashMap, sync::LazyLock}; - -use proc_macro::TokenStream; -use quote::quote; - -static SCREENS: LazyLock> = LazyLock::new(|| { - serde_json::from_str::>(include_str!("../../assets/screens.json")) - .expect("Could not parse screens.json registry.") - .into_iter() - .enumerate() - .map(|(i, s)| (s, i as u8)) - .collect() -}); - -pub(crate) fn screen_impl(item: TokenStream) -> TokenStream { - let input_string = item.to_string(); - let screen_name = input_string.trim_matches('"'); - - let id = *SCREENS.get(screen_name).expect("Invalid Screen"); - quote! { #id }.into() -} diff --git a/pumpkin/Cargo.toml b/pumpkin/Cargo.toml index f0cef7ae4..fdba023f2 100644 --- a/pumpkin/Cargo.toml +++ b/pumpkin/Cargo.toml @@ -16,6 +16,7 @@ pumpkin-util = { path = "../pumpkin-util" } pumpkin-config = { path = "../pumpkin-config" } pumpkin-inventory = { path = "../pumpkin-inventory" } pumpkin-world = { path = "../pumpkin-world" } +pumpkin-data = { path = "../pumpkin-data" } pumpkin-entity = { path = "../pumpkin-entity" } pumpkin-protocol = { path = "../pumpkin-protocol" } pumpkin-registry = { path = "../pumpkin-registry" } diff --git a/pumpkin/src/block/blocks/chest.rs b/pumpkin/src/block/blocks/chest.rs index 8aa3329cb..e47636739 100644 --- a/pumpkin/src/block/blocks/chest.rs +++ b/pumpkin/src/block/blocks/chest.rs @@ -1,5 +1,6 @@ use async_trait::async_trait; -use pumpkin_inventory::{Chest, OpenContainer, WindowType}; +use pumpkin_data::screen::WindowType; +use pumpkin_inventory::{Chest, OpenContainer}; use pumpkin_macros::{pumpkin_block, sound}; use pumpkin_protocol::{client::play::CBlockAction, codec::var_int::VarInt}; use pumpkin_util::math::position::WorldPosition; diff --git a/pumpkin/src/block/blocks/crafting_table.rs b/pumpkin/src/block/blocks/crafting_table.rs index 2538286b4..bb216212f 100644 --- a/pumpkin/src/block/blocks/crafting_table.rs +++ b/pumpkin/src/block/blocks/crafting_table.rs @@ -3,7 +3,8 @@ use crate::block::pumpkin_block::PumpkinBlock; use crate::entity::player::Player; use crate::server::Server; use async_trait::async_trait; -use pumpkin_inventory::{CraftingTable, OpenContainer, WindowType}; +use pumpkin_data::screen::WindowType; +use pumpkin_inventory::{CraftingTable, OpenContainer}; use pumpkin_macros::pumpkin_block; use pumpkin_util::math::position::WorldPosition; use pumpkin_world::{block::block_registry::Block, item::item_registry::Item}; @@ -83,7 +84,7 @@ impl CraftingTableBlock { player, location, server, - WindowType::CraftingTable, + WindowType::Crafting, ) .await; } diff --git a/pumpkin/src/block/blocks/furnace.rs b/pumpkin/src/block/blocks/furnace.rs index 61921fcb4..d8f06f3eb 100644 --- a/pumpkin/src/block/blocks/furnace.rs +++ b/pumpkin/src/block/blocks/furnace.rs @@ -1,8 +1,8 @@ use crate::block::block_manager::BlockActionResult; use crate::entity::player::Player; use async_trait::async_trait; +use pumpkin_data::screen::WindowType; use pumpkin_inventory::Furnace; -use pumpkin_inventory::WindowType; use pumpkin_macros::pumpkin_block; use pumpkin_util::math::position::WorldPosition; use pumpkin_world::block::block_registry::Block; diff --git a/pumpkin/src/block/blocks/mod.rs b/pumpkin/src/block/blocks/mod.rs index a926ad71b..272482d9c 100644 --- a/pumpkin/src/block/blocks/mod.rs +++ b/pumpkin/src/block/blocks/mod.rs @@ -1,4 +1,5 @@ -use pumpkin_inventory::{Container, OpenContainer, WindowType}; +use pumpkin_data::screen::WindowType; +use pumpkin_inventory::{Container, OpenContainer}; use pumpkin_util::math::position::WorldPosition; use pumpkin_world::block::block_registry::Block; diff --git a/pumpkin/src/net/container.rs b/pumpkin/src/net/container.rs index 6aa84b892..1fcdcf307 100644 --- a/pumpkin/src/net/container.rs +++ b/pumpkin/src/net/container.rs @@ -1,12 +1,13 @@ use crate::entity::player::Player; use crate::server::Server; +use pumpkin_data::screen::WindowType; use pumpkin_inventory::container_click::{ Click, ClickType, KeyClick, MouseClick, MouseDragState, MouseDragType, }; use pumpkin_inventory::drag_handler::DragHandler; use pumpkin_inventory::window_property::{WindowProperty, WindowPropertyTrait}; +use pumpkin_inventory::Container; use pumpkin_inventory::{container_click, InventoryError, OptionallyCombinedContainer}; -use pumpkin_inventory::{Container, WindowType}; use pumpkin_protocol::client::play::{ CCloseContainer, COpenScreen, CSetContainerContent, CSetContainerProperty, CSetContainerSlot, };