Merge branch 'shandley/inventory-full-handling' into 'master'

Feedback when collecting an item while inventory is full

Closes #459

See merge request veloren/veloren!847
This commit is contained in:
Marcel 2020-03-11 10:31:00 +00:00
commit 875ae6cedd
7 changed files with 47 additions and 15 deletions

View File

@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Game pauses when in singleplayer and pause menu - Game pauses when in singleplayer and pause menu
- Added authentication system (to play on the official server register on https://account.veloren.net) - Added authentication system (to play on the official server register on https://account.veloren.net)
- Added gamepad/controller support - Added gamepad/controller support
- Added player feedback when attempting to pickup an item with a full inventory
### Changed ### Changed

View File

@ -88,6 +88,12 @@
"voxygen.audio.sfx.inventory.consumable.food", "voxygen.audio.sfx.inventory.consumable.food",
], ],
threshold: 0.3, threshold: 0.3,
),
Inventory(CollectFailed): (
files: [
"voxygen.audio.sfx.inventory.add_failed",
],
threshold: 0.3,
) )
} }
) )

BIN
assets/voxygen/audio/sfx/inventory/add_failed.wav (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

View File

@ -14,7 +14,9 @@ pub use specs::{
use byteorder::{ByteOrder, LittleEndian}; use byteorder::{ByteOrder, LittleEndian};
use common::{ use common::{
comp::{self, ControlEvent, Controller, ControllerInputs, InventoryManip}, comp::{
self, ControlEvent, Controller, ControllerInputs, InventoryManip, InventoryUpdateEvent,
},
event::{EventBus, SfxEvent, SfxEventItem}, event::{EventBus, SfxEvent, SfxEventItem},
msg::{ msg::{
validate_chat_msg, ChatMsgValidationError, ClientMsg, ClientState, PlayerListUpdate, validate_chat_msg, ChatMsgValidationError, ClientMsg, ClientState, PlayerListUpdate,
@ -689,7 +691,19 @@ impl Client {
} }
}, },
ServerMsg::InventoryUpdate(inventory, event) => { ServerMsg::InventoryUpdate(inventory, event) => {
match event {
InventoryUpdateEvent::CollectFailed => {
frontend_events.push(Event::Chat {
message: String::from(
"Failed to collect item. Your inventory may be full!",
),
chat_type: ChatType::Meta,
})
},
_ => {
self.state.write_component(self.entity, inventory); self.state.write_component(self.entity, inventory);
},
}
self.state self.state
.ecs() .ecs()

View File

@ -150,6 +150,7 @@ pub enum InventoryUpdateEvent {
Swapped, Swapped,
Dropped, Dropped,
Collected, Collected,
CollectFailed,
Possession, Possession,
Debug, Debug,
} }

View File

@ -61,19 +61,26 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv
let block = state.terrain().get(pos).ok().copied(); let block = state.terrain().get(pos).ok().copied();
if let Some(block) = block { if let Some(block) = block {
if block.is_collectible() let has_inv_space = state
&& state
.ecs() .ecs()
.read_storage::<comp::Inventory>() .read_storage::<comp::Inventory>()
.get(entity) .get(entity)
.map(|inv| !inv.is_full()) .map(|inv| !inv.is_full())
.unwrap_or(false) .unwrap_or(false);
&& state.try_set_block(pos, Block::empty()).is_some()
if !has_inv_space {
state.write_component(
entity,
comp::InventoryUpdate::new(comp::InventoryUpdateEvent::CollectFailed),
);
} else {
if block.is_collectible() && state.try_set_block(pos, Block::empty()).is_some()
{ {
comp::Item::try_reclaim_from_block(block) comp::Item::try_reclaim_from_block(block)
.map(|item| state.give_item(entity, item)); .map(|item| state.give_item(entity, item));
} }
} }
}
}, },
comp::InventoryManip::Use(slot) => { comp::InventoryManip::Use(slot) => {