diff options
| author | mat <27899617+mat-1@users.noreply.github.com> | 2023-05-03 20:57:27 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-03 20:57:27 -0500 |
| commit | 634cb8d72c6608512aedba19e5cd669104bc35ea (patch) | |
| tree | f8e76ce9eb43403d29cc0cbcf9a4f51522419dc2 /azalea-inventory/azalea-inventory-macros/src/menu_enum.rs | |
| parent | 1fb4418f2c9cbd004c64c2f23d2d0352ee12c0e5 (diff) | |
| download | azalea-drasl-634cb8d72c6608512aedba19e5cd669104bc35ea.tar.xz | |
Inventory (#48)
* start adding azalea-inventory
* design more of how inventories are defined
* start working on az-inv-macros
* inventory macro works
* start adding inventory codegen
* update some deps
* add inventory codegen
* manually write inventory menus
* put the inventories in Client
* start on containersetcontent
* inventory menu should hopefully work
* checks in containersetcontent
* format a comment
* move some variant matches
* inventory.rs
* inventory stuff
* more inventory stuff
* inventory/container tracking works
* start adding interact function
* sequence number
* start adding HitResultComponent
* implement traverse_blocks
* start adding clip
* add clip function
* update_hit_result_component
* start trying to fix
* fix
* make some stuff simpler
* clippy
* lever
* chest
* container handle
* fix ambiguity
* fix some doc tests
* move some container stuff from az-client to azalea
* clicking container
* start implementing simulate_click
* keep working on simulate click
* implement more of simulate_click
this is really boring
* inventory fixes
* start implementing shift clicking
* fix panic in azalea-chat i hope
* shift clicking implemented
* more inventory stuff
* fix items not showing in containers sometimes
* fix test
* fix all warnings
* remove a println
---------
Co-authored-by: mat <git@matdoes.dev>
Diffstat (limited to 'azalea-inventory/azalea-inventory-macros/src/menu_enum.rs')
| -rw-r--r-- | azalea-inventory/azalea-inventory-macros/src/menu_enum.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs b/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs new file mode 100644 index 00000000..a9e4f430 --- /dev/null +++ b/azalea-inventory/azalea-inventory-macros/src/menu_enum.rs @@ -0,0 +1,70 @@ +//! Generate the `enum menu` and nothing else. Implementations are in +//! impl_menu.rs + +use crate::parse_macro::{DeclareMenus, Field, Menu}; +use proc_macro2::TokenStream; +use quote::quote; + +pub fn generate(input: &DeclareMenus) -> TokenStream { + let mut variants = quote! {}; + let mut player_fields = None; + for menu in &input.menus { + if menu.name == "Player" { + player_fields = Some(generate_fields(&menu.fields, true)); + } else { + variants.extend(generate_variant_for_menu(menu)); + } + } + let player_fields = player_fields.expect("Player variant must be present"); + + quote! { + #[derive(Clone, Debug, Default)] + pub struct Player { + #player_fields + } + + /// A menu, which is a fixed collection of slots. + #[derive(Clone, Debug)] + pub enum Menu { + Player(Player), + #variants + } + } +} + +/// Player { +/// craft_result: ItemSlot, +/// craft: [ItemSlot; 4], +/// armor: [ItemSlot; 4], +/// inventory: [ItemSlot; 36], +/// offhand: ItemSlot, +/// }, +fn generate_variant_for_menu(menu: &Menu) -> TokenStream { + let name = &menu.name; + let fields = generate_fields(&menu.fields, false); + + quote! { + #name { + #fields + }, + } +} + +fn generate_fields(fields: &[Field], public: bool) -> TokenStream { + let mut generated_fields = quote! {}; + for field in fields { + let field_length = field.length; + let field_type = if field.length == 1 { + quote! { ItemSlot } + } else { + quote! { SlotList<#field_length> } + }; + let field_name = &field.name; + if public { + generated_fields.extend(quote! { pub #field_name: #field_type, }) + } else { + generated_fields.extend(quote! { #field_name: #field_type, }) + } + } + generated_fields +} |
