From 99d4db145d987a8fb91053b45ed4ac178ace6f74 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Thu, 26 Aug 2021 16:17:18 -0400 Subject: [PATCH] Merge pull request #11499 from VOREStation/upstream-merge-8233 [MIRROR] Ports sliding things along tables --- code/_onclick/drag_drop.dm | 17 +++++++------- code/game/objects/items.dm | 14 ++++++++--- code/game/objects/structures/low_wall.dm | 26 ++++++++++++++++---- code/modules/mob/inventory.dm | 2 +- code/modules/mob/living/inventory.dm | 4 ++-- code/modules/tables/interactions.dm | 30 ++++++++++++++++++------ 6 files changed, 67 insertions(+), 26 deletions(-) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 65974fe009..9f7848b3d3 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -15,14 +15,13 @@ return FALSE // should stop you from dragging through windows return TRUE -/atom/MouseDrop(atom/over) - if(!usr || !over) return - if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows +/atom/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + if(!usr || !over) + return + if(!Adjacent(usr) || !over.Adjacent(usr)) + return // should stop you from dragging through windows - spawn(0) - over.MouseDrop_T(src,usr) - return + INVOKE_ASYNC(over, /atom/.proc/MouseDrop_T, src, usr, src_location, over_location, src_control, over_control, params) -// recieve a mousedrop -/atom/proc/MouseDrop_T(atom/dropping, mob/user) - return +/atom/proc/MouseDrop_T(atom/dropping, mob/user, src_location, over_location, src_control, over_control, params) + return \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 3fb73c4848..239a87c38d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -968,7 +968,7 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen /obj/item/var/list/center_of_mass = list("x" = 16,"y" = 16) -/proc/auto_align(obj/item/W, click_parameters) +/proc/auto_align(obj/item/W, click_parameters, var/animate = FALSE) if(!W.center_of_mass) W.randpixel_xy() return @@ -985,8 +985,16 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen var/cell_x = max(0, min(CELLS-1, round(mouse_x/CELLSIZE))) var/cell_y = max(0, min(CELLS-1, round(mouse_y/CELLSIZE))) - W.pixel_x = (CELLSIZE * (0.5 + cell_x)) - W.center_of_mass["x"] - W.pixel_y = (CELLSIZE * (0.5 + cell_y)) - W.center_of_mass["y"] + var/target_x = (CELLSIZE * (0.5 + cell_x)) - W.center_of_mass["x"] + var/target_y = (CELLSIZE * (0.5 + cell_y)) - W.center_of_mass["y"] + if(animate) + var/dist_x = abs(W.pixel_x - target_x) + var/dist_y = abs(W.pixel_y - target_y) + var/dist = sqrt((dist_x*dist_x)+(dist_y*dist_y)) + animate(W, pixel_x=target_x, pixel_y=target_y,time=dist*0.5) + else + W.pixel_x = target_x + W.pixel_y = target_y #undef CELLS #undef CELLSIZE \ No newline at end of file diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm index 6a3f2cea1b..e6a8f0d0f3 100644 --- a/code/game/objects/structures/low_wall.dm +++ b/code/game/objects/structures/low_wall.dm @@ -121,19 +121,37 @@ return FALSE return TRUE -/obj/structure/low_wall/MouseDrop_T(obj/O as obj, mob/user as mob) +/obj/structure/low_wall/MouseDrop_T(obj/O, mob/user, src_location, over_location, src_control, over_control, params) if(istype(O, /obj/structure/window)) var/obj/structure/window/W = O if(Adjacent(W) && !W.anchored) to_chat("You hoist [W] up onto [src].") W.forceMove(loc) return - if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O)) - return ..() if(isrobot(user)) return if(can_place_items()) - user.unEquip(O, 0, src.loc) + if(ismob(O.loc)) //If placing an item + if(!isitem(O) || user.get_active_hand() != O) + return ..() + if(isrobot(user)) + return + user.drop_item() + if(O.loc != src.loc) + step(O, get_dir(O, src)) + + else if(isturf(O.loc) && isitem(O)) //If pushing an item on the tabletop + var/obj/item/I = O + if(I.anchored) + return + + if((isliving(user)) && (Adjacent(user)) && !(user.incapacitated())) + if(O.w_class <= user.can_pull_size) + O.forceMove(loc) + auto_align(I, params, TRUE) + else + to_chat(user, SPAN_WARNING("\The [I] is too big for you to move!")) + return /obj/structure/low_wall/proc/handle_rod_use(mob/user, obj/item/stack/rods/R) if(!grille_type) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index f007b5c8dc..445bd3895e 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -75,7 +75,7 @@ var/list/slot_equipment_priority = list( \ /mob/proc/equip_voidsuit_to_slot_or_del_with_refit(obj/item/clothing/suit/space/void/W as obj, slot, species = SPECIES_HUMAN) W.refit_for_species(species) return equip_to_slot_if_possible(W, slot, 1, 1, 0) - + /mob/proc/equip_voidhelm_to_slot_or_del_with_refit(obj/item/clothing/head/helmet/space/void/W as obj, slot, species = SPECIES_HUMAN) W.refit_for_species(species) return equip_to_slot_if_possible(W, slot, 1, 1, 0) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index c2ea298683..d9af7a3689 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -307,7 +307,7 @@ if(istype(H.w_uniform, /obj/item/clothing/under)) suit = H.w_uniform - + var/list/slots = list() for(var/entry in H.species.hud.gear) var/list/slot_ref = H.species.hud.gear[entry] @@ -322,7 +322,7 @@ ))) data["slots"] = slots - + var/list/specialSlots = list() if(H.species.hud.has_hands) specialSlots.Add(list(list( diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm index aeb899cf82..27627055d7 100644 --- a/code/modules/tables/interactions.dm +++ b/code/modules/tables/interactions.dm @@ -60,14 +60,30 @@ return 1 return 1 -/obj/structure/table/MouseDrop_T(obj/O as obj, mob/user as mob) +/obj/structure/table/MouseDrop_T(obj/O, mob/user, src_location, over_location, src_control, over_control, params) + if(ismob(O.loc)) //If placing an item + if(!isitem(O) || user.get_active_hand() != O) + return ..() + if(isrobot(user)) + return + user.drop_item() + if(O.loc != src.loc) + step(O, get_dir(O, src)) - if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O)) - return ..() - if(isrobot(user)) - return - user.unEquip(O, 0, src.loc) - return + else if(isturf(O.loc) && isitem(O)) //If pushing an item on the tabletop + var/obj/item/I = O + if(I.anchored) + return + + if((isliving(user)) && (Adjacent(user)) && !(user.incapacitated())) + if(O.w_class <= user.can_pull_size) + O.forceMove(loc) + auto_align(I, params, TRUE) + else + to_chat(user, SPAN_WARNING("\The [I] is too big for you to move!")) + return + + return ..() /obj/structure/table/attackby(obj/item/W as obj, mob/user as mob, var/hit_modifier, var/click_parameters)