From 790668f6f7a3ac5d267bafa71271a33ba9d2605e Mon Sep 17 00:00:00 2001 From: andy Date: Fri, 23 Oct 2020 23:09:30 -0300 Subject: [PATCH] add unit armour slots. equip the unit into the right slot and save correctly --- src/bin/main.rs | 40 ++++++++++++++++++++++-- src/entity/item/unit.rs | 4 ++- src/ship/drops/generic_unit.rs | 2 ++ src/ship/drops/rare_drop_table.rs | 1 + src/ship/items/manager.rs | 50 ++++++++++++++++++++++++++---- src/ship/packet/handler/message.rs | 2 +- src/ship/shops/armor.rs | 1 + 7 files changed, 89 insertions(+), 11 deletions(-) diff --git a/src/bin/main.rs b/src/bin/main.rs index 292aec2..4d8bed7 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -234,6 +234,7 @@ fn main() { item::unit::Unit { unit: item::unit::UnitType::PriestMind, modifier: Some(item::unit::UnitModifier::Minus), + armour_slot: 0, } ), location: ItemLocation::Inventory { @@ -247,8 +248,9 @@ fn main() { NewItemEntity { item: ItemDetail::Unit( item::unit::Unit { - unit: item::unit::UnitType::HeavenlyPower, - modifier: Some(item::unit::UnitModifier::PlusPlus), + unit: item::unit::UnitType::PriestMind, + modifier: Some(item::unit::UnitModifier::Minus), + armour_slot: 1, } ), location: ItemLocation::Inventory { @@ -258,6 +260,38 @@ fn main() { } } ).await; + entity_gateway.create_item( + NewItemEntity { + item: ItemDetail::Unit( + item::unit::Unit { + unit: item::unit::UnitType::PriestMind, + modifier: Some(item::unit::UnitModifier::Minus), + armour_slot: 2, + } + ), + location: ItemLocation::Inventory { + character_id: character.id, + slot: 9, + equipped: true, + } + } + ).await; + entity_gateway.create_item( + NewItemEntity { + item: ItemDetail::Unit( + item::unit::Unit { + unit: item::unit::UnitType::PriestMind, + modifier: Some(item::unit::UnitModifier::Minus), + armour_slot: 3, + } + ), + location: ItemLocation::Inventory { + character_id: character.id, + slot: 10, + equipped: true, + } + } + ).await; entity_gateway.create_item( NewItemEntity { item: ItemDetail::Mag( @@ -265,7 +299,7 @@ fn main() { ), location: ItemLocation::Inventory { character_id: character.id, - slot: 9, + slot: 11, equipped: true, } } diff --git a/src/entity/item/unit.rs b/src/entity/item/unit.rs index aa83bf1..716454e 100644 --- a/src/entity/item/unit.rs +++ b/src/entity/item/unit.rs @@ -335,6 +335,7 @@ pub enum UnitModifier { pub struct Unit { pub unit: UnitType, pub modifier: Option, + pub armour_slot: u8, // 0 - 3 = armour slot 1 - 4 } @@ -361,7 +362,7 @@ impl Unit { }, } } - + result[4] = self.armour_slot; result } @@ -379,6 +380,7 @@ impl Unit { Ok(Unit{ unit: u.unwrap(), modifier: m, + armour_slot: data[4], }) } else { diff --git a/src/ship/drops/generic_unit.rs b/src/ship/drops/generic_unit.rs index 73bc4a6..e071d8d 100644 --- a/src/ship/drops/generic_unit.rs +++ b/src/ship/drops/generic_unit.rs @@ -89,6 +89,7 @@ impl GenericUnitTable { ItemDropType::Unit(Unit { unit: unit_type, modifier: unit_modifier, + armour_slot: 0, }) }) } @@ -116,6 +117,7 @@ mod test { assert!(gut.get_drop(&area, &mut rng) == Some(ItemDropType::Unit(Unit { unit: unit, modifier: umod, + armour_slot: 0, }))); } } diff --git a/src/ship/drops/rare_drop_table.rs b/src/ship/drops/rare_drop_table.rs index fae0175..a464bdf 100644 --- a/src/ship/drops/rare_drop_table.rs +++ b/src/ship/drops/rare_drop_table.rs @@ -128,6 +128,7 @@ impl RareDropTable { ItemDropType::Unit(Unit { unit: unit, modifier: None, + armour_slot: 0, }) }, RareDropItem::Tool(tool) => { diff --git a/src/ship/items/manager.rs b/src/ship/items/manager.rs index 2a9a50c..e5e095d 100644 --- a/src/ship/items/manager.rs +++ b/src/ship/items/manager.rs @@ -4,8 +4,9 @@ use thiserror::Error; use crate::entity::gateway::EntityGateway; use crate::entity::character::{CharacterEntity, CharacterEntityId}; use crate::entity::item::{ItemDetail, ItemLocation, BankName}; -use crate::entity::item::{Meseta, NewItemEntity}; +use crate::entity::item::{Meseta, NewItemEntity, ItemEntity}; use crate::entity::item::tool::{Tool, ToolType}; +use crate::entity::item::unit; use crate::ship::map::MapArea; use crate::ship::ship::ItemDropLocation; use crate::ship::drops::{ItemDrop, ItemDropType}; @@ -898,20 +899,43 @@ impl ItemManager { pub async fn player_equips_item(&mut self, entity_gateway: &mut EG, character: &CharacterEntity, - item_id: ClientItemId) + item_id: ClientItemId, + equip_slot: u8) -> Result<(), ItemManagerError> { let inventory = self.character_inventory.get_mut(&character.id).ok_or(ItemManagerError::NoCharacter(character.id))?; let mut inventory_item_handle = inventory.get_item_handle_by_id(item_id).ok_or(ItemManagerError::NoSuchItemId(item_id))?; let slot = inventory_item_handle.get_slot(); let inventory_item = inventory_item_handle.item_mut().ok_or(ItemManagerError::CannotGetMutItem)?.individual().ok_or(ItemManagerError::CannotGetIndividualItem)?; inventory_item.equipped = true; + if let ItemDetail::Unit(u) = inventory_item.item { + if equip_slot > 0 { + inventory_item.item = ItemDetail::Unit(unit::Unit { + unit: u.unit, + modifier: u.modifier, + armour_slot: ((equip_slot & 0x7) - 1) % 4, + }); + } else { + inventory_item.item = ItemDetail::Unit(unit::Unit { + unit: u.unit, + modifier: u.modifier, + armour_slot: 0, + }); + } + }; entity_gateway.change_item_location(&inventory_item.entity_id, ItemLocation::Inventory{ character_id: character.id, slot: slot, equipped: true, }).await; - - entity_gateway.save_character(character).await; + entity_gateway.save_item(&ItemEntity{ + id: inventory_item.entity_id, + location: ItemLocation::Inventory{ + character_id: character.id, + slot: slot, + equipped: true, + }, + item: inventory_item.item.clone(), + }).await; Ok(()) } @@ -925,13 +949,27 @@ impl ItemManager { let slot = inventory_item_handle.get_slot(); let inventory_item = inventory_item_handle.item_mut().ok_or(ItemManagerError::CannotGetMutItem)?.individual().ok_or(ItemManagerError::CannotGetIndividualItem)?; inventory_item.equipped = false; + if let ItemDetail::Unit(u) = inventory_item.item { + inventory_item.item = ItemDetail::Unit(unit::Unit { + unit: u.unit, + modifier: u.modifier, + armour_slot: 0, + }); + }; entity_gateway.change_item_location(&inventory_item.entity_id, ItemLocation::Inventory{ character_id: character.id, slot: slot, equipped: false, }).await; - - entity_gateway.save_character(character).await; + entity_gateway.save_item(&ItemEntity{ + id: inventory_item.entity_id, + location: ItemLocation::Inventory{ + character_id: character.id, + slot: slot, + equipped: false, + }, + item: inventory_item.item.clone(), + }).await; Ok(()) } } diff --git a/src/ship/packet/handler/message.rs b/src/ship/packet/handler/message.rs index 832c06e..cde8059 100644 --- a/src/ship/packet/handler/message.rs +++ b/src/ship/packet/handler/message.rs @@ -316,7 +316,7 @@ where EG: EntityGateway { let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id))?; - item_manager.player_equips_item(entity_gateway, &client.character, ClientItemId(pkt.item_id)).await?; + item_manager.player_equips_item(entity_gateway, &client.character, ClientItemId(pkt.item_id), pkt.sub_menu).await?; Ok(Box::new(None.into_iter())) } diff --git a/src/ship/shops/armor.rs b/src/ship/shops/armor.rs index 657b732..3ac3fab 100644 --- a/src/ship/shops/armor.rs +++ b/src/ship/shops/armor.rs @@ -89,6 +89,7 @@ impl ShopItem for ArmorShopItem { ItemDetail::Unit(Unit { unit: *unit, modifier: None, + armour_slot: 0, }) }, }