add kill counter field to weapons and increment it when a client kills a monster
This commit is contained in:
parent
13017084ee
commit
b0eb494660
@ -116,7 +116,7 @@ fn main() {
|
||||
Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 30}),
|
||||
None,],
|
||||
tekked: true,
|
||||
kills: Some(22999),
|
||||
kills: Some(22995),
|
||||
}
|
||||
),
|
||||
}).await.unwrap();
|
||||
|
@ -157,6 +157,17 @@ pub trait EntityGateway: Send + Sync {
|
||||
async fn create_trade(&mut self, _char_id1: &CharacterEntityId, _char_id2: &CharacterEntityId) -> Result<TradeEntity, GatewayError> {
|
||||
unimplemented!();
|
||||
}
|
||||
async fn increment_kill_counter(&mut self, _item_entity_id: &ItemEntityId) -> Result<(), GatewayError> {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
async fn get_kill_counter() {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
async fn set_kill_counter() {
|
||||
unimplemented!();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -527,4 +527,19 @@ impl EntityGateway for InMemoryGateway {
|
||||
trades.push(new_trade.clone());
|
||||
Ok(new_trade)
|
||||
}
|
||||
|
||||
async fn increment_kill_counter(&mut self, item_id: &ItemEntityId) -> Result<(), GatewayError> {
|
||||
if let Some(item_entity) = self.items.lock().unwrap().get_mut(item_id) {
|
||||
item_entity.increase_kill_counter();
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn get_kill_counter() {
|
||||
println!("src/entity/gateway/inmemory.rs::get_kill_counter() - unimplemented!");
|
||||
}
|
||||
|
||||
async fn set_kill_counter() {
|
||||
println!("src/entity/gateway/inmemory.rs::set_kill_counter() - unimplemented!");
|
||||
}
|
||||
}
|
||||
|
@ -186,7 +186,6 @@ impl ItemDetail {
|
||||
ItemDetail::Armor(_a) => false,
|
||||
ItemDetail::Shield(_s) => false,
|
||||
ItemDetail::Unit(u) => u.kills.is_some(),
|
||||
// ItemDetail::Unit(_u) => false,
|
||||
ItemDetail::Tool(_t) => false,
|
||||
ItemDetail::TechniqueDisk(_d) => false,
|
||||
ItemDetail::Mag(_m) => false,
|
||||
|
@ -1684,4 +1684,10 @@ impl Weapon {
|
||||
| WeaponType::Scepter
|
||||
)
|
||||
}
|
||||
|
||||
pub fn increment_kill_counter(&mut self) {
|
||||
if let Some(kills) = self.kills {
|
||||
self.kills = Some(kills + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -110,6 +110,7 @@ impl RareDropTable {
|
||||
dropped_weapon.kills = Some(0);
|
||||
};
|
||||
ItemDropType::Weapon(dropped_weapon)
|
||||
})
|
||||
},
|
||||
RareDropItem::Armor(armor) => {
|
||||
ItemDropType::Armor(Armor {
|
||||
|
@ -498,7 +498,6 @@ impl InventoryState {
|
||||
self.equipped.clone()
|
||||
}
|
||||
|
||||
|
||||
pub fn as_client_inventory_items(&self) -> [character::InventoryItem; 30] {
|
||||
self.inventory.0.iter()
|
||||
.enumerate()
|
||||
|
@ -1415,6 +1415,41 @@ impl<EG: EntityGateway> ItemAction<EG> for TradeMeseta {
|
||||
dest_meseta.0 += self.amount as u32;
|
||||
entity_gateway.set_character_meseta(&self.dest_character_id, *dest_meseta).await?;
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn increase_kill_counters<EG: EntityGateway>( &mut self,
|
||||
entity_gateway: &mut EG,
|
||||
character: &CharacterEntity,
|
||||
equipped_items: &EquippedEntity)
|
||||
-> Result<(), anyhow::Error> {
|
||||
let inventory = self.character_inventory.get_mut(&character.id).ok_or(ItemManagerError::NoCharacter(character.id))?;
|
||||
if let Some(weapon_entity) = equipped_items.weapon {
|
||||
println!("updating weapon kill counter for weapon {:?}", weapon_entity);
|
||||
// weapon_entity = &InventoryItem
|
||||
|
||||
// let weapon_id = weapon_entity.item_id();
|
||||
let weapon_id = inventory.get_item_by_entity_id(weapon_entity).ok_or(ItemManagerError::EntityIdNotInInventory(weapon_entity))?.item_id();
|
||||
let mut weapon_handle = inventory.get_item_handle_by_id(weapon_id).ok_or(ItemManagerError::NoSuchItemId(weapon_id))?;
|
||||
// weapon_handle = InventoryItemHandle
|
||||
let individual_item = weapon_handle.item_mut()
|
||||
.ok_or(ItemManagerError::NoSuchItemId(weapon_id))?
|
||||
.individual_mut()
|
||||
.ok_or(ItemManagerError::WrongItemType(weapon_id))?;
|
||||
let weapon = individual_item
|
||||
.weapon_mut()
|
||||
.ok_or(ItemManagerError::WrongItemType(weapon_id))?;
|
||||
|
||||
weapon.increment_kill_counter();
|
||||
entity_gateway.increment_kill_counter(&weapon_entity).await?;
|
||||
entity_gateway.set_character_inventory(&character.id, &inventory.as_inventory_entity(&character.id)).await?;
|
||||
}
|
||||
// for units in equipped_items.unit {
|
||||
// if let Some(unit_id) = units {
|
||||
// println!("UNIMPLEMENTED - updating unit kill counter for unit {:?}", unit_id);
|
||||
// // entity_gateway.increase_kill_counter(&unit_id).await?;
|
||||
// // let unit = inventory.get_item_by_entity_id(&unit_id)
|
||||
// }
|
||||
// }
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
@ -405,7 +405,8 @@ where
|
||||
EG: EntityGateway
|
||||
{
|
||||
let client = clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?;
|
||||
item_manager.player_sells_item(entity_gateway, &mut client.character, ClientItemId(sold_item.item_id), sold_item.amount as usize).await?;
|
||||
sell_item(item_state, entity_gateway, &client.character, ClientItemId(sold_item.item_id), sold_item.amount as u32).await?;
|
||||
// TODO: send the packet to other clients
|
||||
Ok(Box::new(None.into_iter())) // TODO: Do clients care about the order of other clients items?
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user