From 9b0f8ec406bfc47600f1df90ecc60d043097a592 Mon Sep 17 00:00:00 2001 From: ErrorNoInternet Date: Sun, 23 Feb 2025 17:19:26 -0500 Subject: [PATCH] feat(client): add menu field --- src/lua/client/container.rs | 43 +++++++++++++++++++++++++++++---- src/lua/client/mod.rs | 1 + src/lua/container/item_stack.rs | 10 +++++--- src/lua/container/mod.rs | 4 +-- 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/lua/client/container.rs b/src/lua/client/container.rs index 5b0912d..dc9fa42 100644 --- a/src/lua/client/container.rs +++ b/src/lua/client/container.rs @@ -1,10 +1,12 @@ use super::{Client, Container, ContainerRef, ItemStack, Vec3}; use azalea::{ - BlockPos, inventory::Inventory, prelude::ContainerClientExt, + BlockPos, + inventory::{Inventory, Menu, Player, SlotList}, + prelude::ContainerClientExt, protocol::packets::game::ServerboundSetCarriedItem, }; use log::error; -use mlua::{Lua, Result, UserDataRef}; +use mlua::{Lua, Result, Table, UserDataRef}; pub fn container(_lua: &Lua, client: &Client) -> Result> { Ok(client @@ -13,15 +15,46 @@ pub fn container(_lua: &Lua, client: &Client) -> Result> { } pub fn held_item(_lua: &Lua, client: &Client) -> Result { - Ok(ItemStack { - inner: client.component::().held_item(), - }) + Ok(ItemStack::from(client.component::().held_item())) } pub fn held_slot(_lua: &Lua, client: &Client) -> Result { Ok(client.component::().selected_hotbar_slot) } +pub fn menu(lua: &Lua, client: &Client) -> Result { + fn from_slot_list(s: SlotList) -> Vec { + s.iter() + .map(|i| ItemStack::from(i.to_owned())) + .collect::>() + } + + let table = lua.create_table()?; + match client.menu() { + Menu::Player(Player { + craft_result, + craft, + armor, + inventory, + offhand, + }) => { + table.set("type", 0)?; + table.set("craft_result", ItemStack::from(craft_result))?; + table.set("craft", from_slot_list(craft))?; + table.set("armor", from_slot_list(armor))?; + table.set("inventory", from_slot_list(inventory))?; + table.set("offhand", ItemStack::from(offhand))?; + } + Menu::Generic9x6 { contents, player } => { + table.set("type", 6)?; + table.set("contents", from_slot_list(contents))?; + table.set("player", from_slot_list(player))?; + } + _ => (), + } + Ok(table) +} + pub async fn open_container_at( _lua: Lua, client: UserDataRef, diff --git a/src/lua/client/mod.rs b/src/lua/client/mod.rs index c86442b..dc2ed69 100644 --- a/src/lua/client/mod.rs +++ b/src/lua/client/mod.rs @@ -49,6 +49,7 @@ impl UserData for Client { f.add_field_method_get("held_slot", container::held_slot); f.add_field_method_get("hunger", state::hunger); f.add_field_method_get("looking_at", movement::looking_at); + f.add_field_method_get("menu", container::menu); f.add_field_method_get("pathfinder", movement::pathfinder); f.add_field_method_get("position", movement::position); f.add_field_method_get("score", state::score); diff --git a/src/lua/container/item_stack.rs b/src/lua/container/item_stack.rs index 0aef768..40f58e1 100644 --- a/src/lua/container/item_stack.rs +++ b/src/lua/container/item_stack.rs @@ -5,6 +5,12 @@ pub struct ItemStack { pub inner: azalea::inventory::ItemStack, } +impl From for ItemStack { + fn from(inner: azalea::inventory::ItemStack) -> Self { + Self { inner } + } +} + impl UserData for ItemStack { fn add_fields>(f: &mut F) { f.add_field_method_get("is_empty", |_, this| Ok(this.inner.is_empty())); @@ -38,9 +44,7 @@ impl UserData for ItemStack { fn add_methods>(m: &mut M) { m.add_method_mut("split", |_, this, count: u32| { - Ok(ItemStack { - inner: this.inner.split(count), - }) + Ok(ItemStack::from(this.inner.split(count))) }); m.add_method_mut("update_empty", |_, this, (): ()| { this.inner.update_empty(); diff --git a/src/lua/container/mod.rs b/src/lua/container/mod.rs index 8063982..d4cb3f1 100644 --- a/src/lua/container/mod.rs +++ b/src/lua/container/mod.rs @@ -25,7 +25,7 @@ impl UserData for Container { f.add_field_method_get("contents", |_, this| { Ok(this.inner.contents().map(|v| { v.iter() - .map(|i| ItemStack { inner: i.clone() }) + .map(|i| ItemStack::from(i.to_owned())) .collect::>() })) }); @@ -58,7 +58,7 @@ impl UserData for ContainerRef { f.add_field_method_get("contents", |_, this| { Ok(this.inner.contents().map(|v| { v.iter() - .map(|i| ItemStack { inner: i.clone() }) + .map(|i| ItemStack::from(i.to_owned())) .collect::>() })) });