mag feeding
This commit is contained in:
parent
15b4732981
commit
2dde4d5716
@ -43,6 +43,9 @@ pub enum ItemLocation {
|
|||||||
z: f32,
|
z: f32,
|
||||||
},
|
},
|
||||||
Consumed,
|
Consumed,
|
||||||
|
FedToMag {
|
||||||
|
mag: ItemEntityId,
|
||||||
|
}
|
||||||
/*Destroyed {
|
/*Destroyed {
|
||||||
// marks an item that has been consumed in some way
|
// marks an item that has been consumed in some way
|
||||||
},
|
},
|
||||||
|
@ -36,6 +36,7 @@ pub enum ItemManagerError {
|
|||||||
NotEnoughTools(Tool, usize, usize), // have, expected
|
NotEnoughTools(Tool, usize, usize), // have, expected
|
||||||
InventoryItemConsumeError(#[from] InventoryItemConsumeError),
|
InventoryItemConsumeError(#[from] InventoryItemConsumeError),
|
||||||
BankFull,
|
BankFull,
|
||||||
|
WrongItemType(ClientItemId),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ItemManager {
|
pub struct ItemManager {
|
||||||
@ -595,4 +596,41 @@ impl ItemManager {
|
|||||||
|
|
||||||
Ok(inventory_item.0)
|
Ok(inventory_item.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn player_feeds_mag_item<EG: EntityGateway>(&mut self,
|
||||||
|
entity_gateway: &mut EG,
|
||||||
|
character: &CharacterEntity,
|
||||||
|
mag_id: ClientItemId,
|
||||||
|
tool_id: ClientItemId)
|
||||||
|
-> Result<(), ItemManagerError> {
|
||||||
|
let inventory = self.character_inventory.get_mut(&character.id).ok_or(ItemManagerError::NoCharacter(character.id))?;
|
||||||
|
let consumed_tool = {
|
||||||
|
let item_to_feed = inventory.get_item_handle_by_id(tool_id).ok_or(ItemManagerError::NoSuchItemId(tool_id))?;
|
||||||
|
item_to_feed.consume(1)?
|
||||||
|
};
|
||||||
|
let mut mag_handle = inventory.get_item_handle_by_id(mag_id).ok_or(ItemManagerError::NoSuchItemId(mag_id))?;
|
||||||
|
|
||||||
|
let individual_item = mag_handle.item_mut()
|
||||||
|
.ok_or(ItemManagerError::NoSuchItemId(mag_id))?
|
||||||
|
.individual()
|
||||||
|
.ok_or(ItemManagerError::WrongItemType(mag_id))?;
|
||||||
|
let mag = individual_item
|
||||||
|
.mag()
|
||||||
|
.ok_or(ItemManagerError::WrongItemType(mag_id))?;
|
||||||
|
|
||||||
|
let consumed_tool_type = match &consumed_tool {
|
||||||
|
ConsumedItem::Stacked(stacked_consumed_item) => stacked_consumed_item.tool.tool,
|
||||||
|
_ => return Err(ItemManagerError::WrongItemType(tool_id))
|
||||||
|
};
|
||||||
|
mag.feed(consumed_tool_type);
|
||||||
|
|
||||||
|
for entity_id in consumed_tool.entity_ids() {
|
||||||
|
entity_gateway.feed_mag(&individual_item.entity_id, &entity_id).await;
|
||||||
|
entity_gateway.change_item_location(&entity_id, ItemLocation::FedToMag {
|
||||||
|
mag: individual_item.entity_id,
|
||||||
|
}).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -327,3 +327,24 @@ EG: EntityGateway
|
|||||||
Err(ShipError::NotEnoughMeseta(id, client.character.meseta))
|
Err(ShipError::NotEnoughMeseta(id, client.character.meseta))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub async fn player_feed_mag<EG>(id: ClientId,
|
||||||
|
mag_feed: &PlayerFeedMag,
|
||||||
|
entity_gateway: &mut EG,
|
||||||
|
client_location: &ClientLocation,
|
||||||
|
clients: &Clients,
|
||||||
|
item_manager: &mut ItemManager)
|
||||||
|
-> Result<Box<dyn Iterator<Item = (ClientId, SendShipPacket)> + Send>, ShipError>
|
||||||
|
where
|
||||||
|
EG: EntityGateway
|
||||||
|
{
|
||||||
|
let client = clients.get(&id).ok_or(ShipError::ClientNotFound(id))?;
|
||||||
|
item_manager.player_feeds_mag_item(entity_gateway, &client.character, ClientItemId(mag_feed.mag_id), ClientItemId(mag_feed.item_id)).await?;
|
||||||
|
|
||||||
|
let mag_feed = mag_feed.clone();
|
||||||
|
Ok(Box::new(client_location.get_client_neighbors(id).unwrap().into_iter()
|
||||||
|
.map(move |client| {
|
||||||
|
(client.client, SendShipPacket::Message(Message::new(GameMessage::PlayerFeedMag(mag_feed.clone()))))
|
||||||
|
})))
|
||||||
|
}
|
||||||
|
@ -348,6 +348,9 @@ impl<EG: EntityGateway> ShipServerState<EG> {
|
|||||||
GameMessage::PlayerUsedMedicalCenter(player_used_medical_center) => {
|
GameMessage::PlayerUsedMedicalCenter(player_used_medical_center) => {
|
||||||
handler::message::player_used_medical_center(id, &player_used_medical_center, &mut self.entity_gateway, &mut self.clients).await
|
handler::message::player_used_medical_center(id, &player_used_medical_center, &mut self.entity_gateway, &mut self.clients).await
|
||||||
},
|
},
|
||||||
|
GameMessage::PlayerFeedMag(player_feed_mag) => {
|
||||||
|
handler::message::player_feed_mag(id, &player_feed_mag, &mut self.entity_gateway, &mut self.client_location, &mut self.clients, &mut self.item_manager).await
|
||||||
|
},
|
||||||
_ => {
|
_ => {
|
||||||
let cmsg = msg.clone();
|
let cmsg = msg.clone();
|
||||||
Ok(Box::new(self.client_location.get_client_neighbors(id).unwrap().into_iter()
|
Ok(Box::new(self.client_location.get_client_neighbors(id).unwrap().into_iter()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user