diff --git a/code/__defines/structures.dm b/code/__defines/structures.dm
new file mode 100644
index 00000000000..f91ed7aed08
--- /dev/null
+++ b/code/__defines/structures.dm
@@ -0,0 +1 @@
+#define STRUCTURE_FLAG_SURFACE BITFLAG(0)
\ No newline at end of file
diff --git a/code/_helpers/animations.dm b/code/_helpers/animations.dm
index 65932553d9a..163b235e898 100644
--- a/code/_helpers/animations.dm
+++ b/code/_helpers/animations.dm
@@ -98,4 +98,23 @@
for(var/i in 2 to segments) //2 because 1 is covered above
animate(transform = matrices[i], time = speed)
//doesn't have an object argument because this is "Stacking" with the animate call above
- //3 billion% intentional
\ No newline at end of file
+ //3 billion% intentional
+
+// This proc is used to move an atom to a target loc and then interpolite to give the illusion of sliding from start to end.
+/proc/do_visual_slide(var/atom/movable/sliding, var/turf/from, var/from_pixel_x, var/from_pixel_y, var/turf/target, var/target_pixel_x, var/target_pixel_y, var/center_of_mass)
+ set waitfor = FALSE
+ var/start_pixel_x = sliding.pixel_x - ((target.x-from.x) * world.icon_size)
+ var/start_pixel_y = sliding.pixel_y - ((target.y-from.y) * world.icon_size)
+ // Clear our glide so we don't do an animation when dropped into the target turf.
+ var/old_animate_movement = sliding.animate_movement
+ sliding.animate_movement = NO_STEPS
+ sleep(2 * world.tick_lag) // Due to BYOND being byond, animate_movement has to be set for at least 2 ticks before gliding will be disabled.
+ sliding.forceMove(target)
+ // Reset our glide_size now that movement has completed.
+ sliding.animate_movement = old_animate_movement
+ sliding.pixel_x = start_pixel_x
+ sliding.pixel_y = start_pixel_y
+ if(center_of_mass)
+ target_pixel_x -= center_of_mass["x"]
+ target_pixel_y -= center_of_mass["y"]
+ animate(sliding, pixel_x = target_pixel_x, pixel_y = target_pixel_y, time = 1 SECOND)
diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm
index 4d2168073f8..66ce1aa9e67 100644
--- a/code/_onclick/drag_drop.dm
+++ b/code/_onclick/drag_drop.dm
@@ -4,38 +4,38 @@
almost anything into a trash can.
*/
-/atom/MouseDrop(atom/over)
+/atom/MouseDrop(over_object, src_location, over_location, src_control, over_control, params)
SHOULD_CALL_PARENT(TRUE)
- if(!can_mouse_drop(over, usr) || !handle_mouse_drop(over, usr))
+ if(!can_mouse_drop(over_object, usr, params = params) || !handle_mouse_drop(over_object, usr, params))
. = ..()
-/atom/proc/handle_mouse_drop(var/atom/over, var/mob/user)
- . = over?.receive_mouse_drop(src, user)
+/atom/proc/handle_mouse_drop(atom/over, mob/user, params)
+ . = over?.receive_mouse_drop(src, user, params)
// Can the user drop something onto this atom?
-/atom/proc/user_can_mousedrop_onto(var/mob/user, var/atom/being_dropped, var/incapacitation_flags)
- return !user.incapacitated(incapacitation_flags) && check_mousedrop_interactivity(user) && user.check_dexterity(DEXTERITY_EQUIP_ITEM)
+/atom/proc/user_can_mousedrop_onto(mob/user, atom/being_dropped, incapacitation_flags, params)
+ return !user.incapacitated(incapacitation_flags) && check_mousedrop_interactivity(user, params) && user.check_dexterity(DEXTERITY_EQUIP_ITEM)
-/atom/proc/check_mousedrop_interactivity(var/mob/user)
+/atom/proc/check_mousedrop_interactivity(mob/user, params)
return CanPhysicallyInteract(user)
// This proc checks if an atom can be mousedropped onto the target by the user.
-/atom/proc/can_mouse_drop(var/atom/over, var/mob/user = usr, var/incapacitation_flags = INCAPACITATION_DEFAULT)
+/atom/proc/can_mouse_drop(var/atom/over, var/mob/user = usr, var/incapacitation_flags = INCAPACITATION_DEFAULT, var/params)
SHOULD_CALL_PARENT(TRUE)
if(!istype(user) || !istype(over) ||QDELETED(user) || QDELETED(over) || QDELETED(src))
return FALSE
- if(!over.user_can_mousedrop_onto(user, src, incapacitation_flags))
+ if(!over.user_can_mousedrop_onto(user, src, incapacitation_flags, params))
return FALSE
- if(!check_mousedrop_adjacency(over, user))
+ if(!check_mousedrop_adjacency(over, user, params))
return FALSE
return TRUE
-/atom/proc/check_mousedrop_adjacency(var/atom/over, var/mob/user)
+/atom/proc/check_mousedrop_adjacency(atom/over, mob/user, params)
. = (Adjacent(user) && ((over in user?.client?.screen) || over.Adjacent(user)))
// Receive a mouse drop.
// Returns false if the atom is valid for dropping further up the chain, true if the drop has been handled.
-/atom/proc/receive_mouse_drop(var/atom/dropping, var/mob/user)
+/atom/proc/receive_mouse_drop(atom/dropping, mob/user, params)
var/mob/living/H = user
if(istype(H) && !H.anchored && can_climb(H) && dropping == user)
do_climb(dropping)
diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm
index 54094c25e4b..fc992ae2884 100644
--- a/code/_onclick/hud/ability_screen_objects.dm
+++ b/code/_onclick/hud/ability_screen_objects.dm
@@ -33,7 +33,7 @@
my_mob.client.screen -= src
my_mob = null
-/obj/screen/ability_master/handle_mouse_drop(var/atom/over, var/mob/user)
+/obj/screen/ability_master/handle_mouse_drop(atom/over, mob/user, params)
if(showing)
return FALSE
. = ..()
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 4662c1fdc8d..dada577642e 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -15,10 +15,10 @@
is_spawnable_type = FALSE
var/globalscreen = FALSE //Global screens are not qdeled when the holding mob is destroyed.
-/obj/screen/receive_mouse_drop(atom/dropping, mob/user)
+/obj/screen/receive_mouse_drop(atom/dropping, mob/user, params)
return TRUE
-/obj/screen/check_mousedrop_interactivity(var/mob/user)
+/obj/screen/check_mousedrop_interactivity(mob/user, params)
return user.client && (src in user.client.screen)
/obj/screen/text
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index b6bda7218a4..84c5bbad3d0 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -339,7 +339,7 @@
/atom/movable/proc/can_buckle_mob(var/mob/living/dropping)
. = (can_buckle && istype(dropping) && !dropping.buckled && !dropping.anchored && !dropping.buckled_mob && !buckled_mob)
-/atom/movable/receive_mouse_drop(atom/dropping, mob/living/user)
+/atom/movable/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && can_buckle_mob(dropping))
user_buckle_mob(dropping, user)
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index f06b1cd5057..de556eb9486 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -67,7 +67,7 @@
/obj/machinery/optable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
. = (air_group || height == 0 || (istype(mover) && mover.checkpass(PASS_FLAG_TABLE)))
-/obj/machinery/optable/receive_mouse_drop(atom/dropping, mob/user)
+/obj/machinery/optable/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!.)
if(istype(dropping, /obj/item) && user.get_active_hand() == dropping && user.try_unequip(dropping, loc))
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index f78d4e0d926..34a6e1b6b9b 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -316,7 +316,7 @@
return TRUE
return ..()
-/obj/machinery/sleeper/receive_mouse_drop(var/atom/dropping, var/mob/user)
+/obj/machinery/sleeper/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && ismob(dropping))
var/mob/target = dropping
diff --git a/code/game/machinery/bodyscanner.dm b/code/game/machinery/bodyscanner.dm
index b236e2d5bd3..2e815dae25a 100644
--- a/code/game/machinery/bodyscanner.dm
+++ b/code/game/machinery/bodyscanner.dm
@@ -111,7 +111,7 @@
icon_state = "body_scanner_2"
//Like grap-put, but for mouse-drop.
-/obj/machinery/bodyscanner/receive_mouse_drop(var/atom/dropping, var/mob/user)
+/obj/machinery/bodyscanner/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && isliving(dropping))
var/mob/living/M = dropping
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 65a10708027..e7b001cbf3f 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -425,7 +425,7 @@
src.add_fingerprint(target)
//Like grap-put, but for mouse-drop.
-/obj/machinery/cryopod/receive_mouse_drop(var/atom/dropping, var/mob/user)
+/obj/machinery/cryopod/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && check_occupant_allowed(dropping))
if(occupant)
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index 0350d3a4998..c4066068303 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -89,7 +89,7 @@
else
return ..()
-/obj/machinery/gibber/receive_mouse_drop(atom/dropping, mob/user)
+/obj/machinery/gibber/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && ismob(dropping))
move_into_gibber(user, dropping)
diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm
index ccd515bcfe8..89871af4000 100644
--- a/code/game/machinery/oxygen_pump.dm
+++ b/code/game/machinery/oxygen_pump.dm
@@ -41,7 +41,7 @@
breather = null
return ..()
-/obj/machinery/oxygen_pump/handle_mouse_drop(var/atom/over, var/mob/user)
+/obj/machinery/oxygen_pump/handle_mouse_drop(atom/over, mob/user, params)
if(ishuman(over) && can_apply_to_target(over, user))
user.visible_message(SPAN_NOTICE("\The [user] begins placing the mask onto \the [over].."))
if(do_mob(user, over, 25) && can_apply_to_target(over, user))
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index a56c44d6ec5..86dec34e44b 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -26,7 +26,7 @@
. = ..()
update_icon()
-/obj/machinery/recharge_station/receive_mouse_drop(var/atom/dropping, var/mob/user)
+/obj/machinery/recharge_station/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && isliving(dropping))
var/mob/living/M = dropping
diff --git a/code/game/machinery/self_destruct.dm b/code/game/machinery/self_destruct.dm
index 62ded8fe63e..6b516eb954f 100644
--- a/code/game/machinery/self_destruct.dm
+++ b/code/game/machinery/self_destruct.dm
@@ -68,7 +68,7 @@
update_icon()
src.add_fingerprint(user)
-/obj/machinery/self_destruct/handle_mouse_drop(var/atom/over, var/mob/user)
+/obj/machinery/self_destruct/handle_mouse_drop(atom/over, mob/user, params)
if(over == user && cylinder)
if(armed)
to_chat(user, SPAN_WARNING("Disarm the cylinder first."))
diff --git a/code/game/machinery/self_destruct_storage.dm b/code/game/machinery/self_destruct_storage.dm
index 623edd2b60d..09f2e613213 100644
--- a/code/game/machinery/self_destruct_storage.dm
+++ b/code/game/machinery/self_destruct_storage.dm
@@ -120,7 +120,7 @@
..()
-/obj/machinery/nuclear_cylinder_storage/handle_mouse_drop(atom/over, mob/user)
+/obj/machinery/nuclear_cylinder_storage/handle_mouse_drop(atom/over, mob/user, params)
if(over == user && open && !panel_open && length(cylinders))
var/cylinder = cylinders[1]
user.visible_message(
diff --git a/code/game/machinery/suit_cycler.dm b/code/game/machinery/suit_cycler.dm
index 245afe2e16e..7eca07344ae 100644
--- a/code/game/machinery/suit_cycler.dm
+++ b/code/game/machinery/suit_cycler.dm
@@ -124,7 +124,7 @@
DROP_NULL(boots)
return ..()
-/obj/machinery/suit_cycler/receive_mouse_drop(var/atom/dropping, var/mob/user)
+/obj/machinery/suit_cycler/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && ismob(dropping) && try_move_inside(dropping, user))
return TRUE
diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm
index ad1fb149d8a..b43e75c873c 100644
--- a/code/game/machinery/vending/_vending.dm
+++ b/code/game/machinery/vending/_vending.dm
@@ -188,7 +188,7 @@
. = ..()
SSnano.update_uis(src)
-/obj/machinery/vending/receive_mouse_drop(atom/dropping, var/mob/user)
+/obj/machinery/vending/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && dropping.loc == user && attempt_to_stock(dropping, user))
return TRUE
diff --git a/code/game/machinery/vending_deconstruction.dm b/code/game/machinery/vending_deconstruction.dm
index 55ad2206aa0..dce7ac35a27 100644
--- a/code/game/machinery/vending_deconstruction.dm
+++ b/code/game/machinery/vending_deconstruction.dm
@@ -20,9 +20,9 @@
/obj/structure/vending_refill/get_mechanics_info()
return "Drag to a vendor to restock. Generally can not be opened."
-/obj/structure/vending_refill/handle_mouse_drop(var/atom/over, var/mob/user)
+/obj/structure/vending_refill/handle_mouse_drop(atom/over, mob/user, params)
if(istype(over, /obj/machinery/vending))
- var/obj/machinery/vending/vendor = over
+ var/obj/machinery/vending/vendor = over
var/target_type = vendor.base_type || vendor.type
if(ispath(expected_type, target_type))
for(var/datum/stored_items/R in product_records)
diff --git a/code/game/machinery/vitals_monitor.dm b/code/game/machinery/vitals_monitor.dm
index 7378726057a..3eff63edf62 100644
--- a/code/game/machinery/vitals_monitor.dm
+++ b/code/game/machinery/vitals_monitor.dm
@@ -64,7 +64,7 @@
if(beep && victim && victim.get_pulse())
playsound(src, 'sound/machines/quiet_beep.ogg', 40)
-/obj/machinery/vitals_monitor/handle_mouse_drop(var/atom/over, var/mob/user)
+/obj/machinery/vitals_monitor/handle_mouse_drop(atom/over, mob/user, params)
if(ishuman(over))
if(victim)
victim = null
diff --git a/code/game/objects/item.dm b/code/game/objects/item.dm
index b75e0928451..56c91beb77d 100644
--- a/code/game/objects/item.dm
+++ b/code/game/objects/item.dm
@@ -256,13 +256,24 @@
/obj/item/check_mousedrop_adjacency(var/atom/over, var/mob/user)
. = (loc == user && istype(over, /obj/screen/inventory)) || ..()
-/obj/item/handle_mouse_drop(atom/over, mob/user)
-
+/obj/item/handle_mouse_drop(atom/over, mob/user, params)
if(over == user)
usr.face_atom(src)
dragged_onto(over)
return TRUE
+ // Allow dragging items onto/around tables and racks.
+ if(istype(over, /obj/structure))
+ var/obj/structure/struct = over
+ if(struct.structure_flags & STRUCTURE_FLAG_SURFACE)
+ if(user == loc && !user.try_unequip(src, get_turf(user)))
+ return TRUE
+ if(!isturf(loc))
+ return TRUE
+ var/list/click_data = params2list(params)
+ do_visual_slide(src, get_turf(src), pixel_x, pixel_y, get_turf(over), text2num(click_data["icon-x"])-1, text2num(click_data["icon-y"])-1, center_of_mass && cached_json_decode(center_of_mass))
+ return TRUE
+
// Try to drag-equip the item.
var/obj/screen/inventory/inv = over
if(user.client && istype(inv) && inv.slot_id && (over in user.client.screen))
@@ -282,6 +293,7 @@
user.equip_to_slot_if_possible(src, inv.slot_id)
return TRUE
+
. = ..()
/obj/item/proc/dragged_onto(var/mob/user)
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index f8141b84b1e..1febbfd8949 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -75,7 +75,7 @@
. = new item_path(get_turf(src))
qdel(src)
-/obj/structure/closet/body_bag/handle_mouse_drop(var/atom/over, var/mob/user)
+/obj/structure/closet/body_bag/handle_mouse_drop(atom/over, mob/user, params)
if(over == user && (in_range(src, user) || (src in user.contents)))
fold(user)
return TRUE
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 450c8e243c0..e129fe78d4e 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -351,7 +351,7 @@
/obj/item/crowbar
)
-/obj/item/storage/backpack/satchel/flat/handle_mouse_drop(var/atom/over, var/mob/user)
+/obj/item/storage/backpack/satchel/flat/handle_mouse_drop(atom/over, mob/user, params)
var/turf/T = get_turf(src)
if(hides_under_flooring() && isturf(T) && !T.is_plating())
return TRUE
diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm
index 66b7810fcd9..63702e3fbf9 100644
--- a/code/game/objects/items/weapons/storage/internal.dm
+++ b/code/game/objects/items/weapons/storage/internal.dm
@@ -36,7 +36,7 @@
//items that use internal storage have the option of calling this to emulate default storage handle_mouse_drop behaviour.
//returns 1 if the master item's parent's handle_mouse_drop() should be called, 0 otherwise. It's strange, but no other way of
//doing it without the ability to call another proc's parent, really.
-/obj/item/storage/internal/proc/handle_storage_internal_mouse_drop(mob/user, obj/over_object)
+/obj/item/storage/internal/proc/handle_storage_internal_mouse_drop(mob/user, obj/over_object, params)
if (ishuman(user) || issmall(user)) //so monkeys can take off their backpacks -- Urist
if(over_object == user && Adjacent(user)) // this must come before the screen objects only block
diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm
index c9f00adce4c..3d23489d23d 100644
--- a/code/game/objects/items/weapons/storage/laundry_basket.dm
+++ b/code/game/objects/items/weapons/storage/laundry_basket.dm
@@ -56,7 +56,7 @@
else
icon_state = "laundry-empty"
-/obj/item/storage/laundry_basket/handle_mouse_drop(var/atom/over, var/mob/user)
+/obj/item/storage/laundry_basket/handle_mouse_drop(atom/over, mob/user, params)
if(over == user)
return TRUE
. = ..()
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index c028bec0466..616f994091c 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -34,7 +34,7 @@
. = ..()
-/obj/item/storage/secure/handle_mouse_drop(atom/over, mob/user)
+/obj/item/storage/secure/handle_mouse_drop(atom/over, mob/user, params)
var/datum/extension/lockable/lock = get_extension(src, /datum/extension/lockable)
if(lock.locked)
add_fingerprint(user)
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 260f1e776da..2f070bc69e9 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -33,7 +33,7 @@
QDEL_NULL(storage_ui)
. = ..()
-/obj/item/storage/handle_mouse_drop(var/atom/over, var/mob/user)
+/obj/item/storage/handle_mouse_drop(atom/over, mob/user, params)
if(canremove && (ishuman(user) || isrobot(user) || isanimal(user)) && !user.incapacitated(INCAPACITATION_DISRUPTED) && over == user)
open(user)
return TRUE
@@ -318,7 +318,7 @@
remove_from_storage(I, T, 1)
finish_bulk_removal()
-/obj/item/storage/receive_mouse_drop(atom/dropping, mob/living/user)
+/obj/item/storage/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && scoop_inside(dropping, user))
return TRUE
diff --git a/code/game/objects/items/weapons/storage/wall_mirror.dm b/code/game/objects/items/weapons/storage/wall_mirror.dm
index 35ca2379ea4..960a91c3010 100644
--- a/code/game/objects/items/weapons/storage/wall_mirror.dm
+++ b/code/game/objects/items/weapons/storage/wall_mirror.dm
@@ -45,8 +45,8 @@
clear_ui_users(ui_users)
. = ..()
-/obj/structure/mirror/handle_mouse_drop(atom/over, mob/user)
- if(!(. = mirror_storage?.handle_storage_internal_mouse_drop(user, over)))
+/obj/structure/mirror/handle_mouse_drop(atom/over, mob/user, params)
+ if(!(. = mirror_storage?.handle_storage_internal_mouse_drop(user, over, params)))
flick("mirror_open",src)
return
if((. = ..()))
diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm
index 3367f9f096f..25d9e6a3bac 100644
--- a/code/game/objects/structures/__structure.dm
+++ b/code/game/objects/structures/__structure.dm
@@ -4,6 +4,7 @@
layer = STRUCTURE_LAYER
abstract_type = /obj/structure
+ var/structure_flags
var/last_damage_message
var/health = 0
var/maxhealth = 50
diff --git a/code/game/objects/structures/crates_lockers/closets/__closet.dm b/code/game/objects/structures/crates_lockers/closets/__closet.dm
index a57ef2228f0..c0ce1fe5219 100644
--- a/code/game/objects/structures/crates_lockers/closets/__closet.dm
+++ b/code/game/objects/structures/crates_lockers/closets/__closet.dm
@@ -313,7 +313,7 @@ var/global/list/closets = list()
)
physically_destroyed()
-/obj/structure/closet/receive_mouse_drop(atom/dropping, mob/user)
+/obj/structure/closet/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
var/atom/movable/AM = dropping
if(!. && istype(AM) && opened && !istype(AM, /obj/structure/closet) && AM.simulated && !AM.anchored && (large || !ismob(AM)))
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index 548a0f3fc3f..92c7880b785 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -104,7 +104,7 @@
visible_message("[user] strikes [src] with [I].")
check_health()
-/obj/structure/closet/statue/receive_mouse_drop(atom/dropping, var/mob/user)
+/obj/structure/closet/statue/receive_mouse_drop(atom/dropping, mob/user, params)
return TRUE
/obj/structure/closet/statue/relaymove()
diff --git a/code/game/objects/structures/crematorium.dm b/code/game/objects/structures/crematorium.dm
index d8240222d2a..cd170f82f0c 100644
--- a/code/game/objects/structures/crematorium.dm
+++ b/code/game/objects/structures/crematorium.dm
@@ -210,7 +210,7 @@
/obj/structure/crematorium_tray/attack_robot(mob/user)
return attack_hand_with_interaction_checks(user)
-/obj/structure/crematorium_tray/receive_mouse_drop(atom/dropping, mob/user)
+/obj/structure/crematorium_tray/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && (ismob(dropping) || istype(dropping, /obj/structure/closet/body_bag)))
var/atom/movable/AM = dropping
diff --git a/code/game/objects/structures/fireaxe_cabinet.dm b/code/game/objects/structures/fireaxe_cabinet.dm
index c3d6311309b..d2049e48568 100644
--- a/code/game/objects/structures/fireaxe_cabinet.dm
+++ b/code/game/objects/structures/fireaxe_cabinet.dm
@@ -40,7 +40,7 @@
toggle_open(user)
return TRUE
-/obj/structure/fireaxecabinet/handle_mouse_drop(atom/over, mob/user)
+/obj/structure/fireaxecabinet/handle_mouse_drop(atom/over, mob/user, params)
if(over == user)
if(!open)
to_chat(user, SPAN_WARNING("\The [src] is closed."))
diff --git a/code/game/objects/structures/iv_drip.dm b/code/game/objects/structures/iv_drip.dm
index e97d7d3fc86..596c9f0b506 100644
--- a/code/game/objects/structures/iv_drip.dm
+++ b/code/game/objects/structures/iv_drip.dm
@@ -75,7 +75,7 @@
add_overlay(light)
-/obj/structure/iv_drip/handle_mouse_drop(atom/over, mob/user)
+/obj/structure/iv_drip/handle_mouse_drop(atom/over, mob/user, params)
if(attached)
drip_detach()
return TRUE
diff --git a/code/game/objects/structures/mineral_bath.dm b/code/game/objects/structures/mineral_bath.dm
index 845d32402a6..14bb3ef3f23 100644
--- a/code/game/objects/structures/mineral_bath.dm
+++ b/code/game/objects/structures/mineral_bath.dm
@@ -83,7 +83,7 @@
occupant = null
STOP_PROCESSING(SSobj, src)
-/obj/structure/mineral_bath/receive_mouse_drop(var/atom/dropping, var/mob/user)
+/obj/structure/mineral_bath/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && ismob(dropping))
enter_bath(dropping, user)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 6a3c583affd..39d74c931f5 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -114,7 +114,7 @@
/obj/structure/morgue_tray/attack_robot(mob/user)
return attack_hand_with_interaction_checks(user)
-/obj/structure/morgue_tray/receive_mouse_drop(atom/dropping, mob/user)
+/obj/structure/morgue_tray/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && (ismob(dropping) || istype(dropping, /obj/structure/closet/body_bag)))
var/atom/movable/AM = dropping
diff --git a/code/game/objects/structures/racks.dm b/code/game/objects/structures/racks.dm
index 1f8828f5b74..90c6a3fd51a 100644
--- a/code/game/objects/structures/racks.dm
+++ b/code/game/objects/structures/racks.dm
@@ -13,6 +13,7 @@
parts_type = /obj/item/stack/material/strut
density = TRUE
anchored = TRUE
+ structure_flags = STRUCTURE_FLAG_SURFACE
/obj/structure/rack/Initialize()
..()
diff --git a/code/game/objects/structures/stasis_cage.dm b/code/game/objects/structures/stasis_cage.dm
index 99e28d423d4..fd144cae909 100644
--- a/code/game/objects/structures/stasis_cage.dm
+++ b/code/game/objects/structures/stasis_cage.dm
@@ -74,7 +74,7 @@
release()
return ..()
-/mob/living/simple_animal/handle_mouse_drop(atom/over, mob/user)
+/mob/living/simple_animal/handle_mouse_drop(atom/over, mob/user, params)
if(istype(over, /obj/structure/stasis_cage))
var/obj/structure/stasis_cage/cage = over
if(!stat && !istype(buckled, /obj/effect/energy_net))
diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm
index b6aef499f55..95fb9712f41 100644
--- a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm
@@ -25,7 +25,7 @@
parts_type = /obj/item/stack/material/strut
var/base_icon = "bed"
-/obj/structure/bed/user_can_mousedrop_onto(var/mob/user, var/atom/being_dropped, var/incapacitation_flags)
+/obj/structure/bed/user_can_mousedrop_onto(mob/user, atom/being_dropped, incapacitation_flags, params)
if(user == being_dropped)
return user.Adjacent(src) && !user.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_KNOCKOUT)
return ..()
@@ -237,7 +237,7 @@
queue_icon_update()
STOP_PROCESSING(SSobj,src)
-/obj/structure/bed/roller/handle_mouse_drop(atom/over, mob/user)
+/obj/structure/bed/roller/handle_mouse_drop(atom/over, mob/user, params)
if(ishuman(user) || isrobot(user))
if(over == buckled_mob && beaker)
if(iv_attached)
diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm
index a0d4fa6b182..aa81ad48efd 100644
--- a/code/game/objects/structures/tables.dm
+++ b/code/game/objects/structures/tables.dm
@@ -20,6 +20,7 @@
material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC
parts_amount = 2
parts_type = /obj/item/stack/material/strut
+ structure_flags = STRUCTURE_FLAG_SURFACE
var/can_flip = TRUE
var/is_flipped = FALSE
@@ -464,7 +465,7 @@
return TRUE
return TRUE
-/obj/structure/table/receive_mouse_drop(atom/dropping, mob/user)
+/obj/structure/table/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && !isrobot(user) && isitem(dropping) && user.get_active_hand() == dropping && user.try_unequip(dropping))
var/obj/item/I = dropping
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 1c466ff083d..12509e09c74 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -354,7 +354,7 @@ var/global/list/hygiene_props = list()
anchored = TRUE
var/busy = 0 //Something's being washed at the moment
-/obj/structure/hygiene/sink/receive_mouse_drop(var/atom/dropping, var/mob/user)
+/obj/structure/hygiene/sink/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && isitem(dropping) && ATOM_IS_OPEN_CONTAINER(dropping))
var/obj/item/thing = dropping
diff --git a/code/modules/admin/spam_prevention.dm b/code/modules/admin/spam_prevention.dm
index 98875e57cee..69eb5783d62 100644
--- a/code/modules/admin/spam_prevention.dm
+++ b/code/modules/admin/spam_prevention.dm
@@ -41,5 +41,5 @@ var/global/list/ckey_punished_for_spam = list() // this round; to avoid redundan
return
return ..()
-/client/MouseDrop()
+/client/MouseDrop(src_object, over_object, src_location, over_location, src_control, over_control, params)
. = user_acted(src) && ..()
diff --git a/code/modules/augment/active/cyberbrain.dm b/code/modules/augment/active/cyberbrain.dm
index 70abdcb0494..c2b2cd63964 100644
--- a/code/modules/augment/active/cyberbrain.dm
+++ b/code/modules/augment/active/cyberbrain.dm
@@ -60,7 +60,7 @@
return
return ..()
-/obj/item/organ/internal/augment/active/cyberbrain/handle_mouse_drop(atom/over, mob/user)
+/obj/item/organ/internal/augment/active/cyberbrain/handle_mouse_drop(atom/over, mob/user, params)
if(!istype(over, /obj/screen))
attack_self(user)
return TRUE
diff --git a/code/modules/butchery/butchery.dm b/code/modules/butchery/butchery.dm
index 50bc8e95120..b06d0ed83c5 100644
--- a/code/modules/butchery/butchery.dm
+++ b/code/modules/butchery/butchery.dm
@@ -104,7 +104,7 @@
to_chat(user, SPAN_WARNING("\The [occupant] is so badly mangled that removing them from \the [src] would be pointless."))
return TRUE
-/obj/structure/kitchenspike/receive_mouse_drop(var/atom/dropping, var/mob/user)
+/obj/structure/kitchenspike/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && ismob(dropping))
try_spike(dropping, user)
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 2a23761a6fd..5e3fff9233b 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -15,7 +15,7 @@
return ..(user)
return TRUE
-/obj/item/clothing/suit/storage/handle_mouse_drop(atom/over, mob/user)
+/obj/item/clothing/suit/storage/handle_mouse_drop(atom/over, mob/user, params)
if(istype(over, /obj/screen/inventory))
return ..()
return pockets?.handle_storage_internal_mouse_drop(user, over) && ..()
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index 221f35d7a32..907dd272430 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -31,7 +31,7 @@
return ..(user)
return TRUE
-/obj/item/clothing/accessory/storage/handle_mouse_drop(atom/over, mob/user)
+/obj/item/clothing/accessory/storage/handle_mouse_drop(atom/over, mob/user, params)
if(istype(over, /obj/screen/inventory))
return ..()
if(!istype(loc, /obj/item/clothing) && hold?.handle_storage_internal_mouse_drop(user, over))
diff --git a/code/modules/clothing/underwear/base.dm b/code/modules/clothing/underwear/base.dm
index 8219d976153..b1d20666476 100644
--- a/code/modules/clothing/underwear/base.dm
+++ b/code/modules/clothing/underwear/base.dm
@@ -10,7 +10,7 @@
return // Might as well check
DelayedEquipUnderwear(user, target)
-/obj/item/underwear/handle_mouse_drop(atom/over, mob/user)
+/obj/item/underwear/handle_mouse_drop(atom/over, mob/user, params)
SHOULD_CALL_PARENT(FALSE)
DelayedEquipUnderwear(user, over)
return TRUE
diff --git a/code/modules/detectivework/microscope/_forensic_machine.dm b/code/modules/detectivework/microscope/_forensic_machine.dm
index b82eb930fe2..fab07b75720 100644
--- a/code/modules/detectivework/microscope/_forensic_machine.dm
+++ b/code/modules/detectivework/microscope/_forensic_machine.dm
@@ -107,7 +107,7 @@
remover.put_in_hands(sample)
clear_sample()
-/obj/machinery/forensic/handle_mouse_drop(var/atom/over, var/mob/user)
+/obj/machinery/forensic/handle_mouse_drop(atom/over, mob/user, params)
if(user == over)
remove_sample(usr)
return TRUE
diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm
index f644e35e2c1..44b31951521 100644
--- a/code/modules/detectivework/tools/evidencebag.dm
+++ b/code/modules/detectivework/tools/evidencebag.dm
@@ -11,7 +11,7 @@
obj_flags = OBJ_FLAG_HOLLOW
var/obj/item/stored_item = null
-/obj/item/evidencebag/handle_mouse_drop(atom/over, mob/user)
+/obj/item/evidencebag/handle_mouse_drop(atom/over, mob/user, params)
if(user.get_empty_hand_slot() && isitem(over))
var/obj/item/I = over
diff --git a/code/modules/detectivework/tools/sample_kits/_sample_kit.dm b/code/modules/detectivework/tools/sample_kits/_sample_kit.dm
index 8fa87b124bd..07bc721c4ce 100644
--- a/code/modules/detectivework/tools/sample_kits/_sample_kit.dm
+++ b/code/modules/detectivework/tools/sample_kits/_sample_kit.dm
@@ -40,7 +40,7 @@
to_chat(user, SPAN_WARNING("You are unable to locate any [evidence_type]s on \the [A]."))
. = ..()
-/obj/item/forensics/sample_kit/handle_mouse_drop(atom/over, mob/user)
+/obj/item/forensics/sample_kit/handle_mouse_drop(atom/over, mob/user, params)
if(ismob(loc))
afterattack(over, user, TRUE)
return TRUE
diff --git a/code/modules/fabrication/fabricator_pipe.dm b/code/modules/fabrication/fabricator_pipe.dm
index c3cd5055a16..a552ff4f1ac 100644
--- a/code/modules/fabrication/fabricator_pipe.dm
+++ b/code/modules/fabrication/fabricator_pipe.dm
@@ -50,7 +50,7 @@
base_type = /obj/machinery/fabricator/pipe/disposal
//Allow you to drag-drop disposal pipes into it
-/obj/machinery/fabricator/pipe/disposal/receive_mouse_drop(var/atom/dropping, mob/user)
+/obj/machinery/fabricator/pipe/disposal/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && istype(dropping, /obj/structure/disposalconstruct))
qdel(dropping)
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index 679c23c61d5..b25438de00d 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -264,7 +264,7 @@ var/global/list/card_decks = list()
cards = shuffle(cards)
user.visible_message("\The [user] shuffles [src].")
-/obj/item/deck/handle_mouse_drop(atom/over, mob/user)
+/obj/item/deck/handle_mouse_drop(atom/over, mob/user, params)
if(over == user && (loc == user || in_range(src, user)) && user.get_empty_hand_slot())
user.put_in_hands(src)
return TRUE
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 2a344335261..70bf4641b9e 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -119,7 +119,7 @@
if(power_failure || !draw_power(IC.power_draw_idle))
IC.power_fail()
-/obj/item/electronic_assembly/receive_mouse_drop(atom/dropping, mob/user)
+/obj/item/electronic_assembly/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && user == dropping)
interact(user)
diff --git a/code/modules/mechs/components/body.dm b/code/modules/mechs/components/body.dm
index ad13fe6fc90..5f072a7392e 100644
--- a/code/modules/mechs/components/body.dm
+++ b/code/modules/mechs/components/body.dm
@@ -162,7 +162,7 @@
else
return ..()
-/obj/item/mech_component/chassis/receive_mouse_drop(atom/dropping, mob/user)
+/obj/item/mech_component/chassis/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && istype(dropping, /obj/machinery/portable_atmospherics/canister))
var/obj/machinery/portable_atmospherics/canister/C = dropping
@@ -180,9 +180,9 @@
update_components()
return TRUE
-/obj/item/mech_component/chassis/handle_mouse_drop(atom/over, mob/user)
+/obj/item/mech_component/chassis/handle_mouse_drop(atom/over, mob/user, params)
if(storage_compartment)
- return storage_compartment.handle_mouse_drop(over, user)
+ return storage_compartment.handle_mouse_drop(over, user, params)
. = ..()
/obj/item/mech_component/chassis/return_diagnostics(mob/user)
diff --git a/code/modules/mechs/interface/screen_objects.dm b/code/modules/mechs/interface/screen_objects.dm
index f8b87ba090e..94892c42dcd 100644
--- a/code/modules/mechs/interface/screen_objects.dm
+++ b/code/modules/mechs/interface/screen_objects.dm
@@ -44,7 +44,7 @@
maptext_y = 3
maptext_width = 72
-/obj/screen/exosuit/hardpoint/handle_mouse_drop(atom/over, mob/user)
+/obj/screen/exosuit/hardpoint/handle_mouse_drop(atom/over, mob/user, params)
if(holding)
holding.screen_loc = screen_loc
return TRUE
diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm
index 2268f62713d..0c13060d39a 100644
--- a/code/modules/mechs/mech_interaction.dm
+++ b/code/modules/mechs/mech_interaction.dm
@@ -1,11 +1,11 @@
-/mob/living/exosuit/receive_mouse_drop(atom/dropping, mob/user)
+/mob/living/exosuit/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && istype(dropping, /obj/machinery/portable_atmospherics/canister))
- body.receive_mouse_drop(dropping, user)
+ body.receive_mouse_drop(dropping, user, params)
return TRUE
-/mob/living/exosuit/handle_mouse_drop(atom/over, mob/user)
- if(body?.handle_mouse_drop(over, user))
+/mob/living/exosuit/handle_mouse_drop(atom/over, mob/user, params)
+ if(body?.handle_mouse_drop(over, user, params))
return TRUE
. = ..()
diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm
index 818d8a95f59..e8c985ea706 100644
--- a/code/modules/mob/living/bot/mulebot.dm
+++ b/code/modules/mob/living/bot/mulebot.dm
@@ -52,7 +52,7 @@
suffix = num2text(++amount)
name = "Mulebot #[suffix]"
-/mob/living/bot/mulebot/receive_mouse_drop(var/atom/dropping, var/mob/user)
+/mob/living/bot/mulebot/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!.)
load(dropping)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 45c8d879873..8e6fb56de1d 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -948,7 +948,7 @@ default behaviour is:
/mob/living/get_admin_job_string()
return "Living"
-/mob/living/handle_mouse_drop(atom/over, mob/user)
+/mob/living/handle_mouse_drop(atom/over, mob/user, params)
if(!anchored && user == src && user != over)
if(isturf(over))
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 7bc019c0877..25a0c5f2f26 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -593,7 +593,7 @@
return TRUE
return FALSE
-/mob/handle_mouse_drop(atom/over, mob/user)
+/mob/handle_mouse_drop(atom/over, mob/user, params)
if(over == user && user != src && !isAI(user))
show_stripping_window(user)
return TRUE
diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm
index a8a3766c85a..a82cdc09ad0 100644
--- a/code/modules/mob/observer/ghost/ghost.dm
+++ b/code/modules/mob/observer/ghost/ghost.dm
@@ -418,8 +418,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
show_browser(src, dat, "window=manifest;size=370x420;can_close=1")
//This is called when a ghost is drag clicked to something.
-/mob/observer/ghost/MouseDrop(atom/over)
+/mob/observer/ghost/MouseDrop(over_object, src_location, over_location, src_control, over_control, params)
SHOULD_CALL_PARENT(FALSE)
+ var/atom/over = over_object
if(!usr || !over)
return
if(isghost(usr) && usr.client && isliving(over))
diff --git a/code/modules/multiz/hoist.dm b/code/modules/multiz/hoist.dm
index 06e24f6513d..838b64e9dc2 100644
--- a/code/modules/multiz/hoist.dm
+++ b/code/modules/multiz/hoist.dm
@@ -46,7 +46,7 @@
source_hoist.release_hoistee()
return TRUE
-/obj/effect/hoist_hook/receive_mouse_drop(atom/dropping, mob/user)
+/obj/effect/hoist_hook/receive_mouse_drop(atom/dropping, mob/user, params)
// skip the parent buckle logic, handle climbing directly
var/mob/living/H = user
if(istype(H) && !H.anchored && can_climb(H) && dropping == user)
@@ -85,7 +85,7 @@
events_repository.register(/decl/observ/destroyed, AM, src, .proc/release_hoistee)
-/obj/effect/hoist_hook/handle_mouse_drop(atom/over, mob/user)
+/obj/effect/hoist_hook/handle_mouse_drop(atom/over, mob/user, params)
if(source_hoist.hoistee && isturf(over) && over.Adjacent(source_hoist.hoistee))
if(!user.check_dexterity(DEXTERITY_HOLD_ITEM))
return TRUE
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index a5a861b830d..97f80cf22dd 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -21,7 +21,7 @@
LAZYCLEARLIST(papers) //Gets rid of any refs
return ..()
-/obj/item/paper_bin/handle_mouse_drop(atom/over, mob/user)
+/obj/item/paper_bin/handle_mouse_drop(atom/over, mob/user, params)
if((loc == user || in_range(src, user)) && user.get_empty_hand_slot())
user.put_in_hands(src)
return TRUE
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index c479ecaa378..1eef36d4a0d 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -185,7 +185,7 @@
can_hold = list(/obj/item/photo)
material = /decl/material/solid/organic/plastic
-/obj/item/storage/photo_album/handle_mouse_drop(atom/over, mob/user)
+/obj/item/storage/photo_album/handle_mouse_drop(atom/over, mob/user, params)
if(over == user && in_range(src, user) || loc == user)
if(user.active_storage)
user.active_storage.close(user)
diff --git a/code/modules/power/fuel_assembly/fuel_compressor.dm b/code/modules/power/fuel_assembly/fuel_compressor.dm
index 09d8f49f561..6df9b9a8a0b 100644
--- a/code/modules/power/fuel_assembly/fuel_compressor.dm
+++ b/code/modules/power/fuel_assembly/fuel_compressor.dm
@@ -111,7 +111,7 @@
rod_makeup[mat_type] = amt
return TOPIC_REFRESH
-/obj/machinery/fuel_compressor/receive_mouse_drop(var/atom/movable/dropping, var/mob/user)
+/obj/machinery/fuel_compressor/receive_mouse_drop(atom/dropping, mob/user, params)
if(user.incapacitated() || !user.Adjacent(src))
return
return !add_material(dropping, user)
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 4c54b7882dd..84026bdcafa 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -38,7 +38,7 @@
add_overlay(overlay_image(icon, "[round(percent,25)]", reagents.get_color()))
add_overlay(attached? "dongle" : "top")
-/obj/item/chems/ivbag/handle_mouse_drop(atom/over, mob/user)
+/obj/item/chems/ivbag/handle_mouse_drop(atom/over, mob/user, params)
if(ismob(loc))
if(attached)
visible_message(SPAN_NOTICE("\The [attached] is taken off \the [src]."))
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 4aea8101f63..7c48c84bb5b 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -112,7 +112,7 @@ var/global/list/diversion_junctions = list()
update_icon()
-/obj/machinery/disposal/receive_mouse_drop(atom/dropping, mob/user)
+/obj/machinery/disposal/receive_mouse_drop(atom/dropping, mob/user, params)
. = (user?.a_intent != I_HURT && ..())
@@ -124,7 +124,7 @@ var/global/list/diversion_junctions = list()
var/incapacitation_flags = INCAPACITATION_DEFAULT
if(dropping == user)
incapacitation_flags &= ~INCAPACITATION_RESTRAINED
- if(!dropping.can_mouse_drop(src, user, incapacitation_flags))
+ if(!dropping.can_mouse_drop(src, user, incapacitation_flags, params))
return FALSE
// Todo rewrite all of this.
diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm
index 9c4398a49ea..21cdeff40c0 100644
--- a/code/modules/vehicles/bike.dm
+++ b/code/modules/vehicles/bike.dm
@@ -124,7 +124,7 @@
return 1
return ..()
-/obj/vehicle/bike/receive_mouse_drop(var/atom/dropping, mob/user)
+/obj/vehicle/bike/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && istype(dropping, /atom/movable))
if(!load(dropping))
diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm
index 61e579a188e..5703c3ff0d0 100644
--- a/code/modules/vehicles/train.dm
+++ b/code/modules/vehicles/train.dm
@@ -103,14 +103,14 @@
to_chat(user, "You climb down from [src].")
return 1
-/obj/vehicle/train/handle_mouse_drop(atom/over, mob/user)
+/obj/vehicle/train/handle_mouse_drop(atom/over, mob/user, params)
if(istype(over, /obj/vehicle/train))
var/obj/vehicle/train/beep = over
beep.latch(src, user)
return TRUE
. = ..()
-/obj/vehicle/train/receive_mouse_drop(var/atom/dropping, mob/user)
+/obj/vehicle/train/receive_mouse_drop(atom/dropping, mob/user, params)
. = ..()
if(!. && istype(dropping, /atom/movable))
if(!load(dropping))
diff --git a/code/modules/xenoarcheaology/tools/anomaly_container.dm b/code/modules/xenoarcheaology/tools/anomaly_container.dm
index 3ad102b8aeb..19f0e781d94 100644
--- a/code/modules/xenoarcheaology/tools/anomaly_container.dm
+++ b/code/modules/xenoarcheaology/tools/anomaly_container.dm
@@ -37,7 +37,7 @@
underlays.Cut()
desc = initial(desc)
-/obj/structure/artifact/handle_mouse_drop(atom/over, mob/user)
+/obj/structure/artifact/handle_mouse_drop(atom/over, mob/user, params)
if(istype(over, /obj/structure/anomaly_container))
Bumped(user)
var/obj/structure/anomaly_container/box = over
diff --git a/nebula.dme b/nebula.dme
index 93c4ad4743f..b474034b898 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -88,6 +88,7 @@
#include "code\__defines\species.dm"
#include "code\__defines\status.dm"
#include "code\__defines\stress.dm"
+#include "code\__defines\structures.dm"
#include "code\__defines\subsystem-priority.dm"
#include "code\__defines\subsystems.dm"
#include "code\__defines\targeting.dm"