aboutsummaryrefslogtreecommitdiff
path: root/azalea-inventory/src/lib.rs
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2023-05-03 20:57:27 -0500
committerGitHub <noreply@github.com>2023-05-03 20:57:27 -0500
commit634cb8d72c6608512aedba19e5cd669104bc35ea (patch)
treef8e76ce9eb43403d29cc0cbcf9a4f51522419dc2 /azalea-inventory/src/lib.rs
parent1fb4418f2c9cbd004c64c2f23d2d0352ee12c0e5 (diff)
downloadazalea-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/src/lib.rs')
-rw-r--r--azalea-inventory/src/lib.rs172
1 files changed, 172 insertions, 0 deletions
diff --git a/azalea-inventory/src/lib.rs b/azalea-inventory/src/lib.rs
new file mode 100644
index 00000000..518c7a1d
--- /dev/null
+++ b/azalea-inventory/src/lib.rs
@@ -0,0 +1,172 @@
+#![doc = include_str!("../README.md")]
+
+pub mod item;
+pub mod operations;
+mod slot;
+
+use std::ops::{Deref, DerefMut, RangeInclusive};
+
+use azalea_inventory_macros::declare_menus;
+pub use slot::{ItemSlot, ItemSlotData};
+
+// TODO: remove this here and in azalea-inventory-macros when rust makes
+// Default be implemented for all array sizes (since right now it's only up to
+// 32)
+
+/// A fixed-size list of [`ItemSlot`]s.
+#[derive(Debug, Clone)]
+pub struct SlotList<const N: usize>([ItemSlot; N]);
+impl<const N: usize> Deref for SlotList<N> {
+ type Target = [ItemSlot; N];
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+impl<const N: usize> DerefMut for SlotList<N> {
+ fn deref_mut(&mut self) -> &mut Self::Target {
+ &mut self.0
+ }
+}
+impl<const N: usize> Default for SlotList<N> {
+ fn default() -> Self {
+ SlotList([(); N].map(|_| ItemSlot::Empty))
+ }
+}
+
+impl Menu {
+ /// Get the [`Player`] from this [`Menu`].
+ ///
+ /// # Panics
+ ///
+ /// Will panic if the menu isn't `Menu::Player`.
+ pub fn as_player(&self) -> &Player {
+ if let Menu::Player(player) = &self {
+ player
+ } else {
+ unreachable!("Called `Menu::as_player` on a menu that wasn't `Player`.")
+ }
+ }
+}
+
+// the player inventory part is always the last 36 slots (except in the Player
+// menu), so we don't have to explicitly specify it
+
+// Client {
+// ...
+// pub menu: Menu,
+// pub inventory: Arc<[Slot; 36]>
+// }
+
+// Generate a `struct Player`, `enum Menu`, and `impl Menu`.
+// a "player" field gets implicitly added with the player inventory
+
+declare_menus! {
+ Player {
+ craft_result: 1,
+ craft: 4,
+ armor: 4,
+ inventory: 36,
+ offhand: 1,
+ },
+ Generic9x1 {
+ contents: 9,
+ },
+ Generic9x2 {
+ contents: 18,
+ },
+ Generic9x3 {
+ contents: 27,
+ },
+ Generic9x4 {
+ contents: 36,
+ },
+ Generic9x5 {
+ contents: 45,
+ },
+ Generic9x6 {
+ contents: 54,
+ },
+ Generic3x3 {
+ contents: 9,
+ },
+ Anvil {
+ first: 1,
+ second: 1,
+ result: 1,
+ },
+ Beacon {
+ payment: 1,
+ },
+ BlastFurnace {
+ ingredient: 1,
+ fuel: 1,
+ result: 1,
+ },
+ BrewingStand {
+ bottles: 3,
+ ingredient: 1,
+ fuel: 1,
+ },
+ Crafting {
+ result: 1,
+ grid: 9,
+ },
+ Enchantment {
+ item: 1,
+ lapis: 1,
+ },
+ Furnace {
+ ingredient: 1,
+ fuel: 1,
+ result: 1,
+ },
+ Grindstone {
+ input: 1,
+ additional: 1,
+ result: 1,
+ },
+ Hopper {
+ contents: 5,
+ },
+ Lectern {
+ book: 1,
+ },
+ Loom {
+ banner: 1,
+ dye: 1,
+ pattern: 1,
+ result: 1,
+ },
+ Merchant {
+ payments: 2,
+ result: 1,
+ },
+ ShulkerBox {
+ contents: 27,
+ },
+ LegacySmithing {
+ input: 1,
+ additional: 1,
+ result: 1,
+ },
+ Smithing {
+ template: 1,
+ base: 1,
+ additional: 1,
+ result: 1,
+ },
+ Smoker {
+ ingredient: 1,
+ fuel: 1,
+ result: 1,
+ },
+ CartographyTable {
+ map: 1,
+ additional: 1,
+ result: 1,
+ },
+ Stonecutter {
+ input: 1,
+ result: 1,
+ },
+}