diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 73a75a4f7cd..3a2ed505cb1 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -766,12 +766,8 @@
else if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
- if(!remove_item_from_storage(M))
- M.temporarilyRemoveItemFromInventory(src, TRUE)
- if(!M.put_in_hand(src, H.held_index))
- qdel(src)
- return
- usr << "You pick up the deck."
+ if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
+ usr << "You pick up the deck."
else
usr << "You can't reach it from here!"
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index d13d469812f..965c9fe1463 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -93,13 +93,9 @@
/obj/item/weapon/defibrillator/MouseDrop(obj/over_object)
if(ismob(src.loc))
var/mob/M = src.loc
- if(istype(over_object, /obj/screen/inventory/hand))
+ if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
- if(!M.temporarilyRemoveItemFromInventory(src))
- return
- if(!M.put_in_hand(src, H.held_index))
- qdel(src) //wewie
-
+ M.putItemFromInventoryInHandIfPossible(src, H.held_index)
/obj/item/weapon/defibrillator/attackby(obj/item/weapon/W, mob/user, params)
if(W == paddles)
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index 2229d785467..e82aaca5281 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -138,21 +138,14 @@
var/mob/M = usr
if(!istype(over_object, /obj/screen) || !Adjacent(M))
return ..()
- if(!M.restrained() && !M.stat && istype(over_object, /obj/screen/inventory/hand))
+ if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
- if(!M.temporarilyRemoveItemFromInventory(src))
- return
- if(!M.put_in_hand(src,H.held_index))
- qdel(src)
- return
- src.add_fingerprint(usr)
- return
+ if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
+ add_fingerprint(usr)
if(over_object == usr && in_range(src, usr) || usr.contents.Find(src))
if(usr.s_active)
usr.s_active.close(usr)
src.show_to(usr)
- return
- return
/obj/item/weapon/storage/box/silver_sulf
name = "box of silver sulfadiazine patches"
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 30dca0f3ee6..513a8fee8d3 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -45,7 +45,7 @@
show_to(M)
return
- if(!M.restrained() && !M.stat)
+ if(!M.incapacitated())
if(!istype(over_object, /obj/screen))
return content_can_dump(over_object, M)
@@ -54,14 +54,9 @@
playsound(loc, "rustle", 50, 1, -5)
-
if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
- if(!M.temporarilyRemoveItemFromInventory(src))
- return
- if(!M.put_in_hand(src,H.held_index))
- qdel(src)
- return
+ M.putItemFromInventoryInHandIfPossible(src, H.held_index)
add_fingerprint(usr)
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index f6900215f43..dca3668758d 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -85,10 +85,7 @@
var/mob/M = src.loc
if(istype(M) && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
- if(!M.temporarilyRemoveItemFromInventory(src))
- return
- M.put_in_hand(src, H.held_index)
-
+ M.putItemFromInventoryInHandIfPossible(src, H.held_index)
/obj/item/weapon/watertank/attackby(obj/item/W, mob/user, params)
if(W == noz)
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index 96f3bddba2d..f5ce8bb9b88 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -93,7 +93,7 @@
M.temporarilyRemoveItemFromInventory(src, TRUE) //Remove the tank from your character,in case you were holding it
if(!M.put_in_hands(R)) //Equips the bomb if possible, or puts it on the floor.
- forceMove(M.loc)
+ forceMove(get_turf(M))
R.bombassembly = S //Tell the bomb about its assembly part
S.master = R //Tell the assembly about its new owner
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index fa252f4c066..052ef5ac029 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -46,14 +46,10 @@
if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return
- if(!M.restrained() && !M.stat && loc == M && istype(over_object, /obj/screen/inventory/hand))
+ if(!M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
- if(!M.temporarilyRemoveItemFromInventory(src))
- return
- if(!M.put_in_hand(src, H.held_index))
- qdel(src)
- return
- add_fingerprint(usr)
+ if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
+ add_fingerprint(usr)
/obj/item/clothing/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
if(pockets)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index fece3a809b8..2e8b6f7c241 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -331,17 +331,13 @@
if (istype(usr.loc,/obj/mecha))
return
- if(!M.restrained() && !M.stat)
+ if(!M.incapacitated())
playsound(loc, "rustle", 50, 1, -5)
if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
- if(!M.temporarilyRemoveItemFromInventory(src))
- return
- if(!M.put_in_hand(src, H.held_index))
- qdel(src)
- return //fuck these things
+ M.putItemFromInventoryInHandIfPossible(src, H.held_index)
add_fingerprint(usr)
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index ab0d2d0241a..191c9f12ee2 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -148,14 +148,15 @@
/mob/proc/can_equip(obj/item/I, slot, disable_warning = 0)
return FALSE
-
-/mob/proc/put_in_hand(obj/item/I, hand_index)
+/mob/proc/can_put_in_hand(I, hand_index)
if(!put_in_hand_check(I))
return FALSE
if(!has_hand_for_held_index(hand_index))
return FALSE
- var/obj/item/curr = held_items[hand_index]
- if(!curr)
+ return !held_items[hand_index]
+
+/mob/proc/put_in_hand(obj/item/I, hand_index)
+ if(can_put_in_hand(I, hand_index))
I.forceMove(src)
held_items[hand_index] = I
I.layer = ABOVE_HUD_LAYER
@@ -255,6 +256,17 @@
return FALSE
return TRUE
+/mob/proc/putItemFromInventoryInHandIfPossible(obj/item/I, hand_index, force_removal = FALSE)
+ if(!can_put_in_hand(I, hand_index))
+ return FALSE
+ if(!temporarilyRemoveItemFromInventory(I, force_removal))
+ return FALSE
+ I.remove_item_from_storage(src)
+ if(!put_in_hand(I, hand_index))
+ qdel(I)
+ CRASH("Assertion failure: putItemFromInventoryInHandIfPossible") //should never be possible
+ return TRUE
+
//The following functions are the same save for one small difference
//for when you want the item to end up on the ground
diff --git a/code/modules/modular_computers/computers/item/computer_components.dm b/code/modules/modular_computers/computers/item/computer_components.dm
index be032a3ec5b..7335a2f200f 100644
--- a/code/modules/modular_computers/computers/item/computer_components.dm
+++ b/code/modules/modular_computers/computers/item/computer_components.dm
@@ -24,6 +24,7 @@
user << "You install \the [H] into \the [src]."
H.holder = src
+ H.forceMove(src)
H.on_install(src, user)
diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm
index 417690a7e05..b330103f2fa 100644
--- a/code/modules/modular_computers/hardware/card_slot.dm
+++ b/code/modules/modular_computers/hardware/card_slot.dm
@@ -68,14 +68,18 @@
var/ejected = 0
if(stored_card && (!slot || slot == 1))
- stored_card.forceMove(get_turf(src))
- stored_card.verb_pickup()
+ if(user)
+ user.put_in_hands(stored_card)
+ else
+ stored_card.forceMove(get_turf(src))
stored_card = null
ejected++
if(stored_card2 && (!slot || slot == 2))
- stored_card2.forceMove(get_turf(src))
- stored_card2.verb_pickup()
+ if(user)
+ user.put_in_hands(stored_card2)
+ else
+ stored_card2.forceMove(get_turf(src))
stored_card2 = null
ejected++
diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm
index becfab8b41b..79ed3b32548 100644
--- a/code/modules/paperwork/paper_cutter.dm
+++ b/code/modules/paperwork/paper_cutter.dm
@@ -100,11 +100,7 @@
else if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
- if(!remove_item_from_storage(M))
- M.temporarilyRemoveItemFromInventory(src, TRUE)
- if(!M.put_in_hand(src, H.held_index))
- qdel(src) //rip
- return
+ M.putItemFromInventoryInHandIfPossible(src, H.held_index)
add_fingerprint(M)
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 775880a29e9..a15bfd4cba4 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -56,11 +56,7 @@
else if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
- if(!remove_item_from_storage(M))
- M.temporarilyRemoveItemFromInventory(src, TRUE)
- if(!M.put_in_hand(src, H.held_index))
- qdel(src)
- return
+ M.putItemFromInventoryInHandIfPossible(src, H.held_index)
add_fingerprint(M)
diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/ballistic/laser_gatling.dm
index 8f8585c29af..75263937d72 100644
--- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm
+++ b/code/modules/projectiles/guns/ballistic/laser_gatling.dm
@@ -63,14 +63,11 @@
if(!over_object)
return
- if(!M.restrained() && !M.stat)
+ if(!M.incapacitated())
if(istype(over_object, /obj/screen/inventory/hand))
var/obj/screen/inventory/hand/H = over_object
- if(!M.temporarilyRemoveItemFromInventory(src))
- return
- if(!M.put_in_hand(src, H.held_index))
- qdel(src)
+ M.putItemFromInventoryInHandIfPossible(src, H.held_index)
/obj/item/weapon/minigunpack/update_icon()