diff --git a/CHANGELOG.md b/CHANGELOG.md
index 74023e63c9..f0f8bc8c16 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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
 - Added authentication system (to play on the official server register on https://account.veloren.net)
 - Added gamepad/controller support
+- Added player feedback when attempting to pickup an item with a full inventory
 
 ### Changed
 
diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron
index 2a8d79e5e2..9add266bf9 100644
--- a/assets/voxygen/audio/sfx.ron
+++ b/assets/voxygen/audio/sfx.ron
@@ -88,6 +88,12 @@
                 "voxygen.audio.sfx.inventory.consumable.food",
             ],
             threshold: 0.3,
+        ),
+        Inventory(CollectFailed): (
+            files: [
+                "voxygen.audio.sfx.inventory.add_failed",
+            ],
+            threshold: 0.3,
         )
     }
 )
\ No newline at end of file
diff --git a/assets/voxygen/audio/sfx/inventory/add_failed.wav b/assets/voxygen/audio/sfx/inventory/add_failed.wav
new file mode 100644
index 0000000000..6bd5951281
Binary files /dev/null and b/assets/voxygen/audio/sfx/inventory/add_failed.wav differ
diff --git a/assets/voxygen/audio/sfx/inventory/add_item.wav b/assets/voxygen/audio/sfx/inventory/add_item.wav
index 3c6f68dd07..df250bc0ed 100644
Binary files a/assets/voxygen/audio/sfx/inventory/add_item.wav and b/assets/voxygen/audio/sfx/inventory/add_item.wav differ
diff --git a/client/src/lib.rs b/client/src/lib.rs
index 8895ce60d4..6d7b6f7405 100644
--- a/client/src/lib.rs
+++ b/client/src/lib.rs
@@ -14,7 +14,9 @@ pub use specs::{
 
 use byteorder::{ByteOrder, LittleEndian};
 use common::{
-    comp::{self, ControlEvent, Controller, ControllerInputs, InventoryManip},
+    comp::{
+        self, ControlEvent, Controller, ControllerInputs, InventoryManip, InventoryUpdateEvent,
+    },
     event::{EventBus, SfxEvent, SfxEventItem},
     msg::{
         validate_chat_msg, ChatMsgValidationError, ClientMsg, ClientState, PlayerListUpdate,
@@ -689,7 +691,19 @@ impl Client {
                         }
                     },
                     ServerMsg::InventoryUpdate(inventory, event) => {
-                        self.state.write_component(self.entity, inventory);
+                        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
                             .ecs()
diff --git a/common/src/comp/inventory/mod.rs b/common/src/comp/inventory/mod.rs
index 1b79359eb8..6861e59d01 100644
--- a/common/src/comp/inventory/mod.rs
+++ b/common/src/comp/inventory/mod.rs
@@ -150,6 +150,7 @@ pub enum InventoryUpdateEvent {
     Swapped,
     Dropped,
     Collected,
+    CollectFailed,
     Possession,
     Debug,
 }
diff --git a/server/src/events/inventory_manip.rs b/server/src/events/inventory_manip.rs
index 62aed2d676..1973410290 100644
--- a/server/src/events/inventory_manip.rs
+++ b/server/src/events/inventory_manip.rs
@@ -61,17 +61,24 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv
             let block = state.terrain().get(pos).ok().copied();
 
             if let Some(block) = block {
-                if block.is_collectible()
-                    && state
-                        .ecs()
-                        .read_storage::<comp::Inventory>()
-                        .get(entity)
-                        .map(|inv| !inv.is_full())
-                        .unwrap_or(false)
-                    && state.try_set_block(pos, Block::empty()).is_some()
-                {
-                    comp::Item::try_reclaim_from_block(block)
-                        .map(|item| state.give_item(entity, item));
+                let has_inv_space = state
+                    .ecs()
+                    .read_storage::<comp::Inventory>()
+                    .get(entity)
+                    .map(|inv| !inv.is_full())
+                    .unwrap_or(false);
+
+                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)
+                            .map(|item| state.give_item(entity, item));
+                    }
                 }
             }
         },