From b867d36bbcba89ec8d02d6e49cb1af338c535788 Mon Sep 17 00:00:00 2001 From: silicons Date: Wed, 5 Jul 2023 07:57:31 -0700 Subject: [PATCH 001/140] move public helpers around --- citadel.dme | 3 +- code/modules/clothing/clothing_accessories.dm | 2 +- code/modules/mob/inventory/inventory.dm | 2 +- code/modules/mob/inventory/item_public.dm | 270 ++++++++++++++++++ code/modules/mob/inventory/items.dm | 261 +---------------- .../mob/inventory/{mobs.dm => mob_public.dm} | 0 .../mob/living/carbon/human/inventory.dm | 26 +- code/modules/mob/living/carbon/inventory.dm | 4 +- code/modules/mob/living/inventory.dm | 4 +- code/modules/mob/mob_defines.dm | 2 + 10 files changed, 294 insertions(+), 280 deletions(-) create mode 100644 code/modules/mob/inventory/item_public.dm rename code/modules/mob/inventory/{mobs.dm => mob_public.dm} (100%) diff --git a/citadel.dme b/citadel.dme index 76277b38c7f7..32da08750c2c 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3124,8 +3124,9 @@ #include "code\modules\mob\inventory\hands.dm" #include "code\modules\mob\inventory\helpers.dm" #include "code\modules\mob\inventory\inventory.dm" +#include "code\modules\mob\inventory\item_public.dm" #include "code\modules\mob\inventory\items.dm" -#include "code\modules\mob\inventory\mobs.dm" +#include "code\modules\mob\inventory\mob_public.dm" #include "code\modules\mob\inventory\rendering.dm" #include "code\modules\mob\inventory\slot_meta.dm" #include "code\modules\mob\inventory\stripping.dm" diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm index 783372887a7c..28d90f249823 100644 --- a/code/modules/clothing/clothing_accessories.dm +++ b/code/modules/clothing/clothing_accessories.dm @@ -1,4 +1,4 @@ -/obj/item/clothing/_inv_return_attached() +/obj/item/clothing/inv_slot_attached() if(!accessories) return ..() . = ..() diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index a88a947daf01..a11b0ef69db4 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -624,7 +624,7 @@ var/obj/item/I = _item_by_slot(slot) if(!I) return list() - I = I._inv_return_attached() + I = I.inv_slot_attached() return islist(I)? I : list(I) /** diff --git a/code/modules/mob/inventory/item_public.dm b/code/modules/mob/inventory/item_public.dm new file mode 100644 index 000000000000..f13daca9de6e --- /dev/null +++ b/code/modules/mob/inventory/item_public.dm @@ -0,0 +1,270 @@ +//* Hooks *// + +/** + * called when an item is equipped to inventory or picked up + * + * @params + * user - person equipping us + * slot - slot id we're equipped to + * flags - inventory operation flags, see defines + */ +/obj/item/proc/equipped(mob/user, slot, flags) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot, flags) + SEND_SIGNAL(user, COMSIG_MOB_ITEM_EQUIPPED, user, slot, flags) + worn_slot = slot + if(!(flags & INV_OP_IS_ACCESSORY)) + // todo: shouldn't be in here + hud_layerise() + // todo: shouldn't be in here + if(user) + user.position_hud_item(src, slot) + user.client?.screen |= src + if((slot != SLOT_ID_HANDS) && equip_sound) + playsound(src, equip_sound, 30, ignore_walls = FALSE) + user.update_inv_hands() + +/** + * called when an item is unequipped from inventory or moved around in inventory + * + * @params + * user - person unequipping us + * slot - slot id we're unequipping from + * flags - inventory operation flags, see defines + */ +/obj/item/proc/unequipped(mob/user, slot, flags) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ITEM_UNEQUIPPED, user, slot, flags) + SEND_SIGNAL(user, COMSIG_MOB_ITEM_UNEQUIPPED, user, slot, flags) + worn_slot = null + if(!(flags & INV_OP_IS_ACCESSORY)) + // todo: shouldn't be in here + hud_unlayerise() + // todo: shouldn't be in here + screen_loc = null + user?.client?.screen -= src + if(!(flags & INV_OP_DIRECTLY_DROPPING) && (slot != SLOT_ID_HANDS) && unequip_sound) + playsound(src, unequip_sound, 30, ignore_walls = FALSE) + +/** + * called when a mob drops an item + * + * ! WARNING: You CANNOT assume we are post or pre-move on dropped. + * ! If unequipped() deletes the item, loc will be null. Sometimes, loc won't change at all! + * + * dropping is defined as moving out of both equipment slots and hand slots + */ +/obj/item/proc/dropped(mob/user, flags, atom/newLoc) + SHOULD_CALL_PARENT(TRUE) +/* + for(var/X in actions) + var/datum/action/A = X + A.Remove(user) +*/ + if((item_flags & ITEM_DROPDEL) && !(flags & INV_OP_DELETING)) + qdel(src) + + hud_unlayerise() + item_flags &= ~ITEM_IN_INVENTORY + // TODO: THIS IS SHITCODE, MOVE TO EVENT DRIVEN. + user.handle_actions() + + . = SEND_SIGNAL(src, COMSIG_ITEM_DROPPED, user, flags, newLoc) + SEND_SIGNAL(user, COMSIG_MOB_ITEM_DROPPED, src, flags, newLoc) + + if(!(flags & INV_OP_SUPPRESS_SOUND) && isturf(newLoc) && !(. & COMPONENT_ITEM_DROPPED_SUPPRESS_SOUND)) + playsound(src, drop_sound, 30, ignore_walls = FALSE) + // user?.update_equipment_speed_mods() + if(zoom) + zoom() //binoculars, scope, etc + + return ((. & COMPONENT_ITEM_DROPPED_RELOCATE)? ITEM_RELOCATED_BY_DROPPED : NONE) + +/** + * called when a mob picks up an item + * + * picking up is defined as moving into either an equipment slot, or hand slots + */ +/obj/item/proc/pickup(mob/user, flags, atom/oldLoc) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user, flags, oldLoc) + SEND_SIGNAL(user, COMSIG_MOB_ITEM_PICKUP, src, flags, oldLoc) + reset_pixel_offsets() + hud_layerise() + item_flags |= ITEM_IN_INVENTORY + // TODO: THIS IS SHITCODE, MOVE TO EVENT DRIVEN. + user.handle_actions() + if(isturf(oldLoc) && !(flags & (INV_OP_SILENT | INV_OP_DIRECTLY_EQUIPPING))) + playsound(src, pickup_sound, 20, ignore_walls = FALSE) + +//* Access *// + +/** + * get the mob we're equipped on + */ +/obj/item/proc/worn_mob() + RETURN_TYPE(/mob) + return worn_inside?.worn_mob() || (worn_slot? loc : null) + +/** + * checks if we're in inventory. if so, returns mob we're in + * **hands count** + */ +/obj/item/proc/is_in_inventory(include_hands) + return (worn_slot && ((worn_slot != SLOT_ID_HANDS) || include_hands)) && worn_mob() + +/** + * checks if we're worn. if so, return mob we're in + * + * note: this is not the same as is_in_inventory, we check if it's a clothing/worn slot in this case! + */ +/obj/item/proc/is_being_worn() + if(!worn_slot) + return FALSE + var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(worn_slot) + return slot_meta.inventory_slot_flags & INV_SLOT_CONSIDERED_WORN + +//* Stripping *// + +/** + * get strip menu options by href key associated to name. + */ +/obj/item/proc/strip_menu_options(mob/user) + RETURN_TYPE(/list) + return list() + +/** + * strip menu act + * + * adjacency is pre-checked. + * return TRUE to refresh + */ +/obj/item/proc/strip_menu_act(mob/user, action) + return FALSE + +/** + * standard do after for interacting from strip menu + */ +/obj/item/proc/strip_menu_standard_do_after(mob/user, delay) + . = FALSE + var/slot = worn_slot + if(!slot) + CRASH("no worn slot") + var/mob/M = worn_mob() + if(!M) + CRASH("no worn mob") + if(!M.strip_interaction_prechecks(user)) + return + if(!do_after(user, delay, M, DO_AFTER_IGNORE_ACTIVE_ITEM)) + return + if(slot != worn_slot || M != worn_mob()) + return + return TRUE + +//* Checks *// +// todo: item should get final say for "soft" aka not-literal-var-overwrite conflicts. + +/** + * checks if a mob can equip us to a slot + * mob gets final say + * if you return false, feedback to the user, as the main proc doesn't do this. + * + * todo: non-singular-letter proc args + */ +/obj/item/proc/can_equip(mob/M, slot, mob/user, flags) + if(!equip_check_beltlink(M, slot, user, flags)) + return FALSE + return TRUE + +/** + * checks if a mob can unequip us from a slot + * mob gets final say + * if you return false, feedback to the user, as the main proc doesn't do this. + * + * todo: non-singular-letter proc args + */ +/obj/item/proc/can_unequip(mob/M, slot, mob/user, flags) + return TRUE + +/** + * allow an item in suit storage slot? + */ +/obj/item/proc/can_suit_storage(obj/item/I) + // todo: this is awful + return is_type_in_list(I, allowed) + +/** + * checks if we need something to attach to in a certain slot + * + * todo: non-singular-letter proc args + */ +/obj/item/proc/equip_check_beltlink(mob/M, slot, mob/user, flags) + if(clothing_flags & CLOTHING_IGNORE_BELTLINK) + return TRUE + + if(!ishuman(M)) + return TRUE + + var/mob/living/carbon/human/H = M + + switch(slot) + if(SLOT_ID_LEFT_POCKET, SLOT_ID_RIGHT_POCKET) + if(H.semantically_has_slot(SLOT_ID_UNIFORM) && !H.item_by_slot(SLOT_ID_UNIFORM)) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(H, SPAN_WARNING("You need a jumpsuit before you can attach [src].")) + return FALSE + if(SLOT_ID_WORN_ID) + if(H.semantically_has_slot(SLOT_ID_UNIFORM) && !H.item_by_slot(SLOT_ID_UNIFORM)) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(H, SPAN_WARNING("You need a jumpsuit before you can attach [src].")) + return FALSE + if(SLOT_ID_BELT) + if(H.semantically_has_slot(SLOT_ID_UNIFORM) && !H.item_by_slot(SLOT_ID_UNIFORM)) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(H, SPAN_WARNING("You need a jumpsuit before you can attach [src].")) + return FALSE + if(SLOT_ID_SUIT_STORAGE) + if(H.semantically_has_slot(SLOT_ID_SUIT) && !H.item_by_slot(SLOT_ID_SUIT)) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(H, SPAN_WARNING("You need a suit before you can attach [src].")) + return FALSE + return TRUE + +//* ADVANCED: Wear-Over System *// + +/** + * checks if we can fit over something + * + * todo: non-singular-letter proc args + */ +/obj/item/proc/equip_worn_over_check(mob/M, slot, mob/user, obj/item/I, flags) + return FALSE + +/** + * call when we fit us over something - item should be already in us + * + * todo: non-singular-letter proc args + */ +/obj/item/proc/equip_on_worn_over_insert(mob/M, slot, mob/user, obj/item/I, flags) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(M, SPAN_NOTICE("You slip [src] over [I].")) + +/** + * call when we unfit us over something - item should already be out of us + * + * todo: non-singular-letter proc args + */ +/obj/item/proc/equip_on_worn_over_remove(mob/M, slot, mob/user, obj/item/I, flags) + +//* ADVANCED: Compound Objects *// + +/** + * returns either an item or a list + * get_equipped_items() uses this so accessories are included + * anything this returns is considered to be in the same slot. + */ +/obj/item/proc/inv_slot_attached() + if(worn_over) + return list(src) + worn_over.inv_slot_attached() + else + return src diff --git a/code/modules/mob/inventory/items.dm b/code/modules/mob/inventory/items.dm index aa38b32e5929..8168d8e2fbc2 100644 --- a/code/modules/mob/inventory/items.dm +++ b/code/modules/mob/inventory/items.dm @@ -23,103 +23,6 @@ M.temporarily_remove_from_inventory(src, INV_OP_FORCE | INV_OP_DELETING) return ..() -/** - * called when an item is equipped to inventory or picked up - * - * @params - * user - person equipping us - * slot - slot id we're equipped to - * flags - inventory operation flags, see defines - */ -/obj/item/proc/equipped(mob/user, slot, flags) - SHOULD_CALL_PARENT(TRUE) - SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot, flags) - SEND_SIGNAL(user, COMSIG_MOB_ITEM_EQUIPPED, user, slot, flags) - worn_slot = slot - if(!(flags & INV_OP_IS_ACCESSORY)) - // todo: shouldn't be in here - hud_layerise() - // todo: shouldn't be in here - if(user) - user.position_hud_item(src, slot) - user.client?.screen |= src - if((slot != SLOT_ID_HANDS) && equip_sound) - playsound(src, equip_sound, 30, ignore_walls = FALSE) - user.update_inv_hands() - -/** - * called when an item is unequipped from inventory or moved around in inventory - * - * @params - * user - person unequipping us - * slot - slot id we're unequipping from - * flags - inventory operation flags, see defines - */ -/obj/item/proc/unequipped(mob/user, slot, flags) - SHOULD_CALL_PARENT(TRUE) - SEND_SIGNAL(src, COMSIG_ITEM_UNEQUIPPED, user, slot, flags) - SEND_SIGNAL(user, COMSIG_MOB_ITEM_UNEQUIPPED, user, slot, flags) - worn_slot = null - if(!(flags & INV_OP_IS_ACCESSORY)) - // todo: shouldn't be in here - hud_unlayerise() - // todo: shouldn't be in here - screen_loc = null - user?.client?.screen -= src - if(!(flags & INV_OP_DIRECTLY_DROPPING) && (slot != SLOT_ID_HANDS) && unequip_sound) - playsound(src, unequip_sound, 30, ignore_walls = FALSE) - -/** - * called when a mob drops an item - * - * ! WARNING: You CANNOT assume we are post or pre-move on dropped. - * ! If unequipped() deletes the item, loc will be null. Sometimes, loc won't change at all! - * - * dropping is defined as moving out of both equipment slots and hand slots - */ -/obj/item/proc/dropped(mob/user, flags, atom/newLoc) - SHOULD_CALL_PARENT(TRUE) -/* - for(var/X in actions) - var/datum/action/A = X - A.Remove(user) -*/ - if((item_flags & ITEM_DROPDEL) && !(flags & INV_OP_DELETING)) - qdel(src) - - hud_unlayerise() - item_flags &= ~ITEM_IN_INVENTORY - // TODO: THIS IS SHITCODE, MOVE TO EVENT DRIVEN. - user.handle_actions() - - . = SEND_SIGNAL(src, COMSIG_ITEM_DROPPED, user, flags, newLoc) - SEND_SIGNAL(user, COMSIG_MOB_ITEM_DROPPED, src, flags, newLoc) - - if(!(flags & INV_OP_SUPPRESS_SOUND) && isturf(newLoc) && !(. & COMPONENT_ITEM_DROPPED_SUPPRESS_SOUND)) - playsound(src, drop_sound, 30, ignore_walls = FALSE) - // user?.update_equipment_speed_mods() - if(zoom) - zoom() //binoculars, scope, etc - - return ((. & COMPONENT_ITEM_DROPPED_RELOCATE)? ITEM_RELOCATED_BY_DROPPED : NONE) - -/** - * called when a mob picks up an item - * - * picking up is defined as moving into either an equipment slot, or hand slots - */ -/obj/item/proc/pickup(mob/user, flags, atom/oldLoc) - SHOULD_CALL_PARENT(TRUE) - SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user, flags, oldLoc) - SEND_SIGNAL(user, COMSIG_MOB_ITEM_PICKUP, src, flags, oldLoc) - reset_pixel_offsets() - hud_layerise() - item_flags |= ITEM_IN_INVENTORY - // TODO: THIS IS SHITCODE, MOVE TO EVENT DRIVEN. - user.handle_actions() - if(isturf(oldLoc) && !(flags & (INV_OP_SILENT | INV_OP_DIRECTLY_EQUIPPING))) - playsound(src, pickup_sound, 20, ignore_walls = FALSE) - /** * get the slowdown we incur when we're worn */ @@ -165,85 +68,7 @@ M.update_inv_wear_id() /** - * returns either an item or a list - * get_equipped_items() uses this so accessories are included - */ -/obj/item/proc/_inv_return_attached() - if(worn_over) - return list(src) + worn_over._inv_return_attached() - else - return src - -// todo: item should get final say for "soft" aka not-literal-var-overwrite conflicts. - -/** - * checks if a mob can equip us to a slot - * mob gets final say - * if you return false, feedback to the user, as the main proc doesn't do this. - * - * todo: non-singular-letter proc args - */ -/obj/item/proc/can_equip(mob/M, slot, mob/user, flags) - if(!equip_check_beltlink(M, slot, user, flags)) - return FALSE - return TRUE - -/** - * checks if a mob can unequip us from a slot - * mob gets final say - * if you return false, feedback to the user, as the main proc doesn't do this. - * - * todo: non-singular-letter proc args - */ -/obj/item/proc/can_unequip(mob/M, slot, mob/user, flags) - return TRUE - -/** - * allow an item in suit storage slot? - */ -/obj/item/proc/can_suit_storage(obj/item/I) - // todo: this is awful - return is_type_in_list(I, allowed) - -/** - * checks if we need something to attach to in a certain slot - * - * todo: non-singular-letter proc args - */ -/obj/item/proc/equip_check_beltlink(mob/M, slot, mob/user, flags) - if(clothing_flags & CLOTHING_IGNORE_BELTLINK) - return TRUE - - if(!ishuman(M)) - return TRUE - - var/mob/living/carbon/human/H = M - - switch(slot) - if(SLOT_ID_LEFT_POCKET, SLOT_ID_RIGHT_POCKET) - if(H.semantically_has_slot(SLOT_ID_UNIFORM) && !H.item_by_slot(SLOT_ID_UNIFORM)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(H, SPAN_WARNING("You need a jumpsuit before you can attach [src].")) - return FALSE - if(SLOT_ID_WORN_ID) - if(H.semantically_has_slot(SLOT_ID_UNIFORM) && !H.item_by_slot(SLOT_ID_UNIFORM)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(H, SPAN_WARNING("You need a jumpsuit before you can attach [src].")) - return FALSE - if(SLOT_ID_BELT) - if(H.semantically_has_slot(SLOT_ID_UNIFORM) && !H.item_by_slot(SLOT_ID_UNIFORM)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(H, SPAN_WARNING("You need a jumpsuit before you can attach [src].")) - return FALSE - if(SLOT_ID_SUIT_STORAGE) - if(H.semantically_has_slot(SLOT_ID_SUIT) && !H.item_by_slot(SLOT_ID_SUIT)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(H, SPAN_WARNING("You need a suit before you can attach [src].")) - return FALSE - return TRUE - -/** - * automatically uneqiup if we're missing beltlink + * automatically unequip if we're missing beltlink */ /obj/item/proc/reconsider_beltlink() var/mob/M = loc @@ -255,37 +80,6 @@ M.drop_item_to_ground(src) return -/** - * checks if we can fit over something - * - * todo: non-singular-letter proc args - */ -/obj/item/proc/equip_worn_over_check(mob/M, slot, mob/user, obj/item/I, flags) - return FALSE - -/** - * call when we fit us over something - item should be already in us - * - * todo: non-singular-letter proc args - */ -/obj/item/proc/equip_on_worn_over_insert(mob/M, slot, mob/user, obj/item/I, flags) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(M, SPAN_NOTICE("You slip [src] over [I].")) - -/** - * call when we unfit us over something - item should already be out of us - * - * todo: non-singular-letter proc args - */ -/obj/item/proc/equip_on_worn_over_remove(mob/M, slot, mob/user, obj/item/I, flags) - -/** - * get the mob we're equipped on - */ -/obj/item/proc/worn_mob() - RETURN_TYPE(/mob) - return worn_inside?.worn_mob() || (worn_slot? loc : null) - // doMove hook to ensure proper functionality when inv procs aren't called /obj/item/doMove(atom/destination) if(worn_slot && !worn_hook_suppressed) @@ -314,56 +108,3 @@ if(!. || (loc == M)) // kick them out forceMove(M.drop_location()) - -/** - * checks if we're in inventory. if so, returns mob we're in - * **hands count** - */ -/obj/item/proc/is_in_inventory(include_hands) - return (worn_slot && ((worn_slot != SLOT_ID_HANDS) || include_hands)) && worn_mob() - -/** - * checks if we're worn. if so, return mob we're in - * - * note: this is not the same as is_in_inventory, we check if it's a clothing/worn slot in this case! - */ -/obj/item/proc/is_being_worn() - if(!worn_slot) - return FALSE - var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(worn_slot) - return slot_meta.inventory_slot_flags & INV_SLOT_CONSIDERED_WORN - -/** - * get strip menu options by href key associated to name. - */ -/obj/item/proc/strip_menu_options(mob/user) - RETURN_TYPE(/list) - return list() - -/** - * strip menu act - * - * adjacency is pre-checked. - * return TRUE to refresh - */ -/obj/item/proc/strip_menu_act(mob/user, action) - return FALSE - -/** - * standard do after for interacting from strip menu - */ -/obj/item/proc/strip_menu_standard_do_after(mob/user, delay) - . = FALSE - var/slot = worn_slot - if(!slot) - CRASH("no worn slot") - var/mob/M = worn_mob() - if(!M) - CRASH("no worn mob") - if(!M.strip_interaction_prechecks(user)) - return - if(!do_after(user, delay, M, DO_AFTER_IGNORE_ACTIVE_ITEM)) - return - if(slot != worn_slot || M != worn_mob()) - return - return TRUE diff --git a/code/modules/mob/inventory/mobs.dm b/code/modules/mob/inventory/mob_public.dm similarity index 100% rename from code/modules/mob/inventory/mobs.dm rename to code/modules/mob/inventory/mob_public.dm diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 2b73b38b1804..0f41a16d8bd1 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -129,31 +129,31 @@ /mob/living/carbon/human/_get_all_slots(include_restraints) . = ..() if(wear_suit) - . += wear_suit._inv_return_attached() + . += wear_suit.inv_slot_attached() if(w_uniform) - . += w_uniform._inv_return_attached() + . += w_uniform.inv_slot_attached() if(shoes) - . += shoes._inv_return_attached() + . += shoes.inv_slot_attached() if(belt) - . += belt._inv_return_attached() + . += belt.inv_slot_attached() if(gloves) - . += gloves._inv_return_attached() + . += gloves.inv_slot_attached() if(glasses) - . += glasses._inv_return_attached() + . += glasses.inv_slot_attached() if(head) - . += head._inv_return_attached() + . += head.inv_slot_attached() if(l_ear) - . += l_ear._inv_return_attached() + . += l_ear.inv_slot_attached() if(r_ear) - . += r_ear._inv_return_attached() + . += r_ear.inv_slot_attached() if(wear_id) - . += wear_id._inv_return_attached() + . += wear_id.inv_slot_attached() if(r_store) - . += r_store._inv_return_attached() + . += r_store.inv_slot_attached() if(l_store) - . += l_store._inv_return_attached() + . += l_store.inv_slot_attached() if(s_store) - . += s_store._inv_return_attached() + . += s_store.inv_slot_attached() /mob/living/carbon/human/_get_inventory_slot_ids() return ..() + list( diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 063704e5b4f8..6274e9698d15 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -35,9 +35,9 @@ . = ..() if(include_restraints) if(handcuffed) - . += handcuffed._inv_return_attached() + . += handcuffed.inv_slot_attached() if(legcuffed) - . += legcuffed._inv_return_attached() + . += legcuffed.inv_slot_attached() /mob/living/carbon/_get_inventory_slot_ids() return ..() + list( diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 7369dc3608c3..148173d1b7c7 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -175,9 +175,9 @@ /mob/living/_get_all_slots(include_restraints) . = ..() if(back) - . += back._inv_return_attached() + . += back.inv_slot_attached() if(wear_mask) - . += wear_mask._inv_return_attached() + . += wear_mask.inv_slot_attached() /mob/living/_get_inventory_slot_ids() return ..() + list( diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 1bdeba507663..168e6e1fefdc 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -92,6 +92,8 @@ //? Inventory /// our inventory datum, if any. var/datum/inventory/inventory + /// held items; indexed list. defaults to null, lazy. + var/list/held_items //! Size //! todo kill this with fire it should just be part of icon_scale_x/y. From dcbc395d7c2f1df527002e9c90e1c53da3efcce2 Mon Sep 17 00:00:00 2001 From: silicons Date: Wed, 5 Jul 2023 08:15:58 -0700 Subject: [PATCH 002/140] shuffle code around --- citadel.dme | 8 +- code/game/objects/items.dm | 59 +- code/modules/mob/inventory/inventory.dm | 648 +----------------- code/modules/mob/inventory/item_hooks.dm | 28 + code/modules/mob/inventory/item_public.dm | 21 + .../{rendering.dm => item_rendering.dm} | 40 ++ code/modules/mob/inventory/items.dm | 110 --- code/modules/mob/inventory/mob_abstraction.dm | 118 ++++ code/modules/mob/inventory/mob_internal.dm | 276 ++++++++ code/modules/mob/inventory/mob_public.dm | 285 +++++++- .../{stripping.dm => mob_stripping.dm} | 6 + 11 files changed, 822 insertions(+), 777 deletions(-) create mode 100644 code/modules/mob/inventory/item_hooks.dm rename code/modules/mob/inventory/{rendering.dm => item_rendering.dm} (95%) delete mode 100644 code/modules/mob/inventory/items.dm create mode 100644 code/modules/mob/inventory/mob_abstraction.dm create mode 100644 code/modules/mob/inventory/mob_internal.dm rename code/modules/mob/inventory/{stripping.dm => mob_stripping.dm} (98%) diff --git a/citadel.dme b/citadel.dme index 32da08750c2c..0c5cd60105ea 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3124,12 +3124,14 @@ #include "code\modules\mob\inventory\hands.dm" #include "code\modules\mob\inventory\helpers.dm" #include "code\modules\mob\inventory\inventory.dm" +#include "code\modules\mob\inventory\item_hooks.dm" #include "code\modules\mob\inventory\item_public.dm" -#include "code\modules\mob\inventory\items.dm" +#include "code\modules\mob\inventory\item_rendering.dm" +#include "code\modules\mob\inventory\mob_abstraction.dm" +#include "code\modules\mob\inventory\mob_internal.dm" #include "code\modules\mob\inventory\mob_public.dm" -#include "code\modules\mob\inventory\rendering.dm" +#include "code\modules\mob\inventory\mob_stripping.dm" #include "code\modules\mob\inventory\slot_meta.dm" -#include "code\modules\mob\inventory\stripping.dm" #include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\butchering.dm" #include "code\modules\mob\living\damage_procs.dm" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 949d4d23fdcb..8ddace65f48a 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -5,7 +5,22 @@ // todo: better way, for now, block all rad contamination to interior rad_flags = RAD_BLOCK_CONTENTS - //? Flags + //* Combat + /// Amount of damage we do on melee. + var/damage_force = 0 + /// armor flag for melee attacks + var/damage_flag = ARMOR_MELEE + /// damage tier + var/damage_tier = MELEE_TIER_DEFAULT + /// damage_mode bitfield - see [code/__DEFINES/combat/damage.dm] + var/damage_mode = NONE + // todo: port over damtype + + //* Economy + /// economic category for items + var/economic_category_item = ECONOMIC_CATEGORY_ITEM_DEFAULT + + //* Flags /// Item flags. /// These flags are listed in [code/__DEFINES/inventory/item_flags.dm]. var/item_flags = NONE @@ -29,20 +44,26 @@ /// These flags are listed in [code/__DEFINES/_flags/interaction_flags.dm] var/interaction_flags_item = INTERACT_ITEM_ATTACK_SELF - //? Economy - /// economic category for items - var/economic_category_item = ECONOMIC_CATEGORY_ITEM_DEFAULT + //* Inventory - Main + /// currently equipped slot id + var/worn_slot + /** + * current item we fitted over + * ! DANGER: While this is more or less bug-free for "won't lose the item when you unequip/won't get stuck", we + * ! do not promise anything for functionality - this is a SNOWFLAKE SYSTEM. + */ + var/obj/item/worn_over + /** + * current item we're fitted in. + */ + var/obj/item/worn_inside + /// suppress auto inventory hooks in forceMove + var/worn_hook_suppressed = FALSE - //? Combat - /// Amount of damage we do on melee. - var/damage_force = 0 - /// armor flag for melee attacks - var/damage_flag = ARMOR_MELEE - /// damage tier - var/damage_tier = MELEE_TIER_DEFAULT - /// damage_mode bitfield - see [code/__DEFINES/combat/damage.dm] - var/damage_mode = NONE - // todo: port over damtype + //* Inventory - Rendering + /// See [code/modules/mob/inventory/item_rendering.dm] + /// There are simply too many variables to put into this file. + /// When we get rid of a few of the legacy variables, we can move the variables here. //? unsorted / legacy /// This saves our blood splatter overlay, which will be processed not to go over the edges of the sprite @@ -154,6 +175,16 @@ if(damtype == "brute") hitsound = "swing_hit" +/obj/item/Destroy() + // run inventory hooks + if(worn_slot && !worn_hook_suppressed) + var/mob/M = worn_mob() + if(!ismob(M)) + stack_trace("invalid current equipped slot [worn_slot] on an item not on a mob.") + return ..() + M.temporarily_remove_from_inventory(src, INV_OP_FORCE | INV_OP_DELETING) + return ..() + /// Check if target is reasonable for us to operate on. /obj/item/proc/check_allowed_items(atom/target, not_inside, target_self) if(((src in target) && !target_self) || ((!istype(target.loc, /turf)) && (!istype(target, /turf)) && (not_inside))) diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index a11b0ef69db4..4408627f04ac 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -30,119 +30,10 @@ if(I.body_cover_flags & cover_flags) . += I -/** - * handles the insertion - * item can be moved or not moved before calling - * - * slot must be a typepath - * - * @return true/false based on if it worked - */ -/mob/proc/handle_abstract_slot_insertion(obj/item/I, slot, flags) - if(!ispath(slot, /datum/inventory_slot_meta/abstract)) - slot = resolve_inventory_slot_meta(slot)?.type - if(!ispath(slot, /datum/inventory_slot_meta/abstract)) - stack_trace("invalid slot: [slot]") - else if(slot != /datum/inventory_slot_meta/abstract/put_in_hands) - stack_trace("attempted usage of slot id in abstract insertion converted successfully") - . = FALSE - switch(slot) - if(/datum/inventory_slot_meta/abstract/hand/left) - return put_in_left_hand(I, flags) - if(/datum/inventory_slot_meta/abstract/hand/right) - return put_in_right_hand(I, flags) - if(/datum/inventory_slot_meta/abstract/put_in_belt) - var/obj/item/storage/S = item_by_slot(SLOT_ID_BELT) - return istype(S) && S.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE) - if(/datum/inventory_slot_meta/abstract/put_in_backpack) - var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) - return istype(S) && S.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE) - if(/datum/inventory_slot_meta/abstract/put_in_hands) - return put_in_hands(I, flags) - if(/datum/inventory_slot_meta/abstract/put_in_storage, /datum/inventory_slot_meta/abstract/put_in_storage_try_active) - if(slot == /datum/inventory_slot_meta/abstract/put_in_storage_try_active) - if(s_active && Adjacent(s_active) && s_active.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE)) - return TRUE - for(var/obj/item/storage/S in get_equipped_items_in_slots(list( - SLOT_ID_BELT, - SLOT_ID_BACK, - SLOT_ID_UNIFORM, - SLOT_ID_SUIT, - SLOT_ID_LEFT_POCKET, - SLOT_ID_RIGHT_POCKET - )) + get_held_items()) - if(S.try_insert(I, src, INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE)) - return TRUE - return FALSE - if(/datum/inventory_slot_meta/abstract/attach_as_accessory) - for(var/obj/item/clothing/C in get_equipped_items()) - if(C.attempt_attach_accessory(I)) - return TRUE - return FALSE - else - CRASH("Invalid abstract slot [slot]") - -/** - * handles internal logic of unequipping an item - * - * @params - * - I - item - * - flags - inventory operation hint bitfield, see defines - * - newloc - where to transfer to. null for nullspace, FALSE for don't transfer - * - user - can be null - person doing the removals - * - * @return TRUE/FALSE for success - */ -/mob/proc/_unequip_item(obj/item/I, flags, newloc, mob/user = src) - PROTECTED_PROC(TRUE) - if(!I) - return TRUE - - var/hand = get_held_index(I) - var/old - if(hand) - if(!can_unequip(I, SLOT_ID_HANDS, flags, user)) - return FALSE - _unequip_held(I, TRUE) - I.unequipped(src, SLOT_ID_HANDS, flags) - old = SLOT_ID_HANDS - else - if(!I.worn_slot) - stack_trace("tried to unequip an item without current equipped slot.") - I.worn_slot = _slot_by_item(I) - if(!can_unequip(I, I.worn_slot, flags, user)) - return FALSE - old = I.worn_slot - _unequip_slot(I.worn_slot, flags) - I.unequipped(src, I.worn_slot, flags) - handle_item_denesting(I, old, flags, user) - - // this qdeleted catches unequipped() deleting the item. - . = QDELETED(I)? FALSE : TRUE - - if(I) - // todo: better rendering that takes observers into account - if(client) - client.screen -= I - I.screen_loc = null - //! at some point we should have /pre_dropped and /pre_pickup, because dropped should logically come after move. - if(I.dropped(src, flags, newloc) == ITEM_RELOCATED_BY_DROPPED) - . = FALSE - else if(QDELETED(I)) - // this check RELIES on dropped() being the first if - // make sure you don't blindly move it!! - // this is meant to catch any potential deletions dropped can cause. - . = FALSE - else - if(!(I.item_flags & ITEM_DROPDEL)) - if(newloc == null) - I.moveToNullspace() - else if(newloc != FALSE) - I.forceMove(newloc) +//? init - log_inventory("[key_name(src)] unequipped [I] from [old].") - - update_action_buttons() +/mob/proc/init_inventory() + return /mob/proc/handle_item_denesting(obj/item/I, old_slot, flags, mob/user) // if the item was inside something, @@ -178,177 +69,6 @@ position_hud_item(over, old_slot) client?.screen |= over -/** - * checks if we can unequip an item - * - * Preconditions: The item is either equipped already, or isn't equipped. - * - * @return TRUE/FALSE - * - * @params - * - I - item - * - slot - slot we're unequipping from - can be null - * - flags - inventory operation hint bitfield, see defines - * - user - stripper - can be null - */ -/mob/proc/can_unequip(obj/item/I, slot, flags, mob/user = src) - // destroyed IS allowed to call these procs - if(I && QDELETED(I) && !QDESTROYING(I)) - to_chat(user, SPAN_DANGER("A deleted [I] was checked in can_unequip(). Report this entire line to coders immediately. Debug data: [I] ([REF(I)]) slot [slot] flags [flags] user [user]")) - to_chat(user, SPAN_DANGER("can_unequip will return TRUE to allow you to drop the item, but expect potential glitches!")) - return TRUE - - if(!slot) - slot = slot_by_item(I) - - if(!(flags & INV_OP_FORCE) && HAS_TRAIT(I, TRAIT_ITEM_NODROP)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[I] is stuck to your hand!")) - return FALSE - - var/blocked_by - if((blocked_by = inventory_slot_reachability_conflict(I, slot, user)) && !(flags & (INV_OP_FORCE | INV_OP_IGNORE_REACHABILITY))) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("\the [blocked_by] is in the way!")) - return FALSE - - // lastly, check item's opinion - if(!I.can_unequip(src, slot, user, flags)) - return FALSE - - return TRUE - -/** - * checks if we can equip an item to a slot - * - * Preconditions: The item will either be equipped on us already, or not yet equipped. - * - * @return TRUE/FALSE - * - * @params - * - I - item - * - slot - slot ID - * - flags - inventory operation hint bitfield, see defines - * - user - user trying to equip that thing to us there - can be null - * - denest_to - the old slot we're leaving if called from handle_item_reequip. **extremely** snowflakey - * - * todo: refactor nesting to not require this shit - */ -/mob/proc/can_equip(obj/item/I, slot, flags, mob/user, denest_to) - // let's NOT. - if(I && QDELETED(I)) - to_chat(user, SPAN_DANGER("A deleted [I] was checked in can_equip(). Report this entire line to coders immediately. Debug data: [I] ([REF(I)]) slot [slot] flags [flags] user [user]")) - to_chat(user, SPAN_DANGER("can_equip will now attempt to prevent the deleted item from being equipped. There should be no glitches.")) - return FALSE - - var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(slot) - var/self_equip = user == src - if(!slot_meta) - . = FALSE - CRASH("Failed to resolve to slot datm.") - - if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) - // special handling: make educated guess, defaulting to yes - switch(slot_meta.type) - if(/datum/inventory_slot_meta/abstract/hand/left) - return (flags & INV_OP_FORCE) || !get_left_held_item() - if(/datum/inventory_slot_meta/abstract/hand/right) - return (flags & INV_OP_FORCE) || !get_right_held_item() - if(/datum/inventory_slot_meta/abstract/put_in_backpack) - var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) - if(!istype(S)) - return FALSE - return S.can_be_inserted(I, TRUE) - if(/datum/inventory_slot_meta/abstract/put_in_belt) - var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) - if(!istype(S)) - return FALSE - return S.can_be_inserted(I, TRUE) - if(/datum/inventory_slot_meta/abstract/put_in_hands) - return (flags & INV_OP_FORCE) || !hands_full() - return TRUE - - if(!inventory_slot_bodypart_check(I, slot, user, flags) && !(flags & INV_OP_FORCE)) - return FALSE - - var/conflict_result = inventory_slot_conflict_check(I, slot) - var/obj/item/to_wear_over - - if((flags & INV_OP_IS_FINAL_CHECK) && conflict_result && (slot != SLOT_ID_HANDS)) - // try to fit over - var/obj/item/conflicting = item_by_slot(slot) - if(conflicting) - // there's something there - var/can_fit_over = I.equip_worn_over_check(src, slot, user, conflicting, flags) - if(can_fit_over) - conflict_result = CAN_EQUIP_SLOT_CONFLICT_NONE - to_wear_over = conflicting - // ! DANGER: snowflake time - // take it out of the slot - _unequip_slot(slot, flags | INV_OP_NO_LOGIC | INV_OP_NO_UPDATE_ICONS) - // recheck - conflict_result = inventory_slot_conflict_check(I, slot) - // put it back in incase something else breaks - _equip_slot(conflicting, slot, flags | INV_OP_NO_LOGIC | INV_OP_NO_UPDATE_ICONS) - - switch(conflict_result) - if(CAN_EQUIP_SLOT_CONFLICT_HARD) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] are already [slot_meta.display_plural? "holding too many things" : "wearing something"] [slot_meta.display_preposition] [self_equip? "your" : "their"] [slot_meta.display_name].")) - return FALSE - if(CAN_EQUIP_SLOT_CONFLICT_SOFT) - if(!(flags & INV_OP_FORCE)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] are already [slot_meta.display_plural? "holding too many things" : "wearing something"] [slot_meta.display_preposition] [self_equip? "your" : "their"] [slot_meta.display_name].")) - return FALSE - - if(!inventory_slot_semantic_conflict(I, slot, user) && !(flags & INV_OP_FORCE)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[I] doesn't fit there.")) - return FALSE - - var/blocked_by - - if((blocked_by = inventory_slot_reachability_conflict(I, slot, user)) && !(flags & (INV_OP_FORCE | INV_OP_IGNORE_REACHABILITY))) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("\the [blocked_by] is in the way!")) - return FALSE - - // lastly, check item's opinion - if(!I.can_equip(src, slot, user, flags)) - return FALSE - - // we're the final check - side effects ARE allowed - if((flags & INV_OP_IS_FINAL_CHECK) && to_wear_over) - //! Note: this means that can_unequip is NOT called for to wear over. - //! This is intentional, but very, very sonwflakey. - to_wear_over.worn_inside = I - // setting worn inside first disallows equip/unequip from triggering - to_wear_over.forceMove(I) - // check we don't have something already (wtf) - if(I.worn_over) - handle_item_denesting(I, denest_to, flags, user) - // set the other way around - I.worn_over = to_wear_over - // tell it we're inserting the old item - I.equip_on_worn_over_insert(src, slot, user, to_wear_over, flags) - // take the old item off our screen - client?.screen -= to_wear_over - to_wear_over.screen_loc = null - to_wear_over.hud_unlayerise() - // we don't call slot re-equips here because the equip proc does this for us - - return TRUE - -/** - * checks if we are missing the bodypart for a slot - * return FALSE if we are missing, or TRUE if we're not - * - * this proc should give the feedback of what's missing! - */ -/mob/proc/inventory_slot_bodypart_check(obj/item/I, slot, mob/user, flags) - return TRUE - /** * drop items if a bodypart is missing */ @@ -392,367 +112,5 @@ if(!inventory_slot_bodypart_check(I, I.worn_slot, null, INV_OP_SILENT)) drop_item_to_ground(I) -/** - * checks for slot conflict - */ -/mob/proc/inventory_slot_conflict_check(obj/item/I, slot) - if(_item_by_slot(slot)) - return CAN_EQUIP_SLOT_CONFLICT_HARD - switch(slot) - if(SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR) - if(I.slot_flags & SLOT_TWOEARS) - if(_item_by_slot(SLOT_ID_LEFT_EAR) || _item_by_slot(SLOT_ID_RIGHT_EAR)) - return CAN_EQUIP_SLOT_CONFLICT_SOFT - return CAN_EQUIP_SLOT_CONFLICT_NONE - -/** - * checks if you can reach a slot - * return null or the first item blocking - */ -/mob/proc/inventory_slot_reachability_conflict(obj/item/I, slot, mob/user) - return null - -/** - * semantic check - should this item fit here? slot flag checks/etc should go in here. - * - * return TRUE if conflicting, otherwise FALSE - */ -/mob/proc/inventory_slot_semantic_conflict(obj/item/I, datum/inventory_slot_meta/slot, mob/user) - . = FALSE - slot = resolve_inventory_slot_meta(slot) - return slot._equip_check(I, src, user) - -/** - * handles internal logic of equipping an item - * - * @params - * - I - item to equip - * - flags - inventory operation hint flags, see defines - * - slot - slot to equip it to - * - user - user trying to put it on us - * - * @return TRUE/FALSE on success - */ -/mob/proc/_equip_item(obj/item/I, flags, slot, mob/user = src) - PROTECTED_PROC(TRUE) - - if(!I) // how tf would we put on "null"? - return FALSE - - // resolve slot - var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(slot) - if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) - // if it's abstract, we go there directly - do not use can_equip as that will just guess. - return handle_abstract_slot_insertion(I, slot, flags) - - var/old_slot = slot_by_item(I) - - if(old_slot) - . = _handle_item_reequip(I, slot, old_slot, flags, user) - if(!.) - return - - log_inventory("[key_name(src)] moved [I] from [old_slot] to [slot].") - else - if(!can_equip(I, slot, flags | INV_OP_IS_FINAL_CHECK, user)) - return FALSE - - var/atom/oldLoc = I.loc - if(I.loc != src) - I.forceMove(src) - if(I.loc != src) - // UH OH, SOMEONE MOVED US - log_inventory("[key_name(src)] failed to equip [I] to slot (loc sanity failed).") - // UH OH x2, WE GOT WORN OVER SOMETHING - if(I.worn_over) - handle_item_denesting(I, slot, INV_OP_FATAL, user) - return FALSE - - _equip_slot(I, slot, flags) - - // TODO: HANDLE DELETIONS IN PICKUP AND EQUIPPED PROPERLY - I.pickup(src, flags, oldLoc) - I.equipped(src, slot, flags) - - log_inventory("[key_name(src)] equipped [I] to [slot].") - - update_action_buttons() - - if(I.zoom) - I.zoom() - - return TRUE - -/** - * checks if we already have something in our inventory - * if so, this will try to shift the slots over, calling equipped/unequipped automatically - * - * INV_OP_FORCE will allow ignoring can unequip. - * - * return true/false based on if we succeeded - */ -/mob/proc/_handle_item_reequip(obj/item/I, slot, old_slot, flags, mob/user = src) - ASSERT(slot) - if(!old_slot) - // DO NOT USE _slot_by_item - at this point, the item has already been var-set into the new slot! - // slot_by_item however uses cached values still! - old_slot = slot_by_item(I) - if(!old_slot) - // still not there, wasn't already in inv - return FALSE - // this IS a slot shift! - . = old_slot - if((slot == old_slot) && (slot != SLOT_ID_HANDS)) - // lol we're done (unless it was hands) - return TRUE - if(slot == SLOT_ID_HANDS) - // if we're going into hands, - // just check can unequip - if(!can_unequip(I, old_slot, flags, user)) - // check can unequip - return FALSE - // call procs - if(old_slot == SLOT_ID_HANDS) - _unequip_held(I, flags) - else - _unequip_slot(old_slot, flags) - I.unequipped(src, old_slot, flags) - // sigh - handle_item_denesting(I, old_slot, flags, user) - // TODO: HANDLE DELETIONS ON EQUIPPED PROPERLY, INCLUDING ON HANDS - // ? we don't do this on hands, hand procs do it - // _equip_slot(I, slot, update_icons) - I.equipped(src, slot, flags) - log_inventory("[key_name(src)] moved [I] from [old_slot] to hands.") - // hand procs handle rest - return TRUE - else - // else, this gets painful - if(!can_unequip(I, old_slot, flags, user)) - return FALSE - if(!can_equip(I, slot, flags | INV_OP_IS_FINAL_CHECK, user, old_slot)) - return FALSE - // ?if it's from hands, hands aren't a slot. - if(old_slot == SLOT_ID_HANDS) - _unequip_held(I, flags) - else - _unequip_slot(old_slot, flags) - I.unequipped(src, old_slot, flags) - // TODO: HANDLE DELETIONS ON EQUIPPED PROPERLY - // sigh - _equip_slot(I, slot, flags) - I.equipped(src, slot, flags) - log_inventory("[key_name(src)] moved [I] from [old_slot] to [slot].") - return TRUE - -/** - * handles removing an item from our hud - * - * some things call us from outside inventory code. this is shitcode and shouldn't be propageted. - */ -/mob/proc/_handle_inventory_hud_remove(obj/item/I) - if(client) - client.screen -= I - I.screen_loc = null - -/** - * handles adding an item or updating an item to our hud - */ -/mob/proc/_handle_inventory_hud_update(obj/item/I, slot) - var/datum/inventory_slot_meta/meta = resolve_inventory_slot_meta(slot) - I.screen_loc = meta.hud_position - if(client) - client.screen |= I - -/** - * get all equipped items - * - * @params - * include_inhands - include held items too? - * include_restraints - include restraints too? - */ -/mob/proc/get_equipped_items(include_inhands, include_restraints) - return get_held_items() + _get_all_slots(include_restraints) - -/** - * wipe our inventory - * - * @params - * include_inhands - include held items too? - * include_restraints - include restraints too? - */ -/mob/proc/delete_inventory(include_inhands = TRUE, include_restraints = TRUE) - for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) - qdel(I) - -/** - * drops everything in our inventory - * - * @params - * - include_inhands - include held items too? - * - include_restraints - include restraints too? - * - force - ignore nodrop and all that - */ -/mob/proc/drop_inventory(include_inhands = TRUE, include_restraints = TRUE, force = TRUE) - for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) - drop_item_to_ground(I, INV_OP_SILENT | INV_OP_FLUFFLESS | (force? INV_OP_FORCE : NONE)) - - // todo: handle what happens if dropping something requires a logic thing - // e.g. dropping jumpsuit makes it impossible to transfer a belt since it - // de-equipped from the jumpsuit - -/mob/proc/transfer_inventory_to_loc(atom/newLoc, include_inhands = TRUE, include_restraints = TRUE, force = TRUE) - for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) - transfer_item_to_loc(I, newLoc, INV_OP_SILENT | INV_OP_FLUFFLESS | (force? INV_OP_FORCE : NONE)) - // todo: handle what happens if dropping something requires a logic thing - // e.g. dropping jumpsuit makes it impossible to transfer a belt since it - // de-equipped from the jumpsuit - -/** - * gets the primary item in a slot - * null if not in inventory. inhands don't count as inventory here, use held item procs. - */ -/mob/proc/item_by_slot(slot) - return _item_by_slot(slot) // why the needless indirection? so people don't override this for slots! - -/** - * gets the primary item and nested items (e.g. gloves, magboots, accessories) in a slot - * null if not in inventory, otherwise list - * inhands do not count as inventory - */ -/mob/proc/items_by_slot(slot) - var/obj/item/I = _item_by_slot(slot) - if(!I) - return list() - I = I.inv_slot_attached() - return islist(I)? I : list(I) - -/** - * returns if we have something equipped - the slot if it is, null if not - * - * SLOT_ID_HANDS if in hands - */ -/mob/proc/is_in_inventory(obj/item/I) - return (I?.worn_mob() == src) && I.worn_slot - // we use entirely cached vars for speed. - // if this returns bad data well fuck you, don't break equipped()/unequipped(). - -/** - * returns if an item is in inventory (equipped) rather than hands - */ -/mob/proc/is_wearing(obj/item/I) - var/slot = is_in_inventory(I) - return slot && (slot != SLOT_ID_HANDS) - -/** - * get slot of item if it's equipped. - * null if not in inventory. SLOT_HANDS if held. - */ -/mob/proc/slot_by_item(obj/item/I) - return is_in_inventory(I) || null // short circuited to that too - // if equipped/unequipped didn't set worn_slot well jokes on you lmfao - -/mob/proc/_equip_slot(obj/item/I, slot, flags) - SHOULD_NOT_OVERRIDE(TRUE) - . = _set_inv_slot(slot, I, flags) != INVENTORY_SLOT_DOES_NOT_EXIST - -/mob/proc/_unequip_slot(slot, flags) - SHOULD_NOT_OVERRIDE(TRUE) - . = _set_inv_slot(slot, null, flags) != INVENTORY_SLOT_DOES_NOT_EXIST - /mob/proc/_unequip_held(obj/item/I, flags) return - -/mob/proc/has_slot(id) - SHOULD_NOT_OVERRIDE(TRUE) - return _item_by_slot(id) != INVENTORY_SLOT_DOES_NOT_EXIST - -// todo: both of these below procs needs optimization for when we need the datum anyways, to avoid two lookups - -/mob/proc/semantically_has_slot(id) - return has_slot(id) && _semantic_slot_id_check(id) - -/mob/proc/get_inventory_slot_ids(semantic, sorted) - // get all - if(sorted) - . = list() - for(var/id as anything in GLOB.inventory_slot_meta) - if(!semantically_has_slot(id)) - continue - . += id - return - else - . = _get_inventory_slot_ids() - // check if we should filter - if(!semantic) - return - . = _get_inventory_slot_ids() - for(var/id in .) - if(!_semantic_slot_id_check(id)) - . -= id - -/** - * THESE PROCS MUST BE OVERRIDDEN FOR NEW SLOTS ON MOBS - * yes, i managed to shove all basic behaviors that needed overriding into 5-6 procs - * you're - * welcome. - * - * These are UNSAFE PROCS. - * - * oh and can_equip_x* might need overriding for complex mobs like humans but frankly - * sue me, there's no better way right now. - */ - -/** - * sets a slot to icon or null - * - * some behaviors may be included other than update icons - * even update icons is unpreferred but we're stuck with this for now. - * - * todo: logic should be moved out of the proc, but where? - * - * @params - * slot - slot to set - * I - item or null - * update_icons - update icons immediately? - * logic - apply logic like dropping stuff from pockets when unequippiing a jumpsuit imemdiately? - */ -/mob/proc/_set_inv_slot(slot, obj/item/I, flags) - PROTECTED_PROC(TRUE) - . = INVENTORY_SLOT_DOES_NOT_EXIST - CRASH("Attempting to set inv slot of [slot] to [I] went to base /mob. You probably had someone assigning to a nonexistant slot!") - -/** - * ""expensive"" proc that scans for the real slot of an item - * usually used when safety checks detect something is amiss - */ -/mob/proc/_slot_by_item(obj/item/I) - PROTECTED_PROC(TRUE) - -/** - * doubles as slot detection - * returns -1 if no slot - * YES, MAGIC VALUE BUT SOLE USER IS 20 LINES ABOVE, SUE ME. - */ -/mob/proc/_item_by_slot(slot) - PROTECTED_PROC(TRUE) - return INVENTORY_SLOT_DOES_NOT_EXIST - -/mob/proc/_get_all_slots(include_restraints) - PROTECTED_PROC(TRUE) - return list() - -/** - * return all slot ids we implement - */ -/mob/proc/_get_inventory_slot_ids() - PROTECTED_PROC(TRUE) - return list() - -/** - * override this if you need to make a slot not semantically exist - * useful for other species that don't have a slot so you don't have jumpsuit requirements apply - */ -/mob/proc/_semantic_slot_id_check(id) - PROTECTED_PROC(TRUE) - return TRUE diff --git a/code/modules/mob/inventory/item_hooks.dm b/code/modules/mob/inventory/item_hooks.dm new file mode 100644 index 000000000000..bde4816c74ba --- /dev/null +++ b/code/modules/mob/inventory/item_hooks.dm @@ -0,0 +1,28 @@ +// doMove hook to ensure proper functionality when inv procs aren't called +/obj/item/doMove(atom/destination) + if(worn_slot && !worn_hook_suppressed) + // inventory handling + if(destination == worn_inside) + return ..() + var/mob/M = worn_mob() + if(!ismob(M)) + worn_slot = null + worn_hook_suppressed = FALSE + stack_trace("item forcemove inv hook called without a mob as loc??") + M.temporarily_remove_from_inventory(src, INV_OP_FORCE) + return ..() + +// todo: this is fucking awful +/obj/item/Move(atom/newloc, direct, glide_size_override) + if(!worn_slot) + return ..() + var/mob/M = worn_mob() + if(istype(M)) + M.temporarily_remove_from_inventory(src, INV_OP_FORCE) + else + stack_trace("item Move inv hook called without a mob as loc??") + worn_slot = null + . = ..() + if(!. || (loc == M)) + // kick them out + forceMove(M.drop_location()) diff --git a/code/modules/mob/inventory/item_public.dm b/code/modules/mob/inventory/item_public.dm index f13daca9de6e..36fe310228f6 100644 --- a/code/modules/mob/inventory/item_public.dm +++ b/code/modules/mob/inventory/item_public.dm @@ -230,6 +230,27 @@ return FALSE return TRUE +/** + * automatically unequip if we're missing beltlink + */ +/obj/item/proc/reconsider_beltlink() + var/mob/M = loc + if(!istype(M)) + return + if(!worn_slot) + return + if(!equip_check_beltlink(M, worn_slot, null, INV_OP_SILENT)) + M.drop_item_to_ground(src) + return + +//* Speed / Carry Weight *// + +/** + * get the slowdown we incur when we're worn + */ +/obj/item/proc/get_equipment_speed_mod() + return slowdown + //* ADVANCED: Wear-Over System *// /** diff --git a/code/modules/mob/inventory/rendering.dm b/code/modules/mob/inventory/item_rendering.dm similarity index 95% rename from code/modules/mob/inventory/rendering.dm rename to code/modules/mob/inventory/item_rendering.dm index 164aa61eb697..26887537da03 100644 --- a/code/modules/mob/inventory/rendering.dm +++ b/code/modules/mob/inventory/item_rendering.dm @@ -1,5 +1,7 @@ /** * Item rendering system + * Procs in here can be called and overridden as needed, but you should know what you're doing + * if you choose to do so! * * * IF YOU ONLY CARE ABOUT MAKING A NEW ITEM OR ARE CONVERTING AN ITEM, JUST READ THIS!! * @@ -240,6 +242,44 @@ CONSTRUCT_BODYTYPES(worn_bodytypes_invisible) CONSTRUCT_BODYTYPES(worn_bodytypes_fallback) +/** + * update our worn icon if we can + */ +/obj/item/proc/update_worn_icon() + if(!worn_slot) + return // acceptable + var/mob/M = worn_mob() + ASSERT(M) // not acceptable + switch(worn_slot) + if(SLOT_ID_BACK) + M.update_inv_back() + if(SLOT_ID_BELT) + M.update_inv_belt() + if(SLOT_ID_GLASSES) + M.update_inv_glasses() + if(SLOT_ID_GLOVES) + M.update_inv_gloves() + if(SLOT_ID_HANDCUFFED) + M.update_inv_handcuffed() + if(SLOT_ID_HANDS) + M.update_inv_hands() + if(SLOT_ID_HEAD) + M.update_inv_head() + if(SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR) + M.update_inv_ears() + if(SLOT_ID_MASK) + M.update_inv_wear_mask() + if(SLOT_ID_SHOES) + M.update_inv_shoes() + if(SLOT_ID_SUIT) + M.update_inv_wear_suit() + if(SLOT_ID_SUIT_STORAGE) + M.update_inv_s_store() + if(SLOT_ID_UNIFORM) + M.update_inv_w_uniform() + if(SLOT_ID_WORN_ID) + M.update_inv_wear_id() + /** * Renders either a list, or a single image or mutable appearance of what we should be applied to a mob with. * diff --git a/code/modules/mob/inventory/items.dm b/code/modules/mob/inventory/items.dm deleted file mode 100644 index 8168d8e2fbc2..000000000000 --- a/code/modules/mob/inventory/items.dm +++ /dev/null @@ -1,110 +0,0 @@ -/obj/item - /// currently equipped slot id - var/worn_slot - /** - * current item we fitted over - * ! DANGER: While this is more or less bug-free for "won't lose the item when you unequip/won't get stuck", we - * ! do not promise anything for functionality - this is a SNOWFLAKE SYSTEM. - */ - var/obj/item/worn_over - /** - * current item we're fitted in. - */ - var/obj/item/worn_inside - /// suppress auto inventory hooks in forceMove - var/worn_hook_suppressed = FALSE - -/obj/item/Destroy() - if(worn_slot && !worn_hook_suppressed) - var/mob/M = worn_mob() - if(!ismob(M)) - stack_trace("invalid current equipped slot [worn_slot] on an item not on a mob.") - return ..() - M.temporarily_remove_from_inventory(src, INV_OP_FORCE | INV_OP_DELETING) - return ..() - -/** - * get the slowdown we incur when we're worn - */ -/obj/item/proc/get_equipment_speed_mod() - return slowdown - -/** - * update our worn icon if we can - */ -/obj/item/proc/update_worn_icon() - if(!worn_slot) - return // acceptable - var/mob/M = worn_mob() - ASSERT(M) // not acceptable - switch(worn_slot) - if(SLOT_ID_BACK) - M.update_inv_back() - if(SLOT_ID_BELT) - M.update_inv_belt() - if(SLOT_ID_GLASSES) - M.update_inv_glasses() - if(SLOT_ID_GLOVES) - M.update_inv_gloves() - if(SLOT_ID_HANDCUFFED) - M.update_inv_handcuffed() - if(SLOT_ID_HANDS) - M.update_inv_hands() - if(SLOT_ID_HEAD) - M.update_inv_head() - if(SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR) - M.update_inv_ears() - if(SLOT_ID_MASK) - M.update_inv_wear_mask() - if(SLOT_ID_SHOES) - M.update_inv_shoes() - if(SLOT_ID_SUIT) - M.update_inv_wear_suit() - if(SLOT_ID_SUIT_STORAGE) - M.update_inv_s_store() - if(SLOT_ID_UNIFORM) - M.update_inv_w_uniform() - if(SLOT_ID_WORN_ID) - M.update_inv_wear_id() - -/** - * automatically unequip if we're missing beltlink - */ -/obj/item/proc/reconsider_beltlink() - var/mob/M = loc - if(!istype(M)) - return - if(!worn_slot) - return - if(!equip_check_beltlink(M, worn_slot, null, INV_OP_SILENT)) - M.drop_item_to_ground(src) - return - -// doMove hook to ensure proper functionality when inv procs aren't called -/obj/item/doMove(atom/destination) - if(worn_slot && !worn_hook_suppressed) - // inventory handling - if(destination == worn_inside) - return ..() - var/mob/M = worn_mob() - if(!ismob(M)) - worn_slot = null - worn_hook_suppressed = FALSE - stack_trace("item forcemove inv hook called without a mob as loc??") - M.temporarily_remove_from_inventory(src, INV_OP_FORCE) - return ..() - -// todo: this is fucking awful -/obj/item/Move(atom/newloc, direct, glide_size_override) - if(!worn_slot) - return ..() - var/mob/M = worn_mob() - if(istype(M)) - M.temporarily_remove_from_inventory(src, INV_OP_FORCE) - else - stack_trace("item Move inv hook called without a mob as loc??") - worn_slot = null - . = ..() - if(!. || (loc == M)) - // kick them out - forceMove(M.drop_location()) diff --git a/code/modules/mob/inventory/mob_abstraction.dm b/code/modules/mob/inventory/mob_abstraction.dm new file mode 100644 index 000000000000..e14bc2ad69b0 --- /dev/null +++ b/code/modules/mob/inventory/mob_abstraction.dm @@ -0,0 +1,118 @@ +/** + * Abstraction procs + * + * With these, you can implement different inventory handling per mob + * These should usually not be called by non-mobs / items / etc. + * + * Core abstraction should never be called from outside + * Optional abstraction can be called with the caveat that you should be very careful in doing so. + */ + +//* Core Abstraction *// + +/** + * THESE PROCS MUST BE OVERRIDDEN FOR NEW SLOTS ON MOBS + * yes, i managed to shove all basic behaviors that needed overriding into 5-6 procs + * you're + * welcome. + * + * These are UNSAFE PROCS. + * + * oh and can_equip_x* might need overriding for complex mobs like humans but frankly + * sue me, there's no better way right now. + */ + +/** + * sets a slot to icon or null + * + * some behaviors may be included other than update icons + * even update icons is unpreferred but we're stuck with this for now. + * + * todo: logic should be moved out of the proc, but where? + * + * @params + * slot - slot to set + * I - item or null + * update_icons - update icons immediately? + * logic - apply logic like dropping stuff from pockets when unequippiing a jumpsuit imemdiately? + */ +/mob/proc/_set_inv_slot(slot, obj/item/I, flags) + PROTECTED_PROC(TRUE) + . = INVENTORY_SLOT_DOES_NOT_EXIST + CRASH("Attempting to set inv slot of [slot] to [I] went to base /mob. You probably had someone assigning to a nonexistant slot!") + +/** + * ""expensive"" proc that scans for the real slot of an item + * usually used when safety checks detect something is amiss + */ +/mob/proc/_slot_by_item(obj/item/I) + PROTECTED_PROC(TRUE) + +/** + * doubles as slot detection + * returns -1 if no slot + * YES, MAGIC VALUE BUT SOLE USER IS 20 LINES ABOVE, SUE ME. + */ +/mob/proc/_item_by_slot(slot) + PROTECTED_PROC(TRUE) + return INVENTORY_SLOT_DOES_NOT_EXIST + +/mob/proc/_get_all_slots(include_restraints) + PROTECTED_PROC(TRUE) + return list() + +/** + * return all slot ids we implement + */ +/mob/proc/_get_inventory_slot_ids() + PROTECTED_PROC(TRUE) + return list() + +/** + * override this if you need to make a slot not semantically exist + * useful for other species that don't have a slot so you don't have jumpsuit requirements apply + */ +/mob/proc/_semantic_slot_id_check(id) + PROTECTED_PROC(TRUE) + return TRUE + +//* Optional Behaviors *// + +/** + * checks for slot conflict + */ +/mob/proc/inventory_slot_conflict_check(obj/item/I, slot) + if(_item_by_slot(slot)) + return CAN_EQUIP_SLOT_CONFLICT_HARD + switch(slot) + if(SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR) + if(I.slot_flags & SLOT_TWOEARS) + if(_item_by_slot(SLOT_ID_LEFT_EAR) || _item_by_slot(SLOT_ID_RIGHT_EAR)) + return CAN_EQUIP_SLOT_CONFLICT_SOFT + return CAN_EQUIP_SLOT_CONFLICT_NONE + +/** + * checks if you can reach a slot + * return null or the first item blocking + */ +/mob/proc/inventory_slot_reachability_conflict(obj/item/I, slot, mob/user) + return null + +/** + * semantic check - should this item fit here? slot flag checks/etc should go in here. + * + * return TRUE if conflicting, otherwise FALSE + */ +/mob/proc/inventory_slot_semantic_conflict(obj/item/I, datum/inventory_slot_meta/slot, mob/user) + . = FALSE + slot = resolve_inventory_slot_meta(slot) + return slot._equip_check(I, src, user) + +/** + * checks if we are missing the bodypart for a slot + * return FALSE if we are missing, or TRUE if we're not + * + * this proc should give the feedback of what's missing! + */ +/mob/proc/inventory_slot_bodypart_check(obj/item/I, slot, mob/user, flags) + return TRUE diff --git a/code/modules/mob/inventory/mob_internal.dm b/code/modules/mob/inventory/mob_internal.dm new file mode 100644 index 000000000000..16ecad5627fd --- /dev/null +++ b/code/modules/mob/inventory/mob_internal.dm @@ -0,0 +1,276 @@ +/** + * Internal inventory logic + * You shouldn't be calling or modifying these without good reason. + */ + +//* Routing *// + +/** + * handles the insertion + * item can be moved or not moved before calling + * + * slot must be a typepath + * + * @return true/false based on if it worked + */ +/mob/proc/handle_abstract_slot_insertion(obj/item/I, slot, flags) + if(!ispath(slot, /datum/inventory_slot_meta/abstract)) + slot = resolve_inventory_slot_meta(slot)?.type + if(!ispath(slot, /datum/inventory_slot_meta/abstract)) + stack_trace("invalid slot: [slot]") + else if(slot != /datum/inventory_slot_meta/abstract/put_in_hands) + stack_trace("attempted usage of slot id in abstract insertion converted successfully") + . = FALSE + switch(slot) + if(/datum/inventory_slot_meta/abstract/hand/left) + return put_in_left_hand(I, flags) + if(/datum/inventory_slot_meta/abstract/hand/right) + return put_in_right_hand(I, flags) + if(/datum/inventory_slot_meta/abstract/put_in_belt) + var/obj/item/storage/S = item_by_slot(SLOT_ID_BELT) + return istype(S) && S.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE) + if(/datum/inventory_slot_meta/abstract/put_in_backpack) + var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) + return istype(S) && S.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE) + if(/datum/inventory_slot_meta/abstract/put_in_hands) + return put_in_hands(I, flags) + if(/datum/inventory_slot_meta/abstract/put_in_storage, /datum/inventory_slot_meta/abstract/put_in_storage_try_active) + if(slot == /datum/inventory_slot_meta/abstract/put_in_storage_try_active) + if(s_active && Adjacent(s_active) && s_active.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE)) + return TRUE + for(var/obj/item/storage/S in get_equipped_items_in_slots(list( + SLOT_ID_BELT, + SLOT_ID_BACK, + SLOT_ID_UNIFORM, + SLOT_ID_SUIT, + SLOT_ID_LEFT_POCKET, + SLOT_ID_RIGHT_POCKET + )) + get_held_items()) + if(S.try_insert(I, src, INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE)) + return TRUE + return FALSE + if(/datum/inventory_slot_meta/abstract/attach_as_accessory) + for(var/obj/item/clothing/C in get_equipped_items()) + if(C.attempt_attach_accessory(I)) + return TRUE + return FALSE + else + CRASH("Invalid abstract slot [slot]") + +//* Unequip *// + +/** + * handles internal logic of unequipping an item + * + * @params + * - I - item + * - flags - inventory operation hint bitfield, see defines + * - newloc - where to transfer to. null for nullspace, FALSE for don't transfer + * - user - can be null - person doing the removals + * + * @return TRUE/FALSE for success + */ +/mob/proc/_unequip_item(obj/item/I, flags, newloc, mob/user = src) + PROTECTED_PROC(TRUE) + if(!I) + return TRUE + + var/hand = get_held_index(I) + var/old + if(hand) + if(!can_unequip(I, SLOT_ID_HANDS, flags, user)) + return FALSE + _unequip_held(I, TRUE) + I.unequipped(src, SLOT_ID_HANDS, flags) + old = SLOT_ID_HANDS + else + if(!I.worn_slot) + stack_trace("tried to unequip an item without current equipped slot.") + I.worn_slot = _slot_by_item(I) + if(!can_unequip(I, I.worn_slot, flags, user)) + return FALSE + old = I.worn_slot + _unequip_slot(I.worn_slot, flags) + I.unequipped(src, I.worn_slot, flags) + handle_item_denesting(I, old, flags, user) + + // this qdeleted catches unequipped() deleting the item. + . = QDELETED(I)? FALSE : TRUE + + if(I) + // todo: better rendering that takes observers into account + if(client) + client.screen -= I + I.screen_loc = null + //! at some point we should have /pre_dropped and /pre_pickup, because dropped should logically come after move. + if(I.dropped(src, flags, newloc) == ITEM_RELOCATED_BY_DROPPED) + . = FALSE + else if(QDELETED(I)) + // this check RELIES on dropped() being the first if + // make sure you don't blindly move it!! + // this is meant to catch any potential deletions dropped can cause. + . = FALSE + else + if(!(I.item_flags & ITEM_DROPDEL)) + if(newloc == null) + I.moveToNullspace() + else if(newloc != FALSE) + I.forceMove(newloc) + + log_inventory("[key_name(src)] unequipped [I] from [old].") + + update_action_buttons() + +/mob/proc/_unequip_slot(slot, flags) + SHOULD_NOT_OVERRIDE(TRUE) + . = _set_inv_slot(slot, null, flags) != INVENTORY_SLOT_DOES_NOT_EXIST + +/** + * handles removing an item from our hud + * + * some things call us from outside inventory code. this is shitcode and shouldn't be propageted. + */ +/mob/proc/_handle_inventory_hud_remove(obj/item/I) + if(client) + client.screen -= I + I.screen_loc = null + +//* Equip *// + +/** + * handles internal logic of equipping an item + * + * @params + * - I - item to equip + * - flags - inventory operation hint flags, see defines + * - slot - slot to equip it to + * - user - user trying to put it on us + * + * @return TRUE/FALSE on success + */ +/mob/proc/_equip_item(obj/item/I, flags, slot, mob/user = src) + PROTECTED_PROC(TRUE) + + if(!I) // how tf would we put on "null"? + return FALSE + + // resolve slot + var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(slot) + if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) + // if it's abstract, we go there directly - do not use can_equip as that will just guess. + return handle_abstract_slot_insertion(I, slot, flags) + + var/old_slot = slot_by_item(I) + + if(old_slot) + . = _handle_item_reequip(I, slot, old_slot, flags, user) + if(!.) + return + + log_inventory("[key_name(src)] moved [I] from [old_slot] to [slot].") + else + if(!can_equip(I, slot, flags | INV_OP_IS_FINAL_CHECK, user)) + return FALSE + + var/atom/oldLoc = I.loc + if(I.loc != src) + I.forceMove(src) + if(I.loc != src) + // UH OH, SOMEONE MOVED US + log_inventory("[key_name(src)] failed to equip [I] to slot (loc sanity failed).") + // UH OH x2, WE GOT WORN OVER SOMETHING + if(I.worn_over) + handle_item_denesting(I, slot, INV_OP_FATAL, user) + return FALSE + + _equip_slot(I, slot, flags) + + // TODO: HANDLE DELETIONS IN PICKUP AND EQUIPPED PROPERLY + I.pickup(src, flags, oldLoc) + I.equipped(src, slot, flags) + + log_inventory("[key_name(src)] equipped [I] to [slot].") + + update_action_buttons() + + if(I.zoom) + I.zoom() + + return TRUE + +/mob/proc/_equip_slot(obj/item/I, slot, flags) + SHOULD_NOT_OVERRIDE(TRUE) + . = _set_inv_slot(slot, I, flags) != INVENTORY_SLOT_DOES_NOT_EXIST + +/** + * handles adding an item or updating an item to our hud + */ +/mob/proc/_handle_inventory_hud_update(obj/item/I, slot) + var/datum/inventory_slot_meta/meta = resolve_inventory_slot_meta(slot) + I.screen_loc = meta.hud_position + if(client) + client.screen |= I + +//* Slot Change *// + +/** + * checks if we already have something in our inventory + * if so, this will try to shift the slots over, calling equipped/unequipped automatically + * + * INV_OP_FORCE will allow ignoring can unequip. + * + * return true/false based on if we succeeded + */ +/mob/proc/_handle_item_reequip(obj/item/I, slot, old_slot, flags, mob/user = src) + ASSERT(slot) + if(!old_slot) + // DO NOT USE _slot_by_item - at this point, the item has already been var-set into the new slot! + // slot_by_item however uses cached values still! + old_slot = slot_by_item(I) + if(!old_slot) + // still not there, wasn't already in inv + return FALSE + // this IS a slot shift! + . = old_slot + if((slot == old_slot) && (slot != SLOT_ID_HANDS)) + // lol we're done (unless it was hands) + return TRUE + if(slot == SLOT_ID_HANDS) + // if we're going into hands, + // just check can unequip + if(!can_unequip(I, old_slot, flags, user)) + // check can unequip + return FALSE + // call procs + if(old_slot == SLOT_ID_HANDS) + _unequip_held(I, flags) + else + _unequip_slot(old_slot, flags) + I.unequipped(src, old_slot, flags) + // sigh + handle_item_denesting(I, old_slot, flags, user) + // TODO: HANDLE DELETIONS ON EQUIPPED PROPERLY, INCLUDING ON HANDS + // ? we don't do this on hands, hand procs do it + // _equip_slot(I, slot, update_icons) + I.equipped(src, slot, flags) + log_inventory("[key_name(src)] moved [I] from [old_slot] to hands.") + // hand procs handle rest + return TRUE + else + // else, this gets painful + if(!can_unequip(I, old_slot, flags, user)) + return FALSE + if(!can_equip(I, slot, flags | INV_OP_IS_FINAL_CHECK, user, old_slot)) + return FALSE + // ?if it's from hands, hands aren't a slot. + if(old_slot == SLOT_ID_HANDS) + _unequip_held(I, flags) + else + _unequip_slot(old_slot, flags) + I.unequipped(src, old_slot, flags) + // TODO: HANDLE DELETIONS ON EQUIPPED PROPERLY + // sigh + _equip_slot(I, slot, flags) + I.equipped(src, slot, flags) + log_inventory("[key_name(src)] moved [I] from [old_slot] to [slot].") + return TRUE diff --git a/code/modules/mob/inventory/mob_public.dm b/code/modules/mob/inventory/mob_public.dm index 17ed1b0213c6..e7257dbd6d57 100644 --- a/code/modules/mob/inventory/mob_public.dm +++ b/code/modules/mob/inventory/mob_public.dm @@ -1,9 +1,210 @@ -//? init +//* Checks / Enumerations *// -/mob/proc/init_inventory() - return +/** + * gets the primary item in a slot + * null if not in inventory. inhands don't count as inventory here, use held item procs. + */ +/mob/proc/item_by_slot(slot) + return _item_by_slot(slot) // why the needless indirection? so people don't override this for slots! + +/** + * gets the primary item and nested items (e.g. gloves, magboots, accessories) in a slot + * null if not in inventory, otherwise list + * inhands do not count as inventory + */ +/mob/proc/items_by_slot(slot) + var/obj/item/I = _item_by_slot(slot) + if(!I) + return list() + I = I.inv_slot_attached() + return islist(I)? I : list(I) + +/** + * returns if we have something equipped - the slot if it is, null if not + * + * SLOT_ID_HANDS if in hands + */ +/mob/proc/is_in_inventory(obj/item/I) + return (I?.worn_mob() == src) && I.worn_slot + // we use entirely cached vars for speed. + // if this returns bad data well fuck you, don't break equipped()/unequipped(). + +/** + * returns if an item is in inventory (equipped) rather than hands + */ +/mob/proc/is_wearing(obj/item/I) + var/slot = is_in_inventory(I) + return slot && (slot != SLOT_ID_HANDS) + +/** + * get slot of item if it's equipped. + * null if not in inventory. SLOT_HANDS if held. + */ +/mob/proc/slot_by_item(obj/item/I) + return is_in_inventory(I) || null // short circuited to that too + // if equipped/unequipped didn't set worn_slot well jokes on you lmfao + +/** + * get all equipped items + * + * @params + * include_inhands - include held items too? + * include_restraints - include restraints too? + */ +/mob/proc/get_equipped_items(include_inhands, include_restraints) + return get_held_items() + _get_all_slots(include_restraints) + +// todo: below procs needs optimization for when we need the datum anyways, to avoid two lookups + +/mob/proc/has_slot(id) + SHOULD_NOT_OVERRIDE(TRUE) + return _item_by_slot(id) != INVENTORY_SLOT_DOES_NOT_EXIST + +/mob/proc/semantically_has_slot(id) + return has_slot(id) && _semantic_slot_id_check(id) + +/mob/proc/get_inventory_slot_ids(semantic, sorted) + // get all + if(sorted) + . = list() + for(var/id as anything in GLOB.inventory_slot_meta) + if(!semantically_has_slot(id)) + continue + . += id + return + else + . = _get_inventory_slot_ids() + // check if we should filter + if(!semantic) + return + . = _get_inventory_slot_ids() + for(var/id in .) + if(!_semantic_slot_id_check(id)) + . -= id + +//* Equipping *// + +/** + * checks if we can equip an item to a slot + * + * Preconditions: The item will either be equipped on us already, or not yet equipped. + * + * @return TRUE/FALSE + * + * @params + * - I - item + * - slot - slot ID + * - flags - inventory operation hint bitfield, see defines + * - user - user trying to equip that thing to us there - can be null + * - denest_to - the old slot we're leaving if called from handle_item_reequip. **extremely** snowflakey + * + * todo: refactor nesting to not require this shit + */ +/mob/proc/can_equip(obj/item/I, slot, flags, mob/user, denest_to) + // let's NOT. + if(I && QDELETED(I)) + to_chat(user, SPAN_DANGER("A deleted [I] was checked in can_equip(). Report this entire line to coders immediately. Debug data: [I] ([REF(I)]) slot [slot] flags [flags] user [user]")) + to_chat(user, SPAN_DANGER("can_equip will now attempt to prevent the deleted item from being equipped. There should be no glitches.")) + return FALSE + + var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(slot) + var/self_equip = user == src + if(!slot_meta) + . = FALSE + CRASH("Failed to resolve to slot datm.") + + if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) + // special handling: make educated guess, defaulting to yes + switch(slot_meta.type) + if(/datum/inventory_slot_meta/abstract/hand/left) + return (flags & INV_OP_FORCE) || !get_left_held_item() + if(/datum/inventory_slot_meta/abstract/hand/right) + return (flags & INV_OP_FORCE) || !get_right_held_item() + if(/datum/inventory_slot_meta/abstract/put_in_backpack) + var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) + if(!istype(S)) + return FALSE + return S.can_be_inserted(I, TRUE) + if(/datum/inventory_slot_meta/abstract/put_in_belt) + var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) + if(!istype(S)) + return FALSE + return S.can_be_inserted(I, TRUE) + if(/datum/inventory_slot_meta/abstract/put_in_hands) + return (flags & INV_OP_FORCE) || !hands_full() + return TRUE + + if(!inventory_slot_bodypart_check(I, slot, user, flags) && !(flags & INV_OP_FORCE)) + return FALSE + + var/conflict_result = inventory_slot_conflict_check(I, slot) + var/obj/item/to_wear_over + + if((flags & INV_OP_IS_FINAL_CHECK) && conflict_result && (slot != SLOT_ID_HANDS)) + // try to fit over + var/obj/item/conflicting = item_by_slot(slot) + if(conflicting) + // there's something there + var/can_fit_over = I.equip_worn_over_check(src, slot, user, conflicting, flags) + if(can_fit_over) + conflict_result = CAN_EQUIP_SLOT_CONFLICT_NONE + to_wear_over = conflicting + // ! DANGER: snowflake time + // take it out of the slot + _unequip_slot(slot, flags | INV_OP_NO_LOGIC | INV_OP_NO_UPDATE_ICONS) + // recheck + conflict_result = inventory_slot_conflict_check(I, slot) + // put it back in incase something else breaks + _equip_slot(conflicting, slot, flags | INV_OP_NO_LOGIC | INV_OP_NO_UPDATE_ICONS) -//? equip + switch(conflict_result) + if(CAN_EQUIP_SLOT_CONFLICT_HARD) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] are already [slot_meta.display_plural? "holding too many things" : "wearing something"] [slot_meta.display_preposition] [self_equip? "your" : "their"] [slot_meta.display_name].")) + return FALSE + if(CAN_EQUIP_SLOT_CONFLICT_SOFT) + if(!(flags & INV_OP_FORCE)) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] are already [slot_meta.display_plural? "holding too many things" : "wearing something"] [slot_meta.display_preposition] [self_equip? "your" : "their"] [slot_meta.display_name].")) + return FALSE + + if(!inventory_slot_semantic_conflict(I, slot, user) && !(flags & INV_OP_FORCE)) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("[I] doesn't fit there.")) + return FALSE + + var/blocked_by + + if((blocked_by = inventory_slot_reachability_conflict(I, slot, user)) && !(flags & (INV_OP_FORCE | INV_OP_IGNORE_REACHABILITY))) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("\the [blocked_by] is in the way!")) + return FALSE + + // lastly, check item's opinion + if(!I.can_equip(src, slot, user, flags)) + return FALSE + + // we're the final check - side effects ARE allowed + if((flags & INV_OP_IS_FINAL_CHECK) && to_wear_over) + //! Note: this means that can_unequip is NOT called for to wear over. + //! This is intentional, but very, very sonwflakey. + to_wear_over.worn_inside = I + // setting worn inside first disallows equip/unequip from triggering + to_wear_over.forceMove(I) + // check we don't have something already (wtf) + if(I.worn_over) + handle_item_denesting(I, denest_to, flags, user) + // set the other way around + I.worn_over = to_wear_over + // tell it we're inserting the old item + I.equip_on_worn_over_insert(src, slot, user, to_wear_over, flags) + // take the old item off our screen + client?.screen -= to_wear_over + to_wear_over.screen_loc = null + to_wear_over.hud_unlayerise() + // we don't call slot re-equips here because the equip proc does this for us + + return TRUE /** * equips an item to a slot if possible @@ -109,7 +310,47 @@ return FALSE return TRUE -//? drop +//* Dropping *// + +/** + * checks if we can unequip an item + * + * Preconditions: The item is either equipped already, or isn't equipped. + * + * @return TRUE/FALSE + * + * @params + * - I - item + * - slot - slot we're unequipping from - can be null + * - flags - inventory operation hint bitfield, see defines + * - user - stripper - can be null + */ +/mob/proc/can_unequip(obj/item/I, slot, flags, mob/user = src) + // destroyed IS allowed to call these procs + if(I && QDELETED(I) && !QDESTROYING(I)) + to_chat(user, SPAN_DANGER("A deleted [I] was checked in can_unequip(). Report this entire line to coders immediately. Debug data: [I] ([REF(I)]) slot [slot] flags [flags] user [user]")) + to_chat(user, SPAN_DANGER("can_unequip will return TRUE to allow you to drop the item, but expect potential glitches!")) + return TRUE + + if(!slot) + slot = slot_by_item(I) + + if(!(flags & INV_OP_FORCE) && HAS_TRAIT(I, TRAIT_ITEM_NODROP)) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("[I] is stuck to your hand!")) + return FALSE + + var/blocked_by + if((blocked_by = inventory_slot_reachability_conflict(I, slot, user)) && !(flags & (INV_OP_FORCE | INV_OP_IGNORE_REACHABILITY))) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("\the [blocked_by] is in the way!")) + return FALSE + + // lastly, check item's opinion + if(!I.can_unequip(src, slot, user, flags)) + return FALSE + + return TRUE // So why do all of these return true if the item is null? // Semantically, transferring/dropping nothing always works @@ -183,3 +424,37 @@ if(!is_in_inventory(I)) return TRUE return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, FALSE, user) + +/** + * drops everything in our inventory + * + * @params + * - include_inhands - include held items too? + * - include_restraints - include restraints too? + * - force - ignore nodrop and all that + */ +/mob/proc/drop_inventory(include_inhands = TRUE, include_restraints = TRUE, force = TRUE) + for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) + drop_item_to_ground(I, INV_OP_SILENT | INV_OP_FLUFFLESS | (force? INV_OP_FORCE : NONE)) + + // todo: handle what happens if dropping something requires a logic thing + // e.g. dropping jumpsuit makes it impossible to transfer a belt since it + // de-equipped from the jumpsuit + +/mob/proc/transfer_inventory_to_loc(atom/newLoc, include_inhands = TRUE, include_restraints = TRUE, force = TRUE) + for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) + transfer_item_to_loc(I, newLoc, INV_OP_SILENT | INV_OP_FLUFFLESS | (force? INV_OP_FORCE : NONE)) + // todo: handle what happens if dropping something requires a logic thing + // e.g. dropping jumpsuit makes it impossible to transfer a belt since it + // de-equipped from the jumpsuit + +/** + * wipe our inventory + * + * @params + * include_inhands - include held items too? + * include_restraints - include restraints too? + */ +/mob/proc/delete_inventory(include_inhands = TRUE, include_restraints = TRUE) + for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) + qdel(I) diff --git a/code/modules/mob/inventory/stripping.dm b/code/modules/mob/inventory/mob_stripping.dm similarity index 98% rename from code/modules/mob/inventory/stripping.dm rename to code/modules/mob/inventory/mob_stripping.dm index 139ec85baf5c..2a247f060f87 100644 --- a/code/modules/mob/inventory/stripping.dm +++ b/code/modules/mob/inventory/mob_stripping.dm @@ -1,3 +1,9 @@ +/** + * Stripping system + * Procs can be called and overridden as needed + * Please be careful when doing so and understand what you are overriding. + */ + // todo: tgui // todo: ui state handles prechecks? interesting to deal with. /mob/proc/mouse_drop_strip_interaction(mob/user) From 4a5854509f8954d24869ac74f96acf44a7ae8347 Mon Sep 17 00:00:00 2001 From: silicons Date: Wed, 5 Jul 2023 08:19:33 -0700 Subject: [PATCH 003/140] move inventory files to their own module --- citadel.dme | 22 +++++++++---------- code/modules/{mob => }/inventory/hands.dm | 0 code/modules/{mob => }/inventory/inventory.dm | 0 .../item_hooks.dm => inventory/item/hooks.dm} | 0 .../item/public.dm} | 0 .../item/rendering.dm} | 0 .../mob/abstraction.dm} | 0 .../mob/internal.dm} | 0 .../mob_public.dm => inventory/mob/public.dm} | 0 .../mob/public_helpers.dm} | 2 +- .../mob/stripping.dm} | 0 code/modules/{mob => }/inventory/slot_meta.dm | 0 12 files changed, 12 insertions(+), 12 deletions(-) rename code/modules/{mob => }/inventory/hands.dm (100%) rename code/modules/{mob => }/inventory/inventory.dm (100%) rename code/modules/{mob/inventory/item_hooks.dm => inventory/item/hooks.dm} (100%) rename code/modules/{mob/inventory/item_public.dm => inventory/item/public.dm} (100%) rename code/modules/{mob/inventory/item_rendering.dm => inventory/item/rendering.dm} (100%) rename code/modules/{mob/inventory/mob_abstraction.dm => inventory/mob/abstraction.dm} (100%) rename code/modules/{mob/inventory/mob_internal.dm => inventory/mob/internal.dm} (100%) rename code/modules/{mob/inventory/mob_public.dm => inventory/mob/public.dm} (100%) rename code/modules/{mob/inventory/helpers.dm => inventory/mob/public_helpers.dm} (97%) rename code/modules/{mob/inventory/mob_stripping.dm => inventory/mob/stripping.dm} (100%) rename code/modules/{mob => }/inventory/slot_meta.dm (100%) diff --git a/citadel.dme b/citadel.dme index 0c5cd60105ea..8b3f4c548fc1 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2696,6 +2696,17 @@ #include "code\modules\integrated_electronics\subtypes\time.dm" #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\integrated_electronics\~defines\~defines.dm" +#include "code\modules\inventory\hands.dm" +#include "code\modules\inventory\inventory.dm" +#include "code\modules\inventory\slot_meta.dm" +#include "code\modules\inventory\item\hooks.dm" +#include "code\modules\inventory\item\public.dm" +#include "code\modules\inventory\item\rendering.dm" +#include "code\modules\inventory\mob\abstraction.dm" +#include "code\modules\inventory\mob\internal.dm" +#include "code\modules\inventory\mob\public.dm" +#include "code\modules\inventory\mob\public_helpers.dm" +#include "code\modules\inventory\mob\stripping.dm" #include "code\modules\jobs\access.dm" #include "code\modules\jobs\alt_title.dm" #include "code\modules\jobs\department.dm" @@ -3121,17 +3132,6 @@ #include "code\modules\mob\freelook\mask\cultnet.dm" #include "code\modules\mob\freelook\mask\eye.dm" #include "code\modules\mob\freelook\mask\update_triggers.dm" -#include "code\modules\mob\inventory\hands.dm" -#include "code\modules\mob\inventory\helpers.dm" -#include "code\modules\mob\inventory\inventory.dm" -#include "code\modules\mob\inventory\item_hooks.dm" -#include "code\modules\mob\inventory\item_public.dm" -#include "code\modules\mob\inventory\item_rendering.dm" -#include "code\modules\mob\inventory\mob_abstraction.dm" -#include "code\modules\mob\inventory\mob_internal.dm" -#include "code\modules\mob\inventory\mob_public.dm" -#include "code\modules\mob\inventory\mob_stripping.dm" -#include "code\modules\mob\inventory\slot_meta.dm" #include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\butchering.dm" #include "code\modules\mob\living\damage_procs.dm" diff --git a/code/modules/mob/inventory/hands.dm b/code/modules/inventory/hands.dm similarity index 100% rename from code/modules/mob/inventory/hands.dm rename to code/modules/inventory/hands.dm diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/inventory/inventory.dm similarity index 100% rename from code/modules/mob/inventory/inventory.dm rename to code/modules/inventory/inventory.dm diff --git a/code/modules/mob/inventory/item_hooks.dm b/code/modules/inventory/item/hooks.dm similarity index 100% rename from code/modules/mob/inventory/item_hooks.dm rename to code/modules/inventory/item/hooks.dm diff --git a/code/modules/mob/inventory/item_public.dm b/code/modules/inventory/item/public.dm similarity index 100% rename from code/modules/mob/inventory/item_public.dm rename to code/modules/inventory/item/public.dm diff --git a/code/modules/mob/inventory/item_rendering.dm b/code/modules/inventory/item/rendering.dm similarity index 100% rename from code/modules/mob/inventory/item_rendering.dm rename to code/modules/inventory/item/rendering.dm diff --git a/code/modules/mob/inventory/mob_abstraction.dm b/code/modules/inventory/mob/abstraction.dm similarity index 100% rename from code/modules/mob/inventory/mob_abstraction.dm rename to code/modules/inventory/mob/abstraction.dm diff --git a/code/modules/mob/inventory/mob_internal.dm b/code/modules/inventory/mob/internal.dm similarity index 100% rename from code/modules/mob/inventory/mob_internal.dm rename to code/modules/inventory/mob/internal.dm diff --git a/code/modules/mob/inventory/mob_public.dm b/code/modules/inventory/mob/public.dm similarity index 100% rename from code/modules/mob/inventory/mob_public.dm rename to code/modules/inventory/mob/public.dm diff --git a/code/modules/mob/inventory/helpers.dm b/code/modules/inventory/mob/public_helpers.dm similarity index 97% rename from code/modules/mob/inventory/helpers.dm rename to code/modules/inventory/mob/public_helpers.dm index ae6ea95374d9..bdc7db66efe5 100644 --- a/code/modules/mob/inventory/helpers.dm +++ b/code/modules/inventory/mob/public_helpers.dm @@ -1,4 +1,4 @@ -//* these call other procs in external.dm *// +//* these have the primary function of calling other procs in public.dm *// /** * dels something or says "x is stuck to your hand" diff --git a/code/modules/mob/inventory/mob_stripping.dm b/code/modules/inventory/mob/stripping.dm similarity index 100% rename from code/modules/mob/inventory/mob_stripping.dm rename to code/modules/inventory/mob/stripping.dm diff --git a/code/modules/mob/inventory/slot_meta.dm b/code/modules/inventory/slot_meta.dm similarity index 100% rename from code/modules/mob/inventory/slot_meta.dm rename to code/modules/inventory/slot_meta.dm From 705e0a9d8d09e13d08e831f6e1bdf95c59937824 Mon Sep 17 00:00:00 2001 From: silicons Date: Wed, 5 Jul 2023 08:26:10 -0700 Subject: [PATCH 004/140] Start moving files --- citadel.dme | 3 +- code/modules/inventory/hands.dm | 36 ------------- code/modules/inventory/mob/hands.dm | 53 +++++++++++++++++++ .../mob/{public_helpers.dm => helpers.dm} | 0 4 files changed, 55 insertions(+), 37 deletions(-) create mode 100644 code/modules/inventory/mob/hands.dm rename code/modules/inventory/mob/{public_helpers.dm => helpers.dm} (100%) diff --git a/citadel.dme b/citadel.dme index 8b3f4c548fc1..ee8e1ccb31bb 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2703,9 +2703,10 @@ #include "code\modules\inventory\item\public.dm" #include "code\modules\inventory\item\rendering.dm" #include "code\modules\inventory\mob\abstraction.dm" +#include "code\modules\inventory\mob\hands.dm" +#include "code\modules\inventory\mob\helpers.dm" #include "code\modules\inventory\mob\internal.dm" #include "code\modules\inventory\mob\public.dm" -#include "code\modules\inventory\mob\public_helpers.dm" #include "code\modules\inventory\mob\stripping.dm" #include "code\modules\jobs\access.dm" #include "code\modules\jobs\alt_title.dm" diff --git a/code/modules/inventory/hands.dm b/code/modules/inventory/hands.dm index 67c8d278b1d4..925c98063cf7 100644 --- a/code/modules/inventory/hands.dm +++ b/code/modules/inventory/hands.dm @@ -1,41 +1,5 @@ // todo: we need a set of 'core' procs subtypes need to override, and the rest are composites of those procs. -/mob/proc/put_in_hands(obj/item/I, flags) - if(is_holding(I)) - return TRUE - - if(!(flags & INV_OP_NO_MERGE_STACKS) && istype(I, /obj/item/stack)) - var/obj/item/stack/S = I - for(var/obj/item/stack/held_stack in get_held_items()) - if(S.can_merge(held_stack) && S.merge(held_stack)) - to_chat(src, SPAN_NOTICE("Your [held_stack] stack now contains [held_stack.get_amount()] [held_stack.singular_name]\s.")) - return TRUE - - return put_in_active_hand(I, flags) || put_in_inactive_hand(I, flags) - -/** - * put in hands or forcemove to drop location - * allows an optional param for where to drop on fail - * - * @return TRUE/FALSE based on put in hand or dropped to ground - */ -/mob/proc/put_in_hands_or_drop(obj/item/I, flags, atom/drop_loc = drop_location()) - if(!put_in_hands(I, flags)) - I.forceMove(drop_loc) - return FALSE - return TRUE - -/** - * put in hands or del - * - * @return TRUE/FALSE based on put in hand or del'd - */ -/mob/proc/put_in_hands_or_del(obj/item/I, flags) - if(!put_in_hands(I, flags)) - qdel(I) - return FALSE - return TRUE - /mob/proc/put_in_right_hand(obj/item/I, flags) return FALSE diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm new file mode 100644 index 000000000000..633cc82817fc --- /dev/null +++ b/code/modules/inventory/mob/hands.dm @@ -0,0 +1,53 @@ +/** + * Hands are a bit of a special case + * + * They don't use inventory slots like the inventory system does, + * But still exists in the inventory module because they do a number of things, + * like count as equipped under [SLOT_ID_HANDS]. + * + * This semi-integration lets us do a few cool things like not needing separate hooks + * for when someone has something in hand, but not in inventory, transitioning + * to them having it in inventory, but not in hands. + */ + +//* Public API - Pickup *// + +/mob/proc/put_in_hands(obj/item/I, flags) + if(is_holding(I)) + return TRUE + + if(!(flags & INV_OP_NO_MERGE_STACKS) && istype(I, /obj/item/stack)) + var/obj/item/stack/S = I + for(var/obj/item/stack/held_stack in get_held_items()) + if(S.can_merge(held_stack) && S.merge(held_stack)) + to_chat(src, SPAN_NOTICE("Your [held_stack] stack now contains [held_stack.get_amount()] [held_stack.singular_name]\s.")) + return TRUE + + return put_in_active_hand(I, flags) || put_in_inactive_hand(I, flags) + +/** + * put in hands or forcemove to drop location + * allows an optional param for where to drop on fail + * + * @return TRUE/FALSE based on put in hand or dropped to ground + */ +/mob/proc/put_in_hands_or_drop(obj/item/I, flags, atom/drop_loc = drop_location()) + if(!put_in_hands(I, flags)) + I.forceMove(drop_loc) + return FALSE + return TRUE + +/** + * put in hands or del + * + * @return TRUE/FALSE based on put in hand or del'd + */ +/mob/proc/put_in_hands_or_del(obj/item/I, flags) + if(!put_in_hands(I, flags)) + qdel(I) + return FALSE + return TRUE + +//* Public API - Drop *// + +//* Public API - Check *// diff --git a/code/modules/inventory/mob/public_helpers.dm b/code/modules/inventory/mob/helpers.dm similarity index 100% rename from code/modules/inventory/mob/public_helpers.dm rename to code/modules/inventory/mob/helpers.dm From 0869f7794265923f86886e1defd1f2da933f5204 Mon Sep 17 00:00:00 2001 From: silicons Date: Wed, 5 Jul 2023 08:30:17 -0700 Subject: [PATCH 005/140] convert more wrappers --- code/datums/ability.dm | 4 +- code/modules/inventory/hands.dm | 74 -------------------------- code/modules/inventory/mob/hands.dm | 78 ++++++++++++++++++++++++++++ code/modules/mob/living/inventory.dm | 3 -- 4 files changed, 80 insertions(+), 79 deletions(-) diff --git a/code/datums/ability.dm b/code/datums/ability.dm index 1ef787b7c196..92ea929daab6 100644 --- a/code/datums/ability.dm +++ b/code/datums/ability.dm @@ -257,7 +257,7 @@ return FALSE if((ability_check_flags & ABILITY_CHECK_STANDING) && IS_PRONE(owner)) return FALSE - if((ability_check_flags & ABILITY_CHECK_FREE_HAND) && !(owner.has_free_hand())) + if((ability_check_flags & ABILITY_CHECK_FREE_HAND) && !(!owner.hands_full())) return FALSE if(!CHECK_MOBILITY(owner, mobility_check_flags)) return FALSE @@ -275,7 +275,7 @@ return "You cannot do that while unconscious." if((ability_check_flags & ABILITY_CHECK_STANDING) && owner.lying) return "You cannot do that while on the ground." - if((ability_check_flags & ABILITY_CHECK_FREE_HAND) && !(owner.has_free_hand())) + if((ability_check_flags & ABILITY_CHECK_FREE_HAND) && !(!owner.hands_full())) return "You cannot do that without a free hand." if(!CHECK_MOBILITY(owner, mobility_check_flags)) return "You cannot do that while incapacitated." diff --git a/code/modules/inventory/hands.dm b/code/modules/inventory/hands.dm index 925c98063cf7..e0a6ebf83cff 100644 --- a/code/modules/inventory/hands.dm +++ b/code/modules/inventory/hands.dm @@ -25,12 +25,6 @@ if(!.) I.forceMove(drop_loc) -/** - * returns held items - */ -/mob/proc/get_held_items() - . = list() - /mob/proc/get_left_held_item() RETURN_TYPE(/obj/item) return @@ -53,43 +47,12 @@ return list() // TODO: actual variable hand count -/** - * get held items of type - */ -/mob/proc/get_held_items_of_type(type) - . = list() - for(var/obj/item/I as anything in get_held_items()) - if(istype(I, type)) - . += I - -/** - * get first held item of type - */ -/mob/proc/get_held_item_of_type(type) - RETURN_TYPE(/obj/item) - for(var/obj/item/I as anything in get_held_items()) - if(istype(I, type)) - return I - /** * return index of item, or null if not found */ /mob/proc/get_held_index(obj/item/I) return -/** - * get held item item at index - */ -/mob/proc/get_held_item_of_index(index) - RETURN_TYPE(/obj/item) - return FALSE - -/** - * hands are full? - */ -/mob/proc/hands_full() - return FALSE - /** * returns held item in active hand */ @@ -129,37 +92,6 @@ /mob/proc/has_hands() return FALSE -/** - * returns if we are holding something - */ -/mob/proc/is_holding(obj/item/I) - return !!get_held_index(I) - -/** - * returns if we're holding something in inactive hand slots - */ -/mob/proc/is_holding_inactive(obj/item/I) - return is_holding(I) && (get_active_held_item() != I) - -/** - * drops all our held items - * - * @params - * force - even if nodrop - */ -/mob/proc/drop_all_held_items(flags) - for(var/obj/item/I as anything in get_held_items()) - drop_item_to_ground(I, flags) - -/mob/proc/drop_active_held_item(flags) - return drop_item_to_ground(get_active_held_item(), flags) - -/mob/proc/drop_inactive_held_item(flags) - return drop_item_to_ground(get_inactive_held_item(), flags) - -/mob/proc/drop_held_item_of_index(index, flags) - return drop_item_to_ground(get_held_item_of_index(index), flags) - // these two will need rewritten when we get support for arbitrary hand numbers. /mob/proc/drop_left_held_item(flags) @@ -167,9 +99,3 @@ /mob/proc/drop_right_held_item(flags) return drop_held_item_of_index(2, flags) - -/** - * means if we have an empty hand able to accept an arbitrary item. - */ -/mob/proc/has_free_hand() - return FALSE diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm index 633cc82817fc..92b2749ea53e 100644 --- a/code/modules/inventory/mob/hands.dm +++ b/code/modules/inventory/mob/hands.dm @@ -50,4 +50,82 @@ //* Public API - Drop *// +/** + * drops all our held items + * + * @params + * force - even if nodrop + */ +/mob/proc/drop_all_held_items(flags) + for(var/obj/item/I as anything in get_held_items()) + drop_item_to_ground(I, flags) + +/mob/proc/drop_active_held_item(flags) + return drop_item_to_ground(get_active_held_item(), flags) + +/mob/proc/drop_inactive_held_item(flags) + return drop_item_to_ground(get_inactive_held_item(), flags) + +/mob/proc/drop_held_item_of_index(index, flags) + return drop_item_to_ground(get_held_item_of_index(index), flags) + //* Public API - Check *// + +/** + * returns if we are holding something + */ +/mob/proc/is_holding(obj/item/I) + return !!get_held_index(I) + +/** + * returns if we're holding something in inactive hand slots + */ +/mob/proc/is_holding_inactive(obj/item/I) + return is_holding(I) && (get_active_held_item() != I) + +//* Public API - Get *// + +/** + * returns held items + */ +/mob/proc/get_held_items() + . = list() + // intentionally not casted + for(var/item in held_items) + if(isnull(item)) + continue + . += item + +/** + * get held items of type + */ +/mob/proc/get_held_items_of_type(type) + . = list() + for(var/obj/item/I as anything in get_held_items()) + if(istype(I, type)) + . += I + +/** + * get first held item of type + */ +/mob/proc/get_held_item_of_type(type) + RETURN_TYPE(/obj/item) + for(var/obj/item/I as anything in get_held_items()) + if(istype(I, type)) + return I + +/** + * get held item item at index + */ +/mob/proc/get_held_item_of_index(index) + RETURN_TYPE(/obj/item) + return length(held_items) <= index? held_items[index] : null + +/** + * hands are all holding items? undefined behavior if we don't have hands. + */ +/mob/proc/hands_full() + for(var/i in 1 to length(held_items)) + if(isnull(held_items[i])) + return FALSE + return TRUE diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 148173d1b7c7..474ef8187448 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -252,6 +252,3 @@ /mob/living/has_hands() return has_hands - -/mob/living/has_free_hand() - return !l_hand || !r_hand From bbdaea1287a1c7b0dd5f9bfa1537110a49551f59 Mon Sep 17 00:00:00 2001 From: silicons Date: Wed, 5 Jul 2023 08:30:58 -0700 Subject: [PATCH 006/140] and now i cause problems --- code/modules/mob/living/living_defines.dm | 3 --- code/modules/mob/mob_defines.dm | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 50b762dfef8a..81636e015a91 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -112,9 +112,6 @@ var/custom_whisper = null //? inventory - var/hand = null - var/obj/item/l_hand = null - var/obj/item/r_hand = null var/obj/item/back = null//Human/Monkey var/obj/item/tank/internal = null//Human/Monkey var/obj/item/clothing/mask/wear_mask = null//Carbon diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 168e6e1fefdc..5ff4d98d3ec8 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -94,6 +94,8 @@ var/datum/inventory/inventory /// held items; indexed list. defaults to null, lazy. var/list/held_items + /// active hand index - null or num. must always be in range of held_items indices! + var/active_hand //! Size //! todo kill this with fire it should just be part of icon_scale_x/y. From 89b181d305c7a0dd0bbcbc17b8fbb7568cddc780 Mon Sep 17 00:00:00 2001 From: silicons Date: Wed, 5 Jul 2023 08:39:16 -0700 Subject: [PATCH 007/140] move files, redefine.. --- code/modules/inventory/hands.dm | 22 --------------- code/modules/inventory/mob/hands.dm | 42 ++++++++++++++++++++++++++++ code/modules/mob/living/inventory.dm | 41 ++++++--------------------- code/modules/mob/mob_defines.dm | 2 ++ 4 files changed, 52 insertions(+), 55 deletions(-) diff --git a/code/modules/inventory/hands.dm b/code/modules/inventory/hands.dm index e0a6ebf83cff..3168f814cf24 100644 --- a/code/modules/inventory/hands.dm +++ b/code/modules/inventory/hands.dm @@ -25,28 +25,6 @@ if(!.) I.forceMove(drop_loc) -/mob/proc/get_left_held_item() - RETURN_TYPE(/obj/item) - return - -/mob/proc/get_left_held_items() - var/obj/item/I = get_left_held_item() - if(I) - return list(I) - return list() - // TODO: actual variable hand count - -/mob/proc/get_right_held_item() - RETURN_TYPE(/obj/item) - return - -/mob/proc/get_right_held_items() - var/obj/item/I = get_right_held_item() - if(I) - return list(I) - return list() - // TODO: actual variable hand count - /** * return index of item, or null if not found */ diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm index 92b2749ea53e..e1e26d2a7c82 100644 --- a/code/modules/inventory/mob/hands.dm +++ b/code/modules/inventory/mob/hands.dm @@ -85,6 +85,48 @@ //* Public API - Get *// +/** + * returns first item on left + */ +/mob/proc/get_left_held_item() + RETURN_TYPE(/obj/item) + for(var/i in 1 to length(held_items) step 2) + if(isnull(held_items[i])) + continue + return held_items[i] + +/** + * returns first item on right + */ +/mob/proc/get_right_held_item() + RETURN_TYPE(/obj/item) + for(var/i in 2 to length(held_items) step 2) + if(isnull(held_items[i])) + continue + return held_items[i] + +/** + * returns all items on left + */ +/mob/proc/get_left_held_items() + RETURN_TYPE(/obj/item) + . = list() + for(var/i in 1 to length(held_items) step 2) + if(isnull(held_items[i])) + continue + . += held_items[i] + +/** + * returns all items on right + */ +/mob/proc/get_right_held_items() + RETURN_TYPE(/obj/item) + . = list() + for(var/i in 2 to length(held_items) step 2) + if(isnull(held_items[i])) + continue + . += held_items[i] + /** * returns held items */ diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 474ef8187448..4020eb5cc5f0 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -9,45 +9,18 @@ RETURN_TYPE(/obj/item) return hand? r_hand : l_hand -/mob/living/get_left_held_item() - RETURN_TYPE(/obj/item) - return l_hand - -/mob/living/get_right_held_item() - RETURN_TYPE(/obj/item) - return r_hand - /mob/living/get_held_index(obj/item/I) if(l_hand == I) return 1 else if(r_hand == I) return 2 -/mob/living/get_held_items() - RETURN_TYPE(/list) - . = list() - if(l_hand) - . += l_hand - if(r_hand) - . += r_hand - -/mob/living/hands_full() - return l_hand && r_hand - /mob/living/put_in_active_hand(obj/item/I, flags) return hand? put_in_left_hand(I, flags) : put_in_right_hand(I, flags) /mob/living/put_in_inactive_hand(obj/item/I, flags) return hand? put_in_right_hand(I, flags) : put_in_left_hand(I, flags) -/mob/living/get_held_item_of_index(index) - RETURN_TYPE(/obj/item) - switch(index) - if(1) - return l_hand - if(2) - return r_hand - /mob/living/get_number_of_hands() return 2 @@ -125,6 +98,14 @@ if(2) return put_in_right_hand(I, flags) +/mob/living/get_number_of_hands() + return has_hands? 2 : 0 + +/mob/living/has_hands() + return has_hands + +#warn parse above + /mob/living/_unequip_held(obj/item/I, flags) if(l_hand == I) l_hand = null @@ -246,9 +227,3 @@ return TRUE return FALSE - -/mob/living/get_number_of_hands() - return has_hands? 2 : 0 - -/mob/living/has_hands() - return has_hands diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 5ff4d98d3ec8..31e862a3e0ce 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -93,6 +93,8 @@ /// our inventory datum, if any. var/datum/inventory/inventory /// held items; indexed list. defaults to null, lazy. + /// 1, 3, 5, ... are left + /// 2, 4, 6, ... are right var/list/held_items /// active hand index - null or num. must always be in range of held_items indices! var/active_hand From 878aec7e13ddcf70f8c51ad795ca5229ebd85406 Mon Sep 17 00:00:00 2001 From: silicons Date: Wed, 5 Jul 2023 23:39:04 -0700 Subject: [PATCH 008/140] fixes --- code/modules/mob/mob_helpers.dm | 10 ++++----- code/modules/mob/update_icons.dm | 6 +---- code/modules/organs/external/external.dm | 7 ------ .../organs/internal/subtypes/augment.dm | 2 +- code/modules/paperwork/paperbin.dm | 4 ---- .../chemistry/reagents/other/cleaner.dm | 6 ++--- code/modules/rigsuits/modules/combat.dm | 4 ++-- code/modules/rigsuits/modules/utility.dm | 2 +- code/modules/rigsuits/rig_attackby.dm | 5 +---- .../species/promethean/promethean_blob.dm | 18 ++++++++------- code/modules/species/protean/protean_blob.dm | 22 +++++++++---------- .../station/station_special_abilities.dm | 4 ++-- .../species/xenomorphs/alien_powers.dm | 18 +++++---------- 13 files changed, 41 insertions(+), 67 deletions(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 6e03e78d6c80..3936f3675b09 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -465,11 +465,11 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) threatcount += 4 if(auth_weapons && !access_obj.allowed(src)) - if(istype(l_hand, /obj/item/gun) || istype(l_hand, /obj/item/melee)) - threatcount += 4 - - if(istype(r_hand, /obj/item/gun) || istype(r_hand, /obj/item/melee)) - threatcount += 4 + for(var/obj/item/held as anything in get_held_items()) + if(istype(held, /obj/item/melee)) + threatcount += 4 + if(istype(held, /obj/item/gun)) + threatcount += 4 if(istype(belt, /obj/item/gun) || istype(belt, /obj/item/melee)) threatcount += 2 diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index adb10c898cdf..6c3f84ffe889 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -35,11 +35,7 @@ /mob/proc/update_inv_active_hand() return -/mob/living/update_inv_active_hand(var/A) - if(hand) - update_inv_l_hand(A) - else - update_inv_r_hand(A) +#warn uh oh /mob/proc/update_inv_l_hand() return diff --git a/code/modules/organs/external/external.dm b/code/modules/organs/external/external.dm index dbf947ab73a8..e4021ba1c0b3 100644 --- a/code/modules/organs/external/external.dm +++ b/code/modules/organs/external/external.dm @@ -963,13 +963,6 @@ Note that amputating the affected organ does in fact remove the infection from t qdel(src) - if(victim.l_hand) - if(istype(victim.l_hand,/obj/item/material/twohanded)) //if they're holding a two-handed weapon, drop it now they've lost a hand - victim.l_hand.update_held_icon() - if(victim.r_hand) - if(istype(victim.r_hand,/obj/item/material/twohanded)) - victim.r_hand.update_held_icon() - /**************************************************** HELPERS ****************************************************/ diff --git a/code/modules/organs/internal/subtypes/augment.dm b/code/modules/organs/internal/subtypes/augment.dm index a95b335ab6e5..16050fa98c2e 100644 --- a/code/modules/organs/internal/subtypes/augment.dm +++ b/code/modules/organs/internal/subtypes/augment.dm @@ -218,7 +218,7 @@ to_chat(M, SPAN_NOTICE("You cannot use your augments when restrained.")) return FALSE - if((slot == /datum/inventory_slot_meta/abstract/hand/left && l_hand) || (slot == /datum/inventory_slot_meta/abstract/hand/right && r_hand)) + if((slot == /datum/inventory_slot_meta/abstract/hand/left && get_left_held_item()) || (slot == /datum/inventory_slot_meta/abstract/hand/right && get_right_held_item())) to_chat(M, SPAN_WARNING("Your hand is full. Drop something first.")) return FALSE diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 9db2479d0986..e25a6456d59c 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -18,8 +18,6 @@ drop_sound = 'sound/items/drop/cardboardbox.ogg' pickup_sound = 'sound/items/pickup/cardboardbox.ogg' - - /obj/item/paper_bin/OnMouseDropLegacy(mob/user as mob) if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr)))))) if(!istype(usr, /mob/living/simple_mob)) @@ -36,8 +34,6 @@ to_chat(user, "You pick up the [src].") user.put_in_hands(src) - return - /obj/item/paper_bin/attack_hand(mob/user, list/params) if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/modules/reagents/chemistry/reagents/other/cleaner.dm b/code/modules/reagents/chemistry/reagents/other/cleaner.dm index 7e3295f31390..37009458c0fc 100644 --- a/code/modules/reagents/chemistry/reagents/other/cleaner.dm +++ b/code/modules/reagents/chemistry/reagents/other/cleaner.dm @@ -25,10 +25,8 @@ M.adjustToxLoss(rand(5, 10)) /datum/reagent/space_cleaner/affect_touch(mob/living/carbon/M, alien, removed) - if(M.r_hand) - M.r_hand.clean_blood() - if(M.l_hand) - M.l_hand.clean_blood() + for(var/obj/item/held as anything in M.get_held_items()) + held.clean_blood() if(M.wear_mask) if(M.wear_mask.clean_blood()) M.update_inv_wear_mask(0) diff --git a/code/modules/rigsuits/modules/combat.dm b/code/modules/rigsuits/modules/combat.dm index 04e5e12baed7..cf21607e37a3 100644 --- a/code/modules/rigsuits/modules/combat.dm +++ b/code/modules/rigsuits/modules/combat.dm @@ -213,7 +213,7 @@ var/mob/living/M = holder.wearer - if(M.l_hand && M.r_hand) + if(M.hands_full()) to_chat(M, "Your hands are full.") deactivate() return @@ -265,7 +265,7 @@ H.visible_message("[H] launches \a [firing]!") firing.throw_at_old(target,fire_force,fire_distance) else - if(H.l_hand && H.r_hand) + if(H.hands_full()) to_chat(H, "Your hands are full.") else var/obj/item/new_weapon = new fabrication_type() diff --git a/code/modules/rigsuits/modules/utility.dm b/code/modules/rigsuits/modules/utility.dm index b305c592f76b..80ebe33c0a6e 100644 --- a/code/modules/rigsuits/modules/utility.dm +++ b/code/modules/rigsuits/modules/utility.dm @@ -466,7 +466,7 @@ var/mob/living/M = holder.wearer - if(M.l_hand && M.r_hand) + if(M.hands_full()) to_chat(M, "Your hands are full.") deactivate() return diff --git a/code/modules/rigsuits/rig_attackby.dm b/code/modules/rigsuits/rig_attackby.dm index 8a0f9307c865..fe1cdd5e370b 100644 --- a/code/modules/rigsuits/rig_attackby.dm +++ b/code/modules/rigsuits/rig_attackby.dm @@ -102,10 +102,7 @@ to_chat(user, "There is no tank to remove.") return - if(user.r_hand && user.l_hand) - air_supply.forceMove(get_turf(user)) - else - user.put_in_hands(air_supply) + user.put_in_hands_or_drop(air_supply) to_chat(user, "You detach and remove \the [air_supply].") air_supply = null return diff --git a/code/modules/species/promethean/promethean_blob.dm b/code/modules/species/promethean/promethean_blob.dm index f739fdef84eb..5f9255bbc2dc 100644 --- a/code/modules/species/promethean/promethean_blob.dm +++ b/code/modules/species/promethean/promethean_blob.dm @@ -21,10 +21,8 @@ //glow_intensity = 0 var/mob/living/carbon/human/humanform - var/datum/modifier/healing + var/list/obj/item/previously_held - var/obj/prev_left_hand - var/obj/prev_right_hand var/human_brute = 0 var/human_burn = 0 var/is_wide = FALSE @@ -339,6 +337,12 @@ //Drop all our things var/list/things_to_drop = contents.Copy() var/list/things_to_not_drop = list(w_uniform,nif,l_store,r_store,wear_id,l_ear,r_ear) //And whatever else we decide for balancing. + var/list/prev_held = list() + for(var/obj/item/I as anything in get_held_items()) + if(I.w_class >= WEIGHT_CLASS_SMALL) + continue + things_to_not_drop += I + prev_held += I var/obj/item/clothing/head/new_hat var/has_hat = FALSE things_to_drop -= things_to_not_drop //Crunch the lists @@ -366,9 +370,7 @@ //Size update blob.transform = matrix()*size_multiplier blob.size_multiplier = size_multiplier - - if(l_hand) blob.prev_left_hand = l_hand //Won't save them if dropped above, but necessary if handdrop is disabled. - if(r_hand) blob.prev_right_hand = r_hand + blob.previously_held = prev_held //Put our owner in it (don't transfer var/mind) blob.afflict_paralyze(20 * 2) @@ -472,8 +474,8 @@ B.owner = src //vore_organs.Cut() - if(blob.prev_left_hand) put_in_left_hand(blob.prev_left_hand) //The restore for when reforming. - if(blob.prev_right_hand) put_in_right_hand(blob.prev_right_hand) + for(var/obj/item/I as anything in blob.previously_held) + put_in_hands_or_drop(I) Life(1, SSmobs.times_fired) diff --git a/code/modules/species/protean/protean_blob.dm b/code/modules/species/protean/protean_blob.dm index a499a5ea2ec8..37d75f3d56be 100644 --- a/code/modules/species/protean/protean_blob.dm +++ b/code/modules/species/protean/protean_blob.dm @@ -51,8 +51,7 @@ var/obj/item/organ/internal/nano/refactory/refactory var/datum/modifier/healing - var/obj/prev_left_hand - var/obj/prev_right_hand + var/list/obj/item/previously_held player_msg = "In this form, you can move a little faster and your health will regenerate as long as you have metal in you!" holder_type = /obj/item/holder/protoblob @@ -309,11 +308,12 @@ //Drop all our things var/list/things_to_drop = contents.Copy() var/list/things_to_not_drop = list(w_uniform,nif,l_store,r_store,wear_id,l_ear,r_ear,gloves,glasses,shoes) //And whatever else we decide for balancing. - //you can instaflash or pepperspray on unblob with pockets anyways - if(l_hand && l_hand.w_class <= ITEMSIZE_SMALL) //Hands but only if small or smaller - things_to_not_drop += l_hand - if(r_hand && r_hand.w_class <= ITEMSIZE_SMALL) - things_to_not_drop += r_hand + var/list/prev_held = list() + for(var/obj/item/I as anything in get_held_items()) + if(I.w_class >= WEIGHT_CLASS_SMALL) + continue + things_to_not_drop += I + prev_held += I things_to_drop -= things_to_not_drop //Crunch the lists things_to_drop -= organs //Mah armbs things_to_drop -= internal_organs //Mah sqeedily spooch @@ -355,9 +355,7 @@ //Size update blob.transform = matrix()*size_multiplier blob.size_multiplier = size_multiplier - - if(l_hand) blob.prev_left_hand = l_hand //Won't save them if dropped above, but necessary if handdrop is disabled. - if(r_hand) blob.prev_right_hand = r_hand + blob.previously_held = prev_held //languages!! for(var/datum/language/L in languages) blob.add_language(L.name) @@ -498,8 +496,8 @@ B.forceMove(src) B.owner = src - if(blob.prev_left_hand) put_in_left_hand(blob.prev_left_hand) //The restore for when reforming. - if(blob.prev_right_hand) put_in_right_hand(blob.prev_right_hand) + for(var/obj/item/I as anything in blob.previously_held) + put_in_hands_or_drop(I) Life(1, SSmobs.times_fired) diff --git a/code/modules/species/station/station_special_abilities.dm b/code/modules/species/station/station_special_abilities.dm index 2dacabfb4c66..361667122515 100644 --- a/code/modules/species/station/station_special_abilities.dm +++ b/code/modules/species/station/station_special_abilities.dm @@ -162,8 +162,8 @@ if(!halitem) halitem = new var/list/slots_free = list(ui_lhand,ui_rhand) - if(l_hand) slots_free -= ui_lhand - if(r_hand) slots_free -= ui_rhand + if(get_left_held_item()) slots_free -= ui_lhand + if(get_right_held_item()) slots_free -= ui_rhand if(istype(src,/mob/living/carbon/human)) var/mob/living/carbon/human/H = src if(!H.belt) slots_free += ui_belt diff --git a/code/modules/species/xenomorphs/alien_powers.dm b/code/modules/species/xenomorphs/alien_powers.dm index 83e62ac6045c..ff5fce73a31a 100644 --- a/code/modules/species/xenomorphs/alien_powers.dm +++ b/code/modules/species/xenomorphs/alien_powers.dm @@ -307,21 +307,15 @@ T.afflict_paralyze(20 * 3) - var/use_hand = "left" - if(l_hand) - if(r_hand) - to_chat(src, "You need to have one hand free to grab someone.") - return - else - use_hand = "right" + if(hands_full()) + to_chat(src, "You need to have one hand free to grab someone.") + return src.visible_message("\The [src] seizes [T] aggressively!") - var/obj/item/grab/G = new(src,T) - if(use_hand == "left") - l_hand = G - else - r_hand = G + var/obj/item/grab/G = new(src, T) + if(!put_in_hands_or_del(G)) + return G.state = GRAB_PASSIVE G.icon_state = "grabbed1" From 4dc4b3f35f07720cdb24de874f4af0fd7980ee46 Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 7 Jul 2023 21:37:57 -0700 Subject: [PATCH 009/140] more transfers --- .../game/gamemodes/technomancer/spell_objs.dm | 38 +++++--- code/modules/inventory/hands.dm | 59 ------------- code/modules/inventory/mob/hands.dm | 86 +++++++++++++++++++ .../mob/living/carbon/human/examine.dm | 23 +++-- 4 files changed, 123 insertions(+), 83 deletions(-) diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index e4fc110458b2..bd376e6d1178 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -176,23 +176,34 @@ // Parameters: 0 // Description: Terrible code to check if a scepter is in the offhand, returns 1 if yes. /obj/item/spell/proc/check_for_scepter() - if(!src || !owner) return 0 - if(owner.r_hand == src) - if(istype(owner.l_hand, /obj/item/scepter)) - return 1 - else - if(istype(owner.r_hand, /obj/item/scepter)) - return 1 - return 0 + if(isnull(owner)) + return FALSE + var/our_index = owner.get_held_index(src) + if(!our_index) + return FALSE + for(var/i in 1 to length(owner.held_items)) + if(i == our_index) + continue + if(!istype(owner.held_items[i], /obj/item/scepter)) + continue + return TRUE + return FALSE // Proc: get_other_hand() // Parameters: 1 (I - item being compared to determine what the offhand is) // Description: Helper for Aspect spells. /mob/living/carbon/human/proc/get_other_hand(var/obj/item/I) - if(r_hand == I) - return l_hand - else - return r_hand + if(isnull(owner)) + return FALSE + var/our_index = owner.get_held_index(src) + if(!our_index) + return FALSE + for(var/i in 1 to length(owner.held_items)) + if(i == our_index) + continue + if(isnull(owner.held_items[i])) + continue + return owner.held_items[i] // Proc: attack_self() // Parameters: 1 (user - the Technomancer that invoked this proc) @@ -263,6 +274,9 @@ if(S.run_checks()) S.on_innate_cast(src) + // todo: shitcode, doesn't properly support multihanding + var/obj/item/l_hand = get_left_held_item() + var/obj/item/r_hand = get_right_held_item() if(l_hand && r_hand) //Make sure our hands aren't full. if(istype(r_hand, /obj/item/spell)) //If they are full, perhaps we can still be useful. var/obj/item/spell/r_spell = r_hand diff --git a/code/modules/inventory/hands.dm b/code/modules/inventory/hands.dm index 3168f814cf24..e7add0cb2da5 100644 --- a/code/modules/inventory/hands.dm +++ b/code/modules/inventory/hands.dm @@ -1,60 +1,8 @@ // todo: we need a set of 'core' procs subtypes need to override, and the rest are composites of those procs. -/mob/proc/put_in_right_hand(obj/item/I, flags) - return FALSE - -/mob/proc/put_in_left_hand(obj/item/I, flags) - return FALSE - -/mob/proc/put_in_active_hand(obj/item/I, flags) - return FALSE - -/mob/proc/put_in_inactive_hand(obj/item/I, flags) - return FALSE - /mob/proc/put_in_hand(obj/item/I, index, flags) return index == 1? put_in_left_hand(I, flags) : put_in_right_hand(I, flags) -/mob/proc/put_in_hand_or_del(obj/item/I, index, flags) - . = index == 1? put_in_left_hand(I, flags) : put_in_right_hand(I, flags) - if(!.) - qdel(I) - -/mob/proc/put_in_hand_or_drop(obj/item/I, index, flags, atom/drop_loc = drop_location()) - . = index == 1? put_in_left_hand(I, flags) : put_in_right_hand(I, flags) - if(!.) - I.forceMove(drop_loc) - -/** - * return index of item, or null if not found - */ -/mob/proc/get_held_index(obj/item/I) - return - -/** - * returns held item in active hand - */ -/mob/proc/get_active_held_item() - RETURN_TYPE(/obj/item) - return - -/** - * returns held item in inactive hand (or any inactive hand if more than 1) - */ -/mob/proc/get_inactive_held_item() - RETURN_TYPE(/obj/item) - return - -/** - * returns all items held in non active hands - */ -/mob/proc/get_inactive_held_items() - var/obj/item/I = get_inactive_held_item() - if(I) - return list(I) - return list() - // TODO: actual multihanding support, for now this is just a wrapper - /** * get number of hand slots * @@ -70,10 +18,3 @@ /mob/proc/has_hands() return FALSE -// these two will need rewritten when we get support for arbitrary hand numbers. - -/mob/proc/drop_left_held_item(flags) - return drop_held_item_of_index(1, flags) - -/mob/proc/drop_right_held_item(flags) - return drop_held_item_of_index(2, flags) diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm index e1e26d2a7c82..98e1b5b8ed9d 100644 --- a/code/modules/inventory/mob/hands.dm +++ b/code/modules/inventory/mob/hands.dm @@ -48,6 +48,39 @@ return FALSE return TRUE +/mob/proc/put_in_left_hand(obj/item/I, flags) + for(var/i in 1 to length(held_items) step 2) + if(put_in_hand(I, i, flags)) + return TRUE + return FALSE + +/mob/proc/put_in_right_hand(obj/item/I, flags) + for(var/i in 1 to length(held_items) step 2) + if(put_in_hand(I, i, flags)) + return TRUE + return FALSE + +/mob/proc/put_in_active_hand(obj/item/I, flags) + return put_in_hand(I, active_hand, flags) + +/mob/proc/put_in_inactive_hand(obj/item/I, flags) + for(var/i in 1 to length(held_items)) + if(i == active_hand) + continue + if(put_in_hand(I, i, flags)) + return TRUE + return FALSE + +/mob/proc/put_in_hand_or_del(obj/item/I, index, flags) + . = put_in_hand(I, index, flags) + if(!.) + qdel(I) + +/mob/proc/put_in_hand_or_drop(obj/item/I, index, flags, atom/drop_loc = drop_location()) + . = put_in_hand(I, index, flags) + if(!.) + I.forceMove(drop_loc) + //* Public API - Drop *// /** @@ -69,6 +102,18 @@ /mob/proc/drop_held_item_of_index(index, flags) return drop_item_to_ground(get_held_item_of_index(index), flags) +/mob/proc/drop_sequential_left_held_item(flags) + for(var/i in 1 to length(held_items) step 2) + if(isnull(held_items[i])) + continue + return drop_held_item_of_index(i, flags) + +/mob/proc/drop_sequential_right_held_item(flags) + for(var/i in 2 to length(held_items) step 2) + if(isnull(held_items[i])) + continue + return drop_held_item_of_index(i, flags) + //* Public API - Check *// /** @@ -83,6 +128,47 @@ /mob/proc/is_holding_inactive(obj/item/I) return is_holding(I) && (get_active_held_item() != I) + +/** + * return index of item, or null if not found + */ +/mob/proc/get_held_index(obj/item/I) + for(var/i in 1 to length(held_items)) + if(held_items[i] == I) + return i + +/** + * returns held item in active hand + */ +/mob/proc/get_active_held_item() + RETURN_TYPE(/obj/item) + return held_items[active_hand] + +/** + * returns held item in inactive hand (or any inactive hand if more than 1) + */ +/mob/proc/get_inactive_held_item() + RETURN_TYPE(/obj/item) + for(var/i in 1 to length(held_items)) + if(i == active_hand) + continue + if(isnull(held_items[i])) + continue + return held_items[i] + +/** + * returns all items held in non active hands + */ +/mob/proc/get_inactive_held_items() + RETURN_TYPE(/list) + . = list() + for(var/i in 1 to length(held_items)) + if(i == active_hand) + continue + if(isnull(held_items[i])) + continue + . += held_items[i] + //* Public API - Get *// /** diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 8072f894b18e..9527ad769cfa 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -177,19 +177,18 @@ else . += SPAN_INFO("[icon2html(back, user)] [T.He] [T.has] \a [FORMAT_TEXT_LOOKITEM(back)] on [T.his] back.") - //left hand - if(l_hand && l_hand.show_examine) - if(l_hand.blood_DNA) - . += SPAN_WARNING("[icon2html(l_hand, user)] [T.He] [T.is] holding [l_hand.gender == PLURAL ? "some" : "a"] [(l_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [FORMAT_TEXT_LOOKITEM(l_hand)] in [T.his] left hand!") - else - . += SPAN_INFO("[icon2html(l_hand, user)] [T.He] [T.is] holding \a [FORMAT_TEXT_LOOKITEM(l_hand)] in [T.his] left hand.") - - //right hand - if(r_hand && r_hand.show_examine) - if(r_hand.blood_DNA) - . += SPAN_WARNING("[icon2html(r_hand, user)] [T.He] [T.is] holding [r_hand.gender == PLURAL ? "some" : "a"] [(r_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [FORMAT_TEXT_LOOKITEM(r_hand)] in [T.his] right hand!") + // hands + for(var/i in 1 to length(held_items)) + if(isnull(held_items[i])) + continue + var/obj/item/held = held_items[i] + if(held.show_examine) + continue + var/hand_str = (i % 2)? "left hand[i > 2? " #[round(i / 2)]" : ""]" : "right hand[i > 2? " #[round(i / 2)]" : ""]" + if(held.blood_DNA) + . += SPAN_WARNING("[icon2html(held, user)] [T.He] [T.is] holding [held.gender == PLURAL ? "some" : "a"] [(held.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [FORMAT_TEXT_LOOKITEM(held)] in [T.his] [hand_str!") else - . += SPAN_INFO("[icon2html(r_hand, user)] [T.He] [T.is] holding \a [FORMAT_TEXT_LOOKITEM(r_hand)] in [T.his] right hand.") + . += SPAN_INFO("[icon2html(held, user)] [T.He] [T.is] holding \a [FORMAT_TEXT_LOOKITEM(held)] in [T.his] [hand_str].") //gloves if(gloves && !(skip_gear & EXAMINE_SKIPGLOVES) && gloves.show_examine) From 77fa78291e7e2e98c8cca34a946b875a28b36fce Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 7 Jul 2023 21:43:52 -0700 Subject: [PATCH 010/140] oops --- code/modules/mob/living/carbon/human/examine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 9527ad769cfa..0bb73c356343 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -186,7 +186,7 @@ continue var/hand_str = (i % 2)? "left hand[i > 2? " #[round(i / 2)]" : ""]" : "right hand[i > 2? " #[round(i / 2)]" : ""]" if(held.blood_DNA) - . += SPAN_WARNING("[icon2html(held, user)] [T.He] [T.is] holding [held.gender == PLURAL ? "some" : "a"] [(held.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [FORMAT_TEXT_LOOKITEM(held)] in [T.his] [hand_str!") + . += SPAN_WARNING("[icon2html(held, user)] [T.He] [T.is] holding [held.gender == PLURAL ? "some" : "a"] [(held.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [FORMAT_TEXT_LOOKITEM(held)] in [T.his] [hand_str]!") else . += SPAN_INFO("[icon2html(held, user)] [T.He] [T.is] holding \a [FORMAT_TEXT_LOOKITEM(held)] in [T.his] [hand_str].") From 00d8c2b2f565716bb57a4a5fef94193a4d69d32e Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 7 Jul 2023 21:59:25 -0700 Subject: [PATCH 011/140] okay, now for the harder refactor? --- code/game/objects/items.dm | 2 ++ .../objects/items/weapons/cigs_lighters.dm | 10 ++------ code/modules/inventory/item/public.dm | 1 - code/modules/inventory/item/rendering.dm | 2 +- code/modules/inventory/mob/stripping.dm | 2 +- .../mob/living/carbon/human/inventory.dm | 6 ++--- .../mob/living/carbon/human/unarmed_attack.dm | 14 ++++++----- code/modules/mob/update_icons.dm | 23 ++++++++----------- 8 files changed, 26 insertions(+), 34 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8ddace65f48a..fd59697de142 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -47,6 +47,8 @@ //* Inventory - Main /// currently equipped slot id var/worn_slot + /// current hand index, if held in hand + var/held_index /** * current item we fitted over * ! DANGER: While this is more or less bug-free for "won't lose the item when you unequip/won't get stuck", we diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index c8bda1c43adc..9fa9d86fb0e6 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -132,11 +132,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM else icon_state = "[initial(icon_state)]_burnt" item_state = "[initial(item_state)]_burnt" - if(ismob(loc)) - var/mob/living/M = loc - M.update_inv_wear_mask(0) - M.update_inv_l_hand(0) - M.update_inv_r_hand(1) + update_worn_icon() ..() /obj/item/clothing/mask/smokable/examine(mob/user, dist) @@ -487,9 +483,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM else if(istype(W, /obj/item/assembly/igniter)) light("[user] fiddles with [W], and manages to light their [name] with the power of science.") - user.update_inv_wear_mask(0) - user.update_inv_l_hand(0) - user.update_inv_r_hand(1) + update_worn_icon() /obj/item/clothing/mask/smokable/pipe/cobpipe name = "corn cob pipe" diff --git a/code/modules/inventory/item/public.dm b/code/modules/inventory/item/public.dm index 36fe310228f6..e4d05ced6cbb 100644 --- a/code/modules/inventory/item/public.dm +++ b/code/modules/inventory/item/public.dm @@ -22,7 +22,6 @@ user.client?.screen |= src if((slot != SLOT_ID_HANDS) && equip_sound) playsound(src, equip_sound, 30, ignore_walls = FALSE) - user.update_inv_hands() /** * called when an item is unequipped from inventory or moved around in inventory diff --git a/code/modules/inventory/item/rendering.dm b/code/modules/inventory/item/rendering.dm index 26887537da03..ff2b3fe95030 100644 --- a/code/modules/inventory/item/rendering.dm +++ b/code/modules/inventory/item/rendering.dm @@ -262,7 +262,7 @@ if(SLOT_ID_HANDCUFFED) M.update_inv_handcuffed() if(SLOT_ID_HANDS) - M.update_inv_hands() + M.update_inv_hand(held_index) if(SLOT_ID_HEAD) M.update_inv_head() if(SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR) diff --git a/code/modules/inventory/mob/stripping.dm b/code/modules/inventory/mob/stripping.dm index 2a247f060f87..3e4b07cc32ab 100644 --- a/code/modules/inventory/mob/stripping.dm +++ b/code/modules/inventory/mob/stripping.dm @@ -257,7 +257,7 @@ if(!istype(I) || !is_in_inventory(I)) return var/slot = I.worn_slot - if(slot != SLOT_ID_HANDS) + if(!SLOT_ID_IS_HELD_ID(slot)) var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(slot) var/view_flags = slot_meta.strip_obfuscation_check(I, src, user) if(view_flags & (INV_VIEW_OBFUSCATE_DISALLOW_INTERACT | INV_VIEW_OBFUSCATE_HIDE_ITEM_EXISTENCE | INV_VIEW_OBFUSCATE_HIDE_SLOT)) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 0f41a16d8bd1..7767080b2b85 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -287,8 +287,7 @@ if(!thing) to_chat(src, "You have no backpack to take something out of!") return - if(equip_to_slot_if_possible(thing, SLOT_ID_BACK)) - update_inv_hands() + equip_to_slot_if_possible(thing, SLOT_ID_BACK) return if(!istype(equipped_back, /obj/item/storage)) // not a storage item if(!thing) @@ -320,8 +319,7 @@ if(!thing) to_chat(src, "You have no belt to take something out of!") return - if(equip_to_slot_if_possible(thing, SLOT_ID_BELT)) - update_inv_hands() + equip_to_slot_if_possible(thing, SLOT_ID_BELT) return if(!istype(equipped_belt, /obj/item/storage)) // not a storage item if(!thing) diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index 6cc17705fd9e..3d1859142450 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -54,16 +54,18 @@ var/global/list/sparring_attack_cache = list() target.visible_message("[target] looks momentarily disoriented.", "You see stars.") target.apply_effect(attack_damage*2, EYE_BLUR, armour) if(BP_L_ARM, BP_L_HAND) - if (target.l_hand) + var/obj/item/knocked_away = target.get_left_held_item() + if (knocked_away) // Disarm left hand //Urist McAssistant dropped the macguffin with a scream just sounds odd. - target.visible_message("\The [target.l_hand] was knocked right out of [target]'s grasp!") - target.drop_left_held_item() + target.visible_message("\The [target.knocked_away] was knocked right out of [target]'s grasp!") + target.drop_item_to_ground(knocked_away) if(BP_R_ARM, BP_R_HAND) - if (target.r_hand) + var/obj/item/knocked_away = target.get_left_held_item() + if (target.knocked_away) // Disarm right hand - target.visible_message("\The [target.r_hand] was knocked right out of [target]'s grasp!") - target.drop_right_held_item() + target.visible_message("\The [target.knocked_away] was knocked right out of [target]'s grasp!") + target.drop_item_to_ground(knocked_away) if(BP_TORSO) if(!target.lying) var/turf/T = get_step(get_turf(target), get_dir(get_turf(user), get_turf(target))) diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 6c3f84ffe889..fa36e9c937e8 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -32,15 +32,7 @@ /mob/proc/update_inv_back() return -/mob/proc/update_inv_active_hand() - return - -#warn uh oh - -/mob/proc/update_inv_l_hand() - return - -/mob/proc/update_inv_r_hand() +/mob/proc/update_inv_hand(index) return /mob/proc/update_inv_wear_mask() @@ -85,10 +77,15 @@ /mob/proc/update_targeted() return -/mob/proc/update_inv_hands() - update_inv_l_hand() - update_inv_r_hand() - /mob/proc/update_hair() /mob/proc/update_eyes() + +//* Helpers - These call other update procs. *// + +/mob/proc/update_inv_hands() + for(var/i in 1 to length(held_items)) + update_inv_hand(i) + +/mob/proc/update_inv_active_hand() + return update_inv_hand(active_hand) From c125ab5ed8464274c22d63428f433dd98ec9d265 Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 7 Jul 2023 22:13:06 -0700 Subject: [PATCH 012/140] ack --- citadel.dme | 1 + code/__DEFINES/mobs/mobs.dm | 76 ------ code/__DEFINES/mobs/overlays.dm | 103 ++++++++ code/modules/inventory/mob/stripping.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 234 ++++++++---------- 5 files changed, 213 insertions(+), 203 deletions(-) create mode 100644 code/__DEFINES/mobs/overlays.dm diff --git a/citadel.dme b/citadel.dme index ee8e1ccb31bb..945f42fbae2f 100644 --- a/citadel.dme +++ b/citadel.dme @@ -220,6 +220,7 @@ #include "code\__DEFINES\mobs\mobility.dm" #include "code\__DEFINES\mobs\mobs.dm" #include "code\__DEFINES\mobs\organs.dm" +#include "code\__DEFINES\mobs\overlays.dm" #include "code\__DEFINES\mobs\silicon_privileges.dm" #include "code\__DEFINES\mobs\sprite_accessories.dm" #include "code\__DEFINES\mobs\stat.dm" diff --git a/code/__DEFINES/mobs/mobs.dm b/code/__DEFINES/mobs/mobs.dm index ee73e2632f9c..f01a2e96595f 100644 --- a/code/__DEFINES/mobs/mobs.dm +++ b/code/__DEFINES/mobs/mobs.dm @@ -1,79 +1,3 @@ - -// These are used as the layers for the icons, as well as indexes in a list that holds onto them. -// Technically the layers used are all -100+layer to make them FLOAT_LAYER overlays. -//! Human Overlays Indexes///////// -/// Mutations like fat, and lasereyes -#define MUTATIONS_LAYER 1 -/// Skin things added by a call on species -#define SKIN_LAYER 2 -/// Bloodied hands/feet/anything else -#define BLOOD_LAYER 3 -/// Injury overlay sprites like open wounds -#define DAMAGE_LAYER 4 -/// Overlays for open surgical sites -#define SURGERY_LAYER 5 -/// Underwear/bras/etc -#define UNDERWEAR_LAYER 6 -/// Shoe-slot item (when set to be under uniform via verb) -#define SHOES_LAYER_ALT 7 -/// Uniform-slot item -#define UNIFORM_LAYER 8 -/// ID-slot item -#define ID_LAYER 9 -/// Shoe-slot item -#define SHOES_LAYER 10 -/// Glove-slot item -#define GLOVES_LAYER 11 -/// Belt-slot item -#define BELT_LAYER 12 -/// Suit-slot item -#define SUIT_LAYER 13 -/// Some species have tails to render -#define TAIL_LAYER 14 -/// Eye-slot item -#define GLASSES_LAYER 15 -/// Belt-slot item (when set to be above suit via verb) -#define BELT_LAYER_ALT 16 -/// Suit storage-slot item -#define SUIT_STORE_LAYER 17 -/// Back-slot item -#define BACK_LAYER 18 -/// The human's hair -#define HAIR_LAYER 19 -/// Both ear-slot items (combined image) -#define EARS_LAYER 20 -/// Mob's eyes (used for glowing eyes) -#define EYES_LAYER 21 -/// Mask-slot item -#define FACEMASK_LAYER 22 -/// Head-slot item -#define HEAD_LAYER 23 -/// Handcuffs, if the human is handcuffed, in a secret inv slot -#define HANDCUFF_LAYER 24 -/// Same as handcuffs, for legcuffs -#define LEGCUFF_LAYER 25 -/// Left-hand item -#define L_HAND_LAYER 26 -/// Right-hand item -#define R_HAND_LAYER 27 -/// Wing overlay layer. -#define WING_LAYER 28 -/// Tail alt. overlay layer for fixing overlay issues. -#define TAIL_LAYER_ALT 29 -/// Effects drawn by modifiers -#define MODIFIER_EFFECTS_LAYER 30 -/// 'Mob on fire' overlay layer -#define FIRE_LAYER 31 -/// 'Mob submerged' overlay layer -#define MOB_WATER_LAYER 32 -/// 'Aimed at' overlay layer -#define TARGETED_LAYER 33 -//! KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. -#define TOTAL_LAYERS 33 -//! the offset used -#define BODY_LAYER -100 -////////////////////////////////// - // Bitflags defining which status effects could be or are inflicted on a mob. #define STATUS_CAN_STUN (1<<0) //! Can Stun() #define STATUS_CAN_KNOCKDOWN (1<<1) //! Can Knockdown() diff --git a/code/__DEFINES/mobs/overlays.dm b/code/__DEFINES/mobs/overlays.dm new file mode 100644 index 000000000000..709c6f7aec98 --- /dev/null +++ b/code/__DEFINES/mobs/overlays.dm @@ -0,0 +1,103 @@ +//* Human Overlays Indexes *// +// These are used as the layers for the icons, as well as indexes in a list that holds onto them. +// Technically the layers used are all -100+layer to make them FLOAT_LAYER overlays. + +/// Mutations like fat, and lasereyes +#define MUTATIONS_LAYER 1 +/// Skin things added by a call on species +#define SKIN_LAYER 2 +/// Bloodied hands/feet/anything else +#define BLOOD_LAYER 3 +/// Injury overlay sprites like open wounds +#define DAMAGE_LAYER 4 +/// Overlays for open surgical sites +#define SURGERY_LAYER 5 +/// Underwear/bras/etc +#define UNDERWEAR_LAYER 6 +/// Shoe-slot item (when set to be under uniform via verb) +#define SHOES_LAYER_ALT 7 +/// Uniform-slot item +#define UNIFORM_LAYER 8 +/// ID-slot item +#define ID_LAYER 9 +/// Shoe-slot item +#define SHOES_LAYER 10 +/// Glove-slot item +#define GLOVES_LAYER 11 +/// Belt-slot item +#define BELT_LAYER 12 +/// Suit-slot item +#define SUIT_LAYER 13 +/// Some species have tails to render +#define TAIL_LAYER 14 +/// Eye-slot item +#define GLASSES_LAYER 15 +/// Belt-slot item (when set to be above suit via verb) +#define BELT_LAYER_ALT 16 +/// Suit storage-slot item +#define SUIT_STORE_LAYER 17 +/// Back-slot item +#define BACK_LAYER 18 +/// The human's hair +#define HAIR_LAYER 19 +/// Both ear-slot items (combined image) +#define EARS_LAYER 20 +/// Mob's eyes (used for glowing eyes) +#define EYES_LAYER 21 +/// Mask-slot item +#define FACEMASK_LAYER 22 +/// Head-slot item +#define HEAD_LAYER 23 +/// Handcuffs, if the human is handcuffed, in a secret inv slot +#define HANDCUFF_LAYER 24 +/// Same as handcuffs, for legcuffs +#define LEGCUFF_LAYER 25 +/// Hand layers +#define WORN_LAYER_HELD(index) (26 + index) +/// Wing overlay layer. +#define WING_LAYER 45 +/// Tail alt. overlay layer for fixing overlay issues. +#define TAIL_LAYER_ALT 46 +/// Effects drawn by modifiers +#define MODIFIER_EFFECTS_LAYER 47 +/// 'Mob on fire' overlay layer +#define FIRE_LAYER 48 +/// 'Mob submerged' overlay layer +#define MOB_WATER_LAYER 49 +/// 'Aimed at' overlay layer +#define TARGETED_LAYER 50 +//! the offset used +#define BODY_LAYER -100 + +//* Human Overlay Keys *// +// These are the actual keys used in overlays_standing. + +#define WORN_KEY_MUTATIONS "mutations" +#define WORN_KEY_SKIN "skin" +#define WORN_KEY_BLOOD "blood" +#define WORN_KEY_DAMAGE "damage" +#define WORN_KEY_SURGERY "surgery" +#define WORN_KEY_UNDERWEAR "underwear" +#define WORN_KEY_UNIFORM "uniform" +#define WORN_KEY_ID "id" +#define WORN_KEY_SHOES "shoes" +#define WORN_KEY_GLOVES "gloves" +#define WORN_KEY_BELT "belt" +#define WORN_KEY_SUIT "suit" +#define WORN_KEY_TAIL "tail" +#define WORN_KEY_GLASSES "glasses" +#define WORN_KEY_SUITSTORE "suitstore" +#define WORN_KEY_BACK "back" +#define WORN_KEY_HAIR "hair" +#define WORN_KEY_EARS "ears" +#define WORN_KEY_EYES "eyes" +#define WORN_KEY_FACEMASK "facemask" +#define WORN_KEY_HEAD "head" +#define WORN_KEY_HANDCUFF "handcuff" +#define WORN_KEY_LEGCUFF "legcuff" +#define WORN_KEY_HELD(index) "held[index]" +#define WORN_KEY_WING "wing" +#define WORN_KEY_MODIFIERS "modifiers" +#define WORN_KEY_FIRE "fire" +#define WORN_KEY_WATER "water" +#define WORN_KEY_TARGETED "targeted" diff --git a/code/modules/inventory/mob/stripping.dm b/code/modules/inventory/mob/stripping.dm index 3e4b07cc32ab..2a247f060f87 100644 --- a/code/modules/inventory/mob/stripping.dm +++ b/code/modules/inventory/mob/stripping.dm @@ -257,7 +257,7 @@ if(!istype(I) || !is_in_inventory(I)) return var/slot = I.worn_slot - if(!SLOT_ID_IS_HELD_ID(slot)) + if(slot != SLOT_ID_HANDS) var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(slot) var/view_flags = slot_meta.strip_obfuscation_check(I, src, user) if(view_flags & (INV_VIEW_OBFUSCATE_DISALLOW_INTERACT | INV_VIEW_OBFUSCATE_HIDE_ITEM_EXISTENCE | INV_VIEW_OBFUSCATE_HIDE_SLOT)) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 3030d69b6c58..3c43195e9379 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -57,7 +57,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) overlays_standing[cache_index] = null /mob/living/carbon/human - var/list/overlays_standing[TOTAL_LAYERS] + var/list/overlays_standing var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed //UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING @@ -114,7 +114,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(QDESTROYING(src)) return - remove_layer(DAMAGE_LAYER) + remove_layer(WORN_KEY_DAMAGE) // first check whether something actually changed about damage appearance var/damage_appearance = "" @@ -151,8 +151,8 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) standing_image.add_overlay(DI) - overlays_standing[DAMAGE_LAYER] = standing_image - apply_layer(DAMAGE_LAYER) + overlays_standing[WORN_KEY_DAMAGE] = standing_image + apply_layer(WORN_KEY_DAMAGE) //BASE MOB SPRITE /mob/living/carbon/human/update_icons_body() @@ -303,19 +303,19 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(QDESTROYING(src)) return - remove_layer(SKIN_LAYER) + remove_layer(WORN_KEY_SKIN) var/image/skin = species.update_skin(src) if(skin) skin.layer = BODY_LAYER+SKIN_LAYER - overlays_standing[SKIN_LAYER] = skin - apply_layer(SKIN_LAYER) + overlays_standing[WORN_KEY_SKIN] = skin + apply_layer(WORN_KEY_SKIN) /mob/living/carbon/human/proc/update_bloodied() if(QDESTROYING(src)) return - remove_layer(BLOOD_LAYER) + remove_layer(WORN_KEY_BLOOD) if(!blood_DNA && !feet_blood_DNA) return @@ -333,9 +333,9 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) bloodsies.color = feet_blood_color both.add_overlay(bloodsies) - overlays_standing[BLOOD_LAYER] = both + overlays_standing[WORN_KEY_BLOOD] = both - apply_layer(BLOOD_LAYER) + apply_layer(WORN_KEY_BLOOD) /mob/living/carbon/human/proc/BloodyMouth() @@ -346,9 +346,9 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) bloodsies.color = src.species.blood_color both.add_overlay(bloodsies) - overlays_standing[BLOOD_LAYER] = both + overlays_standing[WORN_KEY_BLOOD] = both - apply_layer(BLOOD_LAYER) + apply_layer(WORN_KEY_BLOOD) //UNDERWEAR OVERLAY @@ -356,18 +356,18 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(QDESTROYING(src)) return - remove_layer(UNDERWEAR_LAYER) + remove_layer(WORN_KEY_UNDERWEAR) if(species.species_appearance_flags & HAS_UNDERWEAR) - overlays_standing[UNDERWEAR_LAYER] = list() + overlays_standing[WORN_KEY_UNDERWEAR] = list() for(var/category in all_underwear) if(hide_underwear[category]) continue var/datum/category_item/underwear/UWI = all_underwear[category] var/image/wear = UWI.generate_image(all_underwear_metadata[category], layer = BODY_LAYER+UNDERWEAR_LAYER) - overlays_standing[UNDERWEAR_LAYER] += wear + overlays_standing[WORN_KEY_UNDERWEAR] += wear - apply_layer(UNDERWEAR_LAYER) + apply_layer(WORN_KEY_UNDERWEAR) //HAIR OVERLAY /mob/living/carbon/human/update_hair() @@ -375,7 +375,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) return //Reset our hair - remove_layer(HAIR_LAYER) + remove_layer(WORN_KEY_HAIR) update_eyes() //Pirated out of here, for glowing eyes. var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD) @@ -430,8 +430,8 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) face_standing.Blend(ears_s, ICON_OVERLAY) if(istype(head_organ,/obj/item/organ/external/head/vr)) var/obj/item/organ/external/head/vr/head_organ_vr = head_organ - overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ_vr.head_offset) - apply_layer(HAIR_LAYER) + overlays_standing[WORN_KEY_HAIR] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ_vr.head_offset) + apply_layer(WORN_KEY_HAIR) return var/icon/horns_s = get_horns_overlay() @@ -441,15 +441,15 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) face_standing.Blend(horns_s, ICON_OVERLAY) if(istype(head_organ,/obj/item/organ/external/head/vr)) var/obj/item/organ/external/head/vr/head_organ_vr = head_organ - overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ_vr.head_offset) - apply_layer(HAIR_LAYER) + overlays_standing[WORN_KEY_HAIR] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ_vr.head_offset) + apply_layer(WORN_KEY_HAIR) return if(head_organ.transparent) face_standing += rgb(,,,120) - overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER) - apply_layer(HAIR_LAYER) + overlays_standing[WORN_KEY_HAIR] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER) + apply_layer(WORN_KEY_HAIR) /mob/living/carbon/human/update_eyes() if(QDESTROYING(src)) @@ -461,7 +461,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) update_icons_body() //Reset our eyes - remove_layer(EYES_LAYER) + remove_layer(WORN_KEY_EYES) //TODO: Probably redo this. I know I wrote it, but... @@ -491,14 +491,14 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) var/image/eyes_image = image(eyes_icon) eyes_image.plane = ABOVE_LIGHTING_PLANE - overlays_standing[EYES_LAYER] = eyes_image - apply_layer(EYES_LAYER) + overlays_standing[WORN_KEY_EYES] = eyes_image + apply_layer(WORN_KEY_EYES) /mob/living/carbon/human/update_mutations() if(QDESTROYING(src)) return - remove_layer(MUTATIONS_LAYER) + remove_layer(WORN_KEY_MUTATIONS) if(!LAZYLEN(mutations)) return //No mutations, no icons. @@ -523,8 +523,8 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(mut == MUTATION_LASER) standing.overlays += "lasereyes_s" //TODO - overlays_standing[MUTATIONS_LAYER] = standing - apply_layer(MUTATIONS_LAYER) + overlays_standing[WORN_KEY_MUTATIONS] = standing + apply_layer(WORN_KEY_MUTATIONS) /* --------------------------------------- */ //Recomputes every icon on the mob. Expensive. @@ -571,7 +571,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(QDESTROYING(src)) return - remove_layer(UNIFORM_LAYER) + remove_layer(WORN_KEY_UNIFORM) //Shoes can be affected by uniform being drawn onto them update_inv_shoes() @@ -597,15 +597,15 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) else var/mutable_appearance/MA = MA_or_list MA.filters += filter(type = "alpha", icon = c_mask) - overlays_standing[UNIFORM_LAYER] = MA_or_list + overlays_standing[WORN_KEY_UNIFORM] = MA_or_list - apply_layer(UNIFORM_LAYER) + apply_layer(WORN_KEY_UNIFORM) /mob/living/carbon/human/update_inv_wear_id() if(QDESTROYING(src)) return - remove_layer(ID_LAYER) + remove_layer(WORN_KEY_ID) if(!wear_id) return //Not wearing an ID @@ -614,41 +614,41 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(w_uniform && istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform if(U.displays_id) - overlays_standing[ID_LAYER] = wear_id.render_mob_appearance(src, SLOT_ID_WORN_ID, species.get_effective_bodytype(src, wear_id, SLOT_ID_WORN_ID)) + overlays_standing[WORN_KEY_ID] = wear_id.render_mob_appearance(src, SLOT_ID_WORN_ID, species.get_effective_bodytype(src, wear_id, SLOT_ID_WORN_ID)) - apply_layer(ID_LAYER) + apply_layer(WORN_KEY_ID) /mob/living/carbon/human/update_inv_gloves() if(QDESTROYING(src)) return - remove_layer(GLOVES_LAYER) + remove_layer(WORN_KEY_GLOVES) if(!gloves) return //No gloves, no reason to be here. - overlays_standing[GLOVES_LAYER] = gloves.render_mob_appearance(src, SLOT_ID_GLOVES, species.get_effective_bodytype(src, gloves, SLOT_ID_GLOVES)) + overlays_standing[WORN_KEY_GLOVES] = gloves.render_mob_appearance(src, SLOT_ID_GLOVES, species.get_effective_bodytype(src, gloves, SLOT_ID_GLOVES)) - apply_layer(GLOVES_LAYER) + apply_layer(WORN_KEY_GLOVES) /mob/living/carbon/human/update_inv_glasses() if(QDESTROYING(src)) return - remove_layer(GLASSES_LAYER) + remove_layer(WORN_KEY_GLASSES) if(!glasses) return //Not wearing glasses, no need to update anything. - overlays_standing[GLASSES_LAYER] = glasses.render_mob_appearance(src, SLOT_ID_GLASSES, species.get_effective_bodytype(src, glasses, SLOT_ID_GLASSES)) + overlays_standing[WORN_KEY_GLASSES] = glasses.render_mob_appearance(src, SLOT_ID_GLASSES, species.get_effective_bodytype(src, glasses, SLOT_ID_GLASSES)) - apply_layer(GLASSES_LAYER) + apply_layer(WORN_KEY_GLASSES) /mob/living/carbon/human/update_inv_ears() if(QDESTROYING(src)) return - remove_layer(EARS_LAYER) + remove_layer(WORN_KEY_EARS) if((head && head.inv_hide_flags & (BLOCKHAIR | BLOCKHEADHAIR)) || (wear_mask && wear_mask.inv_hide_flags & (BLOCKHAIR | BLOCKHEADHAIR))) return //Ears are blocked (by hair being blocked, overloaded) @@ -663,15 +663,14 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(r_ear) both += r_ear.render_mob_appearance(src, SLOT_ID_RIGHT_EAR, species.get_effective_bodytype(src, r_ear, SLOT_ID_RIGHT_EAR)) - overlays_standing[EARS_LAYER] = both - apply_layer(EARS_LAYER) + overlays_standing[WORN_KEY_EARS] = both + apply_layer(WORN_KEY_EARS) /mob/living/carbon/human/update_inv_shoes() if(QDESTROYING(src)) return - remove_layer(SHOES_LAYER) - remove_layer(SHOES_LAYER_ALT) //Dumb alternate layer for shoes being under the uniform. + remove_layer(WORN_KEY_SHOES) if(!shoes || (wear_suit && wear_suit.inv_hide_flags & HIDESHOES) || (w_uniform && w_uniform.inv_hide_flags & HIDESHOES)) return //Either nothing to draw, or it'd be hidden. @@ -691,14 +690,13 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //NB: the use of a var for the layer on this one overlays_standing[shoe_layer] = shoes.render_mob_appearance(src, SLOT_ID_SHOES, species.get_effective_bodytype(src, shoes, SLOT_ID_SHOES)) - apply_layer(SHOES_LAYER) - apply_layer(SHOES_LAYER_ALT) + apply_layer(WORN_KEY_SHOES) /mob/living/carbon/human/update_inv_s_store() if(QDESTROYING(src)) return - remove_layer(SUIT_STORE_LAYER) + remove_layer(WORN_KEY_SUITSTORE) if(!s_store) return //Why bother, nothing there. @@ -708,28 +706,28 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) var/t_state = s_store.item_state if(!t_state) t_state = s_store.icon_state - overlays_standing[SUIT_STORE_LAYER] = image(icon = species.suit_storage_icon, icon_state = t_state, layer = BODY_LAYER+SUIT_STORE_LAYER) + overlays_standing[WORN_KEY_SUITSTORE] = image(icon = species.suit_storage_icon, icon_state = t_state, layer = BODY_LAYER+SUIT_STORE_LAYER) - apply_layer(SUIT_STORE_LAYER) + apply_layer(WORN_KEY_SUITSTORE) /mob/living/carbon/human/update_inv_head() if(QDESTROYING(src)) return - remove_layer(HEAD_LAYER) + remove_layer(WORN_KEY_HEAD) if(!head) return //No head item, why bother. - overlays_standing[HEAD_LAYER] = head.render_mob_appearance(src, SLOT_ID_HEAD, species.get_effective_bodytype(src, head, SLOT_ID_HEAD)) + overlays_standing[WORN_KEY_HEAD] = head.render_mob_appearance(src, SLOT_ID_HEAD, species.get_effective_bodytype(src, head, SLOT_ID_HEAD)) - apply_layer(HEAD_LAYER) + apply_layer(WORN_KEY_HEAD) /mob/living/carbon/human/update_inv_belt() if(QDESTROYING(src)) return - remove_layer(BELT_LAYER) + remove_layer(WORN_KEY_BELT) remove_layer(BELT_LAYER_ALT) //Because you can toggle belt layer with a verb if(!belt) @@ -751,7 +749,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(QDESTROYING(src)) return - remove_layer(SUIT_LAYER) + remove_layer(WORN_KEY_SUIT) //Hide/show other layers if necessary update_inv_w_uniform() @@ -765,7 +763,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) // Part of splitting the suit sprites up var/icon/c_mask = null - var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT]) + var/tail_is_rendered = (overlays_standing[WORN_KEY_TAIL] || overlays_standing[TAIL_LAYER_ALT]) var/valid_clip_mask = tail_style?.clip_mask var/obj/item/clothing/suit/S = wear_suit @@ -779,35 +777,35 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) else var/mutable_appearance/MA = MA_or_list MA.filters += filter(type = "alpha", icon = c_mask) - overlays_standing[SUIT_LAYER] = MA_or_list + overlays_standing[WORN_KEY_SUIT] = MA_or_list - apply_layer(SUIT_LAYER) + apply_layer(WORN_KEY_SUIT) /mob/living/carbon/human/update_inv_wear_mask() if(QDESTROYING(src)) return - remove_layer(FACEMASK_LAYER) + remove_layer(WORN_KEY_FACEMASK) if(!wear_mask || (head && head.inv_hide_flags & HIDEMASK)) return //Why bother, nothing in mask slot. - overlays_standing[FACEMASK_LAYER] = wear_mask.render_mob_appearance(src, SLOT_ID_MASK, species.get_effective_bodytype(src, wear_mask, SLOT_ID_MASK)) + overlays_standing[WORN_KEY_FACEMASK] = wear_mask.render_mob_appearance(src, SLOT_ID_MASK, species.get_effective_bodytype(src, wear_mask, SLOT_ID_MASK)) - apply_layer(FACEMASK_LAYER) + apply_layer(WORN_KEY_FACEMASK) /mob/living/carbon/human/update_inv_back() if(QDESTROYING(src)) return - remove_layer(BACK_LAYER) + remove_layer(WORN_KEY_BACK) if(!back) return //Why do anything - overlays_standing[BACK_LAYER] = back.render_mob_appearance(src, SLOT_ID_BACK, species.get_effective_bodytype(src, back, SLOT_ID_BACK)) + overlays_standing[WORN_KEY_BACK] = back.render_mob_appearance(src, SLOT_ID_BACK, species.get_effective_bodytype(src, back, SLOT_ID_BACK)) - apply_layer(BACK_LAYER) + apply_layer(WORN_KEY_BACK) //TODO: Carbon procs in my human update_icons?? /mob/living/carbon/human/update_hud() //TODO: do away with this if possible @@ -835,60 +833,44 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(QDESTROYING(src)) return - remove_layer(HANDCUFF_LAYER) + remove_layer(WORN_KEY_HANDCUFF) update_hud_handcuffed() //TODO if(!handcuffed) return //Not cuffed, why bother - overlays_standing[HANDCUFF_LAYER] = handcuffed.render_mob_appearance(src, SLOT_ID_HANDCUFFED, species.get_effective_bodytype(src, handcuffed, SLOT_ID_HANDCUFFED)) + overlays_standing[WORN_KEY_HANDCUFF] = handcuffed.render_mob_appearance(src, SLOT_ID_HANDCUFFED, species.get_effective_bodytype(src, handcuffed, SLOT_ID_HANDCUFFED)) - apply_layer(HANDCUFF_LAYER) + apply_layer(WORN_KEY_HANDCUFF) /mob/living/carbon/human/update_inv_legcuffed() if(QDESTROYING(src)) return - remove_layer(LEGCUFF_LAYER) + remove_layer(WORN_KEY_LEGCUFF) if(!legcuffed) return //Not legcuffed, why bother. - overlays_standing[LEGCUFF_LAYER] = legcuffed.render_mob_appearance(src, SLOT_ID_LEGCUFFED, species.get_effective_bodytype(src, legcuffed, SLOT_ID_LEGCUFFED)) + overlays_standing[WORN_KEY_LEGCUFF] = legcuffed.render_mob_appearance(src, SLOT_ID_LEGCUFFED, species.get_effective_bodytype(src, legcuffed, SLOT_ID_LEGCUFFED)) - apply_layer(LEGCUFF_LAYER) + apply_layer(WORN_KEY_LEGCUFF) -/mob/living/carbon/human/update_inv_r_hand() +/mob/living/carbon/human/update_inv_hand(index) if(QDESTROYING(src)) return - remove_layer(R_HAND_LAYER) - - if(!r_hand) - return //No hand, no bother. - - overlays_standing[R_HAND_LAYER] = r_hand.render_mob_appearance(src, 2, BODYTYPE_DEFAULT) - - apply_layer(R_HAND_LAYER) - -/mob/living/carbon/human/update_inv_l_hand() - if(QDESTROYING(src)) - return - - remove_layer(L_HAND_LAYER) - - if(!l_hand) - return //No hand, no bother. - - overlays_standing[L_HAND_LAYER] = l_hand.render_mob_appearance(src, 1, BODYTYPE_DEFAULT) - - apply_layer(L_HAND_LAYER) + var/layer_key = WORN_KEY_HELD(index) + remove_layer(layer_key) + if(length(held_items) < index || isnull(held_items[index])) + overlays_standing[layer_key] = held_items[index].render_mob_appearance(src, index, BODYTYPE_DEFAULT) + apply_layer(layer_key) /mob/living/carbon/human/proc/update_tail_showing() if(QDESTROYING(src)) return - remove_layer(TAIL_LAYER) + remove_layer(WORN_KEY_TAIL) remove_layer(TAIL_LAYER_ALT) var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER @@ -948,7 +930,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER var/list/image/tail_overlays = overlays_standing[used_tail_layer] - remove_layer(TAIL_LAYER) + remove_layer(WORN_KEY_TAIL) remove_layer(TAIL_LAYER_ALT) if(!tail_overlays) @@ -1021,21 +1003,21 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(QDESTROYING(src)) return - remove_layer(WING_LAYER) + remove_layer(WORN_KEY_WING) - overlays_standing[WING_LAYER] = list() + overlays_standing[WORN_KEY_WING] = list() var/image/vr_wing_image = get_wing_image(TRUE) if(vr_wing_image) vr_wing_image.layer = BODY_LAYER+WING_LAYER - overlays_standing[WING_LAYER] += vr_wing_image + overlays_standing[WORN_KEY_WING] += vr_wing_image if(wing_style?.front_behind_system) var/image/vr_wing_image_2 = get_wing_image(FALSE) vr_wing_image_2.layer = BODY_LAYER - WING_LAYER - overlays_standing[WING_LAYER] += vr_wing_image_2 + overlays_standing[WORN_KEY_WING] += vr_wing_image_2 - apply_layer(WING_LAYER) + apply_layer(WORN_KEY_WING) /mob/living/carbon/human/proc/wing_spread_start() if(QDESTROYING(src)) @@ -1048,7 +1030,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(QDESTROYING(src)) return - remove_layer(MODIFIER_EFFECTS_LAYER) + remove_layer(WORN_KEY_MODIFIERS) if(!LAZYLEN(modifiers)) return //No modifiers, no effects. @@ -1059,81 +1041,81 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) var/image/I = image(icon = 'icons/mob/modifier_effects.dmi', icon_state = M.mob_overlay_state) effects.add_overlay(I) //TODO, this compositing is annoying. - overlays_standing[MODIFIER_EFFECTS_LAYER] = effects + overlays_standing[WORN_KEY_MODIFIERS] = effects - apply_layer(MODIFIER_EFFECTS_LAYER) + apply_layer(WORN_KEY_MODIFIERS) /mob/living/carbon/human/update_fire() if(QDESTROYING(src)) return - remove_layer(FIRE_LAYER) + remove_layer(WORN_KEY_FIRE) if(!on_fire) return - overlays_standing[FIRE_LAYER] = image(icon = 'icons/mob/OnFire.dmi', icon_state = get_fire_icon_state(), layer = BODY_LAYER+FIRE_LAYER) + overlays_standing[WORN_KEY_FIRE] = image(icon = 'icons/mob/OnFire.dmi', icon_state = get_fire_icon_state(), layer = BODY_LAYER+FIRE_LAYER) - apply_layer(FIRE_LAYER) + apply_layer(WORN_KEY_FIRE) /mob/living/carbon/human/update_water() if(QDESTROYING(src)) return - remove_layer(MOB_WATER_LAYER) + remove_layer(WORN_KEY_WATER) var/depth = check_submerged() if(!depth || lying) return if(depth < 3) - overlays_standing[MOB_WATER_LAYER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+MOB_WATER_LAYER) //TODO: Improve - apply_layer(MOB_WATER_LAYER) + overlays_standing[WORN_KEY_WATER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+MOB_WATER_LAYER) //TODO: Improve + apply_layer(WORN_KEY_WATER) if(depth == 4) - overlays_standing[MOB_WATER_LAYER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hacid_1", layer = BODY_LAYER+MOB_WATER_LAYER) - apply_layer(MOB_WATER_LAYER) + overlays_standing[WORN_KEY_WATER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hacid_1", layer = BODY_LAYER+MOB_WATER_LAYER) + apply_layer(WORN_KEY_WATER) if(depth == 5) - overlays_standing[MOB_WATER_LAYER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hacid_2", layer = BODY_LAYER+MOB_WATER_LAYER) - apply_layer(MOB_WATER_LAYER) + overlays_standing[WORN_KEY_WATER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hacid_2", layer = BODY_LAYER+MOB_WATER_LAYER) + apply_layer(WORN_KEY_WATER) if(depth == 6) - overlays_standing[MOB_WATER_LAYER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hblood_1", layer = BODY_LAYER+MOB_WATER_LAYER) - apply_layer(MOB_WATER_LAYER) + overlays_standing[WORN_KEY_WATER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hblood_1", layer = BODY_LAYER+MOB_WATER_LAYER) + apply_layer(WORN_KEY_WATER) if(depth == 7) - overlays_standing[MOB_WATER_LAYER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hblood_2", layer = BODY_LAYER+MOB_WATER_LAYER) - apply_layer(MOB_WATER_LAYER) + overlays_standing[WORN_KEY_WATER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hblood_2", layer = BODY_LAYER+MOB_WATER_LAYER) + apply_layer(WORN_KEY_WATER) /mob/living/carbon/human/update_acidsub() if(QDESTROYING(src)) return - remove_layer(MOB_WATER_LAYER) + remove_layer(WORN_KEY_WATER) var/depth = check_submerged() if(!depth || lying) return - overlays_standing[MOB_WATER_LAYER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hacid_[depth]", layer = BODY_LAYER+MOB_WATER_LAYER) //TODO: Improve + overlays_standing[WORN_KEY_WATER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hacid_[depth]", layer = BODY_LAYER+MOB_WATER_LAYER) //TODO: Improve - apply_layer(MOB_WATER_LAYER) + apply_layer(WORN_KEY_WATER) /mob/living/carbon/human/update_bloodsub() if(QDESTROYING(src)) return - remove_layer(MOB_WATER_LAYER) + remove_layer(WORN_KEY_WATER) var/depth = check_submerged() if(!depth || lying) return - overlays_standing[MOB_WATER_LAYER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hblood_[depth]", layer = BODY_LAYER+MOB_WATER_LAYER) //TODO: Improve + overlays_standing[WORN_KEY_WATER] = image(icon = 'icons/mob/submerged.dmi', icon_state = "hblood_[depth]", layer = BODY_LAYER+MOB_WATER_LAYER) //TODO: Improve - apply_layer(MOB_WATER_LAYER) + apply_layer(WORN_KEY_WATER) /mob/living/carbon/human/proc/update_surgery() if(QDESTROYING(src)) return - remove_layer(SURGERY_LAYER) + remove_layer(WORN_KEY_SURGERY) var/image/total = new for(var/obj/item/organ/external/E in organs) @@ -1142,8 +1124,8 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) total.add_overlay(I) //TODO: This compositing is annoying if(total.overlays.len) - overlays_standing[SURGERY_LAYER] = total - apply_layer(SURGERY_LAYER) + overlays_standing[WORN_KEY_SURGERY] = total + apply_layer(WORN_KEY_SURGERY) /mob/living/carbon/human/proc/get_wing_image(front) //redbull gives you wings var/icon/grad_swing From f05549c16be5c5f2ac844f19e6741c0898990644 Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 7 Jul 2023 22:18:17 -0700 Subject: [PATCH 013/140] Fix --- code/game/objects/items.dm | 10 ---------- code/game/objects/items/devices/tvcamera.dm | 6 +----- code/game/objects/items/tools/weldingtool.dm | 11 ++--------- code/game/objects/items/toys.dm | 9 ++------- code/game/objects/items/weapons/cigs_lighters.dm | 9 ++------- code/game/objects/items/weapons/melee/energy.dm | 11 ++--------- code/game/objects/items/weapons/melee/misc.dm | 15 +++------------ code/game/objects/items/weapons/other.dm | 7 +------ code/game/objects/items/weapons/shields.dm | 14 ++------------ .../game/objects/items/weapons/swords_axes_etc.dm | 5 +---- code/modules/clothing/chameleon.dm | 12 ++---------- code/modules/holodeck/HolodeckObjects.dm | 5 +---- .../jobs/job_types/station/civillian/chaplain.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 3 +-- code/modules/mob/living/silicon/pai/mobility.dm | 3 +-- .../projectiles/guns/launcher/pneumatic.dm | 5 +---- code/modules/vore/fluffstuff/custom_items.dm | 8 +------- code/modules/vore/fluffstuff/guns/gunsword.dm | 8 +------- 18 files changed, 25 insertions(+), 118 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index fd59697de142..5d7b765f65b0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -215,16 +215,6 @@ return TRUE return FALSE - -///Checks if the item is being held by a mob, and if so, updates the held icons -/obj/item/proc/update_held_icon() - if(isliving(src.loc)) - var/mob/living/M = src.loc - if(M.l_hand == src) - M.update_inv_l_hand() - else if(M.r_hand == src) - M.update_inv_r_hand() - /obj/item/legacy_ex_act(severity) switch(severity) if(1.0) diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index 1301e9265e25..d05f63514c4b 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -91,8 +91,4 @@ else icon_state = "camcorder" item_state = "camcorder" - var/mob/living/carbon/human/H = loc - if(istype(H)) - H.update_inv_r_hand() - H.update_inv_l_hand() - H.update_inv_belt() + update_worn_icon() diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 0de4fc0e3293..fd4a27b8609a 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -230,11 +230,7 @@ else set_light(0) -// icon_state = welding ? "[icon_state]1" : "[initial(icon_state)]" - var/mob/M = loc - if(istype(M)) - M.update_inv_l_hand() - M.update_inv_r_hand() + update_worn_icon() //Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1) //so that the welding tool updates accordingly @@ -719,10 +715,7 @@ /obj/item/weldingtool/electric/crystal/update_icon() icon_state = welding ? "crystal_welder_on" : "crystal_welder" item_state = welding ? "crystal_tool_lit" : "crystal_tool" - var/mob/M = loc - if(istype(M)) - M.update_inv_l_hand() - M.update_inv_r_hand() + update_worn_icon() /obj/item/weldingtool/electric/crystal/attack_self(var/mob/living/carbon/human/user) if(user.species.name == SPECIES_ADHERENT) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 6097e94eaee9..c2aa648b8848 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -281,13 +281,8 @@ src.icon_state = "sword0" src.w_class = ITEMSIZE_SMALL - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() - - src.add_fingerprint(user) - return + update_worn_icon() + add_fingerprint(user) /obj/item/toy/katana name = "replica katana" diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 9fa9d86fb0e6..1fe020c3069c 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -200,9 +200,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM lit = 0 icon_state = initial(icon_state) item_state = initial(item_state) - M.update_inv_wear_mask(0) - M.update_inv_l_hand(0) - M.update_inv_r_hand(1) + update_worn_icon() smoketime = 0 reagents.clear_reagents() name = "empty [initial(name)]" @@ -409,10 +407,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/cigar/attackby(obj/item/W as obj, mob/user as mob) ..() - - user.update_inv_wear_mask(0) - user.update_inv_l_hand(0) - user.update_inv_r_hand(1) + update_worn_icon() /obj/item/cigbutt/imp name = "cigarette butt" diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index ece1f92a4d34..4f8021a36601 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -95,11 +95,7 @@ else activate(user) - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() - + update_worn_icon() add_fingerprint(user) return @@ -160,10 +156,7 @@ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other if(active) add_overlay(blade_overlay) - if(istype(usr,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = usr - H.update_inv_l_hand() - H.update_inv_r_hand() + update_worn_icon() /obj/item/melee/energy/AltClick(mob/living/user) if(!colorable) //checks if is not colorable diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 0d3690d06861..4133ef1e5c11 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -60,10 +60,7 @@ addblends = icon_state + "_a" item_state = icon_state update_icon() - if(ishuman(src.loc)) - var/mob/living/carbon/human/H = src.loc - H.update_inv_l_hand(0) - H.update_inv_r_hand() + update_worn_icon() // Randomizes color /obj/item/melee/umbrella/random/Initialize(mapload) @@ -292,10 +289,7 @@ else set_light(0) - var/mob/M = loc - if(istype(M)) - M.update_inv_l_hand() - M.update_inv_r_hand() + update_worn_icon() /obj/item/melee/ashlander/elder/proc/activate(mob/living/user) to_chat(user, "You ignite the [src]'s sacred flame.") @@ -536,10 +530,7 @@ else set_light(0) - var/mob/M = loc - if(istype(M)) - M.update_inv_l_hand() - M.update_inv_r_hand() + update_worn_icon() /obj/item/melee/thermalcutter/proc/activate(var/mob/M) var/turf/T = get_turf(src) diff --git a/code/game/objects/items/weapons/other.dm b/code/game/objects/items/weapons/other.dm index 24336cd1804f..95092d9c81ad 100644 --- a/code/game/objects/items/weapons/other.dm +++ b/code/game/objects/items/weapons/other.dm @@ -236,14 +236,9 @@ damage_force = 3 attack_verb = list("hit", "poked", "prodded") - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() - + update_worn_icon() playsound(src, 'sound/weapons/empty.ogg', 50, 1) add_fingerprint(user) - return TRUE /obj/item/cane/crutch name ="crutch" diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 5f7bc9dabcfd..2c851b1238f0 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -349,13 +349,8 @@ playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) to_chat(user, "\The [src] can now be concealed.") - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() - + update_worn_icon() add_fingerprint(user) - return /obj/item/shield/energy/update_icon() var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade") @@ -428,13 +423,8 @@ slot_flags = null to_chat(user, "[src] can now be concealed.") - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() - + update_worn_icon() add_fingerprint(user) - return /obj/item/shield/energy/imperial name = "energy scutum" diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index f7f393e80405..8214cc4ee095 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -80,10 +80,7 @@ w_class = ITEMSIZE_SMALL damage_force = off_force //not so robust now attack_verb = list("poked", "jabbed") - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() + update_worn_icon() playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) add_fingerprint(user) if(blood_overlay && blood_DNA && (blood_DNA.len >= 1)) //updates blood overlay, if any diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 49ab8b5948ec..172453b75598 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -469,10 +469,7 @@ desc = "It's a desert eagle." icon_state = "deagle" update_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_r_hand() - M.update_inv_l_hand() + update_worn_icon() /obj/item/gun/energy/chameleon/disguise(var/newtype) var/obj/item/gun/copy = ..() @@ -501,9 +498,4 @@ return disguise(gun_choices[picked]) - - //so our overlays update. - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_r_hand() - M.update_inv_l_hand() + update_worn_icon() diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 4c15dea56efc..6703cf8dc278 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -342,10 +342,7 @@ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other if(active) add_overlay(blade_overlay) - if(istype(usr,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = usr - H.update_inv_l_hand() - H.update_inv_r_hand() + update_worn_icon() //BASKETBALL OBJECTS diff --git a/code/modules/jobs/job_types/station/civillian/chaplain.dm b/code/modules/jobs/job_types/station/civillian/chaplain.dm index 038fe39fc06c..a0b70e79c70f 100644 --- a/code/modules/jobs/job_types/station/civillian/chaplain.dm +++ b/code/modules/jobs/job_types/station/civillian/chaplain.dm @@ -141,7 +141,7 @@ else B.icon_state = "bible" B.item_state = "bible" - H.update_inv_l_hand() // so that it updates the bible's item_state in his hand + B.update_worn_icon() switch(input(H,"Look at your bible - is this what you want?") in list("Yes","No")) if("Yes") accepted = 1 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 3c43195e9379..86f308b642fe 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -553,8 +553,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) update_inv_belt() update_inv_back() update_inv_wear_suit() - update_inv_r_hand() - update_inv_l_hand() + update_inv_hands() update_handcuffed() update_inv_legcuffed() //update_inv_pockets() //Doesn't do anything diff --git a/code/modules/mob/living/silicon/pai/mobility.dm b/code/modules/mob/living/silicon/pai/mobility.dm index 5a026c9b307f..e4beacba6dbb 100644 --- a/code/modules/mob/living/silicon/pai/mobility.dm +++ b/code/modules/mob/living/silicon/pai/mobility.dm @@ -84,8 +84,7 @@ return H.icon_state = "[chassis]" - grabber.update_inv_l_hand() - grabber.update_inv_r_hand() + H.update_worn_icon() return H // handle movement speed diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 8a85bae58f06..04f16ba6f907 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -130,10 +130,7 @@ /obj/item/gun/launcher/pneumatic/update_icon() . = ..() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_r_hand() - M.update_inv_l_hand() + update_worn_icon() /obj/item/gun/launcher/pneumatic/update_icon_state() . = ..() diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index 7bfebfc2c4e2..752335bd7b61 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -1528,14 +1528,8 @@ deactivate(user) else activate(user) - - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() - + update_worn_icon() add_fingerprint(user) - return /obj/item/melee/fluffstuff/suicide_act(mob/user) var/tempgender = "[user.gender == MALE ? "he's" : user.gender == FEMALE ? "she's" : "they are"]" diff --git a/code/modules/vore/fluffstuff/guns/gunsword.dm b/code/modules/vore/fluffstuff/guns/gunsword.dm index f6827a7075ec..0661fbcfe596 100644 --- a/code/modules/vore/fluffstuff/guns/gunsword.dm +++ b/code/modules/vore/fluffstuff/guns/gunsword.dm @@ -106,16 +106,10 @@ H?.take_organ_damage(5,5) deactivate(user) update_icon() - update_held_icon() else activate(user) update_icon() - update_held_icon() - - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_l_hand() - H.update_inv_r_hand() + update_worn_icon() add_fingerprint(user) return From 696893bac61e6c2ceed0ce38fb0c61bd23fe5dab Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 7 Jul 2023 22:19:07 -0700 Subject: [PATCH 014/140] optimize --- code/game/objects/items.dm | 2 +- code/game/objects/items/devices/defib.dm | 4 ++-- .../objects/items/weapons/material/twohanded.dm | 8 ++++---- code/modules/inventory/item/rendering.dm | 5 ++++- code/modules/mob/living/inventory.dm | 4 ++-- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/energy.dm | 6 +++--- code/modules/projectiles/guns/energy/special.dm | 4 ++-- code/modules/projectiles/guns/modular_guns.dm | 2 +- .../projectiles/guns/projectile/automatic.dm | 14 +++++++------- code/modules/resleeving/mirror.dm | 2 +- code/modules/vore/fluffstuff/custom_guns.dm | 12 ++++++------ code/modules/vore/fluffstuff/custom_items.dm | 6 +++--- code/modules/vore/fluffstuff/guns/crestrose.dm | 2 +- 14 files changed, 38 insertions(+), 35 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 5d7b765f65b0..de632d7610a3 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -195,7 +195,7 @@ return TRUE /obj/item/proc/update_twohanding() - update_held_icon() + update_worn_icon() /obj/item/proc/is_held_twohanded(mob/living/M) var/check_hand diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 209782d42fa4..c1e9df422c0d 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -221,7 +221,7 @@ make_announcement("beeps, \"Unit is re-energized.\"", "notice") playsound(src, 'sound/machines/defib_ready.ogg', 50, 0) -/obj/item/shockpaddles/update_held_icon() +/obj/item/shockpaddles/update_worn_icon() var/mob/living/M = loc if(istype(M) && M.is_holding(src) && !M.hands_full()) wielded = 1 @@ -239,7 +239,7 @@ icon_state = "defibpaddles[wielded]_cooldown" /obj/item/shockpaddles/proc/can_use(mob/user, mob/M) - update_held_icon() + update_worn_icon() if(busy) return 0 if(!check_charge(chargecost)) diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index 7237c7e83ede..b4d47b860ded 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -30,7 +30,7 @@ drop_sound = 'sound/items/drop/sword.ogg' pickup_sound = 'sound/items/pickup/sword.ogg' -/obj/item/material/twohanded/update_held_icon() +/obj/item/material/twohanded/update_worn_icon() var/mob/living/M = loc if(istype(M) && M.can_wield_item(src) && is_held_twohanded(M)) wielded = 1 @@ -84,7 +84,7 @@ ..() if(wielded) spawn(0) - update_held_icon() + update_worn_icon() /* * Fireaxe @@ -110,7 +110,7 @@ pickup_sound = 'sound/items/pickup/axe.ogg' heavy = TRUE -/obj/item/material/twohanded/fireaxe/update_held_icon() +/obj/item/material/twohanded/fireaxe/update_worn_icon() var/mob/living/M = loc if(istype(M) && M.can_wield_item(src) && M.is_holding(src) && !M.hands_full()) wielded = 1 @@ -311,7 +311,7 @@ armor_penetration = 50 heavy = TRUE -/obj/item/material/twohanded/sledgehammer/update_held_icon() +/obj/item/material/twohanded/sledgehammer/update_worn_icon() var/mob/living/M = loc if(istype(M) && M.can_wield_item(src) && M.is_holding(src) && !M.hands_full()) wielded = 1 diff --git a/code/modules/inventory/item/rendering.dm b/code/modules/inventory/item/rendering.dm index ff2b3fe95030..e1899294b4c4 100644 --- a/code/modules/inventory/item/rendering.dm +++ b/code/modules/inventory/item/rendering.dm @@ -250,6 +250,9 @@ return // acceptable var/mob/M = worn_mob() ASSERT(M) // not acceptable + if(held_index) + M.update_inv_hand(held_index) + return switch(worn_slot) if(SLOT_ID_BACK) M.update_inv_back() @@ -262,7 +265,7 @@ if(SLOT_ID_HANDCUFFED) M.update_inv_handcuffed() if(SLOT_ID_HANDS) - M.update_inv_hand(held_index) + ASSERT("why did we go here when we should have short-circuited at the held_index check?") if(SLOT_ID_HEAD) M.update_inv_head() if(SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 4020eb5cc5f0..31c6295425a3 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -39,7 +39,7 @@ l_hand = I log_inventory("[key_name(src)] put [I] in hand 1") l_hand.update_twohanding() - l_hand.update_held_icon() + l_hand.update_worn_icon() // ! WARNING: snowflake - at time of equipped, vars aren't set yet. position_hud_item(l_hand, SLOT_ID_HANDS) update_inv_l_hand() @@ -60,7 +60,7 @@ r_hand = I log_inventory("[key_name(src)] put [I] in hand 1") r_hand.update_twohanding() - r_hand.update_held_icon() + r_hand.update_worn_icon() // ! WARNING: snowflake - at time of equipped, vars aren't set yet. position_hud_item(r_hand, SLOT_ID_HANDS) update_inv_r_hand() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index e6fb0f7496c1..7aac7acca526 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -160,7 +160,7 @@ update_icon() // In case item_state is set somewhere else. ..() -/obj/item/gun/update_held_icon() +/obj/item/gun/update_worn_icon() if(wielded_item_state) var/mob/living/M = loc if(istype(M)) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 34a4fa476934..d15e6c5775a9 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -131,7 +131,7 @@ user.visible_message("[user] inserts [P] into [src].", "You insert [P] into [src].") playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) update_icon() - update_held_icon() + update_worn_icon() else to_chat(user, "This cell is not fitted for [src].") return @@ -147,7 +147,7 @@ power_supply = null playsound(src, 'sound/weapons/empty.ogg', 50, 1) update_icon() - update_held_icon() + update_worn_icon() else to_chat(user, "[src] does not have a power cell.") @@ -216,7 +216,7 @@ icon_state = "[initial(icon_state)]" if(!ignore_inhands) - update_held_icon() + update_worn_icon() /obj/item/gun/energy/proc/start_recharge() if(power_supply == null) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index fff2b2bea644..900f8d780cab 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -489,7 +489,7 @@ . = ..() if(overheating) icon_state = "prifle_overheat" - update_held_icon() + update_worn_icon() else return @@ -526,7 +526,7 @@ . = ..() if(overheating) icon_state = "ppistol_overheat" - update_held_icon() + update_worn_icon() else return diff --git a/code/modules/projectiles/guns/modular_guns.dm b/code/modules/projectiles/guns/modular_guns.dm index 7e226f09e813..4a7a0a128ab5 100644 --- a/code/modules/projectiles/guns/modular_guns.dm +++ b/code/modules/projectiles/guns/modular_guns.dm @@ -144,7 +144,7 @@ user.visible_message("[user] inserts [P] into [src].", "You insert [P] into [src].") playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) update_icon() - update_held_icon() + update_worn_icon() return /obj/item/gun/energy/modular/pistol diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 5974e8fd0986..b6b42b88bbcd 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -101,7 +101,7 @@ /obj/item/gun/ballistic/automatic/sts35/update_icon(ignore_inhands) . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/wt550 name = "machine pistol" @@ -193,7 +193,7 @@ /obj/item/gun/ballistic/automatic/z8/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/z8/examine(mob/user, dist) . = ..() @@ -251,7 +251,7 @@ cover_open = !cover_open to_chat(user, "You [cover_open ? "open" : "close"] [src]'s cover.") update_icon() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/lmg/attack_self(mob/user) if(cover_open) @@ -267,7 +267,7 @@ /obj/item/gun/ballistic/automatic/lmg/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/lmg/update_icon_state() . = ..() @@ -467,7 +467,7 @@ /obj/item/gun/ballistic/automatic/tommygun/update_icon_state() . = ..() icon_state = (ammo_magazine)? "tommygun" : "tommygun-empty" -// update_held_icon() +// update_worn_icon() /obj/item/gun/ballistic/automatic/bullpup // Admin abuse assault rifle. ToDo: Make this less shit. Maybe remove its autofire, and make it spawn with only 10 rounds at start. name = "bullpup rifle" @@ -502,7 +502,7 @@ /obj/item/gun/ballistic/automatic/bullpup/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/fal name = "FN-FAL" @@ -753,7 +753,7 @@ /obj/item/gun/ballistic/automatic/lmg/foam/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/lmg/foam/handle_suicide(mob/living/user) user.show_message("You feel rather silly, trying to commit suicide with a toy.") diff --git a/code/modules/resleeving/mirror.dm b/code/modules/resleeving/mirror.dm index 7e30527c71e7..2e246ed0e351 100644 --- a/code/modules/resleeving/mirror.dm +++ b/code/modules/resleeving/mirror.dm @@ -204,5 +204,5 @@ imp = I user.visible_message("[user] inserts the [I] into the [src].", "You insert the [I] into the [src].") update_icon() - update_held_icon() + update_worn_icon() return diff --git a/code/modules/vore/fluffstuff/custom_guns.dm b/code/modules/vore/fluffstuff/custom_guns.dm index 62dc29bfa9e7..ba0a8f3af0bf 100644 --- a/code/modules/vore/fluffstuff/custom_guns.dm +++ b/code/modules/vore/fluffstuff/custom_guns.dm @@ -87,7 +87,7 @@ /obj/item/gun/ballistic/automatic/pdw/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/pdw/update_icon_state() . = ..() @@ -230,7 +230,7 @@ END OF CITADEL CHANGES */ /obj/item/gun/ballistic/automatic/stg/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/stg/update_icon_state() . = ..() @@ -271,7 +271,7 @@ END OF CITADEL CHANGES */ // TODO - Fix this for spriting different size magazines icon_state = (ammo_magazine)? "ufarc" : "ufarc-empty" item_state = (ammo_magazine)? "bullpup" : "bullpup-empty" - if(!ignore_inhands) update_held_icon() + if(!ignore_inhands) update_worn_icon() @@ -289,7 +289,7 @@ END OF CITADEL CHANGES */ // TODO - Fix this for spriting different size magazines icon_state = (ammo_magazine)? "g44" : "g44-empty" item_state = (ammo_magazine)? "bullpup" : "bullpup-empty" - if(!ignore_inhands) update_held_icon() + if(!ignore_inhands) update_worn_icon() //-----------------------G44 Energy Variant-------------------- /obj/item/gun/energy/gun/burst/g44e @@ -747,7 +747,7 @@ END OF CITADEL CHANGES */ /obj/item/gun/energy/frontier/update_icon() if(recharging) icon_state = "[initial(icon_state)]_pump" - update_held_icon() + update_worn_icon() return ..() @@ -780,7 +780,7 @@ END OF CITADEL CHANGES */ . = ..() if(recharging) icon_state = "[modifystate]_pump" - update_held_icon() + update_worn_icon() //Expeditionary Holdout Phaser Pistol /obj/item/gun/energy/frontier/locked/holdout diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index 752335bd7b61..92812661bd93 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -1407,7 +1407,7 @@ update_icon() return -/obj/item/melee/baton/fluff/stunstaff/update_held_icon() +/obj/item/melee/baton/fluff/stunstaff/update_worn_icon() var/mob/living/M = loc if(istype(M) && !issmall(M) && M.is_holding(src) && !M.hands_full()) wielded = 1 @@ -1441,7 +1441,7 @@ if(wielded) wielded = 0 spawn(0) - update_held_icon() + update_worn_icon() /obj/item/melee/baton/fluff/stunstaff/attack_self(mob/user) . = ..() @@ -1457,7 +1457,7 @@ else status = 0 to_chat(user, "[src] is out of charge.") - update_held_icon() + update_worn_icon() add_fingerprint(user) /obj/item/storage/backpack/fluff/stunstaff diff --git a/code/modules/vore/fluffstuff/guns/crestrose.dm b/code/modules/vore/fluffstuff/guns/crestrose.dm index 95ff8ed09a61..246a04c4f831 100644 --- a/code/modules/vore/fluffstuff/guns/crestrose.dm +++ b/code/modules/vore/fluffstuff/guns/crestrose.dm @@ -29,7 +29,7 @@ /obj/item/gun/ballistic/automatic/fluff/crestrose/switch_firemodes(mob/user) if(..()) update_icon() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/fluff/crestrose/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") From 19c0809ec01bf9078868a7f3ff57f7af40ddd363 Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 7 Jul 2023 22:31:22 -0700 Subject: [PATCH 015/140] more stuff --- citadel.dme | 1 + .../game/gamemodes/technomancer/spell_objs.dm | 10 +++---- code/modules/flufftext/Hallucination.dm | 27 ++----------------- code/modules/mob/grab.dm | 12 +++------ code/modules/mob/living/carbon/hands.dm | 6 +++++ code/modules/photography/camera.dm | 16 +++++------ code/modules/power/smes/smes_construction.dm | 2 +- 7 files changed, 23 insertions(+), 51 deletions(-) create mode 100644 code/modules/mob/living/carbon/hands.dm diff --git a/citadel.dme b/citadel.dme index 945f42fbae2f..61a4ae09f4fd 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3177,6 +3177,7 @@ #include "code\modules\mob\living\carbon\carbon_powers.dm" #include "code\modules\mob\living\carbon\cpr.dm" #include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\hands.dm" #include "code\modules\mob\living\carbon\health.dm" #include "code\modules\mob\living\carbon\inventory.dm" #include "code\modules\mob\living\carbon\perspective.dm" diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index bd376e6d1178..43c2527d9da9 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -193,17 +193,15 @@ // Parameters: 1 (I - item being compared to determine what the offhand is) // Description: Helper for Aspect spells. /mob/living/carbon/human/proc/get_other_hand(var/obj/item/I) - if(isnull(owner)) - return FALSE - var/our_index = owner.get_held_index(src) + var/our_index = get_held_index(src) if(!our_index) return FALSE - for(var/i in 1 to length(owner.held_items)) + for(var/i in 1 to length(held_items)) if(i == our_index) continue - if(isnull(owner.held_items[i])) + if(isnull(held_items[i])) continue - return owner.held_items[i] + return held_items[i] // Proc: attack_self() // Parameters: 1 (user - the Technomancer that invoked this proc) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 00d52f74c19b..39c3e0bd2433 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -326,23 +326,6 @@ proc/check_panel(mob/M) SEND_IMAGE(target, I) spawn(300) qdel(O) - return - -GLOBAL_LIST_INIT(non_fakeattack_weapons, list(/obj/item/gun/ballistic, /obj/item/ammo_magazine/s357,\ - /obj/item/gun/energy/crossbow, /obj/item/melee/energy/sword,\ - /obj/item/storage/box/syndicate, /obj/item/storage/box/emps,\ - /obj/item/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ - /obj/item/clothing/shoes/syndigaloshes, /obj/item/card/id/syndicate,\ - /obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\ - /obj/item/chameleon, /obj/item/card/emag,\ - /obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\ - /obj/item/radio/headset/syndicate, /obj/item/plastique,\ - /obj/item/powersink, /obj/item/storage/box/syndie_kit,\ - /obj/item/toy/syndicateballoon, /obj/item/gun/energy/captain,\ - /obj/item/hand_tele, /obj/item/rcd, /obj/item/tank/jetpack,\ - /obj/item/clothing/under/rank/captain, /obj/item/aicard,\ - /obj/item/clothing/shoes/magboots, /obj/item/blueprints, /obj/item/disk/nuclear,\ - /obj/item/clothing/suit/space/void, /obj/item/tank)) /proc/fake_attack(var/mob/living/target) var/list/possible_clones = new/list() @@ -364,14 +347,8 @@ GLOBAL_LIST_INIT(non_fakeattack_weapons, list(/obj/item/gun/ballistic, /obj/item //var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(outside_range(target)) var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(target.loc) - if(clone.l_hand) - if(!(locate(clone.l_hand) in GLOB.non_fakeattack_weapons)) - clone_weapon = clone.l_hand.name - F.weap = clone.l_hand - else if (clone.r_hand) - if(!(locate(clone.r_hand) in GLOB.non_fakeattack_weapons)) - clone_weapon = clone.r_hand.name - F.weap = clone.r_hand + // meta-able but whatever we can redo later. + F.weap = clone.get_active_held_item() || clone.get_inactive_held_item() F.name = clone.name F.my_target = target diff --git a/code/modules/mob/grab.dm b/code/modules/mob/grab.dm index 341b22107842..f63e3b0dcdf3 100644 --- a/code/modules/mob/grab.dm +++ b/code/modules/mob/grab.dm @@ -71,7 +71,7 @@ L.resist() //shortcut for resisting grabs //if we are grabbing someone - for(var/obj/item/grab/G in list(L.l_hand, L.r_hand)) + for(var/obj/item/grab/G in L.get_held_items_of_type(/obj/item/grab)) G.reset_kill_state() //no wandering across the station/asteroid while choking someone /obj/item/grab @@ -160,14 +160,8 @@ if(state <= GRAB_AGGRESSIVE) allow_upgrade = 1 //disallow upgrading if we're grabbing more than one person - if((assailant.l_hand && assailant.l_hand != src && istype(assailant.l_hand, /obj/item/grab))) - var/obj/item/grab/G = assailant.l_hand - if(G.affecting != affecting) - allow_upgrade = 0 - if((assailant.r_hand && assailant.r_hand != src && istype(assailant.r_hand, /obj/item/grab))) - var/obj/item/grab/G = assailant.r_hand - if(G.affecting != affecting) - allow_upgrade = 0 + if(length(assailant.grabbing()) > 1) + allow_upgrade = 0 //disallow upgrading past aggressive if we're being grabbed aggressively for(var/obj/item/grab/G in affecting.grabbed_by) diff --git a/code/modules/mob/living/carbon/hands.dm b/code/modules/mob/living/carbon/hands.dm new file mode 100644 index 000000000000..9ead233e00c1 --- /dev/null +++ b/code/modules/mob/living/carbon/hands.dm @@ -0,0 +1,6 @@ +/mob/living/carbon/proc/get_active_hand_organ_key() + #warn impl + +/mob/living/carbon/proc/get_active_hand_organ() + RETURN_TYPE(/obj/item/organ/external) + return get_organ(get_active_hand_organ_key()) diff --git a/code/modules/photography/camera.dm b/code/modules/photography/camera.dm index c40ae00373b5..306c792b5838 100644 --- a/code/modules/photography/camera.dm +++ b/code/modules/photography/camera.dm @@ -107,19 +107,15 @@ var/mob_detail for(var/mob/living/carbon/A in the_turf) if(A.invisibility) continue - var/holding = null - if(A.l_hand || A.r_hand) - if(A.l_hand) holding = "They are holding \a [A.l_hand]" - if(A.r_hand) - if(holding) - holding += " and \a [A.r_hand]" - else - holding = "They are holding \a [A.r_hand]" + var/holding = list() + + for(var/obj/item/held as anything in A.get_held_items()) + holding += "\a [held]" if(!mob_detail) - mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " + mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[length(holding)? " They are holding [english_list(holding)]":"."]. " else - mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." + mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[length(holding)? " They are holding [english_list(holding)]":"."]." return mob_detail diff --git a/code/modules/power/smes/smes_construction.dm b/code/modules/power/smes/smes_construction.dm index e875d36c8bd9..bca7d06ff04f 100644 --- a/code/modules/power/smes/smes_construction.dm +++ b/code/modules/power/smes/smes_construction.dm @@ -165,7 +165,7 @@ log_game("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100") message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100 - JMP") - var/used_hand = h_user.hand?"l_hand":"r_hand" + var/used_hand = h_user.get_active_hand_organ_key() switch (intensity) if (0 to 15) From f072ac1efc3c5acdd88f38c283293f0204be040a Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 7 Jul 2023 22:33:12 -0700 Subject: [PATCH 016/140] helper --- code/modules/mob/living/carbon/hands.dm | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/hands.dm b/code/modules/mob/living/carbon/hands.dm index 9ead233e00c1..f32495d2b74a 100644 --- a/code/modules/mob/living/carbon/hands.dm +++ b/code/modules/mob/living/carbon/hands.dm @@ -1,6 +1,17 @@ /mob/living/carbon/proc/get_active_hand_organ_key() - #warn impl + return get_hand_organ_key(active_hand) /mob/living/carbon/proc/get_active_hand_organ() RETURN_TYPE(/obj/item/organ/external) - return get_organ(get_active_hand_organ_key()) + return get_organ(get_hand_organ_key(active_hand)) + +/mob/living/carbon/proc/get_hand_organ_key(index) + #warn impl + +/mob/living/carbon/proc/get_hand_organ(index) + return get_organ(get_hand_organ_key(index)) + +/mob/living/carbon/proc/is_hand_functional(index) + var/obj/item/organ/external/part = get_hand_organ(index) + #warn impl + From 97243733850511dc53a40bdd2e4352536fe901fc Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 7 Jul 2023 22:46:44 -0700 Subject: [PATCH 017/140] stuff --- code/modules/inventory/hands.dm | 4 +- code/modules/inventory/inventory.dm | 3 - code/modules/inventory/mob/hands.dm | 107 +++++++++++++++++---------- code/modules/mob/living/inventory.dm | 26 +------ 4 files changed, 69 insertions(+), 71 deletions(-) diff --git a/code/modules/inventory/hands.dm b/code/modules/inventory/hands.dm index e7add0cb2da5..3282816bbd9f 100644 --- a/code/modules/inventory/hands.dm +++ b/code/modules/inventory/hands.dm @@ -1,8 +1,5 @@ // todo: we need a set of 'core' procs subtypes need to override, and the rest are composites of those procs. -/mob/proc/put_in_hand(obj/item/I, index, flags) - return index == 1? put_in_left_hand(I, flags) : put_in_right_hand(I, flags) - /** * get number of hand slots * @@ -18,3 +15,4 @@ /mob/proc/has_hands() return FALSE +#warn ughh diff --git a/code/modules/inventory/inventory.dm b/code/modules/inventory/inventory.dm index 4408627f04ac..108189db8b85 100644 --- a/code/modules/inventory/inventory.dm +++ b/code/modules/inventory/inventory.dm @@ -111,6 +111,3 @@ for(var/obj/item/I as anything in affected) if(!inventory_slot_bodypart_check(I, I.worn_slot, null, INV_OP_SILENT)) drop_item_to_ground(I) - -/mob/proc/_unequip_held(obj/item/I, flags) - return diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm index 98e1b5b8ed9d..fdcfc21b01f8 100644 --- a/code/modules/inventory/mob/hands.dm +++ b/code/modules/inventory/mob/hands.dm @@ -12,6 +12,9 @@ //* Public API - Pickup *// +/mob/proc/put_in_hand(obj/item/I, index, flags) + return put_in_hand_impl(I, index, flags) + /mob/proc/put_in_hands(obj/item/I, flags) if(is_holding(I)) return TRUE @@ -128,46 +131,14 @@ /mob/proc/is_holding_inactive(obj/item/I) return is_holding(I) && (get_active_held_item() != I) - -/** - * return index of item, or null if not found - */ -/mob/proc/get_held_index(obj/item/I) - for(var/i in 1 to length(held_items)) - if(held_items[i] == I) - return i - /** - * returns held item in active hand - */ -/mob/proc/get_active_held_item() - RETURN_TYPE(/obj/item) - return held_items[active_hand] - -/** - * returns held item in inactive hand (or any inactive hand if more than 1) - */ -/mob/proc/get_inactive_held_item() - RETURN_TYPE(/obj/item) - for(var/i in 1 to length(held_items)) - if(i == active_hand) - continue - if(isnull(held_items[i])) - continue - return held_items[i] - -/** - * returns all items held in non active hands + * hands are all holding items? undefined behavior if we don't have hands. */ -/mob/proc/get_inactive_held_items() - RETURN_TYPE(/list) - . = list() +/mob/proc/hands_full() for(var/i in 1 to length(held_items)) - if(i == active_hand) - continue if(isnull(held_items[i])) - continue - . += held_items[i] + return FALSE + return TRUE //* Public API - Get *// @@ -248,12 +219,68 @@ /mob/proc/get_held_item_of_index(index) RETURN_TYPE(/obj/item) return length(held_items) <= index? held_items[index] : null +/** + * return index of item, or null if not found + */ +/mob/proc/get_held_index(obj/item/I) + for(var/i in 1 to length(held_items)) + if(held_items[i] == I) + return i /** - * hands are all holding items? undefined behavior if we don't have hands. + * returns held item in active hand */ -/mob/proc/hands_full() +/mob/proc/get_active_held_item() + RETURN_TYPE(/obj/item) + return held_items[active_hand] + +/** + * returns held item in inactive hand (or any inactive hand if more than 1) + */ +/mob/proc/get_inactive_held_item() + RETURN_TYPE(/obj/item) for(var/i in 1 to length(held_items)) + if(i == active_hand) + continue if(isnull(held_items[i])) - return FALSE - return TRUE + continue + return held_items[i] + +/** + * returns all items held in non active hands + */ +/mob/proc/get_inactive_held_items() + RETURN_TYPE(/list) + . = list() + for(var/i in 1 to length(held_items)) + if(i == active_hand) + continue + if(isnull(held_items[i])) + continue + . += held_items[i] + +//* Internals *// + +/** + * the big, bad proc ultimately in charge of putting something into someone's hand + * whether it's from the ground, from a slot, or from another hand. + */ +/mob/proc/put_in_hand_impl(obj/item/I, index, flags) + PRIVATE_PROC(TRUE) + if(!I) + return TRUE + // let's not do that if it's deleted! + if(QDELETED(I)) + to_chat(src, SPAN_DANGER("A deleted item [I] ([REF(I)]) was sent into inventory hand procs with flags [flags]. Report this line to coders immediately.")) + to_chat(src, SPAN_DANGER("The inventory system will attempt to reject the bad equip. Glitches may occur.")) + return FALSE + + + #warn impl + #warn update icons unless no update icon op flag is set; after list update.. + + + if(!(I.interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ON_TOUCH)) + I.add_fingerprint(src) + else + I.add_hiddenprint(src) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 31c6295425a3..f817d1c3bcdd 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -67,15 +67,6 @@ return TRUE /mob/living/proc/_common_handle_put_in_hand(obj/item/I, flags) - // let's not do that if it's deleted! - if(I && QDELETED(I)) - to_chat(src, SPAN_DANGER("A deleted item [I] ([REF(I)]) was sent into inventory hand procs with flags [flags]. Report this line to coders immediately.")) - to_chat(src, SPAN_DANGER("The inventory system will attempt to reject the bad equip. Glitches may occur.")) - return FALSE - if(!(I.interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ON_TOUCH)) - I.add_fingerprint(src) - else - I.add_hiddenprint(src) var/existing_slot = is_in_inventory(I) if(existing_slot) // handle item reequip can fail. @@ -90,14 +81,6 @@ I.equipped(src, SLOT_ID_HANDS, flags) return TRUE -/mob/living/put_in_hand(obj/item/I, index, flags) - // TODO: WHEN MULTIHAND IS DONE, BESURE TO MAKE THIS HAVE THE LOGIC I PUT INI PUT IN L/R HANDS!! - switch(index) - if(1) - return put_in_left_hand(I, flags) - if(2) - return put_in_right_hand(I, flags) - /mob/living/get_number_of_hands() return has_hands? 2 : 0 @@ -106,14 +89,7 @@ #warn parse above -/mob/living/_unequip_held(obj/item/I, flags) - if(l_hand == I) - l_hand = null - else if(r_hand == I) - r_hand = null - if(!(flags & INV_OP_NO_UPDATE_ICONS)) - update_inv_hands() - +/mob/living/_unequip_ /mob/living/_slot_by_item(obj/item/I) if(back == I) return SLOT_ID_BACK From e2f6bbbd7ed3b58199dbd66f3d316c885518b1c5 Mon Sep 17 00:00:00 2001 From: silicons Date: Sun, 9 Jul 2023 17:57:15 -0700 Subject: [PATCH 018/140] wacky --- code/__DEFINES/inventory/procs.dm | 2 +- code/_onclick/hud/_defines.dm | 2 + code/modules/inventory/mob/hands.dm | 43 ++++++++++++++++- code/modules/inventory/mob/internal.dm | 1 + code/modules/mob/_modifiers/traits_phobias.dm | 8 ++-- code/modules/mob/animations.dm | 6 +-- code/modules/mob/living/inventory.dm | 48 ------------------- 7 files changed, 49 insertions(+), 61 deletions(-) diff --git a/code/__DEFINES/inventory/procs.dm b/code/__DEFINES/inventory/procs.dm index 09942acaa495..9931d578763d 100644 --- a/code/__DEFINES/inventory/procs.dm +++ b/code/__DEFINES/inventory/procs.dm @@ -9,7 +9,7 @@ #define INV_OP_SUPPRESS_WARNING (1<<3) /// do not run logic like checking if you should drop something when something's unequipped #define INV_OP_NO_LOGIC (1<<4) -/// do not updatei cons +/// do not update icons #define INV_OP_NO_UPDATE_ICONS (1<<5) /// hint: we are directly dropping to ground/off omb #define INV_OP_DIRECTLY_DROPPING (1<<6) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 2d0f4b08802a..9b93472fc51a 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -27,8 +27,10 @@ #define ui_id "LEFT+3:12,BOTTOM:5" #define ui_belt "LEFT+4:14,BOTTOM:5" #define ui_back "CENTER-2:14,BOTTOM:5" + #define ui_rhand "CENTER-1:16,BOTTOM:5" #define ui_lhand "CENTER:16,BOTTOM:5" + #define ui_equip "CENTER-1:16,BOTTOM+1:5" #define ui_swaphand1 "CENTER-1:16,BOTTOM+1:5" #define ui_swaphand2 "CENTER:16,BOTTOM+1:5" diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm index fdcfc21b01f8..957701190743 100644 --- a/code/modules/inventory/mob/hands.dm +++ b/code/modules/inventory/mob/hands.dm @@ -275,12 +275,51 @@ to_chat(src, SPAN_DANGER("The inventory system will attempt to reject the bad equip. Glitches may occur.")) return FALSE + if(length(held_items) < index) + return FALSE - #warn impl - #warn update icons unless no update icon op flag is set; after list update.. + var/obj/item/existing = held_items[index] + if(!isnull(existing)) + if(flags & INV_OP_FORCE) + drop_held_item_of_index(index, flags | INV_OP_NO_UPDATE_ICONS) + if(!isnull(held_items[index])) + // failed to drop + return FALSE + else + return FALSE + + var/existing_slot = is_in_inventory(I) + if(existing_slot) + // already in inv + if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags)) + return FALSE + else + // newly eqiupped + var/atom/old_loc = I.loc + if(I.loc != src) + I.forceMove(src) + if(I.loc != src) + return FALSE + I.pickup(src, flags, old_loc) + I.equipped(src, SLOT_ID_HANDS, flags) + log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") + held_items[index] = I + + //! LEGACY BEGIN + I.update_twohanding() + //! END + + if(!(flags & INV_OP_NO_UPDATE_ICONS)) + update_inv_hand(index) if(!(I.interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ON_TOUCH)) I.add_fingerprint(src) else I.add_hiddenprint(src) + +/** + * handle swapping item from one hand index to another + */ +/mob/proc/handle_item_handswap(obj/item/I, index, old_index, flags, mob/user = src) + #warn impl diff --git a/code/modules/inventory/mob/internal.dm b/code/modules/inventory/mob/internal.dm index 16ecad5627fd..317188a1aedc 100644 --- a/code/modules/inventory/mob/internal.dm +++ b/code/modules/inventory/mob/internal.dm @@ -236,6 +236,7 @@ // lol we're done (unless it was hands) return TRUE if(slot == SLOT_ID_HANDS) + #warn impl // if we're going into hands, // just check can unequip if(!can_unequip(I, old_slot, flags, user)) diff --git a/code/modules/mob/_modifiers/traits_phobias.dm b/code/modules/mob/_modifiers/traits_phobias.dm index 0ada41ae420e..bd102a74d139 100644 --- a/code/modules/mob/_modifiers/traits_phobias.dm +++ b/code/modules/mob/_modifiers/traits_phobias.dm @@ -130,7 +130,7 @@ human_blood_fear_amount += 1 // List of slots. Some slots like pockets are omitted due to not being visible, if H isn't the holder. - var/list/clothing_slots = list(H.back, H.wear_mask, H.l_hand, H.r_hand, H.wear_id, H.glasses, H.gloves, H.head, H.shoes, H.belt, H.wear_suit, H.w_uniform, H.s_store, H.l_ear, H.r_ear) + var/list/clothing_slots = list(H.back, H.wear_mask, H.wear_id, H.glasses, H.gloves, H.head, H.shoes, H.belt, H.wear_suit, H.w_uniform, H.s_store, H.l_ear, H.r_ear) + H.get_held_items() if(H == holder) clothing_slots += list(H.l_store, H.r_store) @@ -527,16 +527,14 @@ if(istype(thing, /mob/living/carbon/human)) var/mob/living/carbon/human/H = thing - if(H.l_hand && istype(H.l_hand, /obj/item/reagent_containers/syringe) || H.r_hand && istype(H.r_hand, /obj/item/reagent_containers/syringe)) + if(H.get_held_item_of_type(/obj/item/reagent_containers/syringe)) fear_amount += 10 if(H.l_ear && istype(H.l_ear, /obj/item/reagent_containers/syringe) || H.r_ear && istype(H.r_ear, /obj/item/reagent_containers/syringe)) - fear_amount +=10 - + fear_amount += 10 return fear_amount - // Note for the below 'phobias' are of the xeno-phobic variety, and are less centered on pure fear as above, and more on a mix of distrust, fear, and disdainfulness. // As such, they are mechanically different than the fear-based phobias, in that instead of a buildup of fearful messages, it does intermittent messages specific to what holder sees. diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm index 1089bf31a3ed..342fc234d11c 100644 --- a/code/modules/mob/animations.dm +++ b/code/modules/mob/animations.dm @@ -248,11 +248,7 @@ note dizziness decrements automatically in the mob's Life() proc. return FALSE // What icon do we use for the attack? - var/obj/used_item - if(hand && l_hand) // Attacked with item in left hand. - used_item = l_hand - else if (!hand && r_hand) // Attacked with item in right hand. - used_item = r_hand + var/obj/item/used_item = get_active_held_item() //Couldn't find an item, do they have a sprite specified (like animal claw stuff?) if(!used_item && !(attack_icon && attack_icon_state)) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index f817d1c3bcdd..53acc4dc661b 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -25,60 +25,13 @@ return 2 /mob/living/put_in_left_hand(obj/item/I, flags) - if(!I) - return TRUE - if(!has_hands) - return FALSE - if(l_hand) - if(flags & INV_OP_FORCE) - drop_item_to_ground(l_hand, flags) - if(l_hand) // incase drop item fails which is potentially possible - return FALSE - if(!_common_handle_put_in_hand(I, flags)) - return FALSE - l_hand = I - log_inventory("[key_name(src)] put [I] in hand 1") - l_hand.update_twohanding() - l_hand.update_worn_icon() // ! WARNING: snowflake - at time of equipped, vars aren't set yet. position_hud_item(l_hand, SLOT_ID_HANDS) - update_inv_l_hand() return TRUE /mob/living/put_in_right_hand(obj/item/I, flags) - if(!I) - return TRUE - if(!has_hands) - return FALSE - if(r_hand) - if(flags & INV_OP_FORCE) - drop_item_to_ground(r_hand, flags) - if(r_hand) // incase drop item fails which is potentially possible - return FALSE - if(!_common_handle_put_in_hand(I, flags)) - return FALSE - r_hand = I - log_inventory("[key_name(src)] put [I] in hand 1") - r_hand.update_twohanding() - r_hand.update_worn_icon() // ! WARNING: snowflake - at time of equipped, vars aren't set yet. position_hud_item(r_hand, SLOT_ID_HANDS) - update_inv_r_hand() - return TRUE - -/mob/living/proc/_common_handle_put_in_hand(obj/item/I, flags) - var/existing_slot = is_in_inventory(I) - if(existing_slot) - // handle item reequip can fail. - return _handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags) - // newly equipped - var/atom/oldLoc = I.loc - if(I.loc != src) - I.forceMove(src) - if(I.loc != src) - return FALSE - I.pickup(src, flags, oldLoc) - I.equipped(src, SLOT_ID_HANDS, flags) return TRUE /mob/living/get_number_of_hands() @@ -89,7 +42,6 @@ #warn parse above -/mob/living/_unequip_ /mob/living/_slot_by_item(obj/item/I) if(back == I) return SLOT_ID_BACK From 7ebb52f74eba87dbe6bbbf9ee66ef31c5950f35b Mon Sep 17 00:00:00 2001 From: silicons Date: Sun, 9 Jul 2023 18:00:17 -0700 Subject: [PATCH 019/140] more --- code/_onclick/hud/_defines.dm | 3 +-- .../mob/living/carbon/human/human_attackhand.dm | 17 ++++------------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 9b93472fc51a..7d591b34e038 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -28,8 +28,7 @@ #define ui_belt "LEFT+4:14,BOTTOM:5" #define ui_back "CENTER-2:14,BOTTOM:5" -#define ui_rhand "CENTER-1:16,BOTTOM:5" -#define ui_lhand "CENTER:16,BOTTOM:5" +#define ui_hand_for_index(index) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" #define ui_equip "CENTER-1:16,BOTTOM+1:5" #define ui_swaphand1 "CENTER-1:16,BOTTOM+1:5" diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 6f4acfc82d6b..f3843c72b3bf 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -350,20 +350,11 @@ success = TRUE stop_pulling() - if(istype(l_hand, /obj/item/grab)) - var/obj/item/grab/lgrab = l_hand - if(lgrab.affecting) - visible_message("[user] has broken [src]'s grip on [lgrab.affecting]!") + for(var/obj/item/grab/grab as anything in get_held_items_of_type(/obj/item/grab)) + if(grab.affecting) + visible_message("[user] has broken [src]'s grip on [grab.affecting]!") success = TRUE - spawn(1) - qdel(lgrab) - if(istype(r_hand, /obj/item/grab)) - var/obj/item/grab/rgrab = r_hand - if(rgrab.affecting) - visible_message("[user] has broken [src]'s grip on [rgrab.affecting]!") - success = TRUE - spawn(1) - qdel(rgrab) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), grab) return success /* From b5630279aaab41506e6ca6558982701a050d7ff6 Mon Sep 17 00:00:00 2001 From: silicons Date: Sun, 9 Jul 2023 20:54:49 -0700 Subject: [PATCH 020/140] wacky --- citadel.dme | 1 - code/_onclick/hud/_screen_object.dm | 14 ++----- code/game/gamemodes/cult/cult_items.dm | 4 +- .../gamemodes/technomancer/spells/gambit.dm | 2 +- code/game/objects/items.dm | 19 ++------- code/modules/inventory/mob/hands.dm | 35 +++++++++++++++- code/modules/mob/living/carbon/hands.dm | 17 -------- .../mob/living/carbon/human/human_organs.dm | 6 +-- code/modules/mob/living/carbon/human/life.dm | 6 +-- .../mob/living/carbon/human/movement.dm | 11 ++--- code/modules/mob/living/carbon/human/say.dm | 14 ++++--- .../mob/living/carbon/human/unarmed_attack.dm | 6 +-- code/modules/mob/living/carbon/inventory.dm | 24 +++++++++++ code/modules/mob/living/inventory.dm | 41 ++++--------------- code/modules/mob/living/living.dm | 19 ++++++--- .../silicon/robot/drone/drone_abilities.dm | 2 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/organs/external/external.dm | 4 ++ code/modules/vore/fluffstuff/custom_items.dm | 6 +-- 19 files changed, 119 insertions(+), 114 deletions(-) delete mode 100644 code/modules/mob/living/carbon/hands.dm diff --git a/citadel.dme b/citadel.dme index 61a4ae09f4fd..945f42fbae2f 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3177,7 +3177,6 @@ #include "code\modules\mob\living\carbon\carbon_powers.dm" #include "code\modules\mob\living\carbon\cpr.dm" #include "code\modules\mob\living\carbon\give.dm" -#include "code\modules\mob\living\carbon\hands.dm" #include "code\modules\mob\living\carbon\health.dm" #include "code\modules\mob\living\carbon\inventory.dm" #include "code\modules\mob\living\carbon\perspective.dm" diff --git a/code/_onclick/hud/_screen_object.dm b/code/_onclick/hud/_screen_object.dm index e53de02168cb..448aaa1e089a 100644 --- a/code/_onclick/hud/_screen_object.dm +++ b/code/_onclick/hud/_screen_object.dm @@ -283,11 +283,10 @@ // suit storage locnames += "on your suit" tanks += H.s_store - // right/left hands - locnames += "in your right hand" - tanks += H.r_hand - locnames += "in your left hand" - tanks += H.l_hand + // hands + for(var/obj/item/tank/tank as anything in H.get_held_items_of_type(/obj/item/tank)) + locnames += "in your [tank.held_index % 2? "right" : "left"] hand" + tanks += tank // pockets locnames += "in your left pocket" tanks += H.l_store @@ -300,11 +299,6 @@ locnames += "on your back" tanks += H.back else - // right/left hands - locnames += "in your right hand" - tanks += C.r_hand - locnames += "in your left hand" - tanks += C.l_hand // back locnames += "on your back" tanks += C.back diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index ebe367a9a708..5442d1f16030 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -21,12 +21,10 @@ return ..() if(!isliving(user)) return ..() - var/mob/living/L = user - var/zone = (L.hand ? "l_arm":"r_arm") if(ishuman(user)) var/mob/living/carbon/human/H = user - var/obj/item/organ/external/affecting = H.get_organ(zone) + var/obj/item/organ/external/affecting = H.get_hand_organ(held_index) to_chat(user, "An inexplicable force rips through your [affecting.name], tearing the sword from your grasp!") //random amount of damage between half of the blade's force and the full force of the blade. H.apply_damage(rand(damage_force/2, damage_force), BRUTE, zone, 0, sharp=1, edge=1) diff --git a/code/game/gamemodes/technomancer/spells/gambit.dm b/code/game/gamemodes/technomancer/spells/gambit.dm index 197d28a43e31..ccf6f46c7820 100644 --- a/code/game/gamemodes/technomancer/spells/gambit.dm +++ b/code/game/gamemodes/technomancer/spells/gambit.dm @@ -94,7 +94,7 @@ if(is_ally(H)) // Don't get scared by our apprentice. continue - for(var/obj/item/I in list(H.l_hand, H.r_hand)) + for(var/obj/item/I in H.get_held_items()) // Guns are scary. if(istype(I, /obj/item/gun)) // Toy guns will count as well but oh well. hostile_mobs++ diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index de632d7610a3..443e60e9b836 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -198,21 +198,10 @@ update_worn_icon() /obj/item/proc/is_held_twohanded(mob/living/M) - var/check_hand - if(M.l_hand == src && !M.r_hand) - check_hand = BP_R_HAND //item in left hand, check right hand - else if(M.r_hand == src && !M.l_hand) - check_hand = BP_L_HAND //item in right hand, check left hand - else - return FALSE - - //would check is_broken() and is_malfunctioning() here too but is_malfunctioning() - //is probabilistic so we can't do that and it would be unfair to just check one. - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/hand = H.organs_by_name[check_hand] - if(istype(hand) && hand.is_usable()) - return TRUE + for(var/i in M.get_usable_hand_indices()) + if(!isnull(M.held_items[i])) + continue + return TRUE return FALSE /obj/item/legacy_ex_act(severity) diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm index 957701190743..03d347cecd31 100644 --- a/code/modules/inventory/mob/hands.dm +++ b/code/modules/inventory/mob/hands.dm @@ -135,7 +135,7 @@ * hands are all holding items? undefined behavior if we don't have hands. */ /mob/proc/hands_full() - for(var/i in 1 to length(held_items)) + for(var/i in get_usable_hand_indices()) if(isnull(held_items[i])) return FALSE return TRUE @@ -259,6 +259,39 @@ continue . += held_items[i] +//* Abstraction *// + +/** + * get number of physical hands / arms / whatever that we have and should check for + * + * this is not number we can use + * this is the number we should use for things like rendering + * a hand stump is still rendered, and we should never render less than 2 hands for mobs + * that nominally have hands. + */ +/mob/proc/get_nominal_hand_count() + #warn impl + +/** + * get number of usable hands / arms / whatever that we have and should check for + * + * this is the number we can use + * missing = can't use + * stump = can't use + * broken = *can* use. + * + * basically if a red deny symbol is in the hand it is not usable, otherwise it's usable. + */ +/mob/proc/get_usable_hand_count() + #warn impl + +/** + * get indices of usable hands + */ +/mob/proc/get_usable_hand_indices() + RETURN_TYPE(/list) + #warn impl + //* Internals *// /** diff --git a/code/modules/mob/living/carbon/hands.dm b/code/modules/mob/living/carbon/hands.dm deleted file mode 100644 index f32495d2b74a..000000000000 --- a/code/modules/mob/living/carbon/hands.dm +++ /dev/null @@ -1,17 +0,0 @@ -/mob/living/carbon/proc/get_active_hand_organ_key() - return get_hand_organ_key(active_hand) - -/mob/living/carbon/proc/get_active_hand_organ() - RETURN_TYPE(/obj/item/organ/external) - return get_organ(get_hand_organ_key(active_hand)) - -/mob/living/carbon/proc/get_hand_organ_key(index) - #warn impl - -/mob/living/carbon/proc/get_hand_organ(index) - return get_organ(get_hand_organ_key(index)) - -/mob/living/carbon/proc/is_hand_functional(index) - var/obj/item/organ/external/part = get_hand_organ(index) - #warn impl - diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 17e661de0b5a..af7c8ca7bdc7 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -106,10 +106,8 @@ // Canes and crutches help you stand (if the latter is ever added) // One cane mitigates a broken leg+foot, or a missing foot. // Two canes are needed for a lost leg. If you are missing both legs, canes aren't gonna help you. - if (l_hand && istype(l_hand, /obj/item/cane)) - stance_damage -= 2 - if (r_hand && istype(r_hand, /obj/item/cane)) - stance_damage -= 2 + for(var/obj/item/cane/cane as anything in get_held_items_of_type(/obj/item/cane)) + stance_damgae -= 2 // standing is poor if(stance_damage >= 4 || (stance_damage >= 2 && prob(5))) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 627b54e67d93..ffd125a5af35 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -976,10 +976,10 @@ if(check_belly(I)) continue if(src.species && !(src.species.species_flags & CONTAMINATION_IMMUNE)) - // This is hacky, I'm so sorry. - if(I != l_hand && I != r_hand) //If the item isn't in your hands, you're probably wearing it. Full damage for you. + if(isnull(I.held_index)) + //If the item isn't in your hands, you're probably wearing it. Full damage for you. total_phoronloss += loss_per_part - else if((I == l_hand | I == r_hand) && !((src.wear_suit.body_cover_flags & HANDS) | src.gloves | (src.w_uniform.body_cover_flags & HANDS))) //If the item is in your hands, but you're wearing protection, you might be alright. + else if(!((src.wear_suit.body_cover_flags & HANDS) | src.gloves | (src.w_uniform.body_cover_flags & HANDS))) //If the item is in your hands, but you're wearing protection, you might be alright. //If you hold it in hand, and your hands arent covered by anything total_phoronloss += loss_per_part if(total_phoronloss) diff --git a/code/modules/mob/living/carbon/human/movement.dm b/code/modules/mob/living/carbon/human/movement.dm index 55ba626e7235..c4de37c532c6 100644 --- a/code/modules/mob/living/carbon/human/movement.dm +++ b/code/modules/mob/living/carbon/human/movement.dm @@ -114,7 +114,7 @@ // Hands are also included, to make the 'take off your armor instantly and carry it with you to go faster' trick no longer viable. // This is done seperately to disallow negative numbers (so you can't hold shoes in your hands to go faster). - for(var/obj/item/I in list(r_hand, l_hand)) + for(var/obj/item/I in get_held_items()) . += max(I.slowdown, 0) // Similar to above, but for turf slowdown. @@ -195,10 +195,11 @@ prob_slip = 0 //Check hands and mod slip - if(!l_hand) prob_slip -= 2 - else if(l_hand.w_class <= 2) prob_slip -= 1 - if (!r_hand) prob_slip -= 2 - else if(r_hand.w_class <= 2) prob_slip -= 1 + for(var/i in 1 to get_nominal_hand_count()) + if(isnull(held_items[i])) + prob_slip -= 2 + else if(held_items[i].w_class <= 2) + prob_slip -= 1 prob_slip = round(prob_slip) return(prob_slip) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 61e8cf3b6ca2..80a46599f296 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -175,9 +175,10 @@ if(r_ear && istype(r_ear,/obj/item/radio)) R = r_ear has_radio = 1 - if(r_hand && istype(r_hand, /obj/item/radio)) - R = r_hand - has_radio = 1 + for(var/obj/item/radio/potential in get_right_held_items()) + R = potential + has_radio = TRUE + break if(has_radio) R.talk_into(src,message,null,verb,speaking) used_radios += R @@ -187,9 +188,10 @@ if(l_ear && istype(l_ear,/obj/item/radio)) R = l_ear has_radio = 1 - if(l_hand && istype(l_hand,/obj/item/radio)) - R = l_hand - has_radio = 1 + for(var/obj/item/radio/potential in get_left_held_items()) + R = potential + has_radio = TRUE + break if(has_radio) R.talk_into(src,message,null,verb,speaking) used_radios += R diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index 3d1859142450..86c8407221cd 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -58,13 +58,13 @@ var/global/list/sparring_attack_cache = list() if (knocked_away) // Disarm left hand //Urist McAssistant dropped the macguffin with a scream just sounds odd. - target.visible_message("\The [target.knocked_away] was knocked right out of [target]'s grasp!") + target.visible_message("\The [knocked_away] was knocked right out of [target]'s grasp!") target.drop_item_to_ground(knocked_away) if(BP_R_ARM, BP_R_HAND) var/obj/item/knocked_away = target.get_left_held_item() - if (target.knocked_away) + if (knocked_away) // Disarm right hand - target.visible_message("\The [target.knocked_away] was knocked right out of [target]'s grasp!") + target.visible_message("\The [knocked_away] was knocked right out of [target]'s grasp!") target.drop_item_to_ground(knocked_away) if(BP_TORSO) if(!target.lying) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 6274e9698d15..437dfe07f29a 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -1,3 +1,5 @@ +//* Abstraction *// + /mob/living/carbon/_slot_by_item(obj/item/I) if(handcuffed == I) return SLOT_ID_HANDCUFFED @@ -44,3 +46,25 @@ SLOT_ID_HANDCUFFED, SLOT_ID_LEGCUFFED ) + +//* Hands *// + +/mob/living/carbon/proc/get_active_hand_organ_key() + return get_hand_organ_key(active_hand) + +/mob/living/carbon/proc/get_active_hand_organ() + RETURN_TYPE(/obj/item/organ/external) + return get_organ(get_hand_organ_key(active_hand)) + +/mob/living/carbon/proc/get_hand_organ_key(index) + #warn impl + +/mob/living/carbon/proc/get_hand_organ(index) + return get_organ(get_hand_organ_key(index)) + +/mob/living/carbon/proc/is_hand_functional(index) + var/obj/item/organ/external/part = get_hand_organ(index) + #warn impl + +/mob/living/carbon/proc/get_hand_index_of_organ(obj/item/organ/external/organ) + #warn impl diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 53acc4dc661b..92dd2ff8911f 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -1,39 +1,7 @@ -/mob/living/init_inventory() - inventory = new(src) - -/mob/living/get_active_held_item() - RETURN_TYPE(/obj/item) - return hand? l_hand : r_hand - -/mob/living/get_inactive_held_item() - RETURN_TYPE(/obj/item) - return hand? r_hand : l_hand - -/mob/living/get_held_index(obj/item/I) - if(l_hand == I) - return 1 - else if(r_hand == I) - return 2 - -/mob/living/put_in_active_hand(obj/item/I, flags) - return hand? put_in_left_hand(I, flags) : put_in_right_hand(I, flags) - -/mob/living/put_in_inactive_hand(obj/item/I, flags) - return hand? put_in_right_hand(I, flags) : put_in_left_hand(I, flags) /mob/living/get_number_of_hands() return 2 -/mob/living/put_in_left_hand(obj/item/I, flags) - // ! WARNING: snowflake - at time of equipped, vars aren't set yet. - position_hud_item(l_hand, SLOT_ID_HANDS) - return TRUE - -/mob/living/put_in_right_hand(obj/item/I, flags) - // ! WARNING: snowflake - at time of equipped, vars aren't set yet. - position_hud_item(r_hand, SLOT_ID_HANDS) - return TRUE - /mob/living/get_number_of_hands() return has_hands? 2 : 0 @@ -42,6 +10,8 @@ #warn parse above +//* Abstraction *// + /mob/living/_slot_by_item(obj/item/I) if(back == I) return SLOT_ID_BACK @@ -94,6 +64,13 @@ SLOT_ID_MASK ) +//* Init *// + +/mob/living/init_inventory() + inventory = new(src) + +//* Misc - Legacy *// + /mob/living/ret_grab(obj/effect/list_container/mobl/L as obj, flag) if ((!( istype(l_hand, /obj/item/grab) ) && !( istype(r_hand, /obj/item/grab) ))) if (!( L )) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1ffba2b22aa7..82ecb35bf44a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -697,7 +697,14 @@ default behaviour is: animate(client, color = null, time = 10) /mob/living/swap_hand() - src.hand = !( src.hand ) + var/obj/item/was_active = length(held_items) <= active_hand? held_items[active_hand] : null + + if(active_hand >= length(held_items)) + active_hand = length(held_items)? 1 : null + else + ++active_hand + + #warn hud elements if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) if(hand) //This being 1 means the left hand is in use hud_used.l_hand_hud_object.icon_state = "l_hand_active" @@ -706,12 +713,12 @@ default behaviour is: hud_used.l_hand_hud_object.icon_state = "l_hand_inactive" hud_used.r_hand_hud_object.icon_state = "r_hand_active" + //! LEGACY // We just swapped hands, so the thing in our inactive hand will notice it's not the focus - var/obj/item/I = get_inactive_held_item() - if(I) - if(I.zoom) - I.zoom() - return + if(!isnull(was_active)) + if(was_active.zoom) + was_active.zoom() + //! End /mob/proc/activate_hand(selhand) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index b97100929b52..9d17b1ebc11b 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -25,7 +25,7 @@ var/mob/living/carbon/human/H = over_object if(!istype(H) || !Adjacent(H)) return ..() - if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand)) + if(H.a_intent == "grab" && hat && !H.hands_full()) hat.loc = get_turf(src) H.put_in_hands(hat) H.visible_message(SPAN_DANGER("\The [H] removes \the [src]'s [hat].")) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 31e862a3e0ce..4c6cca5c4a45 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -95,7 +95,7 @@ /// held items; indexed list. defaults to null, lazy. /// 1, 3, 5, ... are left /// 2, 4, 6, ... are right - var/list/held_items + var/list/obj/item/held_items /// active hand index - null or num. must always be in range of held_items indices! var/active_hand diff --git a/code/modules/organs/external/external.dm b/code/modules/organs/external/external.dm index e4021ba1c0b3..8c9de6487f6e 100644 --- a/code/modules/organs/external/external.dm +++ b/code/modules/organs/external/external.dm @@ -1432,3 +1432,7 @@ Note that amputating the affected organ does in fact remove the infection from t for(var/obj/item/I in L.implants) if(!istype(I,/obj/item/implant) && !istype(I,/obj/item/nif)) return TRUE + +//* Hand Integration *// + +#warn impl diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index 92812661bd93..5117d85b9c46 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -1675,8 +1675,4 @@ else icon_state = "jazzcamcorder" item_state = "jazzcamcorder" - var/mob/living/carbon/human/H = loc - if(istype(H)) - H.update_inv_r_hand() - H.update_inv_l_hand() - H.update_inv_belt() + update_worn_icon() From a8aef7fcecf20dd9eff3602172edc3d15a098c11 Mon Sep 17 00:00:00 2001 From: silicons Date: Sun, 16 Jul 2023 03:39:48 -0700 Subject: [PATCH 021/140] new hud time --- citadel.dme | 2 ++ code/_rendering/mob_huds/inventory.dm | 1 + code/_rendering/mob_huds/mob_hud.dm | 7 +++++++ code/_rendering/perspectives/perspective.dm | 9 +++++++++ code/game/gamemodes/cult/cult_items.dm | 2 +- code/game/objects/items/bells.dm | 7 ------- code/modules/inventory/inventory.dm | 2 ++ 7 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 code/_rendering/mob_huds/inventory.dm create mode 100644 code/_rendering/mob_huds/mob_hud.dm diff --git a/citadel.dme b/citadel.dme index 407183b0f917..9dcebce79913 100644 --- a/citadel.dme +++ b/citadel.dme @@ -462,6 +462,8 @@ #include "code\_rendering\atom_huds\other_huds.dm" #include "code\_rendering\clickcatcher\clickcatcher.dm" #include "code\_rendering\fullscreen\fullscreen.dm" +#include "code\_rendering\mob_huds\inventory.dm" +#include "code\_rendering\mob_huds\mob_hud.dm" #include "code\_rendering\parallax\parallax.dm" #include "code\_rendering\parallax\parallax_holder.dm" #include "code\_rendering\parallax\parallax_object.dm" diff --git a/code/_rendering/mob_huds/inventory.dm b/code/_rendering/mob_huds/inventory.dm new file mode 100644 index 000000000000..b0e8ef832b76 --- /dev/null +++ b/code/_rendering/mob_huds/inventory.dm @@ -0,0 +1 @@ +/datum/mob_hud/inventory diff --git a/code/_rendering/mob_huds/mob_hud.dm b/code/_rendering/mob_huds/mob_hud.dm new file mode 100644 index 000000000000..a71f424f65ec --- /dev/null +++ b/code/_rendering/mob_huds/mob_hud.dm @@ -0,0 +1,7 @@ +/** + * owned by one mob + * can be utilized by many + * + * therefore, keep screen locs as widescreen/viewrange agnostic as possible. + */ +/datum/mob_hud diff --git a/code/_rendering/perspectives/perspective.dm b/code/_rendering/perspectives/perspective.dm index 8d2291356e52..f4c1274e8752 100644 --- a/code/_rendering/perspectives/perspective.dm +++ b/code/_rendering/perspectives/perspective.dm @@ -46,6 +46,15 @@ * however, perspectives are designed to force synchronization of the vars it does trample, * because there's no better way to do it (because those vars are, semantically, only relevant to our perspective), * while screen/images can be used for embedded maps/hud/etc. + * + * ## Use Case + * + * Perspectives should for the management of an atom's semantic world-view. + * This is what they can / can not see around them. + * This should not be used for things like inventory HUDs and action buttons. + * Those are "internal" viewing / a mob's internal state. + * + * Basically, these are for what you can see, if you looked through someone's eyes. */ /datum/perspective /// eye - where visual calcs go from diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 5442d1f16030..9fc5ddd49796 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -27,7 +27,7 @@ var/obj/item/organ/external/affecting = H.get_hand_organ(held_index) to_chat(user, "An inexplicable force rips through your [affecting.name], tearing the sword from your grasp!") //random amount of damage between half of the blade's force and the full force of the blade. - H.apply_damage(rand(damage_force/2, damage_force), BRUTE, zone, 0, sharp=1, edge=1) + H.apply_damage(rand(damage_force/2, damage_force), BRUTE, held_index % 2? BP_L_HAND : BP_R_HAND, 0, sharp=1, edge=1) H.afflict_paralyze(20 * 5) else if(!istype(user, /mob/living/simple_mob/construct)) to_chat(user, "An inexplicable force rips through you, tearing the sword from your grasp!") diff --git a/code/game/objects/items/bells.dm b/code/game/objects/items/bells.dm index 4067e8d97cd4..1c9f7cc27f12 100644 --- a/code/game/objects/items/bells.dm +++ b/code/game/objects/items/bells.dm @@ -67,13 +67,6 @@ /obj/item/deskbell/proc/check_ability(mob/user) if (ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - if (H.hand) - temp = H.organs_by_name["l_hand"] - if(temp && !temp.is_usable()) - to_chat(H,"You try to move your [temp.name], but cannot!") - return 0 return 1 else to_chat(user,"You are not able to ring [src].") diff --git a/code/modules/inventory/inventory.dm b/code/modules/inventory/inventory.dm index 108189db8b85..d9ce5264c9f7 100644 --- a/code/modules/inventory/inventory.dm +++ b/code/modules/inventory/inventory.dm @@ -5,6 +5,8 @@ //? basics /// owning mob var/mob/owner + /// hud datum + //? slots From 63a1aa1fb67d42bbbf376150bddd5c7a085fe22d Mon Sep 17 00:00:00 2001 From: silicons Date: Mon, 17 Jul 2023 13:22:47 -0700 Subject: [PATCH 022/140] event args --- .../signals_atom/signals_atom_attack.dm | 2 +- .../signals/signals_mob/signals_mob_main.dm | 2 +- code/_onclick/hud/_defines.dm | 14 +++- code/_onclick/hud/_screen_object.dm | 2 +- code/_onclick/hud/hud.dm | 2 +- code/_onclick/mobs.dm | 14 ++++ code/_onclick/other_mobs.dm | 4 +- code/_rendering/mob_huds/inventory.dm | 33 ++++++++ code/datums/event_args/clickchain.dm | 20 +++++ code/datums/event_args/event_args.dm | 0 code/game/atoms/buckling.dm | 2 +- code/game/dna/dna_modifier.dm | 2 +- code/game/gamemodes/cult/cult_structures.dm | 2 +- code/game/gamemodes/cult/ritual.dm | 2 +- .../endgame/supermatter_cascade/blob.dm | 2 +- code/game/machinery/CableLayer.dm | 2 +- code/game/machinery/OpTable.dm | 2 +- code/game/machinery/Sleeper.dm | 2 +- code/game/machinery/_machinery.dm | 2 +- code/game/machinery/adv_med.dm | 2 +- code/game/machinery/ai_slipper.dm | 2 +- code/game/machinery/air_alarm.dm | 2 +- code/game/machinery/atm_ret_field.dm | 2 +- code/game/machinery/atmo_control.dm | 2 +- .../atmoalter/area_atmos_computer.dm | 2 +- code/game/machinery/atmoalter/canister.dm | 2 +- code/game/machinery/atmoalter/pump.dm | 4 +- code/game/machinery/atmoalter/scrubber.dm | 4 +- code/game/machinery/bioprinter.dm | 2 +- code/game/machinery/bomb_tester.dm | 2 +- code/game/machinery/camera/camera.dm | 2 +- code/game/machinery/camera/camera_assembly.dm | 2 +- code/game/machinery/cell_charger.dm | 2 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/Operating.dm | 2 +- code/game/machinery/computer/RCON_Console.dm | 2 +- code/game/machinery/computer/aifixer.dm | 2 +- .../machinery/computer/arcade/claw_machine.dm | 2 +- code/game/machinery/computer/atmos_alert.dm | 2 +- code/game/machinery/computer/atmos_control.dm | 2 +- code/game/machinery/computer/camera.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/command/card.dm | 2 +- .../game/machinery/computer/communications.dm | 2 +- code/game/machinery/computer/crew.dm | 2 +- code/game/machinery/computer/guestpass.dm | 2 +- code/game/machinery/computer/law.dm | 4 +- code/game/machinery/computer/medical.dm | 2 +- code/game/machinery/computer/message.dm | 2 +- code/game/machinery/computer/pod.dm | 4 +- code/game/machinery/computer/prisoner.dm | 2 +- code/game/machinery/computer/prisonshuttle.dm | 2 +- code/game/machinery/computer/robot.dm | 2 +- code/game/machinery/computer/security.dm | 2 +- .../machinery/computer/shutoff_monitor.dm | 2 +- code/game/machinery/computer/skills.dm | 2 +- .../machinery/computer/specops_shuttle.dm | 2 +- code/game/machinery/computer/station_alert.dm | 2 +- .../computer/supermatter_monitor_tgui.dm | 2 +- code/game/machinery/computer/supply.dm | 2 +- .../computer/syndicate_specops_shuttle.dm | 2 +- code/game/machinery/computer/timeclock_vr.dm | 2 +- code/game/machinery/cryo.dm | 2 +- code/game/machinery/deployable_vr.dm | 2 +- code/game/machinery/door_control.dm | 2 +- code/game/machinery/doorbell_vr.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/doors/airlock_control.dm | 4 +- code/game/machinery/doors/blast_door.dm | 2 +- code/game/machinery/doors/brigdoors.dm | 2 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- .../embedded_controller_base.dm | 2 +- code/game/machinery/event.dm | 4 +- code/game/machinery/exonet_node.dm | 2 +- code/game/machinery/fire_alarm.dm | 4 +- code/game/machinery/flasher.dm | 2 +- code/game/machinery/floodlight.dm | 2 +- code/game/machinery/floor_light.dm | 2 +- code/game/machinery/floorlayer.dm | 2 +- code/game/machinery/holosign.dm | 2 +- code/game/machinery/igniter.dm | 4 +- code/game/machinery/iv_drip.dm | 2 +- code/game/machinery/jukebox.dm | 2 +- code/game/machinery/lightswitch.dm | 2 +- code/game/machinery/magnet.dm | 2 +- code/game/machinery/misc/bioscan_antenna.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- code/game/machinery/newscaster.dm | 2 +- code/game/machinery/nuclear_bomb.dm | 2 +- code/game/machinery/oxygen_pump.dm | 2 +- code/game/machinery/pda_multicaster.dm | 2 +- code/game/machinery/pipe/pipe_dispenser.dm | 2 +- code/game/machinery/pipe/pipelayer.dm | 2 +- code/game/machinery/pointdefense.dm | 2 +- code/game/machinery/portable_turret.dm | 4 +- code/game/machinery/recharger.dm | 2 +- code/game/machinery/records_scanner.dm | 2 +- code/game/machinery/requests_console.dm | 2 +- code/game/machinery/robot_fabricator.dm | 2 +- code/game/machinery/spaceheater.dm | 4 +- .../machinery/suit_storage/suit_cycler.dm | 2 +- .../suit_storage/suit_storage_massive.dm | 2 +- .../suit_storage/suit_storage_unit.dm | 2 +- code/game/machinery/supplybeacon.dm | 2 +- code/game/machinery/syndicatebeacon.dm | 6 +- code/game/machinery/telecomms/_telecomms.dm | 2 +- code/game/machinery/telecomms/logbrowser.dm | 2 +- .../machinery/telecomms/message_server.dm | 2 +- code/game/machinery/telecomms/telemonitor.dm | 2 +- code/game/machinery/teleporter/console.dm | 2 +- code/game/machinery/teleporter/projector.dm | 2 +- code/game/machinery/turret_control.dm | 2 +- code/game/machinery/vending.dm | 2 +- code/game/machinery/washing_machine.dm | 2 +- code/game/machinery/wishgranter.dm | 2 +- code/game/mecha/mech_fabricator.dm | 2 +- code/game/mecha/mecha.dm | 2 +- code/game/mecha/mecha_control_console.dm | 2 +- code/game/mecha/mecha_parts.dm | 4 +- code/game/mecha/micro/mecha_parts_vr.dm | 2 +- code/game/objects/effects/alien/aliens.dm | 4 +- code/game/objects/effects/chem/foam.dm | 2 +- .../effects/debris/cleanable/humans.dm | 2 +- .../objects/effects/debris/cleanable/misc.dm | 2 +- .../game/objects/effects/decals/contraband.dm | 2 +- code/game/objects/effects/decals/remains.dm | 4 +- code/game/objects/effects/portals.dm | 2 +- code/game/objects/items.dm | 2 +- code/game/objects/items/bells.dm | 2 +- code/game/objects/items/bodybag.dm | 2 +- .../objects/items/devices/chameleonproj.dm | 2 +- .../items/devices/communicator/phone.dm | 2 +- code/game/objects/items/devices/defib.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 2 +- code/game/objects/items/devices/powersink.dm | 2 +- .../items/devices/radio/electropack.dm | 2 +- .../objects/items/devices/radio/intercom.dm | 2 +- .../objects/items/devices/radio/jammer.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 2 +- .../devices/tape_recorder/tape_recorder.dm | 2 +- .../objects/items/devices/taperecorder.dm | 2 +- code/game/objects/items/shooting_range.dm | 2 +- .../objects/items/stacks/marker_beacons.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/items/storage/_storage.dm | 2 +- .../objects/items/storage/laundry_basket.dm | 2 +- code/game/objects/items/storage/quickdraw.dm | 2 +- code/game/objects/items/storage/secure.dm | 4 +- code/game/objects/items/tools/weldingtool.dm | 2 +- code/game/objects/items/toys.dm | 4 +- code/game/objects/items/uav.dm | 2 +- .../objects/items/weapons/barrier_tape.dm | 4 +- code/game/objects/items/weapons/duct_tape.dm | 2 +- .../objects/items/weapons/grenades/grenade.dm | 2 +- code/game/objects/items/weapons/handcuffs.dm | 2 +- .../items/weapons/implants/implantchair.dm | 2 +- .../items/weapons/implants/implantpad.dm | 2 +- code/game/objects/items/weapons/stunbaton.dm | 2 +- code/game/objects/items/weapons/traps.dm | 2 +- .../objects/items/weapons/weldbackpack.dm | 2 +- code/game/objects/misc.dm | 2 +- code/game/objects/objs.dm | 2 +- code/game/objects/structures.dm | 2 +- code/game/objects/structures/ashlander.dm | 4 +- code/game/objects/structures/bedsheet_bin.dm | 2 +- code/game/objects/structures/bonfire.dm | 4 +- code/game/objects/structures/catwalk.dm | 2 +- code/game/objects/structures/charge_pylon.dm | 2 +- code/game/objects/structures/coathanger.dm | 2 +- .../structures/crates_lockers/__closet.dm | 2 +- .../crates_lockers/closets/coffin.dm | 2 +- .../crates_lockers/closets/fireaxe.dm | 2 +- .../crates_lockers/closets/statue.dm | 2 +- .../crates_lockers/closets/walllocker.dm | 2 +- .../structures/crates_lockers/crates.dm | 2 +- .../structures/crates_lockers/largecrate.dm | 2 +- .../structures/crates_lockers/vehiclecage.dm | 2 +- code/game/objects/structures/curtains.dm | 2 +- code/game/objects/structures/displaycase.dm | 2 +- code/game/objects/structures/extinguisher.dm | 2 +- code/game/objects/structures/fence.dm | 2 +- code/game/objects/structures/fireaxe.dm | 2 +- code/game/objects/structures/fitness.dm | 4 +- code/game/objects/structures/flora.dm | 4 +- code/game/objects/structures/flora/trees.dm | 2 +- .../structures/ghost_pods/ghost_pods.dm | 2 +- code/game/objects/structures/girders.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/holoplant.dm | 2 +- code/game/objects/structures/holosign.dm | 2 +- code/game/objects/structures/inflatable.dm | 4 +- code/game/objects/structures/janicart.dm | 4 +- .../objects/structures/kitchen_foodcart.dm | 2 +- code/game/objects/structures/kitchen_spike.dm | 2 +- code/game/objects/structures/loot_piles.dm | 2 +- .../objects/structures/medical_stand_vr.dm | 2 +- code/game/objects/structures/mineral_bath.dm | 2 +- code/game/objects/structures/mirror.dm | 2 +- code/game/objects/structures/morgue.dm | 8 +- code/game/objects/structures/noticeboard.dm | 2 +- .../objects/structures/props/beam_prism.dm | 4 +- code/game/objects/structures/props/nest.dm | 2 +- code/game/objects/structures/props/prop.dm | 2 +- .../objects/structures/props/puzzledoor.dm | 2 +- code/game/objects/structures/safe.dm | 2 +- code/game/objects/structures/simple_doors.dm | 2 +- code/game/objects/structures/snowman.dm | 2 +- code/game/objects/structures/stasis_cage.dm | 2 +- code/game/objects/structures/statues.dm | 2 +- .../stool_bed_chair_nest/wheelchair.dm | 2 +- .../game/objects/structures/tank_dispenser.dm | 2 +- code/game/objects/structures/target_stake.dm | 2 +- code/game/objects/structures/transit_tubes.dm | 2 +- code/game/objects/structures/trash_pile.dm | 2 +- .../game/objects/structures/under_wardrobe.dm | 2 +- code/game/objects/structures/watercloset.dm | 16 ++-- code/game/objects/structures/window.dm | 4 +- .../game/objects/structures/window_spawner.dm | 2 +- .../simulated/flooring/flooring_traps.dm | 2 +- code/game/turfs/simulated/floors/snow.dm | 2 +- code/game/turfs/simulated/wall_attacks.dm | 6 +- code/game/turfs/turf.dm | 2 +- code/modules/assembly/holder.dm | 2 +- code/modules/assembly/mousetrap.dm | 4 +- .../binary_devices/algae_generator_vr.dm | 2 +- .../components/binary_devices/heat_pump.dm | 2 +- .../binary_devices/massive_gas_pump.dm | 2 +- .../binary_devices/massive_heat_pump.dm | 2 +- .../components/binary_devices/passive_gate.dm | 2 +- .../components/binary_devices/pump.dm | 2 +- .../components/binary_devices/valve.dm | 4 +- .../components/omni_devices/omni_base.dm | 2 +- .../components/trinary_devices/filter.dm | 2 +- .../components/trinary_devices/mixer.dm | 2 +- .../components/trinary_devices/tvalve.dm | 4 +- .../machinery/components/unary/cold_sink.dm | 2 +- .../machinery/components/unary/heat_source.dm | 2 +- .../components/unary/outlet_injector.dm | 2 +- .../awaymissions/bluespaceartillery.dm | 2 +- code/modules/awaymissions/gateway.dm | 4 +- code/modules/clothing/clothing_accessories.dm | 2 +- code/modules/clothing/masks/miscellaneous.dm | 2 +- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/clothing/suits/storage.dm | 2 +- code/modules/clothing/under/_under.dm | 2 +- .../clothing/under/accessories/accessory.dm | 2 +- .../clothing/under/accessories/holster.dm | 2 +- .../clothing/under/accessories/storage.dm | 2 +- .../detectivework/microscope/dnascanner.dm | 2 +- .../detectivework/microscope/microscope.dm | 2 +- code/modules/economy/machines/ATM.dm | 2 +- code/modules/economy/machines/Accounts_DB.dm | 2 +- .../modules/economy/machines/cash_register.dm | 2 +- code/modules/economy/machines/mint.dm | 4 +- code/modules/economy/money_bag.dm | 2 +- code/modules/food/drinkingglass/extras.dm | 2 +- code/modules/food/food/snacks.dm | 4 +- code/modules/food/glass/bottle.dm | 2 +- .../kitchen/cooking_machines/_appliance.dm | 2 +- code/modules/food/kitchen/gibber.dm | 2 +- code/modules/food/kitchen/icecream.dm | 2 +- code/modules/food/kitchen/microwave.dm | 2 +- code/modules/food/kitchen/smartfridge.dm | 2 +- code/modules/games/cards.dm | 2 +- code/modules/hardsuits/pieces.dm | 2 +- code/modules/hardsuits/rig_attackby.dm | 2 +- code/modules/hardsuits/rig_pieces.dm | 2 +- code/modules/holodeck/HolodeckControl.dm | 2 +- code/modules/holodeck/HolodeckObjects.dm | 2 +- code/modules/holomap/station_holomap.dm | 2 +- .../modules/hydroponics/beekeeping/beehive.dm | 2 +- code/modules/hydroponics/seed_machines.dm | 2 +- code/modules/hydroponics/seed_storage.dm | 2 +- .../hydroponics/spreading/spreading.dm | 2 +- .../spreading/spreading_response.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 2 +- .../instruments/instruments/stationary.dm | 2 +- code/modules/inventory/mob/hands.dm | 15 ++-- code/modules/library/lib_items.dm | 2 +- code/modules/library/lib_machines.dm | 6 +- .../maps/away_missions/archive/wildwest.dm | 2 +- .../maps/misc_maps/lavaland/_lavaland.dm | 4 +- code/modules/materials/material_sheets.dm | 2 +- code/modules/mining/drilling/drill.dm | 2 +- code/modules/mining/machine_processing.dm | 2 +- code/modules/mining/machine_stacking.dm | 2 +- code/modules/mining/mine_items.dm | 2 +- .../equipment_vendor.dm | 2 +- code/modules/mining/shelter_atoms.dm | 2 +- code/modules/mob/living/bot/cleanbot.dm | 2 +- code/modules/mob/living/bot/farmbot.dm | 4 +- code/modules/mob/living/bot/floorbot.dm | 2 +- code/modules/mob/living/bot/medibot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 2 +- .../mob/living/carbon/alien/alien_attacks.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- .../living/carbon/human/human_attackhand.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 6 +- .../mob/living/carbon/human/human_organs.dm | 82 ++++++------------- .../living/carbon/human/traits/weaver_objs.dm | 4 +- code/modules/mob/living/carbon/inventory.dm | 13 +++ code/modules/mob/living/defense.dm | 2 +- .../silicon/robot/drone/drone_console.dm | 2 +- .../silicon/robot/drone/drone_manufacturer.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- code/modules/mob/living/simple_mob/defense.dm | 2 +- .../subtypes/animal/farm animals/cow.dm | 2 +- .../subtypes/animal/passive/fish.dm | 2 +- .../subtypes/animal/passive/mouse.dm | 2 +- .../simple_mob/subtypes/animal/pets/parrot.dm | 2 +- .../living/simple_mob/subtypes/horror/Eddy.dm | 2 +- .../simple_mob/subtypes/horror/Master.dm | 2 +- .../simple_mob/subtypes/horror/Rickey.dm | 2 +- .../simple_mob/subtypes/horror/Smiley.dm | 2 +- .../simple_mob/subtypes/horror/Steve.dm | 2 +- .../simple_mob/subtypes/horror/Willy.dm | 2 +- .../simple_mob/subtypes/horror/bradley.dm | 2 +- .../simple_mob/subtypes/horror/sally.dm | 2 +- .../simple_mob/subtypes/horror/shittytim.dm | 2 +- .../simple_mob/subtypes/horror/timling.dm | 2 +- .../simple_mob/subtypes/illusion/illusion.dm | 2 +- .../living/simple_mob/subtypes/slime/slime.dm | 2 +- .../subtypes/slime/xenobio/defense.dm | 2 +- .../living/simple_mob/subtypes/vore/c_pet.dm | 4 +- .../living/simple_mob/subtypes/vore/otie.dm | 2 +- .../subtypes/vore/shadekin/shadekin.dm | 2 +- .../modular_computers/NTNet/NTNet_relay.dm | 2 +- .../computers/modular_computer/interaction.dm | 2 +- .../modular_computers/laptop_vendor.dm | 2 +- code/modules/multiz/hoist.dm | 4 +- code/modules/multiz/ladder.dm | 2 +- code/modules/multiz/structures_vr.dm | 2 +- code/modules/multiz/zmimic/mimic_movable.dm | 6 +- .../organs/external/subtypes/standard.dm | 4 +- .../modules/overmap/legacy/overmap_shuttle.dm | 2 +- .../legacy/ships/computers/computer_shims.dm | 2 +- .../overmap/legacy/ships/panicbutton.dm | 2 +- code/modules/paperwork/faxmachine.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 6 +- code/modules/paperwork/paperbin.dm | 20 ++--- code/modules/paperwork/photocopier.dm | 2 +- code/modules/power/antimatter/computer.dm | 2 +- code/modules/power/antimatter/control.dm | 2 +- code/modules/power/apc.dm | 2 +- code/modules/power/breaker_box.dm | 2 +- code/modules/power/cable.dm | 2 +- code/modules/power/fission/computer.dm | 2 +- code/modules/power/fission/engine.dm | 2 +- code/modules/power/fusion/core/_core.dm | 2 +- .../modules/power/fusion/core/core_control.dm | 2 +- .../fusion/fuel_assembly/fuel_control.dm | 2 +- .../fusion/fuel_assembly/fuel_injector.dm | 2 +- .../power/fusion/gyrotron/gyrotron_control.dm | 2 +- code/modules/power/generator.dm | 2 +- code/modules/power/generator_type2.dm | 2 +- code/modules/power/gravitygenerator.dm | 4 +- code/modules/power/grid_checker.dm | 2 +- code/modules/power/lighting/lighting.dm | 6 +- code/modules/power/port_gen.dm | 6 +- .../power/sensors/sensor_monitoring.dm | 2 +- code/modules/power/singularity/collector.dm | 2 +- .../power/singularity/containment_field.dm | 2 +- code/modules/power/singularity/emitter.dm | 2 +- .../power/singularity/field_generator.dm | 2 +- .../particle_accelerator/particle_control.dm | 2 +- code/modules/power/singularity/singularity.dm | 2 +- code/modules/power/smes/smes.dm | 2 +- code/modules/power/smes/smes_construction.dm | 2 +- code/modules/power/solar.dm | 4 +- code/modules/power/supermatter/supermatter.dm | 2 +- code/modules/power/tesla/coil.dm | 4 +- code/modules/power/turbine.dm | 4 +- code/modules/projectiles/guns/ballistic.dm | 2 +- code/modules/projectiles/guns/energy.dm | 2 +- .../guns/launcher/grenade_launcher.dm | 2 +- .../projectiles/guns/launcher/pneumatic.dm | 2 +- .../projectiles/guns/launcher/syringe_gun.dm | 2 +- .../modules/projectiles/guns/magnetic/bore.dm | 2 +- .../projectiles/guns/magnetic/magnetic.dm | 2 +- .../projectiles/guns/projectile/automatic.dm | 4 +- .../projectiles/guns/projectile/bow.dm | 2 +- .../projectiles/guns/projectile/pistol.dm | 6 +- .../projectiles/guns/projectile/rocket.dm | 4 +- .../modules/projectiles/magazines/magazine.dm | 2 +- .../modules/projectiles/magazines/smartmag.dm | 2 +- code/modules/random_map/drop/droppod_doors.dm | 2 +- code/modules/reagents/chemistry/machinery.dm | 2 +- .../modules/reagents/distilling/distilling.dm | 2 +- code/modules/reagents/items/hypospray.dm | 2 +- .../modules/reagents/machinery/chem_master.dm | 2 +- .../reagents/reagent_containers/glass.dm | 2 +- .../reagents/reagent_containers/hypospray.dm | 2 +- .../reagents/reagent_containers/organic.dm | 2 +- .../reagents/reagent_containers/syringes.dm | 2 +- code/modules/recycling/conveyor2.dm | 6 +- code/modules/recycling/disposal.dm | 2 +- code/modules/recycling/sortingmachinery.dm | 2 +- code/modules/research/machinery/rdconsole.dm | 2 +- code/modules/research/machinery/rdmachines.dm | 2 +- code/modules/research/machinery/server.dm | 2 +- code/modules/resleeving/computers.dm | 2 +- code/modules/resleeving/infomorph.dm | 2 +- code/modules/resleeving/machines.dm | 4 +- code/modules/rogueminer_vr/zone_console.dm | 2 +- .../security levels/keycard authentication.dm | 2 +- code/modules/shieldgen/emergency_shield.dm | 2 +- code/modules/shieldgen/energy_field.dm | 2 +- code/modules/shieldgen/energy_shield.dm | 2 +- code/modules/shieldgen/handheld_defuser.dm | 2 +- code/modules/shieldgen/sheldwallgen.dm | 4 +- code/modules/shieldgen/shield_capacitor.dm | 2 +- code/modules/shieldgen/shield_diffuser.dm | 2 +- code/modules/shieldgen/shield_gen.dm | 2 +- code/modules/shieldgen/shield_generator.dm | 2 +- code/modules/shuttles/shuttle_console.dm | 2 +- code/modules/species/protean/protean_blob.dm | 2 +- .../station/xenomorph_hybrids/hybrid_resin.dm | 2 +- .../species/xenomorphs/alien_facehugger.dm | 4 +- code/modules/stockmarket/computer.dm | 2 +- code/modules/tables/tables.dm | 2 +- code/modules/telesci/hyper_pad.dm | 4 +- code/modules/telesci/quantum_pad.dm | 2 +- code/modules/telesci/telesci_computer.dm | 2 +- code/modules/turbolift/turbolift_console.dm | 2 +- code/modules/vehicles_legacy/bike.dm | 2 +- code/modules/vehicles_legacy/skateboard.dm | 2 +- code/modules/vehicles_legacy/train.dm | 2 +- code/modules/virus2/curer.dm | 2 +- code/modules/virus2/diseasesplicer.dm | 2 +- code/modules/virus2/dishincubator.dm | 2 +- code/modules/virus2/isolator.dm | 2 +- code/modules/vore/fluffstuff/custom_guns.dm | 2 +- code/modules/vore/fluffstuff/custom_items.dm | 4 +- .../vore/weight/fitness_machines_vr.dm | 6 +- .../xenoarcheaology/anomaly_container.dm | 2 +- .../xenoarcheaology/artifacts/artifact.dm | 2 +- .../xenoarcheaology/artifacts/gigadrill.dm | 2 +- .../xenoarcheaology/artifacts/replicator.dm | 2 +- .../tools/artifact_analyser.dm | 2 +- .../tools/artifact_harvester.dm | 2 +- .../tools/geosample_scanner.dm | 2 +- .../tools/suspension_generator.dm | 2 +- code/modules/xenobio/machinery/processor.dm | 2 +- .../xenobio2/machinery/core_extractor.dm | 2 +- .../xenobio2/machinery/gene_manipulators.dm | 2 +- .../xenobio2/machinery/injector_computer.dm | 2 +- .../xenobio2/machinery/slime_replicator.dm | 2 +- maps/generic/misc.dm | 2 +- 450 files changed, 649 insertions(+), 604 deletions(-) create mode 100644 code/datums/event_args/clickchain.dm create mode 100644 code/datums/event_args/event_args.dm diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm index f3e1f47a1ace..6f84aa04ba96 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -37,7 +37,7 @@ ////#define COMPONENT_SKIP_ATTACK (1<<1) /// From base of atom/attack_ghost(): (mob/observer/dead/ghost) #define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" -/// From base of atom/attack_hand(mob/user, list/params): (mob/user, list/modifiers) +/// From base of atom/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args): (mob/user, list/modifiers) ////#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" /// From base of atom/attack_paw(): (mob/user) ////#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 894562605d66..622538036f96 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -129,7 +129,7 @@ ////#define COMSIG_MOB_CLUMSY_SHOOT_FOOT "mob_clumsy_shoot_foot" /// From /obj/item/hand_item/slapper/attack_atom(): (source=obj/structure/table/slammed_table, mob/living/slammer) ////#define COMSIG_TABLE_SLAMMED "table_slammed" -/// From base of atom/attack_hand(mob/user, list/params): (mob/user, modifiers) +/// From base of atom/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args): (mob/user, modifiers) ////#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" /// From base of /obj/item/attack(): (mob/M, mob/user) ////#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 7d591b34e038..98fd11a04f87 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -17,7 +17,17 @@ //! BYOND will 100% allow you to. //! DO NOT DO THIS. -#define ui_entire_screen "LEFT,BOTTOM to RIGHT,TOP" +//* General HUD positions +//* These should be as widescreen-agnostic as possible. + +/// Fill screen +#define SCREEN_LOC_FULLSCREEN "LEFT,BOTTOM to RIGHT,TOP" + +//* Mob HUD screen object positions +//* These should be widescreen-agnostic and use anchorings to the sides of the screen / center. + +/// Hands +#define SCREEN_LOC_INV_HAND(index) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" //Lower left, persistant menu #define ui_inventory "LEFT:6,BOTTOM:5" @@ -28,8 +38,6 @@ #define ui_belt "LEFT+4:14,BOTTOM:5" #define ui_back "CENTER-2:14,BOTTOM:5" -#define ui_hand_for_index(index) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" - #define ui_equip "CENTER-1:16,BOTTOM+1:5" #define ui_swaphand1 "CENTER-1:16,BOTTOM+1:5" #define ui_swaphand2 "CENTER:16,BOTTOM+1:5" diff --git a/code/_onclick/hud/_screen_object.dm b/code/_onclick/hud/_screen_object.dm index 448aaa1e089a..62b532d484bd 100644 --- a/code/_onclick/hud/_screen_object.dm +++ b/code/_onclick/hud/_screen_object.dm @@ -69,7 +69,7 @@ G.s_click(src) return 1 -/atom/movable/screen/grab/attack_hand(mob/user, list/params) +/atom/movable/screen/grab/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return /atom/movable/screen/grab/attackby() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index f25e70190c7d..8200bf2fd0d6 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -18,7 +18,7 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) var/atom/movable/screen/holomap /atom/movable/screen/global_screen - screen_loc = ui_entire_screen + screen_loc = SCREEN_LOC_FULLSCREEN plane = FULLSCREEN_PLANE mouse_opacity = 0 diff --git a/code/_onclick/mobs.dm b/code/_onclick/mobs.dm index 422b14593c4b..a27597ad2052 100644 --- a/code/_onclick/mobs.dm +++ b/code/_onclick/mobs.dm @@ -24,3 +24,17 @@ // todo: NO. MORE. LIST. PARAMS. WHY. ARE. WE. UNPACKING. THE. LIST. MULTIPLE. TIMES? var/stupid_fucking_shim = list2params(params) RangedAttack(target, stupid_fucking_shim) + +/** + * construct default event args for what we're doing to a target + */ +/mob/proc/default_clickchain_event_args(atom/target, list/params, unarmed = FALSE) + var/datum/event_args/clickchain/constructed = new + constructed.initiator = src + constructed.actor = src + constructed.target = target + constructed.click_params = params + constructed.attack_intent = a_intent + constructed.hand_index = active_hand + if(!unarmed) + constructed.using = get_active_held_item() diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index d54b5226b340..eaa67bb1a840 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -31,7 +31,9 @@ A.attack_hand(src) /// Return TRUE to cancel other attack hand effects that respect it. -/atom/proc/attack_hand(mob/user, list/params) +/atom/proc/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) + if(isnull(e_args)) + e_args = user.default_clickchain_event_args(src, params, TRUE) . = _try_interact(user) //Return a non FALSE value to cancel whatever called this from propagating, if it respects it. diff --git a/code/_rendering/mob_huds/inventory.dm b/code/_rendering/mob_huds/inventory.dm index b0e8ef832b76..5c5d3c41b211 100644 --- a/code/_rendering/mob_huds/inventory.dm +++ b/code/_rendering/mob_huds/inventory.dm @@ -1 +1,34 @@ /datum/mob_hud/inventory + +/atom/movable/screen/inventory + name = "inventory" + + /// our owning inventory datum + var/datum/inventory/host + /// our slot ID or index + var/target + +/atom/movable/screen/inventory/Initialize(mapload, datum/inventory/host, target) + . = ..() + src.target = target + src.host = host + auto_name_and_position(target) + +/atom/movable/screen/inventory/proc/auto_name_and_position(slot_or_index) + + +/** + * handle an inventory operation + * + * @params + * * user - clicking user; not necessarily the inventory's owner + * * slot_or_index - slot ID or numerical hand index + * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. + */ +/atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) + +#warn impl all + +/atom/movable/screen/inventory/hand + +/atom/movable/screen/inventory/hand/ diff --git a/code/datums/event_args/clickchain.dm b/code/datums/event_args/clickchain.dm new file mode 100644 index 000000000000..ce9d7af1f117 --- /dev/null +++ b/code/datums/event_args/clickchain.dm @@ -0,0 +1,20 @@ +/** + * event args for clickchain procs + * + * clickchain is attack_x with item procs, attack hand, unarmed/ranged, etc. + */ +/datum/event_args/clickchain + /// the mob that initiated the action - you usually don't care about this unless you're logging + var/mob/initiator + /// the mob that is doing the action + var/mob/actor + /// the original atom target of the action + var/atom/target + /// original click params as list - can be null + var/list/click_params + /// attack intent + var/attack_intent + /// hand index, if any + var/hand_index + /// with item, if any + var/obj/item/using diff --git a/code/datums/event_args/event_args.dm b/code/datums/event_args/event_args.dm new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/code/game/atoms/buckling.dm b/code/game/atoms/buckling.dm index 32f3da64bee5..4ac3c3b1ecec 100644 --- a/code/game/atoms/buckling.dm +++ b/code/game/atoms/buckling.dm @@ -3,7 +3,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return ..() -/atom/movable/attack_hand(mob/user, list/params) +/atom/movable/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 2727789cdf6b..963f6aeb28fa 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -331,7 +331,7 @@ src.add_hiddenprint(user) nano_ui_interact(user) -/obj/machinery/computer/scan_consolenew/attack_hand(mob/user, list/params) +/obj/machinery/computer/scan_consolenew/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!..()) nano_ui_interact(user) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index dfb37a7cb90d..e32fdec2470d 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -37,7 +37,7 @@ . = ..() START_PROCESSING(SSobj, src) -/obj/structure/cult/pylon/attack_hand(mob/user, list/params) +/obj/structure/cult/pylon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) attackpylon(user, 5) /obj/structure/cult/pylon/attack_generic(var/mob/user, var/damage) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 7bbc8e5f4dc4..5cfca05ca47e 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -101,7 +101,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," return -/obj/effect/rune/attack_hand(mob/user, list/params) +/obj/effect/rune/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!ishuman(user)) return var/mob/living/carbon/human/H = user diff --git a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm index bf31926e9224..4e90dbb70d64 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm @@ -78,7 +78,7 @@ /turf/unsimulated/wall/supermatter/attack_ai(mob/user as mob) return user.examinate(src) -/turf/unsimulated/wall/supermatter/attack_hand(mob/user, list/params) +/turf/unsimulated/wall/supermatter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.visible_message("\The [user] reaches out and touches \the [src]... And then blinks out of existance.",\ "You reach out and touch \the [src]. Everything immediately goes quiet. Your last thought is \"That was not a wise decision.\"",\ "You hear an unearthly noise.") diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 0156cb84f94c..48ab65664690 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -17,7 +17,7 @@ . = ..() layCable(new_turf,M_Dir) -/obj/machinery/cablelayer/attack_hand(mob/user, list/params) +/obj/machinery/cablelayer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!cable&&!on) to_chat(user, SPAN_WARNING("\The [src] doesn't have any cable loaded.")) return diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 0a95097a3876..59186cd478b1 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -41,7 +41,7 @@ if(prob(25)) density = 0 -/obj/machinery/optable/attack_hand(mob/user, list/params) +/obj/machinery/optable/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(MUTATION_HULK in usr.mutations) visible_message(SPAN_DANGER("\The [usr] destroys \the [src]!")) density = FALSE diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 6e36d6b781d3..da488f2e56ba 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -37,7 +37,7 @@ /obj/machinery/sleep_console/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/sleep_console/attack_hand(mob/user, list/params) +/obj/machinery/sleep_console/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return 1 diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 0771ed8b1f7a..39f35ecd212a 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -332,7 +332,7 @@ else return attack_hand(user) -/obj/machinery/attack_hand(mob/user, list/params) +/obj/machinery/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(IsAdminGhost(user)) return FALSE if(inoperable(MAINT)) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 5efd47539ee3..86bcbe1d4f48 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -240,7 +240,7 @@ . = ..() return attack_hand(user) -/obj/machinery/body_scanconsole/attack_hand(mob/user, list/params) +/obj/machinery/body_scanconsole/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 477852c0229c..2402a67993c6 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -57,7 +57,7 @@ /obj/machinery/ai_slipper/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/ai_slipper/attack_hand(mob/user, list/params) +/obj/machinery/ai_slipper/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return if((get_dist(src, user) > 1)) diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 0f238880a4fd..61330e28496f 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -523,7 +523,7 @@ GLOBAL_LIST_EMPTY(air_alarms) /obj/machinery/alarm/attack_ai(mob/user) ui_interact(user) -/obj/machinery/alarm/attack_hand(mob/user, list/params) +/obj/machinery/alarm/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/atm_ret_field.dm b/code/game/machinery/atm_ret_field.dm index bdeb68ae6619..3db0f97d1fa9 100644 --- a/code/game/machinery/atm_ret_field.dm +++ b/code/game/machinery/atm_ret_field.dm @@ -218,7 +218,7 @@ update_nearby_tiles() //Force ZAS update . = ..() -/obj/structure/atmospheric_retention_field/attack_hand(mob/user, list/params) +/obj/structure/atmospheric_retention_field/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(density) visible_message("You touch the retention field, and it crackles faintly. Tingly!") else diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index d6231dd100b9..f34fd4adfdc4 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -86,7 +86,7 @@ radio_controller.remove_object(src, frequency) ..() -/obj/machinery/computer/general_air_control/attack_hand(mob/user, list/params) +/obj/machinery/computer/general_air_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..(user)) return diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm index a143483bd497..80214301b225 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/atmoalter/area_atmos_computer.dm @@ -21,7 +21,7 @@ /obj/machinery/computer/area_atmos/attack_ai(mob/user) return src.attack_hand(user) -/obj/machinery/computer/area_atmos/attack_hand(mob/user, list/params) +/obj/machinery/computer/area_atmos/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..(user)) return ui_interact(user) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 402cc3c211ed..d2e46791ecc5 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -317,7 +317,7 @@ update_flag /obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/portable_atmospherics/canister/attack_hand(mob/user, list/params) +/obj/machinery/portable_atmospherics/canister/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return src.ui_interact(user) /obj/machinery/portable_atmospherics/canister/ui_state(mob/user, datum/tgui_module/module) diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index 4b1f0faca85f..cdf02a482180 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -110,7 +110,7 @@ . = ..() return src.attack_hand(user) -/obj/machinery/portable_atmospherics/powered/pump/attack_hand(mob/user, list/params) +/obj/machinery/portable_atmospherics/powered/pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/portable_atmospherics/powered/pump/ui_interact(mob/user, datum/tgui/ui) @@ -208,7 +208,7 @@ name = "[name] (ID [id])" -/obj/machinery/portable_atmospherics/powered/pump/huge/attack_hand(mob/user, list/params) +/obj/machinery/portable_atmospherics/powered/pump/huge/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) to_chat(user, "You can't directly interact with this machine. Use the pump control console.") /obj/machinery/portable_atmospherics/powered/pump/huge/update_icon() diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 16dd175f9c6f..a7f1b4bb070e 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -105,7 +105,7 @@ . = ..() return src.attack_hand(user) -/obj/machinery/portable_atmospherics/powered/scrubber/attack_hand(mob/user, list/params) +/obj/machinery/portable_atmospherics/powered/scrubber/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/portable_atmospherics/powered/scrubber/ui_interact(mob/user, datum/tgui/ui) @@ -181,7 +181,7 @@ name = "[name] (ID [id])" -/obj/machinery/portable_atmospherics/powered/scrubber/huge/attack_hand(mob/user, list/params) +/obj/machinery/portable_atmospherics/powered/scrubber/huge/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) to_chat(user, "You can't directly interact with this machine. Use the scrubber control console.") /obj/machinery/portable_atmospherics/powered/scrubber/huge/update_icon() diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index ddf18136f023..f4ae84b670a1 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -125,7 +125,7 @@ . = ..() -/obj/machinery/organ_printer/attack_hand(mob/user, list/params) +/obj/machinery/organ_printer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/bomb_tester.dm b/code/game/machinery/bomb_tester.dm index 48d68ca5326f..32a5e6acad85 100644 --- a/code/game/machinery/bomb_tester.dm +++ b/code/game/machinery/bomb_tester.dm @@ -109,7 +109,7 @@ return ..() -/obj/machinery/bomb_tester/attack_hand(mob/user, list/params) +/obj/machinery/bomb_tester/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) ui_interact(user) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index e87757a02b27..b7a9912ee3fe 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -129,7 +129,7 @@ src.view_range = num GLOB.cameranet.updateVisibility(src, 0) -/obj/machinery/camera/attack_hand(mob/user, list/params) +/obj/machinery/camera/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/carbon/human/L = user if(!istype(L)) return diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 55550d1cf58b..4f318c0cc7d2 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -149,7 +149,7 @@ else icon_state = "cameracase" -/obj/item/camera_assembly/attack_hand(mob/user, list/params) +/obj/item/camera_assembly/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!anchored) ..() diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 8002321d58f1..ec7319aee547 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -81,7 +81,7 @@ else if(default_part_replacement(user, W)) return -/obj/machinery/cell_charger/attack_hand(mob/user, list/params) +/obj/machinery/cell_charger/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(charging) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index a8b2a8ee83a4..0bc0d3ca187f 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -60,7 +60,7 @@ add_hiddenprint(user) return attack_hand(user) -/obj/machinery/clonepod/attack_hand(mob/user, list/params) +/obj/machinery/clonepod/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((isnull(occupant)) || (machine_stat & NOPOWER)) return if((!isnull(occupant)) && (occupant.stat != 2)) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 94e50904ceda..798cc4efdf7f 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -48,7 +48,7 @@ return ui_interact(user) -/obj/machinery/computer/operating/attack_hand(mob/user, list/params) +/obj/machinery/computer/operating/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/game/machinery/computer/RCON_Console.dm b/code/game/machinery/computer/RCON_Console.dm index 6dae0a2772ec..1116fc62b2af 100644 --- a/code/game/machinery/computer/RCON_Console.dm +++ b/code/game/machinery/computer/RCON_Console.dm @@ -26,7 +26,7 @@ // Proc: attack_hand() // Parameters: 1 (user - Person which clicked this computer) // Description: Opens UI of this machine. -/obj/machinery/computer/rcon/attack_hand(mob/user, list/params) +/obj/machinery/computer/rcon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() ui_interact(user) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 123ea6200666..795ee7036e2a 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -48,7 +48,7 @@ to_chat(user, SPAN_NOTICE("There is no AI loaded onto this computer, and no AI loaded onto [I]. What exactly are you trying to do here?")) return ..() -/obj/machinery/computer/aifixer/attack_hand(mob/user, list/params) +/obj/machinery/computer/aifixer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return ui_interact(user) diff --git a/code/game/machinery/computer/arcade/claw_machine.dm b/code/game/machinery/computer/arcade/claw_machine.dm index 1ea2dcc61fa7..9a42c68971ee 100644 --- a/code/game/machinery/computer/arcade/claw_machine.dm +++ b/code/game/machinery/computer/arcade/claw_machine.dm @@ -160,7 +160,7 @@ /obj/machinery/computer/arcade/clawmachine/Initialize(mapload) . = ..() -/obj/machinery/computer/arcade/clawmachine/attack_hand(mob/user, list/params) +/obj/machinery/computer/arcade/clawmachine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 153bf06d024a..af1fcd1a0b56 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -19,7 +19,7 @@ var/global/list/minor_air_alarms = list() atmosphere_alarm.unregister_alarm(src) return ..() -/obj/machinery/computer/atmos_alert/attack_hand(mob/user, list/params) +/obj/machinery/computer/atmos_alert/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/computer/atmos_alert/ui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 7351b5d8be42..3aaa58253358 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -30,7 +30,7 @@ /obj/machinery/computer/atmoscontrol/attack_ai(mob/user) ui_interact(user) -/obj/machinery/computer/atmoscontrol/attack_hand(mob/user, list/params) +/obj/machinery/computer/atmoscontrol/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index c6876f758bc4..e6c6829c097d 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -28,7 +28,7 @@ /obj/machinery/computer/security/ui_interact(mob/user, datum/tgui/ui = null) camera.ui_interact(user, ui) -/obj/machinery/computer/security/attack_hand(mob/user, list/params) +/obj/machinery/computer/security/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index cc7b57599f99..580fffde7d6b 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -94,7 +94,7 @@ /obj/machinery/computer/cloning/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/cloning/attack_hand(mob/user, list/params) +/obj/machinery/computer/cloning/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) add_fingerprint(user) diff --git a/code/game/machinery/computer/command/card.dm b/code/game/machinery/computer/command/card.dm index 0915303c0735..2a77a37b1f30 100644 --- a/code/game/machinery/computer/command/card.dm +++ b/code/game/machinery/computer/command/card.dm @@ -105,7 +105,7 @@ /obj/machinery/computer/card/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/card/attack_hand(mob/user, list/params) +/obj/machinery/computer/card/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if(machine_stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 365e0e483c3b..894ad9f15fcd 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -296,7 +296,7 @@ /obj/machinery/computer/communications/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/communications/attack_hand(mob/user, list/params) +/obj/machinery/computer/communications/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if ((LEGACY_MAP_DATUM) && !(src.z in (LEGACY_MAP_DATUM).contact_levels)) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 72bdbcf6831e..b6de72b49577 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -23,7 +23,7 @@ /obj/machinery/computer/crew/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/crew/attack_hand(mob/user, list/params) +/obj/machinery/computer/crew/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 2d7851711b0e..8563e4880cc4 100755 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -115,7 +115,7 @@ /obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/guestpass/attack_hand(mob/user, list/params) +/obj/machinery/computer/guestpass/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 0b78a2ed1e77..1bbf16bc7c3f 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -35,7 +35,7 @@ ..() -/obj/machinery/computer/aiupload/attack_hand(mob/user, list/params) +/obj/machinery/computer/aiupload/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & NOPOWER) to_chat(user, "The upload computer has no power!") return @@ -71,7 +71,7 @@ return ..() -/obj/machinery/computer/borgupload/attack_hand(mob/user, list/params) +/obj/machinery/computer/borgupload/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat& NOPOWER) to_chat(user, "The upload computer has no power!") return diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 734cc897362b..5416d73abb91 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -101,7 +101,7 @@ /obj/machinery/computer/med_data/attack_ai(user as mob) return attack_hand(user) -/obj/machinery/computer/med_data/attack_hand(mob/user, list/params) +/obj/machinery/computer/med_data/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index d237215ad181..66dc5d051803 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -78,7 +78,7 @@ linkedServer = message_servers[1] return ..() -/obj/machinery/computer/message_monitor/attack_hand(mob/user, list/params) +/obj/machinery/computer/message_monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return if(!istype(user)) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index ebeb9a383006..c6fa49997344 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -46,7 +46,7 @@ /obj/machinery/computer/pod/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/pod/attack_hand(mob/user, list/params) +/obj/machinery/computer/pod/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return @@ -142,7 +142,7 @@ title = "External Airlock Controls" req_access = list(ACCESS_FACTION_SYNDICATE) -/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user, list/params) +/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access Denied") return diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 3454c1ab935f..5a271b03478b 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -16,7 +16,7 @@ /obj/machinery/computer/prisoner/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/prisoner/attack_hand(mob/user, list/params) +/obj/machinery/computer/prisoner/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm index 398b877bec3e..7fc855387013 100644 --- a/code/game/machinery/computer/prisonshuttle.dm +++ b/code/game/machinery/computer/prisonshuttle.dm @@ -27,7 +27,7 @@ var/prison_shuttle_timeleft = 0 /obj/machinery/computer/prison_shuttle/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/prison_shuttle/attack_hand(mob/user, list/params) +/obj/machinery/computer/prison_shuttle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!src.allowed(user) && (!hacked)) to_chat(user, "Access Denied.") return diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 818dd977ac3e..a9f92aa7c6e1 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -11,7 +11,7 @@ /obj/machinery/computer/robotics/attack_ai(var/mob/user as mob) ui_interact(user) -/obj/machinery/computer/robotics/attack_hand(mob/user, list/params) +/obj/machinery/computer/robotics/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if(machine_stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 3374bf176908..018eaba17b61 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -87,7 +87,7 @@ /obj/machinery/computer/secure_data/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/secure_data/attack_hand(mob/user, list/params) +/obj/machinery/computer/secure_data/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return add_fingerprint(user) diff --git a/code/game/machinery/computer/shutoff_monitor.dm b/code/game/machinery/computer/shutoff_monitor.dm index aca1c4988522..adda8e52c18c 100644 --- a/code/game/machinery/computer/shutoff_monitor.dm +++ b/code/game/machinery/computer/shutoff_monitor.dm @@ -15,7 +15,7 @@ QDEL_NULL(monitor) ..() -/obj/machinery/computer/shutoff_monitor/attack_hand(mob/user, list/params) +/obj/machinery/computer/shutoff_monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() monitor.ui_interact(user) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 65b2b5870cc3..eb0ebdc904f8 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -62,7 +62,7 @@ return attack_hand(user) //Someone needs to break down the dat += into chunks instead of long ass lines. -/obj/machinery/computer/skills/attack_hand(mob/user, list/params) +/obj/machinery/computer/skills/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if ((LEGACY_MAP_DATUM) && !(src.z in (LEGACY_MAP_DATUM).contact_levels)) diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm index 57c8fc93b682..143636a06d95 100644 --- a/code/game/machinery/computer/specops_shuttle.dm +++ b/code/game/machinery/computer/specops_shuttle.dm @@ -255,7 +255,7 @@ var/specops_shuttle_timeleft = 0 /obj/machinery/computer/specops_shuttle/emag_act(var/remaining_charges, var/mob/user) to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals.") -/obj/machinery/computer/specops_shuttle/attack_hand(mob/user, list/params) +/obj/machinery/computer/specops_shuttle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access Denied.") return diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 35b4b3187a4e..66dbe82f28e5 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -34,7 +34,7 @@ ui_interact(user) return -/obj/machinery/computer/station_alert/attack_hand(mob/user, list/params) +/obj/machinery/computer/station_alert/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/computer/supermatter_monitor_tgui.dm b/code/game/machinery/computer/supermatter_monitor_tgui.dm index c033af582418..921190479603 100644 --- a/code/game/machinery/computer/supermatter_monitor_tgui.dm +++ b/code/game/machinery/computer/supermatter_monitor_tgui.dm @@ -17,7 +17,7 @@ /obj/machinery/computer/sm_monitor/attack_ai(mob/user) ui_interact(user) -/obj/machinery/computer/sm_monitor/attack_hand(mob/user, list/params) +/obj/machinery/computer/sm_monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index b8465c5db694..de2bf923edd2 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -35,7 +35,7 @@ /obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/supplycomp/attack_hand(mob/user, list/params) +/obj/machinery/computer/supplycomp/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if(!allowed(user)) diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm index 1e681eb33c87..643a79f3f429 100644 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm @@ -191,7 +191,7 @@ var/syndicate_elite_shuttle_timeleft = 0 /obj/machinery/computer/syndicate_elite_shuttle/emag_act(var/remaining_charges, var/mob/user) to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals.") -/obj/machinery/computer/syndicate_elite_shuttle/attack_hand(mob/user, list/params) +/obj/machinery/computer/syndicate_elite_shuttle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access Denied.") return diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index 8d18a35c73e6..614bc25eaadb 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -63,7 +63,7 @@ return . = ..() -/obj/machinery/computer/timeclock/attack_hand(mob/user, list/params) +/obj/machinery/computer/timeclock/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return user.set_machine(src) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index bea8fe774feb..9dcf0e983dc1 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -79,7 +79,7 @@ if(occupant == user && !user.stat) go_out() -/obj/machinery/atmospherics/component/unary/cryo_cell/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/unary/cryo_cell/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) nano_ui_interact(user) /** diff --git a/code/game/machinery/deployable_vr.dm b/code/game/machinery/deployable_vr.dm index b57f97c56598..1bee4e7a83a0 100644 --- a/code/game/machinery/deployable_vr.dm +++ b/code/game/machinery/deployable_vr.dm @@ -56,7 +56,7 @@ topple() ..() -/obj/structure/barricade/cutout/attack_hand(mob/user, list/params) +/obj/structure/barricade/cutout/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((. = ..())) return diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 56d88ba9ca4a..d426765dc716 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -34,7 +34,7 @@ playsound(src.loc, "sparks", 100, TRUE) return 1 -/obj/machinery/button/remote/attack_hand(mob/user, list/params) +/obj/machinery/button/remote/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/doorbell_vr.dm b/code/game/machinery/doorbell_vr.dm index 1379236cf3d4..399385d26d76 100644 --- a/code/game/machinery/doorbell_vr.dm +++ b/code/game/machinery/doorbell_vr.dm @@ -111,7 +111,7 @@ else icon_state = "doorbell-standby" -/obj/machinery/button/doorbell/attack_hand(mob/user, list/params) +/obj/machinery/button/doorbell/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(..()) return diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 839784f07415..5d4dec4ecd6e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -654,7 +654,7 @@ About the new airlock wires panel: last_spark = world.time return ..() -/obj/machinery/door/airlock/attack_hand(mob/user, list/params) +/obj/machinery/door/airlock/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 100)) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 90960165da3c..1fed6130f8b4 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -174,7 +174,7 @@ else icon_state = "airlock_sensor_off" -/obj/machinery/airlock_sensor/attack_hand(mob/user, list/params) +/obj/machinery/airlock_sensor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/datum/signal/signal = new signal.transmission_method = TRANSMISSION_RADIO //radio signal signal.data["tag"] = master_tag @@ -260,7 +260,7 @@ return ..() -/obj/machinery/access_button/attack_hand(mob/user, list/params) +/obj/machinery/access_button/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() if(!allowed(user)) to_chat(user, "Access Denied") diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index f28b7052b2ee..d93c41c1a214 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -119,7 +119,7 @@ //Proc: attack_hand //Description: Attacked with empty hand. Only to allow special attack_bys. -/obj/machinery/door/blast/attack_hand(mob/user, list/params) +/obj/machinery/door/blast/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/X = user if(istype(X.species, /datum/species/xenos)) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 7852955f99dc..4a24bd8e08eb 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -158,7 +158,7 @@ /obj/machinery/door_timer/attack_ai(mob/user) return src.attack_hand(user) -/obj/machinery/door_timer/attack_hand(mob/user, list/params) +/obj/machinery/door_timer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a1cb606f3bea..8b6a3a324e0a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -200,7 +200,7 @@ /obj/machinery/door/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/door/attack_hand(mob/user, list/params) +/obj/machinery/door/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return src.attackby(user, user) /obj/machinery/door/attack_tk(mob/user as mob) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d6b3e404015a..afe23fc3b1f5 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -150,7 +150,7 @@ GLOBAL_LIST_INIT(firelock_align_types, typecacheof(list( attack_hand(M) return 0 -/obj/machinery/door/firedoor/attack_hand(mob/user, list/params) +/obj/machinery/door/firedoor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(operating) return//Already doing something. diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index b36fa04e0354..138c43696e14 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -147,7 +147,7 @@ /obj/machinery/door/window/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/door/window/attack_hand(mob/user, list/params) +/obj/machinery/door/window/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) src.add_fingerprint(user) if(istype(user,/mob/living/carbon/human)) diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 968b162ddfe6..a90a2ae651be 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -48,7 +48,7 @@ /obj/machinery/embedded_controller/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/embedded_controller/attack_hand(mob/user, list/params) +/obj/machinery/embedded_controller/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!user.IsAdvancedToolUser()) return 0 diff --git a/code/game/machinery/event.dm b/code/game/machinery/event.dm index aabe77a9a12f..6ea2d298e760 100644 --- a/code/game/machinery/event.dm +++ b/code/game/machinery/event.dm @@ -65,7 +65,7 @@ The goal here is to create esoteric or niche, specialized machines that follow t else return -/obj/machinery/magma_pump/attack_hand(mob/user, list/params) +/obj/machinery/magma_pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) interact(user) /obj/machinery/magma_pump/interact(mob/user) @@ -211,7 +211,7 @@ The goal here is to create esoteric or niche, specialized machines that follow t else return -/obj/machinery/magma_reservoir/attack_hand(mob/user, list/params) +/obj/machinery/magma_reservoir/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) interact(user) /obj/machinery/magma_reservoir/interact(mob/user) diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm index 3533fa08592b..844783b41cbb 100644 --- a/code/game/machinery/exonet_node.dm +++ b/code/game/machinery/exonet_node.dm @@ -93,7 +93,7 @@ // Proc: attack_hand() // Parameters: 1 (user - the person clicking on the machine) // Description: Opens the TGUI interface with ui_interact() -/obj/machinery/exonet_node/attack_hand(mob/user, list/params) +/obj/machinery/exonet_node/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) // Proc: ui_interact() diff --git a/code/game/machinery/fire_alarm.dm b/code/game/machinery/fire_alarm.dm index acae368d42e1..043f69e7e820 100644 --- a/code/game/machinery/fire_alarm.dm +++ b/code/game/machinery/fire_alarm.dm @@ -176,7 +176,7 @@ FIRE ALARM spawn(rand(0,15)) update_icon() -/obj/machinery/firealarm/attack_hand(mob/user, list/params) +/obj/machinery/firealarm/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER | BROKEN)) return @@ -295,7 +295,7 @@ Just a object used in constructing fire alarms idle_power_usage = 2 active_power_usage = 6 -/obj/machinery/partyalarm/attack_hand(mob/user, list/params) +/obj/machinery/partyalarm/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 1644ad5ddcf3..64d07367a3c2 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -127,7 +127,7 @@ name = "flasher button" desc = "A remote control switch for a mounted flasher." -/obj/machinery/button/flasher/attack_hand(mob/user, list/params) +/obj/machinery/button/flasher/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 1b5cbbc7b4eb..d155a44d061d 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -66,7 +66,7 @@ if(!turn_on(TRUE)) to_chat(user, "You try to turn on \the [src] but it does not work.") -/obj/machinery/floodlight/attack_hand(mob/user, list/params) +/obj/machinery/floodlight/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(open && cell) user.grab_item_from_interacted_with(cell, src) diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index 54145073c6c8..9a1d861ee950 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -62,7 +62,7 @@ var/list/floor_light_cache = list() attack_hand(user) return -/obj/machinery/floor_light/attack_hand(mob/user, list/params) +/obj/machinery/floor_light/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_HARM && !issmall(user)) if(!isnull(damaged) && !(machine_stat & BROKEN)) diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index f2cb0f8e2c78..336f25277f43 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -32,7 +32,7 @@ old_turf = isturf(loc)? loc : null -/obj/machinery/floorlayer/attack_hand(mob/user, list/params) +/obj/machinery/floorlayer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) on=!on user.visible_message( \ SPAN_NOTICE("[user] has [!on?"de":""]activated \the [src]."), \ diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 4208e4973304..1aceb9587d42 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -59,7 +59,7 @@ icon = 'icons/obj/power.dmi' icon_state = "crema_switch" -/obj/machinery/button/holosign/attack_hand(mob/user, list/params) +/obj/machinery/button/holosign/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index a4d038ddb312..1bd269924f7c 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -13,7 +13,7 @@ /obj/machinery/igniter/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/igniter/attack_hand(mob/user, list/params) +/obj/machinery/igniter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return @@ -121,7 +121,7 @@ name = "ignition switch" desc = "A remote control switch for a mounted igniter." -/obj/machinery/button/ignition/attack_hand(mob/user, list/params) +/obj/machinery/button/ignition/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 95cafc612406..6c7ce12e8dc3 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -166,7 +166,7 @@ else return ..() -/obj/machinery/iv_drip/attack_hand(mob/user, list/params) +/obj/machinery/iv_drip/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(reagent_container) reagent_container.loc = get_turf(src) reagent_container = null diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 0a2bb00449c5..0b311d6362f3 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -299,7 +299,7 @@ /obj/machinery/media/jukebox/attack_ai(mob/user) return src.attack_hand(user) -/obj/machinery/media/jukebox/attack_hand(mob/user, list/params) +/obj/machinery/media/jukebox/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) interact(user) /obj/machinery/media/jukebox/proc/explode() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 21a0dddf6323..03f1d31b75f0 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -52,7 +52,7 @@ /obj/machinery/light_switch/examine(mob/user, dist) . += SPAN_NOTICE("A light switch. It is [on? "on" : "off"].") -/obj/machinery/light_switch/attack_hand(mob/user, list/params) +/obj/machinery/light_switch/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) on = !on diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 43ceb5a84901..6ded067e09b7 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -251,7 +251,7 @@ /obj/machinery/magnetic_controller/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/magnetic_controller/attack_hand(mob/user, list/params) +/obj/machinery/magnetic_controller/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return user.set_machine(src) diff --git a/code/game/machinery/misc/bioscan_antenna.dm b/code/game/machinery/misc/bioscan_antenna.dm index e7d0c52c06d8..3b0cc1601e76 100644 --- a/code/game/machinery/misc/bioscan_antenna.dm +++ b/code/game/machinery/misc/bioscan_antenna.dm @@ -50,7 +50,7 @@ GLOBAL_LIST_EMPTY(bioscan_antenna_list) .[TOOL_MULTITOOL] = "change network" return merge_double_lazy_assoc_list(., ..()) -/obj/machinery/bioscan_antenna/attack_hand(mob/user, list/params) +/obj/machinery/bioscan_antenna/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // todo: better xenomorphs if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 4d181a2c78d9..acd60d82a916 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -100,7 +100,7 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w /obj/machinery/navbeacon/attack_ai(var/mob/user) interact(user, 1) -/obj/machinery/navbeacon/attack_hand(mob/user, list/params) +/obj/machinery/navbeacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!user.IsAdvancedToolUser()) return FALSE diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index c30ab1425191..ab3db27ae82f 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -250,7 +250,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/newscaster/attack_hand(mob/user, list/params) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ +/obj/machinery/newscaster/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ if(!ispowered || isbroken) return diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index ab29e0b796fd..c9c9dbec686a 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -162,7 +162,7 @@ var/bomb_set return ..() -/obj/machinery/nuclearbomb/attack_hand(mob/user, list/params) +/obj/machinery/nuclearbomb/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(extended) if(!ishuman(user)) to_chat(user, "You don't have the dexterity to do this!") diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 331d22d233ba..4338940130ac 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -51,7 +51,7 @@ attach_mask(target) src.add_fingerprint(usr) -/obj/machinery/oxygen_pump/attack_hand(mob/user, list/params) +/obj/machinery/oxygen_pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((machine_stat & MAINT) && tank) user.visible_message( \ SPAN_NOTICE("\The [user] removes \the [tank] from \the [src]."), \ diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm index 324fc042db0d..7f581fbe0a18 100644 --- a/code/game/machinery/pda_multicaster.dm +++ b/code/game/machinery/pda_multicaster.dm @@ -46,7 +46,7 @@ /obj/machinery/pda_multicaster/attack_ai(mob/user) attack_hand(user) -/obj/machinery/pda_multicaster/attack_hand(mob/user, list/params) +/obj/machinery/pda_multicaster/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) toggle_power(user) /obj/machinery/pda_multicaster/proc/toggle_power(mob/user) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 7c055ad255b8..1d8ca71ecc8f 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -11,7 +11,7 @@ var/disposals = FALSE -/obj/machinery/pipedispenser/attack_hand(mob/user, list/params) +/obj/machinery/pipedispenser/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((. = ..())) return ui_interact(user) diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index c6303fa7eb31..8648ffb7a78a 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -51,7 +51,7 @@ old_turf = new_turf old_dir = turn(M_Dir, 180) -/obj/machinery/pipelayer/attack_hand(mob/user, list/params) +/obj/machinery/pipelayer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if(panel_open) diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index 7762137b5c0f..f68ea70469af 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -39,7 +39,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) ui = new(user, src, "PointDefenseControl") // 400, 600 ui.open() -/obj/machinery/pointdefense_control/attack_hand(mob/user, list/params) +/obj/machinery/pointdefense_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index b4fdafc3c55b..c808bf5df334 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -452,7 +452,7 @@ nano_ui_interact(user) -/obj/machinery/porta_turret/attack_hand(mob/user, list/params) +/obj/machinery/porta_turret/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(isLocked(user)) return @@ -1145,7 +1145,7 @@ ..() -/obj/machinery/porta_turret_construct/attack_hand(mob/user, list/params) +/obj/machinery/porta_turret_construct/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) switch(build_step) if(4) if(!installation) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index a1124b7d4465..9c1889603adc 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -100,7 +100,7 @@ else if(default_part_replacement(user, G)) return -/obj/machinery/recharger/attack_hand(mob/user, list/params) +/obj/machinery/recharger/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(istype(user,/mob/living/silicon)) return diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm index 5ba7d9db0a76..a2106766542f 100644 --- a/code/game/machinery/records_scanner.dm +++ b/code/game/machinery/records_scanner.dm @@ -36,7 +36,7 @@ obj/machinery/scanner else icon_state = "scanner_idle" -obj/machinery/scanner/attack_hand(mob/user, list/params) +obj/machinery/scanner/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(stat & NOPOWER) return if(!ishuman(user) || lastuser == user.real_name) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 3c24ce2293e7..e742f684a1ee 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -119,7 +119,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() req_console_information -= department return ..() -/obj/machinery/requests_console/attack_hand(mob/user, list/params) +/obj/machinery/requests_console/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..(user)) return nano_ui_interact(user) diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index ec6631308913..daabe33d3127 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -32,7 +32,7 @@ else to_chat(user, "The robot part maker is full. Please remove metal from the robot part maker in order to insert more.") -/obj/machinery/robotic_fabricator/attack_hand(mob/user, list/params) +/obj/machinery/robotic_fabricator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/dat if(..()) return diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 972f5dd7edca..9e9fc77a6157 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -74,7 +74,7 @@ ..() return -/obj/machinery/space_heater/attack_hand(mob/user, list/params) +/obj/machinery/space_heater/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) interact(user) /obj/machinery/space_heater/interact(mob/user as mob) @@ -230,7 +230,7 @@ return ..() -/obj/machinery/power/thermoregulator/attack_hand(mob/user, list/params) +/obj/machinery/power/thermoregulator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/game/machinery/suit_storage/suit_cycler.dm b/code/game/machinery/suit_storage/suit_cycler.dm index e0a6abcbdf15..6b6dc59437ec 100644 --- a/code/game/machinery/suit_storage/suit_cycler.dm +++ b/code/game/machinery/suit_storage/suit_cycler.dm @@ -260,7 +260,7 @@ updateUsrDialog() return 1 -/obj/machinery/suit_cycler/attack_hand(mob/user, list/params) +/obj/machinery/suit_cycler/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) diff --git a/code/game/machinery/suit_storage/suit_storage_massive.dm b/code/game/machinery/suit_storage/suit_storage_massive.dm index dd5dc3cf21c6..6c0b3f4f62d6 100644 --- a/code/game/machinery/suit_storage/suit_storage_massive.dm +++ b/code/game/machinery/suit_storage/suit_storage_massive.dm @@ -65,7 +65,7 @@ dump_everything() qdel(src) -/obj/machinery/suit_storage_closet/attack_hand(mob/user, list/params) +/obj/machinery/suit_storage_closet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if(machine_stat & NOPOWER) diff --git a/code/game/machinery/suit_storage/suit_storage_unit.dm b/code/game/machinery/suit_storage/suit_storage_unit.dm index 5546eeb3deb6..15b9c4211acd 100644 --- a/code/game/machinery/suit_storage/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage/suit_storage_unit.dm @@ -78,7 +78,7 @@ dump_everything() qdel(src) -/obj/machinery/suit_storage_unit/attack_hand(mob/user, list/params) +/obj/machinery/suit_storage_unit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if(machine_stat & NOPOWER) diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index f3337336291c..4cff0452f79e 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -57,7 +57,7 @@ return return ..() -/obj/machinery/power/supply_beacon/attack_hand(mob/user, list/params) +/obj/machinery/power/supply_beacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(expended) update_use_power(USE_POWER_OFF) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 6148d58e0681..b225acb6acc6 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -15,7 +15,7 @@ var/selfdestructing = FALSE var/charges = 1 -/obj/machinery/syndicate_beacon/attack_hand(mob/user, list/params) +/obj/machinery/syndicate_beacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) usr.set_machine(src) var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) @@ -108,7 +108,7 @@ /obj/machinery/power/singularity_beacon/attack_ai(mob/user) return -/obj/machinery/power/singularity_beacon/attack_hand(mob/user, list/params) +/obj/machinery/power/singularity_beacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(anchored) return active ? Deactivate(user) : Activate(user) else @@ -159,7 +159,7 @@ //! ## VR FILE MERGE ## !// // Virgo modified syndie beacon, does not give objectives -/obj/machinery/syndicate_beacon/virgo/attack_hand(mob/user, list/params) +/obj/machinery/syndicate_beacon/virgo/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) usr.set_machine(src) var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) diff --git a/code/game/machinery/telecomms/_telecomms.dm b/code/game/machinery/telecomms/_telecomms.dm index 6742110c2473..26c0b1eb1a46 100644 --- a/code/game/machinery/telecomms/_telecomms.dm +++ b/code/game/machinery/telecomms/_telecomms.dm @@ -363,7 +363,7 @@ return UI_CLOSE . = ..() -/obj/machinery/telecomms/attack_hand(mob/user, list/params) +/obj/machinery/telecomms/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/telecomms/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index deb1bc024ec4..25a3fa2d80d0 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -62,7 +62,7 @@ return data -/obj/machinery/computer/telecomms/server/attack_hand(mob/user, list/params) +/obj/machinery/computer/telecomms/server/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/game/machinery/telecomms/message_server.dm b/code/game/machinery/telecomms/message_server.dm index 56b0aec8744a..487157dfd705 100644 --- a/code/game/machinery/telecomms/message_server.dm +++ b/code/game/machinery/telecomms/message_server.dm @@ -140,7 +140,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() Console.set_light(2) -/obj/machinery/message_server/attack_hand(mob/user, list/params) +/obj/machinery/message_server/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // to_chat(user, "There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentCom delays.") to_chat(user, "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]") active = !active diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index f23e06aab2a8..155944c56783 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -50,7 +50,7 @@ return data -/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user, list/params) +/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/game/machinery/teleporter/console.dm b/code/game/machinery/teleporter/console.dm index 1f57687b2a47..11ee010e97db 100644 --- a/code/game/machinery/teleporter/console.dm +++ b/code/game/machinery/teleporter/console.dm @@ -86,7 +86,7 @@ return -/obj/machinery/computer/teleporter/attack_hand(mob/user, list/params) +/obj/machinery/computer/teleporter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/computer/teleporter/ui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) diff --git a/code/game/machinery/teleporter/projector.dm b/code/game/machinery/teleporter/projector.dm index 208563eccd1d..c59e933c74f6 100644 --- a/code/game/machinery/teleporter/projector.dm +++ b/code/game/machinery/teleporter/projector.dm @@ -182,7 +182,7 @@ /obj/machinery/tele_projector/attack_ai() attack_hand() -/obj/machinery/tele_projector/attack_hand(mob/user, list/params) +/obj/machinery/tele_projector/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(engaged) disengage() else diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index e01425d540a2..a6e091c4250b 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -118,7 +118,7 @@ nano_ui_interact(user) -/obj/machinery/turretid/attack_hand(mob/user, list/params) +/obj/machinery/turretid/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(isLocked(user)) return diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 0df4c120f5ff..b2d474f77e76 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -281,7 +281,7 @@ /obj/machinery/vending/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/vending/attack_hand(mob/user, list/params) +/obj/machinery/vending/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 3a51e757c4f8..065a41e8ff82 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -120,7 +120,7 @@ ..() update_icon() -/obj/machinery/washing_machine/attack_hand(mob/user, list/params) +/obj/machinery/washing_machine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) switch(state) if(1) state = 2 diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index cd2ffb6a64d4..3442c677071d 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -9,7 +9,7 @@ var/charges = 1 var/insisting = 0 -/obj/machinery/wish_granter/attack_hand(mob/user, list/params) +/obj/machinery/wish_granter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) usr.set_machine(src) if(charges <= 0) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index f15549224295..69ebaaa74199 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -482,7 +482,7 @@ get_asset_datum(/datum/asset/spritesheet/materials) ) -/obj/machinery/mecha_part_fabricator/attack_hand(mob/user, list/params) +/obj/machinery/mecha_part_fabricator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if(!allowed(user)) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 22463275fa32..c56049410a7a 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1006,7 +1006,7 @@ qdel(src) return -/obj/mecha/attack_hand(mob/user, list/params) +/obj/mecha/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user == occupant) show_radial_occupant(user) return diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 2e39b429c4bd..53b5058005ac 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -13,7 +13,7 @@ /obj/machinery/computer/mecha/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/computer/mecha/attack_hand(mob/user, list/params) +/obj/machinery/computer/mecha/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 2604d6a369ae..d5b8376a89e5 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -22,7 +22,7 @@ ..() return -/obj/item/mecha_parts/chassis/attack_hand(mob/user, list/params) +/obj/item/mecha_parts/chassis/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return //! Ripley @@ -467,7 +467,7 @@ ..() return -/obj/item/mecha_parts/fighter/chassis/attack_hand(mob/user, list/params) +/obj/item/mecha_parts/fighter/chassis/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return diff --git a/code/game/mecha/micro/mecha_parts_vr.dm b/code/game/mecha/micro/mecha_parts_vr.dm index 0966e84fa286..ee8e712cae03 100644 --- a/code/game/mecha/micro/mecha_parts_vr.dm +++ b/code/game/mecha/micro/mecha_parts_vr.dm @@ -17,7 +17,7 @@ ..() return -/obj/item/mecha_parts/micro/chassis/attack_hand(mob/user, list/params) +/obj/item/mecha_parts/micro/chassis/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return //Gopher diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index 242adbfffe59..3057aae6636a 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -104,7 +104,7 @@ health = max(0, health - tforce) healthcheck() -/obj/effect/alien/resin/attack_hand(mob/user, list/params) +/obj/effect/alien/resin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if (MUTATION_HULK in usr.mutations) to_chat(usr, "You easily destroy the [name].") @@ -454,7 +454,7 @@ Alien plants should do something if theres a lot of poison if((status == GROWING) && (BURST == 0)) Grow() -/obj/effect/alien/egg/attack_hand(mob/user, list/params) +/obj/effect/alien/egg/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/carbon/M = user if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)) diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 113ae4f08377..984379d7d427 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -171,7 +171,7 @@ else if(metal == 1 || prob(50)) qdel(src) -/obj/structure/foamedmetal/attack_hand(mob/user, list/params) +/obj/structure/foamedmetal/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if ((MUTATION_HULK in user.mutations) || (prob(75 - metal * 25))) user.visible_message("[user] smashes through the foamed metal.", "You smash through the metal foam wall.") qdel(src) diff --git a/code/game/objects/effects/debris/cleanable/humans.dm b/code/game/objects/effects/debris/cleanable/humans.dm index 9e1ecff3a1ab..1f8bbe0803b3 100644 --- a/code/game/objects/effects/debris/cleanable/humans.dm +++ b/code/game/objects/effects/debris/cleanable/humans.dm @@ -121,7 +121,7 @@ var/global/list/image/splatter_cache=list() add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) amount = 0 -/obj/effect/debris/cleanable/blood/attack_hand(mob/user, list/params) +/obj/effect/debris/cleanable/blood/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/effects/debris/cleanable/misc.dm b/code/game/objects/effects/debris/cleanable/misc.dm index a33652a0bce5..8d685f85b545 100644 --- a/code/game/objects/effects/debris/cleanable/misc.dm +++ b/code/game/objects/effects/debris/cleanable/misc.dm @@ -15,7 +15,7 @@ icon_state = "ash" anchored = 1 -/obj/effect/debris/cleanable/ash/attack_hand(mob/user, list/params) +/obj/effect/debris/cleanable/ash/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) to_chat(user, "[src] sifts through your fingers.") var/turf/simulated/floor/F = get_turf(src) if (istype(F)) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index fa5c8a1d0729..1b1d81d632b7 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -158,7 +158,7 @@ roll_and_drop(user.loc) return -/obj/structure/sign/poster/attack_hand(mob/user, list/params) +/obj/structure/sign/poster/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(ruined) return diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 60db68d1e00b..bbfed4fa61e2 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -55,12 +55,12 @@ desc = "They look like human remains. They've been here a long time." icon_state = "mummified2" -/obj/effect/decal/remains/attack_hand(mob/user, list/params) +/obj/effect/decal/remains/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) to_chat(user, "[src] sinks together into a pile of ash.") var/turf/simulated/floor/F = get_turf(src) if (istype(F)) new /obj/effect/debris/cleanable/ash(F) qdel(src) -/obj/effect/decal/remains/robot/attack_hand(mob/user, list/params) +/obj/effect/decal/remains/robot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 9e14f1ec7b3a..da0faa38b999 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -21,7 +21,7 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal) . = ..() teleport(AM) -/obj/effect/portal/attack_hand(mob/user, list/params) +/obj/effect/portal/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(istype(user) && !(istype(user,/mob/living))) return //do not send ghosts, zshadows, ai eyes, etc spawn(0) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 443e60e9b836..b663e834507d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -282,7 +282,7 @@ else . = "" -/obj/item/attack_hand(mob/user, list/params) +/obj/item/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) attempt_pickup(user) /obj/item/proc/attempt_pickup(mob/user) diff --git a/code/game/objects/items/bells.dm b/code/game/objects/items/bells.dm index 1c9f7cc27f12..293547310870 100644 --- a/code/game/objects/items/bells.dm +++ b/code/game/objects/items/bells.dm @@ -18,7 +18,7 @@ if(broken) . += "It looks damaged, the ringer is stuck firmly inside." -/obj/item/deskbell/attack_hand(mob/user, list/params) +/obj/item/deskbell/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) //This defines the radials and what call we're assiging to them. var/list/options = list() diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index b5b4af061f78..bf8b1c642e01 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -161,7 +161,7 @@ QDEL_NULL(tank) return ..() -/obj/structure/closet/body_bag/cryobag/attack_hand(mob/user, list/params) +/obj/structure/closet/body_bag/cryobag/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(used) var/confirm = tgui_alert(user, "Are you sure you want to open \the [src]? \The [src] will expire upon opening it.", "Confirm Opening", list("No", "Yes")) if(confirm == "Yes") diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 307836496233..ca04ee075ba9 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -110,7 +110,7 @@ to_chat(M, "Your chameleon-projector deactivates.") master.disrupt() -/obj/effect/dummy/chameleon/attack_hand(mob/user, list/params) +/obj/effect/dummy/chameleon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) for(var/mob/M in src) to_chat(M, "Your chameleon-projector deactivates.") master.disrupt() diff --git a/code/game/objects/items/devices/communicator/phone.dm b/code/game/objects/items/devices/communicator/phone.dm index c134667ba3ab..896d028e4329 100644 --- a/code/game/objects/items/devices/communicator/phone.dm +++ b/code/game/objects/items/devices/communicator/phone.dm @@ -76,7 +76,7 @@ listening_objects |= src var/atom/movable/screen/blackness = new() //Makes a black screen, so the candidate can't see what's going on before actually 'connecting' to the communicator. - blackness.screen_loc = ui_entire_screen + blackness.screen_loc = SCREEN_LOC_FULLSCREEN blackness.icon = 'icons/effects/effects.dmi' blackness.icon_state = "1" blackness.mouse_opacity = 2 //Can't see anything! diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index c1e9df422c0d..d766420c34f3 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -66,7 +66,7 @@ /obj/item/defib_kit/ui_action_click() toggle_paddles() -/obj/item/defib_kit/attack_hand(mob/user, list/params) +/obj/item/defib_kit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(loc == user) toggle_paddles() else diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 7465420ab86f..2a5583c94fbd 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -192,7 +192,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return ..() -/obj/item/flashlight/attack_hand(mob/user, list/params) +/obj/item/flashlight/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(cell) cell.update_appearance() diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 63868fdb3ca9..be715160e3e0 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -70,7 +70,7 @@ /obj/item/powersink/attack_ai() return -/obj/item/powersink/attack_hand(mob/user, list/params) +/obj/item/powersink/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) switch(mode) if(0) ..() diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 98224e408e53..f21a86e586ec 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -15,7 +15,7 @@ var/code = 2 -/obj/item/radio/electropack/attack_hand(mob/user, list/params) +/obj/item/radio/electropack/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(src == user.item_by_slot(SLOT_ID_BACK)) to_chat(user, "You need help taking this off!") return diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index a57119fdb8f6..788f1c0425ec 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -135,7 +135,7 @@ spawn (0) attack_self(user) -/obj/item/radio/intercom/attack_hand(mob/user, list/params) +/obj/item/radio/intercom/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) src.add_fingerprint(user) spawn (0) attack_self(user) diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index 24453693e9c5..91445e2888e9 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -69,7 +69,7 @@ var/global/list/active_radio_jammers = list() update_icon() -/obj/item/radio_jammer/attack_hand(mob/user, list/params) +/obj/item/radio_jammer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src && power_source) to_chat(user,"You eject \the [power_source] from \the [src].") user.put_in_hands(power_source) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 2c8ee98d1832..3d4d09b3e392 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -810,7 +810,7 @@ GLOBAL_DATUM_INIT(virtual_announcer_ai, /mob/living/silicon/ai/announcer, new(nu /obj/item/bluespace_radio/ui_action_click() toggle_handset() -/obj/item/bluespace_radio/attack_hand(mob/user, list/params) +/obj/item/bluespace_radio/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(loc == user) toggle_handset() else diff --git a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm index 06a2eb35e528..69c6379fafa2 100644 --- a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm +++ b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm @@ -62,7 +62,7 @@ tape.ruin() //Fires destroy the tape return ..() -/obj/item/tape_recorder/attack_hand(mob/user, list/params) +/obj/item/tape_recorder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(tape) eject() diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index b9135bac54b9..c442990651bb 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -57,7 +57,7 @@ return ..() -/obj/item/tape_recorder/attack_hand(mob/user, list/params) +/obj/item/tape_recorder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(mytape) eject() diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index f5a60eb0d67a..738560c44430 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -29,7 +29,7 @@ return ..() -/obj/item/target/attack_hand(mob/user, list/params) +/obj/item/target/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // taking pinned targets off! var/obj/structure/target_stake/stake for(var/obj/structure/target_stake/T in view(3,src)) diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm index 5f37614594e1..45ef3a8ad557 100644 --- a/code/game/objects/items/stacks/marker_beacons.dm +++ b/code/game/objects/items/stacks/marker_beacons.dm @@ -106,7 +106,7 @@ var/list/marker_beacon_colors = list( icon_state = "[initial(icon_state)][lowertext(picked_color)]-on" set_light(light_range, light_power, marker_beacon_colors[picked_color]) -/obj/structure/marker_beacon/attack_hand(mob/user, list/params) +/obj/structure/marker_beacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) to_chat(user, "You start picking [src] up...") if(do_after(user, remove_speed, target = src)) var/obj/item/stack/marker_beacon/M = new(loc) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index ddb070824b4e..d5333edad638 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -352,7 +352,7 @@ if(!amount) break -/obj/item/stack/attack_hand(mob/user, list/params) +/obj/item/stack/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) change_stack(user, 1) else diff --git a/code/game/objects/items/storage/_storage.dm b/code/game/objects/items/storage/_storage.dm index 811c90be8cb8..f90b3d9b3772 100644 --- a/code/game/objects/items/storage/_storage.dm +++ b/code/game/objects/items/storage/_storage.dm @@ -448,7 +448,7 @@ W.add_fingerprint(user) return handle_item_insertion(W, user) -/obj/item/storage/attack_hand(mob/user, list/params) +/obj/item/storage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.l_store == src && !H.get_active_held_item()) //Prevents opening if it's in a pocket. diff --git a/code/game/objects/items/storage/laundry_basket.dm b/code/game/objects/items/storage/laundry_basket.dm index 2d0c83027fc5..34eb88f15d11 100644 --- a/code/game/objects/items/storage/laundry_basket.dm +++ b/code/game/objects/items/storage/laundry_basket.dm @@ -20,7 +20,7 @@ collection_mode = 1 var/linked -/obj/item/storage/laundry_basket/attack_hand(mob/user, list/params) +/obj/item/storage/laundry_basket/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(ishuman(user)) var/mob/living/carbon/human/H = user var/obj/item/organ/external/temp = H.get_organ("r_hand") diff --git a/code/game/objects/items/storage/quickdraw.dm b/code/game/objects/items/storage/quickdraw.dm index eee338ea5665..2c21b571f4fa 100644 --- a/code/game/objects/items/storage/quickdraw.dm +++ b/code/game/objects/items/storage/quickdraw.dm @@ -14,7 +14,7 @@ //When set to 1, a click while it is equipped will instead move the first item inside it to your hand var/quickmode = 0 -/obj/item/storage/quickdraw/attack_hand(mob/user, list/params) +/obj/item/storage/quickdraw/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(src.loc == user) //If they aren't holding us, we do nothing special if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index cdf36d31445d..26347d284b6c 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -155,7 +155,7 @@ w_class = ITEMSIZE_LARGE max_storage_space = ITEMSIZE_COST_NORMAL * 4 -/obj/item/storage/secure/briefcase/attack_hand(mob/user, list/params) +/obj/item/storage/secure/briefcase/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if ((src.loc == user) && (src.locked == 1)) to_chat(user, "[src] is locked and cannot be opened!") else if ((src.loc == user) && (!src.locked)) @@ -216,5 +216,5 @@ /obj/item/pen ) -/obj/item/storage/secure/safe/attack_hand(mob/user, list/params) +/obj/item/storage/secure/safe/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return attack_self(user) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 434b617df3a2..045b1dc029dc 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -617,7 +617,7 @@ update_icon() return 0 -/obj/item/weldingtool/electric/attack_hand(mob/user, list/params) +/obj/item/weldingtool/electric/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(power_supply) power_supply.update_icon() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index c2aa648b8848..ba37a1099c89 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -447,7 +447,7 @@ playsound(user, 'sound/mecha/mechstep.ogg', 20, 1) cooldown = world.time -/obj/item/toy/prize/attack_hand(mob/user, list/params) +/obj/item/toy/prize/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(loc == user) if(cooldown < world.time - 8) to_chat(user, "You play with [src].") @@ -855,7 +855,7 @@ density = 1 var/phrase = "I don't want to exist anymore!" -/obj/structure/plushie/attack_hand(mob/user, list/params) +/obj/structure/plushie/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(user.a_intent == INTENT_HELP) user.visible_message("\The [user] hugs [src]!","You hug [src]!") diff --git a/code/game/objects/items/uav.dm b/code/game/objects/items/uav.dm index 47b10a81b77f..5880d7ae623c 100644 --- a/code/game/objects/items/uav.dm +++ b/code/game/objects/items/uav.dm @@ -64,7 +64,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/uav/attack_hand(mob/user, list/params) +/obj/item/uav/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) //Has to be on the ground to work with it properly if(!isturf(loc)) return ..() diff --git a/code/game/objects/items/weapons/barrier_tape.dm b/code/game/objects/items/weapons/barrier_tape.dm index b39f14072d37..40f9e73474d8 100644 --- a/code/game/objects/items/weapons/barrier_tape.dm +++ b/code/game/objects/items/weapons/barrier_tape.dm @@ -133,7 +133,7 @@ var/list/tape_roll_applications = list() update_icon() return ..() -/obj/item/barrier_tape_roll/attack_hand(mob/user, list/params) +/obj/item/barrier_tape_roll/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) update_icon() return ..() @@ -334,7 +334,7 @@ var/list/tape_roll_applications = list() /obj/item/barrier_tape_segment/attackby(obj/item/W as obj, mob/user as mob) breaktape(user) -/obj/item/barrier_tape_segment/attack_hand(mob/user, list/params) +/obj/item/barrier_tape_segment/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (user.a_intent == INTENT_HELP && src.allowed(user)) user.show_viewers("\The [user] lifts \the [src], allowing passage.") for(var/obj/item/barrier_tape_segment/T in gettapeline()) diff --git a/code/game/objects/items/weapons/duct_tape.dm b/code/game/objects/items/weapons/duct_tape.dm index d4e320a954ee..3d8879846752 100644 --- a/code/game/objects/items/weapons/duct_tape.dm +++ b/code/game/objects/items/weapons/duct_tape.dm @@ -202,7 +202,7 @@ qdel(I) to_chat(user, "You place \the [I] back into \the [src].") -/obj/item/duct_tape_piece/attack_hand(mob/user, list/params) +/obj/item/duct_tape_piece/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) anchored = FALSE return ..() // Pick it up now that it's unanchored. diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 7db758699695..1bbf42045cd8 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -111,7 +111,7 @@ ..() return -/obj/item/grenade/attack_hand(mob/user, list/params) +/obj/item/grenade/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) walk(src, null, null) ..() return diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 5a325eafe813..bbbdcd5fba66 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -117,7 +117,7 @@ var/last_chew = 0 if (H.wear_mask) return if (istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket)) return - var/obj/item/organ/external/O = H.organs_by_name[(H.hand ? BP_L_HAND : BP_R_HAND)] + var/obj/item/organ/external/O = H.organs_by_name[(H.hand % 2? BP_L_HAND : BP_R_HAND)] if (!O) return var/datum/gender/T = GLOB.gender_datums[H.get_visible_gender()] diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index fdf177025f0b..76c0f3f4849a 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -24,7 +24,7 @@ ..() add_implants() -/obj/machinery/implantchair/attack_hand(mob/user, list/params) +/obj/machinery/implantchair/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) var/health_text = "" if(src.occupant) diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index ef48e75c3aa9..cf82dc06c786 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -21,7 +21,7 @@ return -/obj/item/implantpad/attack_hand(mob/user, list/params) +/obj/item/implantpad/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if ((src.case && user.is_holding(src))) user.put_in_active_hand(case) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index bfa6974638d3..4810c8106726 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -94,7 +94,7 @@ else to_chat(user, "This cell is not fitted for [src].") -/obj/item/melee/baton/attack_hand(mob/user, list/params) +/obj/item/melee/baton/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(bcell && !integrated_cell) bcell.update_icon() diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index ffd13e67131c..66c96c503545 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -85,7 +85,7 @@ if(!has_buckled_mobs()) anchored = FALSE -/obj/item/beartrap/attack_hand(mob/user, list/params) +/obj/item/beartrap/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // check unbuckle first if(click_unbuckle_interaction(user)) return CLICKCHAIN_DO_NOT_PROPAGATE diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index 280aa7f5b2a9..bda4a4375ac5 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -84,7 +84,7 @@ to_chat(user,"The tank scoffs at your insolence. It only provides services to welders.") return -/obj/item/weldpack/attack_hand(mob/user, list/params) +/obj/item/weldpack/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/wearer = user if(wearer.back == src) diff --git a/code/game/objects/misc.dm b/code/game/objects/misc.dm index c021555090c3..88b96361d13b 100644 --- a/code/game/objects/misc.dm +++ b/code/game/objects/misc.dm @@ -7,7 +7,7 @@ /obj/structure/signpost/attackby(obj/item/W, mob/user) return attack_hand(user) -/obj/structure/signpost/attack_hand(mob/user, list/params) +/obj/structure/signpost/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) switch(tgui_alert(user, "Do you want to go to SS13?", "Travel", list("Yes", "No"))) if("Yes") user.forceMove(SSjob.get_latejoin_spawnpoint(faction = JOB_FACTION_STATION)) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 33bc578db287..87c451baa190 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -231,7 +231,7 @@ /obj/proc/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) return -/obj/attack_hand(mob/user, list/params) +/obj/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(Adjacent(user)) add_fingerprint(user) ..() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index f050a280f3f3..446c33c95429 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -38,7 +38,7 @@ return ..() -/obj/structure/attack_hand(mob/user, list/params) +/obj/structure/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(breakable) if(MUTATION_HULK in user.mutations) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) diff --git a/code/game/objects/structures/ashlander.dm b/code/game/objects/structures/ashlander.dm index 3d00370a7f42..7003c47b138d 100644 --- a/code/game/objects/structures/ashlander.dm +++ b/code/game/objects/structures/ashlander.dm @@ -294,7 +294,7 @@ src.updateUsrDialog() return 0 -/obj/structure/ashlander/calcinator/attack_hand(mob/user, list/params) +/obj/structure/ashlander/calcinator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) interact(user) /obj/structure/ashlander/calcinator/AltClick(mob/user) @@ -382,7 +382,7 @@ . = ..() set_light(3, 2, "#9463bb") -/obj/structure/ashlander/statue/attack_hand(mob/user, list/params) +/obj/structure/ashlander/statue/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/choice = tgui_alert(user, "Do you wish to pray to the statue?", "Interact With the Statue", list("Yes", "No")) if(choice != "Yes") return diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 3c4278b805b0..de114728f437 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -216,7 +216,7 @@ LINEN BINS hidden = I to_chat(user, "You hide [I] among the sheets.") -/obj/structure/bedsheetbin/attack_hand(mob/user, list/params) +/obj/structure/bedsheetbin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(amount >= 1) amount-- diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 7e7348d8d3cb..0998fc207e5c 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -81,7 +81,7 @@ else return ..() -/obj/structure/bonfire/attack_hand(mob/user, list/params) +/obj/structure/bonfire/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(has_buckled_mobs()) return ..() @@ -288,7 +288,7 @@ else return ..() -/obj/structure/fireplace/attack_hand(mob/user, list/params) +/obj/structure/fireplace/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(get_fuel_amount()) remove_fuel(user) diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 340445319b99..fcd2bc2c6580 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -143,7 +143,7 @@ . = ..() activate() -/obj/effect/catwalk_plated/attack_hand(mob/user, list/params) +/obj/effect/catwalk_plated/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) attack_generic() /obj/effect/catwalk_plated/attack_ghost() diff --git a/code/game/objects/structures/charge_pylon.dm b/code/game/objects/structures/charge_pylon.dm index 6a86d5b85f8e..b564745e4ea0 100644 --- a/code/game/objects/structures/charge_pylon.dm +++ b/code/game/objects/structures/charge_pylon.dm @@ -12,7 +12,7 @@ if(Adjacent(user)) attack_hand(user) -/obj/structure/adherent_pylon/attack_hand(mob/user, list/params) +/obj/structure/adherent_pylon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) charge_user(user) /obj/structure/adherent_pylon/proc/charge_user(var/mob/living/user) diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index 0b2e643c2f98..93032959f29e 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -6,7 +6,7 @@ var/obj/item/clothing/suit/coat var/list/allowed = list(/obj/item/clothing/suit/storage/toggle/labcoat, /obj/item/clothing/suit/storage/det_trench) -/obj/structure/coatrack/attack_hand(mob/user, list/params) +/obj/structure/coatrack/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.visible_message("[user] takes [coat] off \the [src].", "You take [coat] off the \the [src]") if(!user.put_in_active_hand(coat)) coat.loc = get_turf(user) diff --git a/code/game/objects/structures/crates_lockers/__closet.dm b/code/game/objects/structures/crates_lockers/__closet.dm index 941e28c00367..3cf6cf891a2e 100644 --- a/code/game/objects/structures/crates_lockers/__closet.dm +++ b/code/game/objects/structures/crates_lockers/__closet.dm @@ -419,7 +419,7 @@ if(!open()) to_chat(user, "It won't budge!") -/obj/structure/closet/attack_hand(mob/user, list/params) +/obj/structure/closet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(locked && secure) togglelock(user) diff --git a/code/game/objects/structures/crates_lockers/closets/coffin.dm b/code/game/objects/structures/crates_lockers/closets/coffin.dm index 9c45e1dc873b..4fcaabed2a3f 100644 --- a/code/game/objects/structures/crates_lockers/closets/coffin.dm +++ b/code/game/objects/structures/crates_lockers/closets/coffin.dm @@ -40,7 +40,7 @@ else icon_state = "closed" -/obj/structure/closet/grave/attack_hand(mob/user, list/params) +/obj/structure/closet/grave/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(opened) visible_message("[user] starts to climb into \the [src.name].", \ "You start to lower yourself into \the [src.name].") diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index ea81d91eda78..f05214c1acb1 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -109,7 +109,7 @@ update_icon() -/obj/structure/closet/fireaxecabinet/attack_hand(mob/user, list/params) +/obj/structure/closet/fireaxecabinet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/hasaxe = 0 if(fireaxe) hasaxe = 1 diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 0a4918d80e70..99c71a001e59 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -110,7 +110,7 @@ /obj/structure/closet/statue/relaymove() return -/obj/structure/closet/statue/attack_hand(mob/user, list/params) +/obj/structure/closet/statue/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return /obj/structure/closet/statue/verb_toggleopen() diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm index 4244755d37b4..d695b741763c 100644 --- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm @@ -27,7 +27,7 @@ /obj/structure/closet/walllocker/emerglocker/attackby(obj/item/W as obj, mob/user as mob) return -/obj/structure/closet/walllocker/emerglocker/attack_hand(mob/user, list/params) +/obj/structure/closet/walllocker/emerglocker/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc) if(!amount) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 6a565c8c40a4..a204616b734a 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -170,7 +170,7 @@ else to_chat(usr, "This mob type can't use this verb.") -/obj/structure/closet/crate/secure/attack_hand(mob/user, list/params) +/obj/structure/closet/crate/secure/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) src.add_fingerprint(user) if(locked) src.togglelock(user) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 8ecd1ddcd2d6..efd120bda089 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -61,7 +61,7 @@ */ -/obj/structure/largecrate/attack_hand(mob/user, list/params) +/obj/structure/largecrate/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) to_chat(user, "You need a crowbar to pry this open!") return diff --git a/code/game/objects/structures/crates_lockers/vehiclecage.dm b/code/game/objects/structures/crates_lockers/vehiclecage.dm index c4987c4f0600..b0afaad71886 100644 --- a/code/game/objects/structures/crates_lockers/vehiclecage.dm +++ b/code/game/objects/structures/crates_lockers/vehiclecage.dm @@ -23,7 +23,7 @@ load_vehicle(I) update_icon() -/obj/structure/vehiclecage/attack_hand(mob/user, list/params) +/obj/structure/vehiclecage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) to_chat(user, "You need a wrench to take this apart!") return diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index f5fc14112969..223299c64b76 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -20,7 +20,7 @@ else ..(P, def_zone) -/obj/structure/curtain/attack_hand(mob/user, list/params) +/obj/structure/curtain/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(get_turf(loc), "rustle", 15, 1, -5) toggle() ..() diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 86b36b8ef217..2f9d287685f4 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -63,7 +63,7 @@ ..() return -/obj/structure/displaycase/attack_hand(mob/user, list/params) +/obj/structure/displaycase/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (src.destroyed && src.occupied) new /obj/item/gun/energy/captain( src.loc ) to_chat(user, "You deactivate the hover field built into the case.") diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index c1897ea9bca8..283c1df0a12f 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -45,7 +45,7 @@ update_icon() -/obj/structure/extinguisher_cabinet/attack_hand(mob/user, list/params) +/obj/structure/extinguisher_cabinet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(isrobot(user)) return if (ishuman(user)) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 69405eb9c4f1..989dc16cf4b2 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -139,7 +139,7 @@ desc = "It looks like it has a strong padlock attached." locked = TRUE -/obj/structure/fence/door/attack_hand(mob/user, list/params) +/obj/structure/fence/door/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(can_open(user)) toggle(user) else diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index bc90ef272282..bed55c62d67b 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -92,7 +92,7 @@ toggle_close_open() -/obj/structure/fireaxecabinet/attack_hand(mob/user, list/params) +/obj/structure/fireaxecabinet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) //var/hasaxe = 0 //Fuck this. Fuck everything about this. Who wrote this. Why. //if(fireaxe) // hasaxe = 1 diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm index 355d2f9f1db6..3c59dcef31d1 100644 --- a/code/game/objects/structures/fitness.dm +++ b/code/game/objects/structures/fitness.dm @@ -10,7 +10,7 @@ density = 1 var/list/hit_message = list("hit", "punch", "kick", "robust") -/obj/structure/fitness/punchingbag/attack_hand(mob/user, list/params) +/obj/structure/fitness/punchingbag/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!istype(user)) ..() return @@ -38,7 +38,7 @@ weight = ((weight) % qualifiers.len) + 1 to_chat(user, "You set the machine's weight level to [weight].") -/obj/structure/fitness/weightlifter/attack_hand(mob/user, list/params) +/obj/structure/fitness/weightlifter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!istype(user)) return if(user.loc != src.loc) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 86b62f1cb605..a19ea09ab254 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -394,7 +394,7 @@ /obj/structure/flora/sif icon = 'icons/obj/flora/sifflora.dmi' -/obj/structure/flora/sif/attack_hand(mob/user, list/params) +/obj/structure/flora/sif/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (user.a_intent == INTENT_HARM) if(do_after(user, 5 SECONDS)) user.visible_message("\The [user] digs up \the [src.name].", "You dig up \the [src.name].") @@ -515,7 +515,7 @@ var/gift_type = /obj/item/b_gift var/list/ckeys_that_took = list() -/obj/structure/flora/pumpkin/pumpkin_patch/presents/attack_hand(mob/user, list/params) +/obj/structure/flora/pumpkin/pumpkin_patch/presents/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index 14b65b561428..9bd3cc262e7c 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -170,7 +170,7 @@ /obj/structure/flora/tree/pine/xmas/presents/choose_icon_state() return "pinepresents" -/obj/structure/flora/tree/pine/xmas/presents/attack_hand(mob/user, list/params) +/obj/structure/flora/tree/pine/xmas/presents/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm index ebfc4daa2afc..c84432dc07d6 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm @@ -43,7 +43,7 @@ /obj/structure/ghost_pod/manual var/confirm_before_open = FALSE // Recommended to be TRUE if the pod contains a surprise. -/obj/structure/ghost_pod/manual/attack_hand(mob/user, list/params) +/obj/structure/ghost_pod/manual/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!used) if(confirm_before_open) if(alert(user, "Are you sure you want to touch \the [src]?", "Confirm", "No", "Yes") == "No") diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index e30cd90d92d4..07045db2e76d 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -297,7 +297,7 @@ girder_material.place_dismantled_product(get_turf(src), 2) qdel(src) -/obj/structure/girder/attack_hand(mob/user, list/params) +/obj/structure/girder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (MUTATION_HULK in user.mutations) visible_message("[user] smashes [src] apart!") dismantle() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 3753afbba251..190a6d67c793 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -28,7 +28,7 @@ /obj/structure/grille/Bumped(atom/user) if(ismob(user)) shock(user, 70) -/obj/structure/grille/attack_hand(mob/user, list/params) +/obj/structure/grille/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.setClickCooldown(user.get_attack_speed()) playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) diff --git a/code/game/objects/structures/holoplant.dm b/code/game/objects/structures/holoplant.dm index d239087db652..83365877733f 100644 --- a/code/game/objects/structures/holoplant.dm +++ b/code/game/objects/structures/holoplant.dm @@ -21,7 +21,7 @@ . = ..() activate() -/obj/machinery/holoplant/attack_hand(mob/user, list/params) +/obj/machinery/holoplant/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!istype(user) || interference) return diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 374d6f388f8c..ecd0b301f873 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -24,7 +24,7 @@ projector = null return ..() -/obj/structure/holosign/attack_hand(mob/user, list/params) +/obj/structure/holosign/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index ce3ecc965f61..b7d947573157 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -72,7 +72,7 @@ /obj/structure/inflatable/blob_act() puncture() -/obj/structure/inflatable/attack_hand(mob/user, list/params) +/obj/structure/inflatable/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) return @@ -175,7 +175,7 @@ if(get_dist(user,src) <= 1) //not remotely though return TryToSwitchState(user) -/obj/structure/inflatable/door/attack_hand(mob/user, list/params) +/obj/structure/inflatable/door/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return TryToSwitchState(user) /obj/structure/inflatable/door/CanAllowThrough(atom/movable/mover, turf/target) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 7b04af27eaec..d210e45f1679 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -87,7 +87,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) mybag.attackby(I, user) -/obj/structure/janitorialcart/attack_hand(mob/user, list/params) +/obj/structure/janitorialcart/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) nano_ui_interact(user) return @@ -208,7 +208,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) to_chat(user, "You hook the trashbag onto the [callme].") mybag = I -/obj/structure/bed/chair/janicart/attack_hand(mob/user, list/params) +/obj/structure/bed/chair/janicart/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(mybag) user.grab_item_from_interacted_with(mybag, src) mybag = null diff --git a/code/game/objects/structures/kitchen_foodcart.dm b/code/game/objects/structures/kitchen_foodcart.dm index 968d990be4c5..97b8ac64e396 100644 --- a/code/game/objects/structures/kitchen_foodcart.dm +++ b/code/game/objects/structures/kitchen_foodcart.dm @@ -22,7 +22,7 @@ return return ..() -/obj/structure/foodcart/attack_hand(mob/user, list/params) +/obj/structure/foodcart/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(contents.len) var/obj/item/reagent_containers/food/choice = input("What would you like to grab from the cart?") as null|obj in contents if(choice) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index ecc3dffbb52f..823cfd395b26 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -50,7 +50,7 @@ meat = 5 return 1 -/obj/structure/kitchenspike/attack_hand(mob/user, list/params) +/obj/structure/kitchenspike/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..() || !occupied) return meat-- diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index a658e7da47f7..c6da2f8f1932 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -42,7 +42,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh var/list/rare_loot = list() // Rare is powerful, or somewhat unique items. var/list/very_rare_loot = list()// Very Rare really powerful, or at least unique items. -/obj/structure/loot_pile/attack_hand(mob/user, list/params) +/obj/structure/loot_pile/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) //Human mob if(isliving(user)) var/mob/living/L = user diff --git a/code/game/objects/structures/medical_stand_vr.dm b/code/game/objects/structures/medical_stand_vr.dm index 2fb5f1f0f6e0..ede5f913474f 100644 --- a/code/game/objects/structures/medical_stand_vr.dm +++ b/code/game/objects/structures/medical_stand_vr.dm @@ -164,7 +164,7 @@ update_icon() -/obj/structure/medical_stand/attack_hand(mob/user, list/params) +/obj/structure/medical_stand/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/list/available_options = list() if (tank) available_options += "Toggle valve" diff --git a/code/game/objects/structures/mineral_bath.dm b/code/game/objects/structures/mineral_bath.dm index d144f338c42a..71e5cef8500d 100644 --- a/code/game/objects/structures/mineral_bath.dm +++ b/code/game/objects/structures/mineral_bath.dm @@ -66,7 +66,7 @@ START_PROCESSING(SSobj, src) return TRUE -/obj/structure/adherent_bath/attack_hand(mob/user, list/params) +/obj/structure/adherent_bath/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) eject_occupant() /obj/structure/adherent_bath/proc/eject_occupant() diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index df8f872b1056..33fec7176ddb 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -18,7 +18,7 @@ pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28) pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0 -/obj/structure/mirror/attack_hand(mob/user, list/params) +/obj/structure/mirror/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!glass) return if(shattered) return diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index a8d1e3fddaad..5393491e03e0 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -82,7 +82,7 @@ if(Adjacent(user)) attack_hand(user) -/obj/structure/morgue/attack_hand(mob/user, list/params) +/obj/structure/morgue/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (src.connected) close() else @@ -173,7 +173,7 @@ if(Adjacent(user)) attack_hand(user) -/obj/structure/m_tray/attack_hand(mob/user, list/params) +/obj/structure/m_tray/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (src.connected) for(var/atom/movable/A as mob|obj in src.loc) if (!( A.anchored )) @@ -227,7 +227,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium) src.icon_state = "crema1" return -/obj/structure/morgue/crematorium/attack_hand(mob/user, list/params) +/obj/structure/morgue/crematorium/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (cremating) to_chat(usr, "It's locked.") return @@ -350,7 +350,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium) req_access = list(ACCESS_GENERAL_CREMATOR) id = 1 -/obj/machinery/button/crematorium/attack_hand(mob/user, list/params) +/obj/machinery/button/crematorium/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if(src.allowed(user)) diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 9376814056a7..a9efe527b4f7 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -43,7 +43,7 @@ new /obj/item/frame/noticeboard( src.loc ) qdel(src) -/obj/structure/noticeboard/attack_hand(mob/user, list/params) +/obj/structure/noticeboard/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.do_examinate(src) // Since Topic() never seems to interact with usr on more than a superficial diff --git a/code/game/objects/structures/props/beam_prism.dm b/code/game/objects/structures/props/beam_prism.dm index d73b843a960a..d23075fcc589 100644 --- a/code/game/objects/structures/props/beam_prism.dm +++ b/code/game/objects/structures/props/beam_prism.dm @@ -43,7 +43,7 @@ var/degrees_to_rotate = -1 * degrees_from_north animate(src, transform = turn(src.transform, degrees_to_rotate), time = 2) -/obj/structure/prop/prism/attack_hand(mob/user, list/params) +/obj/structure/prop/prism/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() if(rotation_lock) @@ -157,7 +157,7 @@ var/list/my_turrets = list() var/dialID = null -/obj/structure/prop/prismcontrol/attack_hand(mob/user, list/params) +/obj/structure/prop/prismcontrol/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() var/confirm = input("Do you want to try to rotate \the [src]?", "[name]") in list("Yes", "No") diff --git a/code/game/objects/structures/props/nest.dm b/code/game/objects/structures/props/nest.dm index 2d968a94671d..3c51fb6b6e3e 100644 --- a/code/game/objects/structures/props/nest.dm +++ b/code/game/objects/structures/props/nest.dm @@ -34,7 +34,7 @@ STOP_PROCESSING(SSobj, src) ..() -/obj/structure/prop/nest/attack_hand(mob/user, list/params) // Used to tell the player that this isn't useful for anything. +/obj/structure/prop/nest/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // Used to tell the player that this isn't useful for anything. ..() if(user && prob(disturbance_spawn_chance)) spawn_creature(get_turf(src)) diff --git a/code/game/objects/structures/props/prop.dm b/code/game/objects/structures/props/prop.dm index c82b4b4dcdef..29f3530e6c38 100644 --- a/code/game/objects/structures/props/prop.dm +++ b/code/game/objects/structures/props/prop.dm @@ -9,7 +9,7 @@ anchored = TRUE var/interaction_message = null -/obj/structure/prop/attack_hand(mob/user, list/params) // Used to tell the player that this isn't useful for anything. +/obj/structure/prop/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // Used to tell the player that this isn't useful for anything. if(!istype(user)) return FALSE if(!interaction_message) diff --git a/code/game/objects/structures/props/puzzledoor.dm b/code/game/objects/structures/props/puzzledoor.dm index cd5899b6481b..9004768f34e6 100644 --- a/code/game/objects/structures/props/puzzledoor.dm +++ b/code/game/objects/structures/props/puzzledoor.dm @@ -53,7 +53,7 @@ locks -= L ..() -/obj/machinery/door/blast/puzzle/attack_hand(mob/user, list/params) +/obj/machinery/door/blast/puzzle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(check_locks()) force_toggle(1, user) else diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 8b1d00b6e755..75c4d6e8587f 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -70,7 +70,7 @@ FLOOR SAFES icon_state = initial(icon_state) -/obj/structure/safe/attack_hand(mob/user, list/params) +/obj/structure/safe/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) var/dat = "
" dat += "[open ? "Close" : "Open"] [src] | - [dial * 5] +" diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index 4c645033c62f..dbf006b582aa 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -61,7 +61,7 @@ if(get_dist(user,src) <= 1) //not remotely though return TryToSwitchState(user) -/obj/structure/simple_door/attack_hand(mob/user, list/params) +/obj/structure/simple_door/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return TryToSwitchState(user) /obj/structure/simple_door/CanAllowThrough(atom/movable/mover, turf/target) diff --git a/code/game/objects/structures/snowman.dm b/code/game/objects/structures/snowman.dm index 702d870a15ad..1217016743d1 100644 --- a/code/game/objects/structures/snowman.dm +++ b/code/game/objects/structures/snowman.dm @@ -5,7 +5,7 @@ desc = "A happy little snowman smiles back at you!" anchored = 1 -/obj/structure/snowman/attack_hand(mob/user, list/params) +/obj/structure/snowman/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_HARM) to_chat(user, "In one hit, [src] easily crumples into a pile of snow. You monster.") var/turf/simulated/floor/F = get_turf(src) diff --git a/code/game/objects/structures/stasis_cage.dm b/code/game/objects/structures/stasis_cage.dm index e61d37956543..84003cf71ab6 100644 --- a/code/game/objects/structures/stasis_cage.dm +++ b/code/game/objects/structures/stasis_cage.dm @@ -14,7 +14,7 @@ if(A) contain(A) -/obj/structure/stasis_cage/attack_hand(mob/user, list/params) +/obj/structure/stasis_cage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) release() /obj/structure/stasis_cage/attack_robot(var/mob/user) diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 20c5fe87b595..abcc4fdcb7b4 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -82,7 +82,7 @@ ..() CheckHardness() -/obj/structure/statue/attack_hand(mob/user, list/params) +/obj/structure/statue/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) user.visible_message("[user] rubs some dust off from the [name]'s surface.", \ "You rub some dust off from the [name]'s surface.") diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index f7dd34397fd9..feaae2b8b720 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -97,7 +97,7 @@ create_track() driving = 0 -/obj/structure/bed/chair/wheelchair/attack_hand(mob/user, list/params) +/obj/structure/bed/chair/wheelchair/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (pulling_along) MouseDrop(usr) return ..() diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 9e8778ce764e..668260bf763c 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -44,7 +44,7 @@ return attack_hand(user) ..() -/obj/structure/dispenser/attack_hand(mob/user, list/params) +/obj/structure/dispenser/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) var/dat = "[src]

" dat += "Oxygen tanks: [oxygentanks] - [oxygentanks ? "Dispense" : "empty"]
" diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index a0038c1d1c90..73a8f4032ec8 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -29,7 +29,7 @@ else return ..() -/obj/structure/target_stake/attack_hand(mob/user, list/params) +/obj/structure/target_stake/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // taking pinned targets off! if(pinned_target) pinned_target.layer = OBJ_LAYER diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm index f224e710a443..63d443422b14 100644 --- a/code/game/objects/structures/transit_tubes.dm +++ b/code/game/objects/structures/transit_tubes.dm @@ -119,7 +119,7 @@ return -/obj/structure/transit_tube/station/attack_hand(mob/user, list/params) +/obj/structure/transit_tube/station/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!pod_moving) for(var/obj/structure/transit_tube_pod/pod in loc) if(!pod.moving && (pod.dir in directions())) diff --git a/code/game/objects/structures/trash_pile.dm b/code/game/objects/structures/trash_pile.dm index 95853120c0f4..4dac6dec6eb6 100644 --- a/code/game/objects/structures/trash_pile.dm +++ b/code/game/objects/structures/trash_pile.dm @@ -82,7 +82,7 @@ else return ..() -/obj/structure/trash_pile/attack_hand(mob/user, list/params) +/obj/structure/trash_pile/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) //Human mob if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index dfd2a0dbd631..8d894bfac3b3 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -5,7 +5,7 @@ icon_state = "cabinet_closed" density = 1 -/obj/structure/undies_wardrobe/attack_hand(mob/user, list/params) +/obj/structure/undies_wardrobe/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!human_who_can_use_underwear(user)) to_chat(user, "Sadly there's nothing in here for you to wear.") return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index cf5c8f936b31..d821fec9cb56 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -17,7 +17,7 @@ open = round(rand(0, 1)) update_icon() -/obj/structure/toilet/attack_hand(mob/user, list/params) +/obj/structure/toilet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(swirlie) usr.setClickCooldown(user.get_attack_speed()) usr.visible_message("[user] slams the toilet seat onto [swirlie.name]'s head!", "You slam the toilet seat onto [swirlie.name]'s head!", "You hear reverberating porcelain.") @@ -172,7 +172,7 @@ anchored = 1 mouse_opacity = 0 -/obj/machinery/shower/attack_hand(mob/user, list/params) +/obj/machinery/shower/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/M = user if(!istype(M)) return @@ -241,10 +241,8 @@ if(iscarbon(O)) var/mob/living/carbon/M = O - if(M.r_hand) - M.r_hand.clean_blood() - if(M.l_hand) - M.l_hand.clean_blood() + for(var/obj/item/I as anything in M.get_held_items()) + I.clean_blood() if(M.back) if(M.back.clean_blood()) M.update_inv_back(0) @@ -388,7 +386,7 @@ thing.reagents.clear_reagents() thing.update_icon() -/obj/structure/sink/attack_hand(mob/user, list/params) +/obj/structure/sink/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (ishuman(user)) var/mob/living/carbon/human/H = user var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] @@ -497,7 +495,7 @@ icon_state = "puddle" desc = "A small pool of some liquid, ostensibly water." -/obj/structure/sink/puddle/attack_hand(mob/user, list/params) +/obj/structure/sink/puddle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) icon_state = "puddle-splash" ..() icon_state = "puddle" @@ -521,7 +519,7 @@ reagents.add_reagent(dispensedreagent, 20) /* Okay, just straight up, I tried to code this like blood overlays, but I just do NOT understand the system. If someone wants to sort it, enable this too. -/obj/structure/sink/oil_well/attack_hand(mob/user, list/params) +/obj/structure/sink/oil_well/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) flick("puddle-oil-splash",src) reagents.reaction(M, 20) //Covers target in 20u of oil. to_chat(M, "You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water.") diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 80199ea014d7..b582393db11f 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -275,7 +275,7 @@ playsound(loc, 'sound/effects/Glasshit.ogg', 50, TRUE) -/obj/structure/window/attack_hand(mob/user, list/params) +/obj/structure/window/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.setClickCooldown(user.get_attack_speed()) if (MUTATION_HULK in user.mutations) // Do we really still need these? @@ -937,7 +937,7 @@ var/range = 7 -/obj/machinery/button/windowtint/attack_hand(mob/user, list/params) +/obj/machinery/button/windowtint/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (..()) return TRUE else diff --git a/code/game/objects/structures/window_spawner.dm b/code/game/objects/structures/window_spawner.dm index d99751a22bf0..4d84e6b04519 100644 --- a/code/game/objects/structures/window_spawner.dm +++ b/code/game/objects/structures/window_spawner.dm @@ -14,7 +14,7 @@ var/win_path = /obj/structure/window/basic var/activated -/obj/effect/wingrille_spawn/attack_hand(mob/user, list/params) +/obj/effect/wingrille_spawn/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) attack_generic() /obj/effect/wingrille_spawn/attack_ghost() diff --git a/code/game/turfs/simulated/flooring/flooring_traps.dm b/code/game/turfs/simulated/flooring/flooring_traps.dm index 659166ce710f..fe1e1b6b69ca 100644 --- a/code/game/turfs/simulated/flooring/flooring_traps.dm +++ b/code/game/turfs/simulated/flooring/flooring_traps.dm @@ -31,7 +31,7 @@ else if (tripped) icon_state = "[initial(icon_state)]_tripped" -/turf/simulated/floor/trap/attack_hand(mob/user, list/params) +/turf/simulated/floor/trap/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(tripped) to_chat(usr, "You reset the triggered mechanism.") tripped = 0 diff --git a/code/game/turfs/simulated/floors/snow.dm b/code/game/turfs/simulated/floors/snow.dm index 6f3227957ac3..30a6049b95c9 100644 --- a/code/game/turfs/simulated/floors/snow.dm +++ b/code/game/turfs/simulated/floors/snow.dm @@ -39,7 +39,7 @@ else ..() -/turf/simulated/floor/outdoors/snow/attack_hand(mob/user, list/params) +/turf/simulated/floor/outdoors/snow/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) visible_message("[user] starts scooping up some snow.", "You start scooping up some snow.") if(do_after(user, 1 SECOND)) user.put_in_hands_or_drop(new /obj/item/stack/material/snow) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 53bd8b60c8be..e6e0e64dbb39 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -106,7 +106,7 @@ return 0 -/turf/simulated/wall/attack_hand(mob/user, list/params) +/turf/simulated/wall/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) radiate() add_fingerprint(user) @@ -130,7 +130,7 @@ //it's hacky but it works if(ishuman(user)) var/mob/living/carbon/human/H = user - var/obj/item/organ/external/E = H.organs_by_name[M.hand ? BP_L_HAND : BP_R_HAND] + var/obj/item/organ/external/E = H.organs_by_name[M.hand % 2? BP_L_HAND : BP_R_HAND] if (!(E.is_usable())) to_chat(user, SPAN_WARNING("You can't use that hand.")) return @@ -140,7 +140,7 @@ playsound(src, get_sfx("punch"), 20) else M.visible_message(SPAN_DANGER("[M.name] punches \the [src]!"), SPAN_DANGER("You punch \the [src]!")) - M.apply_damage(3, BRUTE, M.hand ? BP_L_HAND : BP_R_HAND) + M.apply_damage(3, BRUTE, M.hand % 2? BP_L_HAND : BP_R_HAND) playsound(src, get_sfx("punch"), 20) else diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3e776a064e93..ee999e51ec96 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -248,7 +248,7 @@ /turf/proc/is_solid_structure() return TRUE -/turf/attack_hand(mob/user, list/params) +/turf/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() //QOL feature, clicking on turf can toggle doors, unless pulling something if(!user.pulling) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 347f5df0b968..b433414c09e0 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -86,7 +86,7 @@ a_right.holder_movement() -/obj/item/assembly_holder/attack_hand(mob/user, list/params)//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess +/obj/item/assembly_holder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args)//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index e344762cd627..3d8909208891 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -69,7 +69,7 @@ playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) -/obj/item/assembly/mousetrap/attack_hand(mob/user, list/params) +/obj/item/assembly/mousetrap/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return @@ -104,7 +104,7 @@ if(armed) finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \ "You accidentally trigger [src]!") - triggered(finder, finder.hand ? "l_hand" : "r_hand") + triggered(finder, finder.hand % 2? "l_hand" : "r_hand") return 1 //end the search! return 0 diff --git a/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm b/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm index 8cb2ad900c3d..e50a75b2f2e2 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm @@ -139,7 +139,7 @@ to_chat(user, SPAN_NOTICE("You cannot insert this item into \the [src]!")) return -/obj/machinery/atmospherics/component/binary/algae_farm/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/binary/algae_farm/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm index 6a9c0646d4d9..97c46bd7ca3d 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm @@ -117,7 +117,7 @@ "You hear ratchet.") deconstruct() -/obj/machinery/atmospherics/component/binary/heat_pump/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/binary/heat_pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return src.add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm index 99a478cd435a..8364561ad586 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm @@ -147,7 +147,7 @@ return data -/obj/machinery/atmospherics/component/binary/massive_gas_pump/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/binary/massive_gas_pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm index 0c352eafe031..4815e79cfa87 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm @@ -184,7 +184,7 @@ return data -/obj/machinery/atmospherics/component/binary/massive_heat_pump/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/binary/massive_heat_pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index f4f88bd898c5..9e9482482aa4 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -168,7 +168,7 @@ update_icon() return -/obj/machinery/atmospherics/component/binary/passive_gate/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/binary/passive_gate/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 930198c712f9..23958364d5a3 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -231,7 +231,7 @@ Thus, the two variables affect pump operation are set in New(): . = ..() ui_interact(user) -/obj/machinery/atmospherics/component/binary/pump/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/binary/pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index 3412cd5b5762..9d50aab66b7f 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -130,7 +130,7 @@ /obj/machinery/atmospherics/valve/attack_ai(mob/user as mob) return -/obj/machinery/atmospherics/valve/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/valve/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) src.add_fingerprint(usr) update_icon() sleep(10) @@ -234,7 +234,7 @@ /obj/machinery/atmospherics/valve/digital/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/atmospherics/valve/digital/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/valve/digital/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!powered()) return if(!src.allowed(user)) diff --git a/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm b/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm index 3d61ae0adf28..11359239d639 100644 --- a/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm +++ b/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm @@ -102,7 +102,7 @@ return TRUE return FALSE -/obj/machinery/atmospherics/component/quaternary/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/quaternary/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 049bdbbf189a..0f3d18101e1c 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -111,7 +111,7 @@ if(frequency) set_frequency(frequency) -/obj/machinery/atmospherics/component/trinary/atmos_filter/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/trinary/atmos_filter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if(!src.allowed(user)) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index c535d6d77897..8c82c1922bfe 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -95,7 +95,7 @@ data["node2_dir"] = dir_name(node_connects[2],TRUE) return data -/obj/machinery/atmospherics/component/trinary/mixer/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/trinary/mixer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm b/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm index 7ff6f13fe17a..65970d348d35 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm @@ -160,7 +160,7 @@ /obj/machinery/atmospherics/tvalve/attack_ai(mob/user as mob) return -/obj/machinery/atmospherics/tvalve/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/tvalve/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) src.add_fingerprint(usr) animation() sleep(10) @@ -284,7 +284,7 @@ /obj/machinery/atmospherics/tvalve/digital/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/atmospherics/tvalve/digital/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/tvalve/digital/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!powered()) return if(!src.allowed(user)) diff --git a/code/modules/atmospherics/machinery/components/unary/cold_sink.dm b/code/modules/atmospherics/machinery/components/unary/cold_sink.dm index 85709a230734..f09fbc1e7b6f 100644 --- a/code/modules/atmospherics/machinery/components/unary/cold_sink.dm +++ b/code/modules/atmospherics/machinery/components/unary/cold_sink.dm @@ -59,7 +59,7 @@ /obj/machinery/atmospherics/component/unary/freezer/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/atmospherics/component/unary/freezer/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/unary/freezer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/atmospherics/component/unary/freezer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/atmospherics/machinery/components/unary/heat_source.dm b/code/modules/atmospherics/machinery/components/unary/heat_source.dm index c2a16315e36e..89a76a805636 100644 --- a/code/modules/atmospherics/machinery/components/unary/heat_source.dm +++ b/code/modules/atmospherics/machinery/components/unary/heat_source.dm @@ -73,7 +73,7 @@ /obj/machinery/atmospherics/component/unary/heater/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/atmospherics/component/unary/heater/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/unary/heater/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/atmospherics/component/unary/heater/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm index 0773434506f4..502a8aa68d3c 100644 --- a/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm @@ -197,7 +197,7 @@ /obj/machinery/atmospherics/component/unary/outlet_injector/hide(var/i) update_underlays() -/obj/machinery/atmospherics/component/unary/outlet_injector/attack_hand(mob/user, list/params) +/obj/machinery/atmospherics/component/unary/outlet_injector/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/atmospherics/component/unary/outlet_injector/proc/toggle_injecting() diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index 70aa1e5bd534..d75bb18cd4a0 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -20,7 +20,7 @@ /obj/structure/artilleryplaceholder/decorative density = 0 -/obj/machinery/artillerycontrol/attack_hand(mob/user, list/params) +/obj/machinery/artillerycontrol/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) var/dat = "Bluespace Artillery Control:
" dat += "Locked on
" diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 3456f19e3944..aa0acac3189e 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -105,7 +105,7 @@ update_icon() -/obj/machinery/gateway/centerstation/attack_hand(mob/user, list/params) +/obj/machinery/gateway/centerstation/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!ready) detect() return @@ -215,7 +215,7 @@ update_icon() -/obj/machinery/gateway/centeraway/attack_hand(mob/user, list/params) +/obj/machinery/gateway/centeraway/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!ready) detect() return diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm index 28d90f249823..2cac53bbb8bd 100644 --- a/code/modules/clothing/clothing_accessories.dm +++ b/code/modules/clothing/clothing_accessories.dm @@ -160,7 +160,7 @@ ..() -/obj/item/clothing/attack_hand(mob/user, list/params) +/obj/item/clothing/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) //only forward to the attached accessory if the clothing is equipped (not in a storage) if(LAZYLEN(accessories) && src.loc == user) for(var/obj/item/clothing/accessory/A in accessories) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 2d162d159b74..6e508e8c4931 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -21,7 +21,7 @@ say_verbs = list("mumbles", "says") // Clumsy folks can't take the mask off themselves. -/obj/item/clothing/mask/muzzle/attack_hand(mob/user, list/params) +/obj/item/clothing/mask/muzzle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.item_by_slot(SLOT_ID_MASK) == src && !user.IsAdvancedToolUser()) return 0 ..() diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 212ed0ce8e11..a8665e24f73a 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -67,7 +67,7 @@ update_icon() -/obj/item/clothing/shoes/attack_hand(mob/user, list/params) +/obj/item/clothing/shoes/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(can_hold_knife == 1 && holding && src.loc == user) draw_knife() return diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index f1ecfd379588..174f69ac4a3b 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -16,7 +16,7 @@ ..() ToggleButtons() -/obj/item/clothing/suit/storage/attack_hand(mob/user, list/params) +/obj/item/clothing/suit/storage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (pockets.handle_attack_hand(user)) ..(user) diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 9e58bda55f13..6e6aa877e078 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -67,7 +67,7 @@ var/icon/rolled_down_sleeves_icon = 'icons/mob/clothing/uniform_sleeves_rolled.dmi' // todo kick to item flag for auto-unequip-without-clickdrag -/obj/item/clothing/under/attack_hand(mob/user, list/params) +/obj/item/clothing/under/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(LAZYLEN(accessories)) ..() if ((ishuman(usr) || issmall(usr)) && src.loc == user) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 552c6bed3931..8229b441cd67 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -132,7 +132,7 @@ ..() //default attack_hand behaviour -/obj/item/clothing/accessory/attack_hand(mob/user, list/params) +/obj/item/clothing/accessory/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(accessory_host) return //we aren't an object on the ground so don't call parent ..() diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 5e9c472cca67..494d74013a32 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -66,7 +66,7 @@ w_class = initial(w_class) clear_holster() -/obj/item/clothing/accessory/holster/attack_hand(mob/user, list/params) +/obj/item/clothing/accessory/holster/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (accessory_host && (slot & ACCESSORY_SLOT_UTILITY)) if(holstered) unholster(user) diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 34a26899d124..54c701d50edd 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -19,7 +19,7 @@ if (!hide_on_roll) on_rolled["down"] = icon_state -/obj/item/clothing/accessory/storage/attack_hand(mob/user, list/params) +/obj/item/clothing/accessory/storage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (accessory_host) //if we are part of a suit hold.open(user) return diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm index 23106071b3f3..7ec106ff1902 100644 --- a/code/modules/detectivework/microscope/dnascanner.dm +++ b/code/modules/detectivework/microscope/dnascanner.dm @@ -142,7 +142,7 @@ /obj/machinery/dnaforensics/attack_ai(mob/user) ui_interact(user) -/obj/machinery/dnaforensics/attack_hand(mob/user, list/params) +/obj/machinery/dnaforensics/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/dnaforensics/update_icon() diff --git a/code/modules/detectivework/microscope/microscope.dm b/code/modules/detectivework/microscope/microscope.dm index 5be88931cf1d..6feb15780270 100644 --- a/code/modules/detectivework/microscope/microscope.dm +++ b/code/modules/detectivework/microscope/microscope.dm @@ -25,7 +25,7 @@ return return ..() -/obj/machinery/microscope/attack_hand(mob/user, list/params) +/obj/machinery/microscope/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!sample) to_chat(user, "The microscope has no sample to examine.") diff --git a/code/modules/economy/machines/ATM.dm b/code/modules/economy/machines/ATM.dm index 4da4bb650bc3..c803d0a4e6ce 100644 --- a/code/modules/economy/machines/ATM.dm +++ b/code/modules/economy/machines/ATM.dm @@ -308,7 +308,7 @@ GLOBAL_LIST_INIT(atm_sounds, list('sound/items/polaroid1.ogg', 'sound/items/pola authenticated_account = null account_security_level = 0 -/obj/machinery/atm/attack_hand(mob/user, list/params) +/obj/machinery/atm/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(istype(user, /mob/living/silicon)) to_chat (user, SPAN_WARNING("A firewall prevents you from interfacing with this device!")) return diff --git a/code/modules/economy/machines/Accounts_DB.dm b/code/modules/economy/machines/Accounts_DB.dm index 08cfd60644de..dc7eab52e358 100644 --- a/code/modules/economy/machines/Accounts_DB.dm +++ b/code/modules/economy/machines/Accounts_DB.dm @@ -57,7 +57,7 @@ attack_hand(user) -/obj/machinery/account_database/attack_hand(mob/user, list/params) +/obj/machinery/account_database/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return nano_ui_interact(user) diff --git a/code/modules/economy/machines/cash_register.dm b/code/modules/economy/machines/cash_register.dm index 99bce0da9d8f..2cce9f0fefb9 100644 --- a/code/modules/economy/machines/cash_register.dm +++ b/code/modules/economy/machines/cash_register.dm @@ -39,7 +39,7 @@ . += "It's completely empty." -/obj/machinery/cash_register/attack_hand(mob/user, list/params) +/obj/machinery/cash_register/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // Don't be accessible from the wrong side of the machine if(get_dir(src, user) & global.reverse_dir[src.dir]) return diff --git a/code/modules/economy/machines/mint.dm b/code/modules/economy/machines/mint.dm index 0cfa87cbfe3f..ab1b2530f3a9 100644 --- a/code/modules/economy/machines/mint.dm +++ b/code/modules/economy/machines/mint.dm @@ -81,7 +81,7 @@ if(processed) qdel(O) -/obj/machinery/mineral/mint/attack_hand(mob/user, list/params) +/obj/machinery/mineral/mint/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/dat = "Coin Press
" @@ -474,7 +474,7 @@ /obj/machinery/coinbank/attack_ai(mob/user as mob) attack_hand(user) -/obj/machinery/coinbank/attack_hand(mob/user, list/params) +/obj/machinery/coinbank/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return wires.Interact(user) diff --git a/code/modules/economy/money_bag.dm b/code/modules/economy/money_bag.dm index 87a5f736d1f5..65309d859ad7 100644 --- a/code/modules/economy/money_bag.dm +++ b/code/modules/economy/money_bag.dm @@ -8,7 +8,7 @@ throw_force = 2.0 w_class = ITEMSIZE_LARGE -/obj/item/moneybag/attack_hand(mob/user, list/params) +/obj/item/moneybag/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/amt_supermatter = 0 var/amt_bananium = 0 var/amt_mhydrogen = 0 diff --git a/code/modules/food/drinkingglass/extras.dm b/code/modules/food/drinkingglass/extras.dm index 726728eea8a9..03076e0d39df 100644 --- a/code/modules/food/drinkingglass/extras.dm +++ b/code/modules/food/drinkingglass/extras.dm @@ -26,7 +26,7 @@ else return ..() -/obj/item/reagent_containers/food/drinks/glass2/attack_hand(mob/user, list/params) +/obj/item/reagent_containers/food/drinks/glass2/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(src != user.get_inactive_held_item()) return ..() diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 8d4ed847d36a..071602bfcf0f 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -3263,7 +3263,7 @@ icon_state = "pizzabox[boxes.len+1]" add_overlay(overlays_to_add) -/obj/item/pizzabox/attack_hand(mob/user, list/params) +/obj/item/pizzabox/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if( open && pizza ) user.put_in_hands( pizza ) @@ -4825,7 +4825,7 @@ END CITADEL CHANGE */ bitesize = 1 nutriment_amt = 10 -/obj/item/reagent_containers/food/snacks/chipplate/attack_hand(mob/user, list/params) +/obj/item/reagent_containers/food/snacks/chipplate/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() var/obj/item/reagent_containers/food/snacks/returningitem = new vendingobject(loc) returningitem.reagents.clear_reagents() diff --git a/code/modules/food/glass/bottle.dm b/code/modules/food/glass/bottle.dm index 76736ada9951..a31358e828f0 100644 --- a/code/modules/food/glass/bottle.dm +++ b/code/modules/food/glass/bottle.dm @@ -26,7 +26,7 @@ ..() update_icon() -/obj/item/reagent_containers/glass/bottle/attack_hand(mob/user, list/params) +/obj/item/reagent_containers/glass/bottle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() update_icon() diff --git a/code/modules/food/kitchen/cooking_machines/_appliance.dm b/code/modules/food/kitchen/cooking_machines/_appliance.dm index ed32f52cf728..c48635d79c0b 100644 --- a/code/modules/food/kitchen/cooking_machines/_appliance.dm +++ b/code/modules/food/kitchen/cooking_machines/_appliance.dm @@ -543,7 +543,7 @@ smoke.set_up(10, 0, get_turf(src), 300) smoke.start() -/obj/machinery/appliance/attack_hand(mob/user, list/params) +/obj/machinery/appliance/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (cooking_objs.len) if (removal_menu(user)) return diff --git a/code/modules/food/kitchen/gibber.dm b/code/modules/food/kitchen/gibber.dm index eaabee39cebb..62fdfd3e6b1e 100644 --- a/code/modules/food/kitchen/gibber.dm +++ b/code/modules/food/kitchen/gibber.dm @@ -74,7 +74,7 @@ src.go_out() return -/obj/machinery/gibber/attack_hand(mob/user, list/params) +/obj/machinery/gibber/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return if(operating) diff --git a/code/modules/food/kitchen/icecream.dm b/code/modules/food/kitchen/icecream.dm index ff4876c4d239..5c3fb0f2bd8f 100644 --- a/code/modules/food/kitchen/icecream.dm +++ b/code/modules/food/kitchen/icecream.dm @@ -61,7 +61,7 @@ reagents.add_reagent("sugar", 5) reagents.add_reagent("ice", 5) -/obj/machinery/icecream_vat/attack_hand(mob/user, list/params) +/obj/machinery/icecream_vat/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index b8d12647b6ac..8b7113801105 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -160,7 +160,7 @@ if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) attack_hand(user) -/obj/machinery/microwave/attack_hand(mob/user, list/params) +/obj/machinery/microwave/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/code/modules/food/kitchen/smartfridge.dm b/code/modules/food/kitchen/smartfridge.dm index a3f79d0cf965..a268d18cff69 100644 --- a/code/modules/food/kitchen/smartfridge.dm +++ b/code/modules/food/kitchen/smartfridge.dm @@ -199,7 +199,7 @@ /obj/machinery/smartfridge/attack_ai(mob/user as mob) attack_hand(user) -/obj/machinery/smartfridge/attack_hand(mob/user, list/params) +/obj/machinery/smartfridge/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return wires.Interact(user) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index a917b15734a2..caeadc7eb698 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -67,7 +67,7 @@ return ..() -/obj/item/deck/attack_hand(mob/user, list/params) +/obj/item/deck/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/carbon/human/H = user if(istype(src.loc, /obj/item/storage) || src == H.r_store || src == H.l_store || src.loc == user) // so objects can be removed from storage containers or pockets. also added a catch-all, so if it's in the mob you'll pick it up. ..() diff --git a/code/modules/hardsuits/pieces.dm b/code/modules/hardsuits/pieces.dm index 6615b4240656..a87fef5fb747 100644 --- a/code/modules/hardsuits/pieces.dm +++ b/code/modules/hardsuits/pieces.dm @@ -85,7 +85,7 @@ hardsuit = null return ..() -/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, list/params) +/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(tacknife) tacknife.loc = get_turf(src) if(user.put_in_active_hand(tacknife)) diff --git a/code/modules/hardsuits/rig_attackby.dm b/code/modules/hardsuits/rig_attackby.dm index fe1cdd5e370b..9a62ef653e5e 100644 --- a/code/modules/hardsuits/rig_attackby.dm +++ b/code/modules/hardsuits/rig_attackby.dm @@ -169,7 +169,7 @@ ..() -/obj/item/hardsuit/attack_hand(mob/user, list/params) +/obj/item/hardsuit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(electrified != 0) if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here. diff --git a/code/modules/hardsuits/rig_pieces.dm b/code/modules/hardsuits/rig_pieces.dm index f06fd025829c..3f0cfa3a1f57 100644 --- a/code/modules/hardsuits/rig_pieces.dm +++ b/code/modules/hardsuits/rig_pieces.dm @@ -164,7 +164,7 @@ SPECIES_ZORREN_HIGH, ) -/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, list/params) +/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(tacknife) tacknife.loc = get_turf(src) if(user.put_in_active_hand(tacknife)) diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 5c989f49b04a..90e8a682e4e4 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -75,7 +75,7 @@ /obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/HolodeckControl/attack_hand(mob/user, list/params) +/obj/machinery/computer/HolodeckControl/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return user.set_machine(src) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 6703cf8dc278..4883816a2f50 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -418,7 +418,7 @@ /obj/machinery/readybutton/attackby(obj/item/W as obj, mob/user as mob) to_chat(user, "The device is a solid button, there's nothing you can do with it!") -/obj/machinery/readybutton/attack_hand(mob/user, list/params) +/obj/machinery/readybutton/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") diff --git a/code/modules/holomap/station_holomap.dm b/code/modules/holomap/station_holomap.dm index 7d4ceb7f7b3b..ccd0b07b0c6d 100644 --- a/code/modules/holomap/station_holomap.dm +++ b/code/modules/holomap/station_holomap.dm @@ -68,7 +68,7 @@ // floor_markings.layer = FLOOR_DECAL_LAYER update_icon() -/obj/machinery/station_map/attack_hand(mob/user, list/params) +/obj/machinery/station_map/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(watching_mob && (watching_mob != user)) to_chat(user, "Someone else is currently watching the holomap.") return diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index a70359683fee..97c1687a43a5 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -122,7 +122,7 @@ qdel(src) return -/obj/machinery/beehive/attack_hand(mob/user, list/params) +/obj/machinery/beehive/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!closed) if(honeycombs < 100) to_chat(user, "There are no filled honeycombs.") diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 4d8fd05a68af..01da23db0ed7 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -63,7 +63,7 @@ /obj/machinery/botany/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/botany/attack_hand(mob/user, list/params) +/obj/machinery/botany/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/botany/proc/finished_task() diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index ec86d7b2155e..8c7e115e671b 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -206,7 +206,7 @@ /obj/item/seeds/whitebeetseed = 3 ) -/obj/machinery/seed_storage/attack_hand(mob/user, list/params) +/obj/machinery/seed_storage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 7609f0f94b70..88acceb31139 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -34,7 +34,7 @@ density = 0 color = DEAD_PLANT_COLOUR -/obj/effect/dead_plant/attack_hand(mob/user, list/params) +/obj/effect/dead_plant/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) qdel(src) /obj/effect/dead_plant/attackby() diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 2955ef771634..bbc38b04e3aa 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -34,7 +34,7 @@ if(!M.apply_damage(base_damage, BRUTE, target_zone, blocked, soaked, used_weapon=src)) return 0 -/obj/effect/plant/attack_hand(mob/user, list/params) +/obj/effect/plant/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) manual_unbuckle(user) /obj/effect/plant/attack_generic(var/mob/user) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 7685ddfa72b4..fda9e92b925f 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -581,7 +581,7 @@ else if(harvest) harvest(user) -/obj/machinery/portable_atmospherics/hydroponics/attack_hand(mob/user, list/params) +/obj/machinery/portable_atmospherics/hydroponics/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(istype(usr,/mob/living/silicon)) return diff --git a/code/modules/instruments/instruments/stationary.dm b/code/modules/instruments/instruments/stationary.dm index 390f10f10f11..618bdac17e8f 100644 --- a/code/modules/instruments/instruments/stationary.dm +++ b/code/modules/instruments/instruments/stationary.dm @@ -23,7 +23,7 @@ return (usr.default_can_use_topic(src) < UI_UPDATE) //can play with MUTATION_TELEKINESIS and while resting because fun. /// CITRP EDIT UNTIL INTERACTION REFACTOR PORT! -/obj/structure/musician/attack_hand(mob/user, list/params) +/obj/structure/musician/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm index 03d347cecd31..b406ba209f93 100644 --- a/code/modules/inventory/mob/hands.dm +++ b/code/modules/inventory/mob/hands.dm @@ -189,11 +189,8 @@ */ /mob/proc/get_held_items() . = list() - // intentionally not casted - for(var/item in held_items) - if(isnull(item)) - continue - . += item + for(var/obj/item/I in held_items) + . += I /** * get held items of type @@ -219,20 +216,20 @@ /mob/proc/get_held_item_of_index(index) RETURN_TYPE(/obj/item) return length(held_items) <= index? held_items[index] : null + /** * return index of item, or null if not found */ /mob/proc/get_held_index(obj/item/I) - for(var/i in 1 to length(held_items)) - if(held_items[i] == I) - return i + . = held_items?.Find(I) + return .? . : null /** * returns held item in active hand */ /mob/proc/get_active_held_item() RETURN_TYPE(/obj/item) - return held_items[active_hand] + return held_items?[active_hand] /** * returns held item in inactive hand (or any inactive hand if more than 1) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index e47dcedf6f18..663c4b8e016b 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -54,7 +54,7 @@ else ..() -/obj/structure/bookcase/attack_hand(mob/user, list/params) +/obj/structure/bookcase/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(contents.len) var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents if(choice) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 7a2d668fff97..1e756331d3fe 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -31,7 +31,7 @@ var/category = "Any" var/author -/obj/machinery/librarypubliccomp/attack_hand(mob/user, list/params) +/obj/machinery/librarypubliccomp/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) usr.set_machine(src) var/dat = "Library Visitor\n" // switch(screenstate) @@ -160,7 +160,7 @@ var/obj/item/book/M = new path(null) all_books[M.title] = M -/obj/machinery/librarycomp/attack_hand(mob/user, list/params) +/obj/machinery/librarycomp/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) usr.set_machine(src) var/dat = "Book Inventory Management\n" // switch(screenstate) @@ -476,7 +476,7 @@ if(!user.attempt_insert_item_for_installation(I, src)) return -/obj/machinery/libraryscanner/attack_hand(mob/user, list/params) +/obj/machinery/libraryscanner/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) usr.set_machine(src) var/dat = "Scanner Control Interface\n" // if(cache) diff --git a/code/modules/maps/away_missions/archive/wildwest.dm b/code/modules/maps/away_missions/archive/wildwest.dm index f343556da93c..2c14ea2699a7 100644 --- a/code/modules/maps/away_missions/archive/wildwest.dm +++ b/code/modules/maps/away_missions/archive/wildwest.dm @@ -20,7 +20,7 @@ var/chargesa = 1 var/insistinga = 0 -/obj/machinery/wish_granter_dark/attack_hand(mob/user, list/params) +/obj/machinery/wish_granter_dark/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) usr.set_machine(src) if(chargesa <= 0) diff --git a/code/modules/maps/misc_maps/lavaland/_lavaland.dm b/code/modules/maps/misc_maps/lavaland/_lavaland.dm index 86fe7f5efb34..5d041df011f8 100644 --- a/code/modules/maps/misc_maps/lavaland/_lavaland.dm +++ b/code/modules/maps/misc_maps/lavaland/_lavaland.dm @@ -22,7 +22,7 @@ use_power = USE_POWER_IDLE interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE_SILICON -/obj/machinery/lavaland_entryportal/attack_hand(mob/user, list/params) +/obj/machinery/lavaland_entryportal/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(istype(user, /mob/living/silicon/ai)) // lets not teleport AI cores return if(inoperable(MAINT)) @@ -58,7 +58,7 @@ anchored = 1 -/obj/effect/lavaland_exitportal/attack_hand(mob/user, list/params) +/obj/effect/lavaland_exitportal/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(istype(usr, /mob/living/silicon/ai)) return if(do_after(user, 10)) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index b9d32de0dea6..17d6ac3e8461 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -284,7 +284,7 @@ update_mass() return -/obj/item/stack/material/supermatter/attack_hand(mob/user, list/params) +/obj/item/stack/material/supermatter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() update_mass() diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index bb2cf6e9af81..0f141067520b 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -174,7 +174,7 @@ return ..() -/obj/machinery/mining/drill/attack_hand(mob/user, list/params) +/obj/machinery/mining/drill/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) check_supports() if (panel_open && cell && user.Adjacent(src)) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 153fd2e743b9..58776f0dde27 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -30,7 +30,7 @@ inserted_id.forceMove(loc) //Prevents deconstructing from deleting whatever ID was inside it. . = ..() -/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user, list/params) +/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return interact(user) diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 4b85b8ff2b19..9d52de828745 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -24,7 +24,7 @@ stack_trace("Stacking machine console at [COORD(src)] could not find its machine!") qdel(src) -/obj/machinery/mineral/stacking_unit_console/attack_hand(mob/user, list/params) +/obj/machinery/mineral/stacking_unit_console/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index cde5d2d6aefc..d39e5ce3562d 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -364,7 +364,7 @@ else ..() -/obj/item/stack/flag/attack_hand(mob/user, list/params) +/obj/item/stack/flag/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(upright) upright = 0 icon_state = base_state diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index 1c0778736ca1..d2853a154d35 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -117,7 +117,7 @@ else icon_state = "[initial(icon_state)]-off" -/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user, list/params) +/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return interact(user) diff --git a/code/modules/mining/shelter_atoms.dm b/code/modules/mining/shelter_atoms.dm index 096bb5da05a3..29cfd36fa28b 100644 --- a/code/modules/mining/shelter_atoms.dm +++ b/code/modules/mining/shelter_atoms.dm @@ -210,7 +210,7 @@ return FALSE -/obj/item/gps/computer/attack_hand(mob/user, list/params) +/obj/item/gps/computer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) attack_self(user) //Bed diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index d7de39fe7d7b..844f5d6199a1 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -140,7 +140,7 @@ else icon_state = "cleanbot[on]" -/mob/living/bot/cleanbot/attack_hand(mob/user, list/params) +/mob/living/bot/cleanbot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /mob/living/bot/cleanbot/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index c4de4f76bbc9..d1a9e13a2d15 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -69,7 +69,7 @@ return data -/mob/living/bot/farmbot/attack_hand(mob/user, list/params) +/mob/living/bot/farmbot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -408,5 +408,5 @@ created_name = t -/obj/item/farmbot_arm_assembly/attack_hand(mob/user, list/params) +/obj/item/farmbot_arm_assembly/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return //it's a converted watertank, no you cannot pick it up and put it in your backpack diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 96915b101343..3b895c1f0ceb 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -89,7 +89,7 @@ return data -/mob/living/bot/floorbot/attack_hand(mob/user, list/params) +/mob/living/bot/floorbot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /mob/living/bot/floorbot/emag_act(var/remaining_charges, var/mob/user) diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index 4c180701c351..f9a86ed439b7 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -221,7 +221,7 @@ busy = FALSE update_appearance() -/mob/living/bot/medibot/attack_hand(mob/user, list/params) +/mob/living/bot/medibot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index fa83e1f04e21..42fd5a5bafb5 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -162,7 +162,7 @@ return data -/mob/living/bot/secbot/attack_hand(mob/user, list/params) +/mob/living/bot/secbot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /mob/living/bot/secbot/ui_act(action, list/params, datum/tgui/ui) diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index 42f7735e2bbe..605d99c8066c 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -3,7 +3,7 @@ /mob/living/carbon/alien/attack_ui(slot_id) return -/mob/living/carbon/alien/attack_hand(mob/user, list/params) +/mob/living/carbon/alien/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0f4c3c6efdcb..b0dc0ec46e16 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -38,7 +38,7 @@ N.show_message("[M] bursts out of [src]!", 2) ..() -/mob/living/carbon/attack_hand(mob/user, list/params) +/mob/living/carbon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/carbon/M = user if(!istype(M)) return ..() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index f3843c72b3bf..ca4e279f6ef3 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -25,7 +25,7 @@ return u_attack return null -/mob/living/carbon/human/attack_hand(mob/user, list/params) +/mob/living/carbon/human/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/datum/gender/TT = GLOB.gender_datums[user.get_visible_gender()] var/mob/living/carbon/human/H = user if(istype(H)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 93ae41375801..26b55d816e46 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -58,9 +58,9 @@ meteor_act if(BP_L_HAND, BP_R_HAND) var/c_hand if (def_zone == BP_L_HAND) - c_hand = l_hand + c_hand = get_left_held_item() else - c_hand = r_hand + c_hand = get_right_held_item() if(c_hand && (stun_amount || agony_amount > 10)) msg_admin_attack("[key_name(src)] was disarmed by a stun effect") @@ -207,7 +207,7 @@ meteor_act return null /mob/living/carbon/human/proc/check_shields(var/damage = 0, var/atom/damage_source = null, var/mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - for(var/obj/item/shield in list(l_hand, r_hand, wear_suit)) + for(var/obj/item/shield in get_held_items() | list(wear_suit)) if(!shield) continue . = shield.handle_shield(src, damage, damage_source, attacker, def_zone, attack_text) if(.) return diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index af7c8ca7bdc7..338df8907f69 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -107,7 +107,7 @@ // One cane mitigates a broken leg+foot, or a missing foot. // Two canes are needed for a lost leg. If you are missing both legs, canes aren't gonna help you. for(var/obj/item/cane/cane as anything in get_held_items_of_type(/obj/item/cane)) - stance_damgae -= 2 + stance_damage -= 2 // standing is poor if(stance_damage >= 4 || (stance_damage >= 2 && prob(5))) @@ -118,67 +118,37 @@ afflict_paralyze(20 * 5) //can't emote while weakened, apparently. /mob/living/carbon/human/proc/handle_grasp() - if(!l_hand && !r_hand) - return - - // You should not be able to pick anything up, but stranger things have happened. - if(l_hand) - for(var/limb_tag in list(BP_L_HAND, BP_L_ARM)) - var/obj/item/organ/external/E = get_organ(limb_tag) - if(!E) - visible_message("Lacking a functioning left hand, \the [src] drops \the [l_hand].") - drop_left_held_item(INV_OP_FORCE) - break - - if(r_hand) - for(var/limb_tag in list(BP_R_HAND, BP_R_ARM)) - var/obj/item/organ/external/E = get_organ(limb_tag) - if(!E) - visible_message("Lacking a functioning right hand, \the [src] drops \the [r_hand].") - drop_right_held_item(INV_OP_FORCE) - break - - // Check again... - if(!l_hand && !r_hand) - return - - for (var/obj/item/organ/external/E in organs) - if(!E || !E.can_grasp) + for(var/i in 1 to length(held_items)) + var/obj/item/held = held_items[i] + if(isnull(held)) continue - - if((E.is_broken() || E.is_dislocated()) && !E.splinted) - switch(E.body_part_flags) - if(HAND_LEFT, ARM_LEFT) - if(!l_hand) - continue - drop_left_held_item() - if(HAND_RIGHT, ARM_RIGHT) - if(!r_hand) - continue - drop_right_held_item() - + var/obj/item/organ/external/hand = get_hand_organ(i) + var/obj/item/organ/external/arm = get_arm_organ(i) + if(isnull(arm) || isnull(hand)) + visible_message("Lacking a functioning left hand, \the [src] drops \the [held].") + drop_item_to_ground(held, INV_OP_FORCE) + continue + if(((hand.is_broken() || hand.is_dislocated()) && !hand.splinted) || ((arm.is_broken() || arm.is_dislocated()) && !arm.splinted)) var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") - emote("me", 1, "[(can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [E.name]!") - - else if(E.is_malfunctioning()) - switch(E.body_part_flags) - if(HAND_LEFT, ARM_LEFT) - if(!l_hand) - continue - drop_left_held_item() - if(HAND_RIGHT, ARM_RIGHT) - if(!r_hand) - continue - drop_right_held_item() - - emote("me", 1, "drops what they were holding, their [E.name] malfunctioning!") - + emote("me", 1, "[(can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [hand.name]!") + drop_item_to_ground(held, INV_OP_FORCE) + continue + else if(hand.is_malfunctioning()) + emote("me", 1, "drops what they were holding, their [hand.name] malfunctioning!") + drop_item_to_ground(held, INV_OP_FORCE) + var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() + spark_system.set_up(5, 0, src) + spark_system.attach(src) + spark_system.start() + QDEL_IN(spark_system, 1 SECONDS) + else if(arm.is_malfunctioning()) + emote("me", 1, "drops what they were holding, their [hand.name] malfunctioning!") + drop_item_to_ground(held, INV_OP_FORCE) var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) spark_system.start() - spawn(10) - qdel(spark_system) + QDEL_IN(spark_system, 1 SECONDS) //Handles chem traces /mob/living/carbon/human/proc/handle_trace_chems() diff --git a/code/modules/mob/living/carbon/human/traits/weaver_objs.dm b/code/modules/mob/living/carbon/human/traits/weaver_objs.dm index b08f5cd4bb27..5d7e1216a7d8 100644 --- a/code/modules/mob/living/carbon/human/traits/weaver_objs.dm +++ b/code/modules/mob/living/carbon/human/traits/weaver_objs.dm @@ -34,7 +34,7 @@ var/global/list/weavable_items = list() if(damage) qdel(src) -/obj/effect/weaversilk/attack_hand(mob/user, list/params) +/obj/effect/weaversilk/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() if(user.a_intent == INTENT_HARM) to_chat(user,"You easily tear down [name].") @@ -81,7 +81,7 @@ var/global/list/weavable_items = list() return ..() -/obj/structure/bed/double/weaversilk_nest/attack_hand(mob/user, list/params) +/obj/structure/bed/double/weaversilk_nest/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() if(user.a_intent == INTENT_HARM && !has_buckled_mobs()) to_chat(user,"You easily tear down [name].") diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 437dfe07f29a..356eff97c042 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -68,3 +68,16 @@ /mob/living/carbon/proc/get_hand_index_of_organ(obj/item/organ/external/organ) #warn impl + +/mob/living/carbon/proc/get_active_arm_organ_key() + return get_arm_organ_key(active_arm) + +/mob/living/carbon/proc/get_active_arm_organ() + RETURN_TYPE(/obj/item/organ/external) + return get_organ(get_arm_organ_key(active_hand)) + +/mob/living/carbon/proc/get_arm_organ_key(index) + #warn impl + +/mob/living/carbon/proc/get_arm_organ(index) + return get_organ(get_arm_organ_key(index)) diff --git a/code/modules/mob/living/defense.dm b/code/modules/mob/living/defense.dm index 199b93f03a34..6e7902af425b 100644 --- a/code/modules/mob/living/defense.dm +++ b/code/modules/mob/living/defense.dm @@ -92,7 +92,7 @@ return 0 // Clicking with an empty hand -/mob/living/attack_hand(mob/user, list/params) +/mob/living/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index edc82f84704c..d0cdab442a84 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -19,7 +19,7 @@ return UI_CLOSE return ..() -/obj/machinery/computer/drone_control/attack_hand(mob/user, list/params) +/obj/machinery/computer/drone_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 3e7214da92d6..482b56fbfa1f 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -184,7 +184,7 @@ var/obj/machinery/drone_fabricator/chosen_fabricator = all_fabricators[choice] chosen_fabricator.create_drone(src.client) -/obj/machinery/drone_fabricator/attack_hand(mob/user, list/params) +/obj/machinery/drone_fabricator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!is_spawn_safe) is_spawn_safe = TRUE to_chat(user, "You inform the fabricator that it is safe for drones to roam around.") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 54f77784ea28..7fef4b284e01 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -811,7 +811,7 @@ module = null updatename("Default") -/mob/living/silicon/robot/attack_hand(mob/user, list/params) +/mob/living/silicon/robot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(. & CLICKCHAIN_DO_NOT_PROPAGATE) return diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index a7350ebe3df5..aa2aa36ca68d 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -1,5 +1,5 @@ // When someone clicks us with an empty hand -/mob/living/simple_mob/attack_hand(mob/user, list/params) +/mob/living/simple_mob/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm index dd1534a2565c..b233f023b3d7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm @@ -62,7 +62,7 @@ if(udder && prob(5)) udder.add_reagent("milk", rand(5, 10)) -/mob/living/simple_mob/animal/passive/cow/attack_hand(mob/user, list/params) +/mob/living/simple_mob/animal/passive/cow/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/M = user if(!istype(M)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm index e6c26cb9f8bb..fa8d7e1ab287 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm @@ -110,7 +110,7 @@ var/obj/belly/B = loc sting(B.owner) -/mob/living/simple_mob/animal/passive/fish/koi/poisonous/attack_hand(mob/user, list/params) +/mob/living/simple_mob/animal/passive/fish/koi/poisonous/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index abd414b2e891..726da4d6fbc4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -145,7 +145,7 @@ emote_hear = list("squeeks","squeaks","squiks") emote_see = list("runs in a circle", "shakes", "scritches at something") -/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/user, list/params) +/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/hander = user if(!istype(hander)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm index 032d773e9bfb..fdde288d5245 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm @@ -72,7 +72,7 @@ return ..() // Clicked on by empty hand. -/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/user, list/params) +/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm index 82d92282b052..de30215ab8db 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Eddy/attack_hand(mob/user, list/params) +/mob/living/simple_mob/horror/Eddy/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm index f36106255b51..4d080eb131b0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm @@ -53,7 +53,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Master/attack_hand(mob/user, list/params) +/mob/living/simple_mob/horror/Master/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm index b00e8549a2c1..58744ee7422f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm @@ -54,7 +54,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Rickey/attack_hand(mob/user, list/params) +/mob/living/simple_mob/horror/Rickey/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm index cf8dd4bf90e3..5bc8c4a93c8d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm @@ -53,7 +53,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Helix/attack_hand(mob/user, list/params) +/mob/living/simple_mob/horror/Helix/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm index df8f04d85eb9..920b1c40e896 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm @@ -58,7 +58,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Steve/attack_hand(mob/user, list/params) +/mob/living/simple_mob/horror/Steve/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm index a4ef7c85111a..61d28718e2f7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm @@ -54,7 +54,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Willy/attack_hand(mob/user, list/params) +/mob/living/simple_mob/horror/Willy/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm index 3bd478fa12bc..4a85c2c626aa 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/bradley/attack_hand(mob/user, list/params) +/mob/living/simple_mob/horror/bradley/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm b/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm index 7acfd47cb6f3..cc96651ba183 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm @@ -51,7 +51,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Sally/attack_hand(mob/user, list/params) +/mob/living/simple_mob/horror/Sally/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm index 40f40b2620c5..a75875f4df23 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/BigTim/attack_hand(mob/user, list/params) +/mob/living/simple_mob/horror/BigTim/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm b/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm index 584da79a915f..7d4a7bf22837 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/TinyTim/attack_hand(mob/user, list/params) +/mob/living/simple_mob/horror/TinyTim/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm index b23185c0382d..6685dc2c155f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm +++ b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm @@ -54,7 +54,7 @@ return PROJECTILE_FORCE_MISS -/mob/living/simple_mob/illusion/attack_hand(mob/user, list/params) +/mob/living/simple_mob/illusion/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/M = user if(!istype(M)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm index 25a190fafd8b..3447826f0f4c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm @@ -155,7 +155,7 @@ adjustBruteLoss(-1) // Clicked on by empty hand. -/mob/living/simple_mob/slime/attack_hand(mob/user, list/params) +/mob/living/simple_mob/slime/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm index 7d0d0eccb655..71edd7b2ee75 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm @@ -2,7 +2,7 @@ // Clicked on by empty hand. // Handles trying to wrestle a slime off of someone being eatten. -/mob/living/simple_mob/slime/xenobio/attack_hand(mob/user, list/params) +/mob/living/simple_mob/slime/xenobio/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm index a4e39b89688e..8a9079d74560 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm @@ -40,7 +40,7 @@ has_langs = list("Coulrian") -/mob/living/simple_mob/animal/passive/honkpet/attack_hand(mob/user, list/params) +/mob/living/simple_mob/animal/passive/honkpet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_DISARM) return icon_state = pick("c_pet", "m_pet") .=..() @@ -78,7 +78,7 @@ "rad" = 0 ) -/mob/living/simple_mob/animal/passive/mimepet/attack_hand(mob/user, list/params) +/mob/living/simple_mob/animal/passive/mimepet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_DISARM) icon_state = pick("dave1", "dave2", "dave3", "dave5" , "dave6" , "dave7" , "dave8" , "dave9" , "dave10") .=..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index ad06ad560942..653859f8a09e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -219,7 +219,7 @@ //Pet 4 friendly -/mob/living/simple_mob/otie/attack_hand(mob/user, list/params) +/mob/living/simple_mob/otie/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/M = user if(!istype(M)) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm index f10f0ad7c0ed..41847013b344 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm @@ -374,7 +374,7 @@ hud_elements |= energyhud // When someone clicks us with an empty hand -/mob/living/simple_mob/shadekin/attack_hand(mob/user, list/params) +/mob/living/simple_mob/shadekin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(user.a_intent == INTENT_HELP) shy_approach = FALSE //ACCLIMATED diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index c7e503ee6c59..11ab6dffcf97 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -70,7 +70,7 @@ ui.open() ui.set_auto_update(1) -/obj/machinery/ntnet_relay/attack_hand(mob/user, list/params) +/obj/machinery/ntnet_relay/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) nano_ui_interact(user) /obj/machinery/ntnet_relay/Topic(href, href_list) diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 8e357fdc1805..28d7b007b54d 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -109,7 +109,7 @@ /obj/item/modular_computer/attack_ai(mob/user) return attack_self(user) -/obj/item/modular_computer/attack_hand(mob/user, list/params) +/obj/item/modular_computer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(anchored) return attack_self(user) return ..() diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index fc48f029d79f..ecdbdaf26763 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -214,7 +214,7 @@ return 1 return 0 -/obj/machinery/lapvend/attack_hand(mob/user, list/params) +/obj/machinery/lapvend/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) nano_ui_interact(user) /obj/machinery/lapvend/nano_ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) diff --git a/code/modules/multiz/hoist.dm b/code/modules/multiz/hoist.dm index 5ade15effd69..3587c367b675 100644 --- a/code/modules/multiz/hoist.dm +++ b/code/modules/multiz/hoist.dm @@ -28,7 +28,7 @@ var/obj/structure/hoist/source_hoist description_info = "Click and drag someone (or any object) to this to attach them to the clamp. If you are within reach, when you click and drag this to a turf adjacent to you, it will move the attached object there and release it." -/obj/effect/hoist_hook/attack_hand(mob/user, list/params) +/obj/effect/hoist_hook/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return // This has to be overridden so that it works properly. /obj/effect/hoist_hook/MouseDroppedOnLegacy(atom/movable/AM,mob/user) @@ -175,7 +175,7 @@ return -/obj/structure/hoist/attack_hand(mob/user, list/params) +/obj/structure/hoist/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (!ishuman(user)) return diff --git a/code/modules/multiz/ladder.dm b/code/modules/multiz/ladder.dm index 92efc89112e5..aded8cbc6e03 100644 --- a/code/modules/multiz/ladder.dm +++ b/code/modules/multiz/ladder.dm @@ -37,7 +37,7 @@ attack_hand(user) return -/obj/structure/ladder/attack_hand(mob/user, list/params) +/obj/structure/ladder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/multiz/structures_vr.dm b/code/modules/multiz/structures_vr.dm index 34033b47c89e..8a3bfa53a6e0 100644 --- a/code/modules/multiz/structures_vr.dm +++ b/code/modules/multiz/structures_vr.dm @@ -27,7 +27,7 @@ return //do not send ghosts, zshadows, ai eyes, etc teleport(AM) -/obj/structure/portal_subtle/attack_hand(mob/user, list/params) +/obj/structure/portal_subtle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(istype(user) && !(istype(user,/mob/living))) return //do not send ghosts, zshadows, ai eyes, etc spawn(0) diff --git a/code/modules/multiz/zmimic/mimic_movable.dm b/code/modules/multiz/zmimic/mimic_movable.dm index fd891c0ac6bd..dc39bf59a5a5 100644 --- a/code/modules/multiz/zmimic/mimic_movable.dm +++ b/code/modules/multiz/zmimic/mimic_movable.dm @@ -186,7 +186,7 @@ /atom/movable/openspace/mimic/attackby(obj/item/W, mob/user) to_chat(user, SPAN_NOTICE("\The [src] is too far away.")) -/atom/movable/openspace/mimic/attack_hand(mob/user, list/params) +/atom/movable/openspace/mimic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) to_chat(user, SPAN_NOTICE("You cannot reach \the [src] from here.")) /atom/movable/openspace/mimic/examine(...) @@ -218,7 +218,7 @@ /atom/movable/openspace/turf_proxy/attackby(obj/item/W, mob/user) loc.attackby(W, user) -/atom/movable/openspace/turf_proxy/attack_hand(mob/user, list/params) +/atom/movable/openspace/turf_proxy/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) loc.attack_hand(user) /atom/movable/openspace/turf_proxy/attack_generic(mob/user as mob) @@ -245,7 +245,7 @@ /atom/movable/openspace/turf_mimic/attackby(obj/item/W, mob/user) loc.attackby(W, user) -/atom/movable/openspace/turf_mimic/attack_hand(mob/user, list/params) +/atom/movable/openspace/turf_mimic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) to_chat(user, SPAN_NOTICE("You cannot reach \the [src] from here.")) /atom/movable/openspace/turf_mimic/attack_generic(mob/user as mob) diff --git a/code/modules/organs/external/subtypes/standard.dm b/code/modules/organs/external/subtypes/standard.dm index f54c5a9a5492..a35a454916de 100644 --- a/code/modules/organs/external/subtypes/standard.dm +++ b/code/modules/organs/external/subtypes/standard.dm @@ -225,9 +225,9 @@ if(prob(.)) owner.custom_pain("A jolt of pain surges through your [name]!",1) if(organ_tag == BP_L_HAND) //Specific level 2 'feature - owner.drop_left_held_item() + owner.drop_sequential_left_held_item() else if(organ_tag == BP_R_HAND) - owner.drop_right_held_item() + owner.drop_sequential_right_held_item() /obj/item/organ/external/hand/right organ_tag = BP_R_HAND diff --git a/code/modules/overmap/legacy/overmap_shuttle.dm b/code/modules/overmap/legacy/overmap_shuttle.dm index 8cb609c9f2d4..4bb7edb0c3ec 100644 --- a/code/modules/overmap/legacy/overmap_shuttle.dm +++ b/code/modules/overmap/legacy/overmap_shuttle.dm @@ -134,7 +134,7 @@ opened = 1 //shows open so you can diagnose 'oops, no gas' easily icon_state = "fuel_port_empty" //set the default state just to be safe -/obj/structure/fuel_port/attack_hand(mob/user, list/params) +/obj/structure/fuel_port/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!opened) to_chat(user, "The door is secured tightly. You'll need a crowbar to open it.") return diff --git a/code/modules/overmap/legacy/ships/computers/computer_shims.dm b/code/modules/overmap/legacy/ships/computers/computer_shims.dm index 616cb4f694f7..f49827c35bfb 100644 --- a/code/modules/overmap/legacy/ships/computers/computer_shims.dm +++ b/code/modules/overmap/legacy/ships/computers/computer_shims.dm @@ -80,7 +80,7 @@ // If you don't call parent in this proc, you must make all appropriate checks yourself. // If you do, you must respect the return value. -/obj/machinery/computer/ship/attack_hand(mob/user, list/params) +/obj/machinery/computer/ship/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((. = ..())) return if(!allowed(user)) diff --git a/code/modules/overmap/legacy/ships/panicbutton.dm b/code/modules/overmap/legacy/ships/panicbutton.dm index 0cd9d8c53f2e..e944841610fb 100644 --- a/code/modules/overmap/legacy/ships/panicbutton.dm +++ b/code/modules/overmap/legacy/ships/panicbutton.dm @@ -23,7 +23,7 @@ else icon_state = "[initial(icon_state)]" -/obj/structure/panic_button/attack_hand(mob/user, list/params) +/obj/structure/panic_button/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!istype(user)) return ..() diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index e6c91e650d3a..4a571cf57d4f 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -32,7 +32,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins if(!(("[department]" in alldepartments) || ("[department]" in admin_departments())) ) alldepartments |= department -/obj/machinery/photocopier/faxmachine/attack_hand(mob/user, list/params) +/obj/machinery/photocopier/faxmachine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) nano_ui_interact(user) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 18ccc45cf3bb..3710a56731c6 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -61,7 +61,7 @@ else to_chat(user, SPAN_NOTICE("You can't put [P] in [src]!")) -/obj/structure/filingcabinet/attack_hand(mob/user, list/params) +/obj/structure/filingcabinet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(contents.len <= 0) to_chat(user, SPAN_NOTICE("\The [src] is empty.")) return @@ -150,7 +150,7 @@ virgin = 0 //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. -/obj/structure/filingcabinet/security/attack_hand(mob/user, list/params) +/obj/structure/filingcabinet/security/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) populate() ..() @@ -187,7 +187,7 @@ virgin = 0 //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. -/obj/structure/filingcabinet/medical/attack_hand(mob/user, list/params) +/obj/structure/filingcabinet/medical/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) populate() ..() diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index e25a6456d59c..524827f04251 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -20,21 +20,11 @@ /obj/item/paper_bin/OnMouseDropLegacy(mob/user as mob) if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr)))))) - if(!istype(usr, /mob/living/simple_mob)) - if( !usr.get_active_held_item() ) //if active hand is empty - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - - if (H.hand) - temp = H.organs_by_name["l_hand"] - if(temp && !temp.is_usable()) - to_chat(user, "You try to move your [temp.name], but cannot!") - return - - to_chat(user, "You pick up the [src].") - user.put_in_hands(src) + if(!user.put_in_hands(src)) + return + to_chat(user, "You pick up the [src].") -/obj/item/paper_bin/attack_hand(mob/user, list/params) +/obj/item/paper_bin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(ishuman(user)) var/mob/living/carbon/human/H = user var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] @@ -112,7 +102,7 @@ icon_state = "paper_bundle" papers = /obj/item/paper/natural -/obj/item/paper_bin/bundlenatural/attack_hand(mob/user, list/params) +/obj/item/paper_bin/bundlenatural/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(amount < 1) qdel(src) return ..() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index d4933968e0db..69d8d0ffb5af 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -27,7 +27,7 @@ /obj/machinery/photocopier/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/photocopier/attack_hand(mob/user, list/params) +/obj/machinery/photocopier/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) nano_ui_interact(user) diff --git a/code/modules/power/antimatter/computer.dm b/code/modules/power/antimatter/computer.dm index aa9067bb23e1..248ce9835824 100644 --- a/code/modules/power/antimatter/computer.dm +++ b/code/modules/power/antimatter/computer.dm @@ -64,7 +64,7 @@ /obj/machinery/computer/am_engine/attack_paw(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/am_engine/attack_hand(mob/user, list/params) +/obj/machinery/computer/am_engine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return user.machine = src diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 75ad385a6001..0f95265d50d8 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -177,7 +177,7 @@ return -/obj/machinery/power/am_control_unit/attack_hand(mob/user, list/params) +/obj/machinery/power/am_control_unit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(anchored) interact(user) return diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ca571af5932b..eacbf1fe192e 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -936,7 +936,7 @@ GLOBAL_LIST_EMPTY(apcs) wires.cut_all() update_icon() -/obj/machinery/power/apc/attack_hand(mob/user, list/params) +/obj/machinery/power/apc/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // if (!can_use(user)) This already gets called in interact() and in topic() // return if(!user) diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 2c02209b324d..97e81220894a 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -72,7 +72,7 @@ busy = 0 -/obj/machinery/power/breakerbox/attack_hand(mob/user, list/params) +/obj/machinery/power/breakerbox/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(update_locked) to_chat(user, "System locked. Please try again later.") return diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 1093169419b5..83b3c7cdeef5 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -999,7 +999,7 @@ GLOBAL_LIST_INIT(possible_cable_coil_colours, list( -/obj/item/stack/cable_coil/alien/attack_hand(mob/user, list/params) +/obj/item/stack/cable_coil/alien/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (user.get_inactive_held_item() == src) var/N = input("How many units of wire do you want to take from [src]? You can only take up to [amount] at a time.", "Split stacks", 1) as num|null if(N && N <= amount) diff --git a/code/modules/power/fission/computer.dm b/code/modules/power/fission/computer.dm index 6c7b62a33a58..0d8c51857978 100644 --- a/code/modules/power/fission/computer.dm +++ b/code/modules/power/fission/computer.dm @@ -37,7 +37,7 @@ /obj/machinery/computer/fission_monitor/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/fission_monitor/attack_hand(mob/user, list/params) +/obj/machinery/computer/fission_monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/power/fission/engine.dm b/code/modules/power/fission/engine.dm index fe2fcc958ea7..937816af951a 100644 --- a/code/modules/power/fission/engine.dm +++ b/code/modules/power/fission/engine.dm @@ -106,7 +106,7 @@ var/power = (decay_heat / REACTOR_RADS_TO_MJ) * max(healthmul, 0.1) radiation_pulse(src, max(power * REACTOR_RADIATION_MULTIPLIER, 0), RAD_FALLOFF_ENGINE_FISSION) -/obj/machinery/power/fission/attack_hand(mob/user, list/params) +/obj/machinery/power/fission/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) nano_ui_interact(user) /obj/machinery/power/fission/attack_robot(mob/user) diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm index eff1ef5682ba..329961937d80 100644 --- a/code/modules/power/fusion/core/_core.dm +++ b/code/modules/power/fusion/core/_core.dm @@ -98,7 +98,7 @@ var/list/fusion_cores = list() if(owned_field) owned_field.ChangeFieldStrength(value) -/obj/machinery/power/fusion_core/attack_hand(mob/user, list/params) +/obj/machinery/power/fusion_core/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!Adjacent(user)) // As funny as it was for the AI to hug-kill the tokamak field from a distance... return visible_message("\The [user] hugs \the [src] to make it feel better!") diff --git a/code/modules/power/fusion/core/core_control.dm b/code/modules/power/fusion/core/core_control.dm index 802a509693f7..cbd09629dbe9 100644 --- a/code/modules/power/fusion/core/core_control.dm +++ b/code/modules/power/fusion/core/core_control.dm @@ -21,7 +21,7 @@ /obj/machinery/computer/fusion_core_control/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/fusion_core_control/attack_hand(mob/user, list/params) +/obj/machinery/computer/fusion_core_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_control.dm b/code/modules/power/fusion/fuel_assembly/fuel_control.dm index 668c1ee7d7cf..3d24a531430e 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_control.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_control.dm @@ -10,7 +10,7 @@ /obj/machinery/computer/fusion_fuel_control/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/fusion_fuel_control/attack_hand(mob/user, list/params) +/obj/machinery/computer/fusion_fuel_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm index 00d137e7fa6a..0983a1a53921 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm @@ -79,7 +79,7 @@ var/list/fuel_injectors = list() return ..() -/obj/machinery/fusion_fuel_injector/attack_hand(mob/user, list/params) +/obj/machinery/fusion_fuel_injector/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(injecting) to_chat(user, "Shut \the [src] off before playing with the fuel rod!") diff --git a/code/modules/power/fusion/gyrotron/gyrotron_control.dm b/code/modules/power/fusion/gyrotron/gyrotron_control.dm index 8cff0d855e12..4c2313635647 100644 --- a/code/modules/power/fusion/gyrotron/gyrotron_control.dm +++ b/code/modules/power/fusion/gyrotron/gyrotron_control.dm @@ -11,7 +11,7 @@ /obj/machinery/computer/gyrotron_control/attack_ai(var/mob/user) attack_hand(user) -/obj/machinery/computer/gyrotron_control/attack_hand(mob/user, list/params) +/obj/machinery/computer/gyrotron_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 8a17215033d2..2ba489f76e7e 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -187,7 +187,7 @@ GLOBAL_LIST_EMPTY(all_turbines) else ..() -/obj/machinery/power/generator/attack_hand(mob/user, list/params) +/obj/machinery/power/generator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER) || !anchored) return diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm index 1bf94294a438..7d71f1a5dcd1 100644 --- a/code/modules/power/generator_type2.dm +++ b/code/modules/power/generator_type2.dm @@ -94,7 +94,7 @@ interact(user) -/obj/machinery/power/generator_type2/attack_hand(mob/user, list/params) +/obj/machinery/power/generator_type2/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index c00371978dfa..6f97632e5f27 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -77,7 +77,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) /obj/machinery/gravity_generator/part/get_status() return main_part?.get_status() -/obj/machinery/gravity_generator/part/attack_hand(mob/user, list/params) +/obj/machinery/gravity_generator/part/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return main_part.attack_hand(user) /obj/machinery/gravity_generator/part/set_broken() @@ -237,7 +237,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) return return ..() -/obj/machinery/gravity_generator/main/attack_hand(mob/user, list/params) +/obj/machinery/gravity_generator/main/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((. = ..())) return ui_interact(user) diff --git a/code/modules/power/grid_checker.dm b/code/modules/power/grid_checker.dm index 4da2807a9e53..99136da69434 100644 --- a/code/modules/power/grid_checker.dm +++ b/code/modules/power/grid_checker.dm @@ -51,7 +51,7 @@ else if(istype(W, /obj/item/multitool) || W.is_wirecutter()) attack_hand(user) -/obj/machinery/power/grid_checker/attack_hand(mob/user, list/params) +/obj/machinery/power/grid_checker/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!user) return add_fingerprint(user) diff --git a/code/modules/power/lighting/lighting.dm b/code/modules/power/lighting/lighting.dm index 2487b2f2cecf..de2a3d8de5d8 100644 --- a/code/modules/power/lighting/lighting.dm +++ b/code/modules/power/lighting/lighting.dm @@ -77,7 +77,7 @@ var/global/list/light_type_cache = list() else to_chat(user, "This casing doesn't support power cells for backup power.") -/obj/machinery/light_construct/attack_hand(mob/user, list/params) +/obj/machinery/light_construct/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return . // obj/machinery/attack_hand returns 1 if user can't use the machine @@ -852,7 +852,7 @@ var/global/list/light_type_cache = list() // attack with hand - remove tube/bulb // if hands aren't protected and the light is on, burn the player -/obj/machinery/light/attack_hand(mob/user, list/params) +/obj/machinery/light/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) @@ -898,7 +898,7 @@ var/global/list/light_type_cache = list() // create a light tube/bulb item and put it in the user's hand user.put_in_active_hand(remove_bulb()) //puts it in our active hand -/obj/machinery/light/flamp/attack_hand(mob/user, list/params) +/obj/machinery/light/flamp/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(lamp_shade) if(status == LIGHT_EMPTY) to_chat(user, "There is no [get_fitting_name()] in this light.") diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 1624eb42b1a1..052cb4cf0e50 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -42,7 +42,7 @@ /obj/machinery/power/powered() return 1 //doesn't require an external power source -/obj/machinery/power/port_gen/attack_hand(mob/user, list/params) +/obj/machinery/power/port_gen/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return if(!anchored) @@ -301,7 +301,7 @@ return return ..() -/obj/machinery/power/port_gen/pacman/attack_hand(mob/user, list/params) +/obj/machinery/power/port_gen/pacman/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() if (!anchored) return @@ -611,7 +611,7 @@ log_and_message_admins("[ADMIN_LOOKUPFLW(Proj.firer)] triggered an Abductor Core explosion at [x],[y],[z] via projectile.") asplod() -/obj/machinery/power/rtg/abductor/attack_hand(mob/user, list/params) +/obj/machinery/power/rtg/abductor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!istype(user) || (. = ..())) return diff --git a/code/modules/power/sensors/sensor_monitoring.dm b/code/modules/power/sensors/sensor_monitoring.dm index fc9f49505e39..1fbe66ad3d8c 100644 --- a/code/modules/power/sensors/sensor_monitoring.dm +++ b/code/modules/power/sensors/sensor_monitoring.dm @@ -41,7 +41,7 @@ ..() // On user click opens the UI of this computer. -/obj/machinery/computer/power_monitor/attack_hand(mob/user, list/params) +/obj/machinery/computer/power_monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index c8b4588d35bc..bbc11c3f3232 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -45,7 +45,7 @@ AddComponent(/datum/component/radiation_listener) rad_insulation = active? rad_insulation_active : rad_insulation_inactive -/obj/machinery/power/rad_collector/attack_hand(mob/user, list/params) +/obj/machinery/power/rad_collector/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(anchored) if(!src.locked) toggle_power() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index c9b56b5a486b..ced2ca32ac34 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -21,7 +21,7 @@ FG2.cleanup() . = ..() -/obj/machinery/containment_field/attack_hand(mob/user, list/params) +/obj/machinery/containment_field/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(get_dist(src, user) > 1) return 0 else diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index a4f741bb77b5..6c2161db06e6 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -58,7 +58,7 @@ else icon_state = "emitter" -/obj/machinery/power/emitter/attack_hand(mob/user, list/params) +/obj/machinery/power/emitter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) src.add_fingerprint(user) activate(user) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index bfa09404df67..6413ff08d32c 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -73,7 +73,7 @@ field_generator power level display return -/obj/machinery/field_generator/attack_hand(mob/user, list/params) +/obj/machinery/field_generator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(state == 2) if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on if(src.active >= 1) diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index d87f82a0621b..17aa345dd83d 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -34,7 +34,7 @@ wires = null return ..() -/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user, list/params) +/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(construction_state >= 3) interact(user) else if(construction_state == 2) // Wires exposed diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 0effd4cddf59..e50dec3c4c08 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -46,7 +46,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) STOP_PROCESSING(SSobj, src) return ..() -/obj/singularity/attack_hand(mob/user, list/params) +/obj/singularity/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) consume(user) return 1 diff --git a/code/modules/power/smes/smes.dm b/code/modules/power/smes/smes.dm index 7bc474aab786..c91e03cbd72c 100644 --- a/code/modules/power/smes/smes.dm +++ b/code/modules/power/smes/smes.dm @@ -241,7 +241,7 @@ GLOBAL_LIST_EMPTY(smeses) add_hiddenprint(user) ui_interact(user) -/obj/machinery/power/smes/attack_hand(mob/user, list/params) +/obj/machinery/power/smes/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) ui_interact(user) diff --git a/code/modules/power/smes/smes_construction.dm b/code/modules/power/smes/smes_construction.dm index bca7d06ff04f..92668e4dfa71 100644 --- a/code/modules/power/smes/smes_construction.dm +++ b/code/modules/power/smes/smes_construction.dm @@ -111,7 +111,7 @@ // Proc: attack_hand() // Parameters: None // Description: Opens the UI as usual, and if cover is removed opens the wiring panel. -/obj/machinery/power/smes/buildable/attack_hand(mob/user, list/params) +/obj/machinery/power/smes/buildable/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() if(open_hatch) wires.Interact(usr) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 80063e97aa77..f29ee7d1b32d 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -216,7 +216,7 @@ GLOBAL_LIST_EMPTY(solars_list) var/tracker = 0 var/glass_type = null -/obj/item/solar_assembly/attack_hand(mob/user, list/params) +/obj/item/solar_assembly/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!anchored || !isturf(loc)) // You can't pick it up ..() @@ -397,7 +397,7 @@ GLOBAL_LIST_EMPTY(solars_list) add_overlay(image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir))) return -/obj/machinery/power/solar_control/attack_hand(mob/user, list/params) +/obj/machinery/power/solar_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!..()) interact(user) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 58e5b9607992..f4c826366ce4 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -400,7 +400,7 @@ /obj/machinery/power/supermatter/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/power/supermatter/attack_hand(mob/user, list/params) +/obj/machinery/power/supermatter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()] user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... [TU.his] body starts to glow and bursts into flames before flashing into ash.",\ "You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\ diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 249354f75f13..fa34e6df156b 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -59,7 +59,7 @@ return wires.Interact(user) return ..() -/obj/machinery/power/tesla_coil/attack_hand(mob/user, list/params) +/obj/machinery/power/tesla_coil/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_GRAB && user_buckle_mob(user.pulling, user)) return ..() @@ -125,7 +125,7 @@ return return ..() -/obj/machinery/power/grounding_rod/attack_hand(mob/user, list/params) +/obj/machinery/power/grounding_rod/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_GRAB && user_buckle_mob(user.pulling, user)) return ..() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index e8d7410e77e0..4873ef91757d 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -273,7 +273,7 @@ updateDialog() -/obj/machinery/power/turbine/attack_hand(mob/user, list/params) +/obj/machinery/power/turbine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((. = ..())) return src.interact(user) @@ -340,7 +340,7 @@ id = new_ident return -/obj/machinery/computer/turbine_computer/attack_hand(mob/user, list/params) +/obj/machinery/computer/turbine_computer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((. = ..())) return src.interact(user) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 593d4f6c1bd5..0b6fe122f5f0 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -249,7 +249,7 @@ unload_ammo(user) update_icon() -/obj/item/gun/ballistic/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user, allow_dump=0) else diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index d15e6c5775a9..f4d89263e10a 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -155,7 +155,7 @@ ..() load_ammo(A, user) -/obj/item/gun/energy/attack_hand(mob/user, list/params) +/obj/item/gun/energy/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user) else diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index 441eccdc715e..259680e5efce 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -77,7 +77,7 @@ else ..() -/obj/item/gun/launcher/grenade/attack_hand(mob/user, list/params) +/obj/item/gun/launcher/grenade/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload(user) else diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 04f16ba6f907..ba05789f710e 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -59,7 +59,7 @@ else to_chat(user, "There is nothing to remove in \the [src].") -/obj/item/gun/launcher/pneumatic/attack_hand(mob/user, list/params) +/obj/item/gun/launcher/pneumatic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_hopper(user) else diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index c9f16b0789a5..f92a3bea3d48 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -108,7 +108,7 @@ next = darts[1] add_fingerprint(user) -/obj/item/gun/launcher/syringe/attack_hand(mob/user, list/params) +/obj/item/gun/launcher/syringe/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(!darts.len) to_chat(user, "[src] is empty.") diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm index a97180fe86c6..26f1218b12ee 100644 --- a/code/modules/projectiles/guns/magnetic/bore.dm +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -48,7 +48,7 @@ if(mat_storage) . += image(icon, "[icon_state]_loaded") -/obj/item/gun/magnetic/matfed/attack_hand(mob/user, list/params) // It doesn't keep a loaded item inside. +/obj/item/gun/magnetic/matfed/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // It doesn't keep a loaded item inside. if(user.get_inactive_held_item() == src) var/obj/item/removing diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index ab2e8dcea4b9..c64f7f147ba4 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -149,7 +149,7 @@ return . = ..() -/obj/item/gun/magnetic/attack_hand(mob/user, list/params) +/obj/item/gun/magnetic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) var/obj/item/removing diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index b6b42b88bbcd..38cbc7ba34de 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -170,7 +170,7 @@ else ..() -/obj/item/gun/ballistic/automatic/z8/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/automatic/z8/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src && use_launcher) launcher.unload(user) else @@ -259,7 +259,7 @@ else return ..() //once closed, behave like normal -/obj/item/gun/ballistic/automatic/lmg/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/automatic/lmg/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!cover_open && user.get_inactive_held_item() == src) toggle_cover(user) //open the cover else diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index 72e0d2676d4d..62926541ea47 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -54,7 +54,7 @@ else return -/obj/item/gun/ballistic/bow/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/bow/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user, allow_dump=0) else diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 1c5276fcc9fc..3e1bd21903e8 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -74,7 +74,7 @@ icon_state = "colt-taj" /*//apart of reskins that have two sprites, touching may result in frustration and breaks -/obj/item/gun/ballistic/colt/detective/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/colt/detective/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!unique_reskin && loc == user) reskin_gun(user) return @@ -211,7 +211,7 @@ name = "compact signal pistol" magazine_type = /obj/item/ammo_magazine/m9mm/compact/flash -/obj/item/gun/ballistic/pistol/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/pistol/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(silenced) if(!user.is_holding(src)) @@ -431,7 +431,7 @@ else ..() -/obj/item/gun/ballistic/konigin/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/konigin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src && use_shotgun) shotgun.unload_ammo(user) else diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index 753fc9a21863..f7304d36cea4 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -45,7 +45,7 @@ else ..() -/obj/item/gun/ballistic/rocket/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/rocket/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload(user) else @@ -86,7 +86,7 @@ to_chat(user, "You cannot reload the [src]!") return -/obj/item/gun/ballistic/rocket/collapsible/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/rocket/collapsible/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) to_chat(user, "You cannot unload the [src]'s munition!") return diff --git a/code/modules/projectiles/magazines/magazine.dm b/code/modules/projectiles/magazines/magazine.dm index d50d31301ad1..90c6f42a507a 100644 --- a/code/modules/projectiles/magazines/magazine.dm +++ b/code/modules/projectiles/magazines/magazine.dm @@ -102,7 +102,7 @@ return // This puts one bullet from the magazine into your hand -/obj/item/ammo_magazine/attack_hand(mob/user, list/params) +/obj/item/ammo_magazine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(can_remove_ammo) // For Smart Magazines if(user.get_inactive_held_item() == src) if(stored_ammo.len) diff --git a/code/modules/projectiles/magazines/smartmag.dm b/code/modules/projectiles/magazines/smartmag.dm index 91abc9552a02..57e3e329910f 100644 --- a/code/modules/projectiles/magazines/smartmag.dm +++ b/code/modules/projectiles/magazines/smartmag.dm @@ -109,7 +109,7 @@ ..() // You can remove the power cell from the magazine by hand, but it's way slower than using a screwdriver -/obj/item/ammo_magazine/smart/attack_hand(mob/user, list/params) +/obj/item/ammo_magazine/smart/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(attached_cell) to_chat(user, "You struggle to remove \the [attached_cell] from \the [src].") diff --git a/code/modules/random_map/drop/droppod_doors.dm b/code/modules/random_map/drop/droppod_doors.dm index c4b959129eb8..b7944a5be577 100644 --- a/code/modules/random_map/drop/droppod_doors.dm +++ b/code/modules/random_map/drop/droppod_doors.dm @@ -23,7 +23,7 @@ /obj/structure/droppod_door/attack_generic(var/mob/user) attack_hand(user) -/obj/structure/droppod_door/attack_hand(mob/user, list/params) +/obj/structure/droppod_door/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(deploying) return to_chat(user, "You prime the explosive bolts. Better get clear!") sleep(30) diff --git a/code/modules/reagents/chemistry/machinery.dm b/code/modules/reagents/chemistry/machinery.dm index 665f79521436..bc3f7caef7ed 100644 --- a/code/modules/reagents/chemistry/machinery.dm +++ b/code/modules/reagents/chemistry/machinery.dm @@ -160,7 +160,7 @@ if(AM in holdingitems) holdingitems -= AM -/obj/machinery/reagentgrinder/attack_hand(mob/user, list/params) +/obj/machinery/reagentgrinder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) interact(user) /obj/machinery/reagentgrinder/interact(mob/user as mob) // The microwave Menu //I am reasonably certain that this is not a microwave diff --git a/code/modules/reagents/distilling/distilling.dm b/code/modules/reagents/distilling/distilling.dm index 043015b3c936..3f25475de57f 100644 --- a/code/modules/reagents/distilling/distilling.dm +++ b/code/modules/reagents/distilling/distilling.dm @@ -108,7 +108,7 @@ ..() -/obj/machinery/portable_atmospherics/powered/reagent_distillery/attack_hand(mob/user, list/params) +/obj/machinery/portable_atmospherics/powered/reagent_distillery/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/list/options = list() options["examine"] = radial_examine options["use"] = radial_use diff --git a/code/modules/reagents/items/hypospray.dm b/code/modules/reagents/items/hypospray.dm index 45becb70b8a4..54eef218a0c9 100644 --- a/code/modules/reagents/items/hypospray.dm +++ b/code/modules/reagents/items/hypospray.dm @@ -58,7 +58,7 @@ icon_state = "[initial(icon_state)][vial_state]" return ..() -/obj/item/hypospray/attack_hand(mob/user, list/params) +/obj/item/hypospray/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.is_holding_inactive(src)) if(isnull(loaded)) user.action_feedback(SPAN_WARNING("[src] has no vial loaded."), src) diff --git a/code/modules/reagents/machinery/chem_master.dm b/code/modules/reagents/machinery/chem_master.dm index bf6379db1b9a..020e7458c4f2 100644 --- a/code/modules/reagents/machinery/chem_master.dm +++ b/code/modules/reagents/machinery/chem_master.dm @@ -147,7 +147,7 @@ pill_bottle = null return ..() -/obj/machinery/chem_master/attack_hand(mob/user, list/params) +/obj/machinery/chem_master/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & BROKEN) return user.set_machine(src) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 3d54b62ce0d4..e96e33355b7f 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -168,7 +168,7 @@ . = ..() update_icon() -/obj/item/reagent_containers/glass/beaker/attack_hand(mob/user, list/params) +/obj/item/reagent_containers/glass/beaker/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() update_icon() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 62963e86e318..79ae2e1fb7bc 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -94,7 +94,7 @@ volume = loaded_vial.volume reagents.maximum_volume = loaded_vial.reagents.maximum_volume -/obj/item/reagent_containers/hypospray/vial/attack_hand(mob/user, list/params) +/obj/item/reagent_containers/hypospray/vial/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(loaded_vial) reagents.trans_to_holder(loaded_vial.reagents,volume) diff --git a/code/modules/reagents/reagent_containers/organic.dm b/code/modules/reagents/reagent_containers/organic.dm index b6d6bdb7d89d..bd055faca232 100644 --- a/code/modules/reagents/reagent_containers/organic.dm +++ b/code/modules/reagents/reagent_containers/organic.dm @@ -52,7 +52,7 @@ . = ..() update_icon() -/obj/item/reagent_containers/organic/attack_hand(mob/user, list/params) +/obj/item/reagent_containers/organic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() update_icon() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 4e87d47b3ae8..51fef1c30868 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -47,7 +47,7 @@ return update_icon() -/obj/item/reagent_containers/syringe/attack_hand(mob/user, list/params) +/obj/item/reagent_containers/syringe/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ..() update_icon() diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 8da3a8e5f0eb..d1469b53348a 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -150,7 +150,7 @@ return ..() // attack with hand, move pulled object onto conveyor -/obj/machinery/conveyor/attack_hand(mob/user, list/params) +/obj/machinery/conveyor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!CHECK_ALL_MOBILITY(user, MOBILITY_CAN_MOVE | MOBILITY_CAN_USE)) return if(isnull(user.pulling) || user.pulling.anchored) @@ -254,7 +254,7 @@ C.setmove() // attack with hand, switch position -/obj/machinery/conveyor_switch/attack_hand(mob/user, list/params) +/obj/machinery/conveyor_switch/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access denied.") return @@ -315,7 +315,7 @@ desc = "A conveyor control switch. It appears to only go in one direction." // attack with hand, switch position -/obj/machinery/conveyor_switch/oneway/attack_hand(mob/user, list/params) +/obj/machinery/conveyor_switch/oneway/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(position == 0) position = convdir else diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 31e1af1aae17..efa9766326d9 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -218,7 +218,7 @@ interact(user, 1) // human interact with machine -/obj/machinery/disposal/attack_hand(mob/user, list/params) +/obj/machinery/disposal/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & BROKEN) return diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index c624b7ddff68..034ab565f5c1 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -13,7 +13,7 @@ var/label_x var/tag_x -/obj/structure/bigDelivery/attack_hand(mob/user, list/params) +/obj/structure/bigDelivery/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) unwrap() /obj/structure/bigDelivery/proc/unwrap() diff --git a/code/modules/research/machinery/rdconsole.dm b/code/modules/research/machinery/rdconsole.dm index 1be1333f86ff..fcd0ce9691e1 100644 --- a/code/modules/research/machinery/rdconsole.dm +++ b/code/modules/research/machinery/rdconsole.dm @@ -165,7 +165,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "" return dat.Join() -/obj/machinery/computer/rdconsole/attack_hand(mob/user, list/params) +/obj/machinery/computer/rdconsole/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/modules/research/machinery/rdmachines.dm b/code/modules/research/machinery/rdmachines.dm index 942d368d0d0b..5c67d3449fbb 100644 --- a/code/modules/research/machinery/rdmachines.dm +++ b/code/modules/research/machinery/rdmachines.dm @@ -14,7 +14,7 @@ var/list/stored_materials = list() // Materials this machine can accept. var/list/hidden_materials = list() // Materials this machine will not display, unless it contains them. Must be in the materials list as well. -/obj/machinery/r_n_d/attack_hand(mob/user, list/params) +/obj/machinery/r_n_d/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return /obj/machinery/r_n_d/proc/getMaterialType(var/name) diff --git a/code/modules/research/machinery/server.dm b/code/modules/research/machinery/server.dm index 284723f7ce77..42c4bfe67877 100644 --- a/code/modules/research/machinery/server.dm +++ b/code/modules/research/machinery/server.dm @@ -284,7 +284,7 @@ target.files.known_tech |= from.files.known_tech return TRUE -/obj/machinery/computer/rdservercontrol/attack_hand(mob/user, list/params) +/obj/machinery/computer/rdservercontrol/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm index 7b7f1c4af768..f46217b1248d 100644 --- a/code/modules/resleeving/computers.dm +++ b/code/modules/resleeving/computers.dm @@ -135,7 +135,7 @@ /obj/machinery/computer/transhuman/resleeving/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/transhuman/resleeving/attack_hand(mob/user, list/params) +/obj/machinery/computer/transhuman/resleeving/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) add_fingerprint(user) diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm index 02c840ceb873..5715a6b7a6fe 100644 --- a/code/modules/resleeving/infomorph.dm +++ b/code/modules/resleeving/infomorph.dm @@ -340,7 +340,7 @@ var/list/infomorph_emotions = list( if(stat != 2) close_up() return -/mob/living/silicon/infomorph/attack_hand(mob/user, list/params) +/mob/living/silicon/infomorph/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) visible_message("[user.name] boops [src] on the head.") close_up() diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index a0b901ebd0be..1b78180954c3 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -341,7 +341,7 @@ return 1 -/obj/machinery/transhuman/synthprinter/attack_hand(mob/user, list/params) +/obj/machinery/transhuman/synthprinter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((busy == 0) || (machine_stat & NOPOWER)) return to_chat(user, "Current print cycle is [busy]% complete.") @@ -430,7 +430,7 @@ manip_rating += M.rating blur_amount = (48 - manip_rating * 8) -/obj/machinery/transhuman/resleever/attack_hand(mob/user, list/params) +/obj/machinery/transhuman/resleever/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) var/health_text = "" var/mind_text = "" diff --git a/code/modules/rogueminer_vr/zone_console.dm b/code/modules/rogueminer_vr/zone_console.dm index 633bdd2b0232..0b877bebe915 100644 --- a/code/modules/rogueminer_vr/zone_console.dm +++ b/code/modules/rogueminer_vr/zone_console.dm @@ -32,7 +32,7 @@ /obj/machinery/computer/roguezones/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/roguezones/attack_hand(mob/user, list/params) +/obj/machinery/computer/roguezones/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index 526f672973d5..8b4c9b27ffe7 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -68,7 +68,7 @@ if(machine_stat & NOPOWER) icon_state = "auth_off" -/obj/machinery/keycard_auth/attack_hand(mob/user, list/params) +/obj/machinery/keycard_auth/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") return diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 7266fb0926cb..ea9b041e18d2 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -250,7 +250,7 @@ malfunction = 1 checkhp() -/obj/machinery/shieldgen/attack_hand(mob/user, list/params) +/obj/machinery/shieldgen/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(locked) to_chat(user, "The machine is locked, you are unable to use it.") return diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 27261d7908f6..e1cdc158efac 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -64,7 +64,7 @@ /obj/effect/energy_field/take_damage(var/damage) adjust_strength(-damage / 20) -/obj/effect/energy_field/attack_hand(mob/user, list/params) +/obj/effect/energy_field/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) impact_effect(3) // Harmless, but still produces the 'impact' effect. ..() diff --git a/code/modules/shieldgen/energy_shield.dm b/code/modules/shieldgen/energy_shield.dm index 4d6727316003..b9dc2b2c0b90 100644 --- a/code/modules/shieldgen/energy_shield.dm +++ b/code/modules/shieldgen/energy_shield.dm @@ -162,7 +162,7 @@ animate(src, alpha = initial(alpha), time = 1 SECOND) // Just for fun -/obj/effect/shield/attack_hand(mob/user, list/params) +/obj/effect/shield/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) flash_adjacent_segments(3) /obj/effect/shield/take_damage(var/damage, var/damtype, var/hitby) diff --git a/code/modules/shieldgen/handheld_defuser.dm b/code/modules/shieldgen/handheld_defuser.dm index edf509c4bda7..a5f66ccb3e06 100644 --- a/code/modules/shieldgen/handheld_defuser.dm +++ b/code/modules/shieldgen/handheld_defuser.dm @@ -61,7 +61,7 @@ to_chat(user, "The charge meter reads [cell ? cell.percent() : 0]%") to_chat(user, "It is [enabled ? "enabled" : "disabled"].") -/obj/item/shield_diffuser/attack_hand(mob/user, list/params) +/obj/item/shield_diffuser/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(cell) cell.update_icon() diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index 59a521390435..555ff2039332 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -25,7 +25,7 @@ var/max_stored_power = 50000 //50 kW use_power = USE_POWER_OFF //Draws directly from power net. Does not use APC power. -/obj/machinery/shieldwallgen/attack_hand(mob/user, list/params) +/obj/machinery/shieldwallgen/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(state != 1) to_chat(user, "The shield generator needs to be firmly secured to the floor first.") return 1 @@ -257,7 +257,7 @@ update_nearby_tiles() ..() -/obj/machinery/shieldwall/attack_hand(mob/user, list/params) +/obj/machinery/shieldwall/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index 4136e694e422..4e469b90c69b 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -67,7 +67,7 @@ else ..() -/obj/machinery/shield_capacitor/attack_hand(mob/user, list/params) +/obj/machinery/shield_capacitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN)) return interact(user) diff --git a/code/modules/shieldgen/shield_diffuser.dm b/code/modules/shieldgen/shield_diffuser.dm index a52ca181682a..bea4300310cf 100644 --- a/code/modules/shieldgen/shield_diffuser.dm +++ b/code/modules/shieldgen/shield_diffuser.dm @@ -55,7 +55,7 @@ else icon_state = "fdiffuser_on" -/obj/machinery/shield_diffuser/attack_hand(mob/user, list/params) +/obj/machinery/shield_diffuser/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((. = ..())) return if(alarm) diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index e8990524486a..478212344081 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -94,7 +94,7 @@ /obj/machinery/shield_gen/attack_ai(user as mob) return src.attack_hand(user) -/obj/machinery/shield_gen/attack_hand(mob/user, list/params) +/obj/machinery/shield_gen/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN)) return interact(user) diff --git a/code/modules/shieldgen/shield_generator.dm b/code/modules/shieldgen/shield_generator.dm index 1c991f989418..d5f226c6a506 100644 --- a/code/modules/shieldgen/shield_generator.dm +++ b/code/modules/shieldgen/shield_generator.dm @@ -431,7 +431,7 @@ return data -/obj/machinery/power/shield_generator/attack_hand(mob/user, list/params) +/obj/machinery/power/shield_generator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((. = ..())) return if(panel_open && Adjacent(user)) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 93007cb676fd..b6197b4982b6 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -11,7 +11,7 @@ var/skip_act = FALSE var/tgui_subtemplate = "ShuttleControlConsoleDefault" -/obj/machinery/computer/shuttle_control/attack_hand(mob/user, list/params) +/obj/machinery/computer/shuttle_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..(user)) return if(!allowed(user)) diff --git a/code/modules/species/protean/protean_blob.dm b/code/modules/species/protean/protean_blob.dm index 37d75f3d56be..f8ab8cf2c479 100644 --- a/code/modules/species/protean/protean_blob.dm +++ b/code/modules/species/protean/protean_blob.dm @@ -258,7 +258,7 @@ else return ..() -/mob/living/simple_mob/protean_blob/attack_hand(mob/user, list/params) +/mob/living/simple_mob/protean_blob/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm b/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm index ae8c43a5253d..c186cde43e3a 100644 --- a/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm +++ b/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm @@ -218,7 +218,7 @@ health = max(0, health - tforce) healthcheck() -/obj/effect/alien/hybrid_resin/attack_hand(mob/user, list/params) +/obj/effect/alien/hybrid_resin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if (MUTATION_HULK in usr.mutations) to_chat(usr, "You easily destroy the [name].") diff --git a/code/modules/species/xenomorphs/alien_facehugger.dm b/code/modules/species/xenomorphs/alien_facehugger.dm index 48ad67058d24..722216a6e837 100644 --- a/code/modules/species/xenomorphs/alien_facehugger.dm +++ b/code/modules/species/xenomorphs/alien_facehugger.dm @@ -30,7 +30,7 @@ var/const/MAX_ACTIVE_TIME = 400 var/strength = 5 var/attached = 0 -/obj/item/clothing/mask/facehugger/attack_hand(mob/user, list/params) +/obj/item/clothing/mask/facehugger/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((stat == CONSCIOUS && !sterile)) if(Attach(user)) return @@ -312,7 +312,7 @@ var/const/MAX_ACTIVE_TIME = 400 var/strength = 5 var/attached = 0 -/mob/living/simple_mob/animal/space/alien/facehugger/attack_hand(mob/user, list/params) +/mob/living/simple_mob/animal/space/alien/facehugger/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((stat == CONSCIOUS && !sterile)) if(Attach(user)) diff --git a/code/modules/stockmarket/computer.dm b/code/modules/stockmarket/computer.dm index 6d16aa4ee95a..29457b945c09 100644 --- a/code/modules/stockmarket/computer.dm +++ b/code/modules/stockmarket/computer.dm @@ -13,7 +13,7 @@ . = ..() logged_in = "Cargo Department" -/obj/machinery/computer/stockexchange/attack_hand(mob/user, list/params) +/obj/machinery/computer/stockexchange/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..(user)) return diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 06e121332be8..282963c09389 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -182,7 +182,7 @@ var/list/table_icon_cache = list() return ..() -/obj/structure/table/attack_hand(mob/user, list/params) +/obj/structure/table/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/X = user if(istype(X.species, /datum/species/xenos)) diff --git a/code/modules/telesci/hyper_pad.dm b/code/modules/telesci/hyper_pad.dm index 8777f64c7dc3..8b796b144a7f 100644 --- a/code/modules/telesci/hyper_pad.dm +++ b/code/modules/telesci/hyper_pad.dm @@ -54,7 +54,7 @@ if(primary) primary.attack_ghost(ghost) -/obj/machinery/hyperpad/centre/attack_hand(mob/user, list/params) +/obj/machinery/hyperpad/centre/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -75,7 +75,7 @@ src.add_fingerprint(user) startteleport(user) -/obj/machinery/hyperpad/attack_hand(mob/user, list/params) +/obj/machinery/hyperpad/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(primary) primary.attack_hand(user) diff --git a/code/modules/telesci/quantum_pad.dm b/code/modules/telesci/quantum_pad.dm index 3aabd75950bc..728072d88d36 100644 --- a/code/modules/telesci/quantum_pad.dm +++ b/code/modules/telesci/quantum_pad.dm @@ -78,7 +78,7 @@ else icon_state = initial(icon_state) -/obj/machinery/power/quantumpad/attack_hand(mob/user, list/params) +/obj/machinery/power/quantumpad/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index e8b779185b95..24ad04abc370 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -77,7 +77,7 @@ /obj/machinery/computer/telescience/attack_ai(mob/user) src.attack_hand(user) -/obj/machinery/computer/telescience/attack_hand(mob/user, list/params) +/obj/machinery/computer/telescience/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return nano_ui_interact(user) diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm index 782afd39a580..fb3c1d6ce85d 100644 --- a/code/modules/turbolift/turbolift_console.dm +++ b/code/modules/turbolift/turbolift_console.dm @@ -39,7 +39,7 @@ /obj/structure/lift/attack_generic(var/mob/user) return attack_hand(user) -/obj/structure/lift/attack_hand(mob/user, list/params) +/obj/structure/lift/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) return interact(user) /obj/structure/lift/interact(var/mob/user) diff --git a/code/modules/vehicles_legacy/bike.dm b/code/modules/vehicles_legacy/bike.dm index 121c533d38f4..4ed18d7ad076 100644 --- a/code/modules/vehicles_legacy/bike.dm +++ b/code/modules/vehicles_legacy/bike.dm @@ -120,7 +120,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/vehicle_old/bike/attack_hand(mob/user, list/params) +/obj/vehicle_old/bike/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user == load) unload(load, user) to_chat(user, "You unbuckle yourself from \the [src].") diff --git a/code/modules/vehicles_legacy/skateboard.dm b/code/modules/vehicles_legacy/skateboard.dm index d454378fb835..710652be8cc4 100644 --- a/code/modules/vehicles_legacy/skateboard.dm +++ b/code/modules/vehicles_legacy/skateboard.dm @@ -47,7 +47,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/vehicle_old/skateboard/attack_hand(mob/user, list/params) +/obj/vehicle_old/skateboard/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user == load) unbuckle_mob(load, user) to_chat(user, "You unbuckle yourself from \the [src].") diff --git a/code/modules/vehicles_legacy/train.dm b/code/modules/vehicles_legacy/train.dm index 1cd8e8bab08f..1299fa77430a 100644 --- a/code/modules/vehicles_legacy/train.dm +++ b/code/modules/vehicles_legacy/train.dm @@ -110,7 +110,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/vehicle_old/train/attack_hand(mob/user, list/params) +/obj/vehicle_old/train/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.stat || user.restrained() || !Adjacent(user)) return 0 diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm index 4263e11d7450..d0a8ee24707d 100644 --- a/code/modules/virus2/curer.dm +++ b/code/modules/virus2/curer.dm @@ -36,7 +36,7 @@ /obj/machinery/computer/curer/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/curer/attack_hand(mob/user, list/params) +/obj/machinery/computer/curer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return user.machine = src diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm index 4541157455be..5a34669d1e35 100644 --- a/code/modules/virus2/diseasesplicer.dm +++ b/code/modules/virus2/diseasesplicer.dm @@ -38,7 +38,7 @@ /obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/diseasesplicer/attack_hand(mob/user, list/params) +/obj/machinery/computer/diseasesplicer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index df4e6ab94357..af366ed0192b 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -45,7 +45,7 @@ src.attack_hand(user) -/obj/machinery/disease2/incubator/attack_hand(mob/user, list/params) +/obj/machinery/disease2/incubator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return nano_ui_interact(user) diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm index c4b98f30f337..3e49f61cdb9b 100644 --- a/code/modules/virus2/isolator.dm +++ b/code/modules/virus2/isolator.dm @@ -41,7 +41,7 @@ src.attack_hand(user) -/obj/machinery/disease2/isolator/attack_hand(mob/user, list/params) +/obj/machinery/disease2/isolator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return ui_interact(user) diff --git a/code/modules/vore/fluffstuff/custom_guns.dm b/code/modules/vore/fluffstuff/custom_guns.dm index 65ac1e155446..2adc4c4569a7 100644 --- a/code/modules/vore/fluffstuff/custom_guns.dm +++ b/code/modules/vore/fluffstuff/custom_guns.dm @@ -150,7 +150,7 @@ chambered = AC update_icon() -/obj/item/gun/ballistic/revolver/mateba/fluff/tasald_corlethian/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/revolver/mateba/fluff/tasald_corlethian/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user, allow_dump = 1) else diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index b1ee62e2a169..d005d79482dc 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -843,7 +843,7 @@ ..() -/obj/item/perfect_tele/attack_hand(mob/user, list/params) +/obj/item/perfect_tele/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src && power_source) to_chat(user,"You eject \the [power_source] from \the [src].") user.put_in_hands(power_source) @@ -1105,7 +1105,7 @@ tele_hand = null return ..() -/obj/item/perfect_tele_beacon/attack_hand(mob/user, list/params) +/obj/item/perfect_tele_beacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if((user.ckey != creator) && !(user.ckey in warned_users)) warned_users |= user.ckey var/choice = alert(user,"This device is a translocator beacon. Having it on your person may mean that anyone \ diff --git a/code/modules/vore/weight/fitness_machines_vr.dm b/code/modules/vore/weight/fitness_machines_vr.dm index 1af486035e79..98c9975dd4e5 100644 --- a/code/modules/vore/weight/fitness_machines_vr.dm +++ b/code/modules/vore/weight/fitness_machines_vr.dm @@ -11,7 +11,7 @@ var/cooldown = 10 var/weightloss_power = 1 -/obj/machinery/fitness/attack_hand(mob/user, list/params) +/obj/machinery/fitness/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -68,7 +68,7 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) return -/obj/machinery/fitness/heavy/attack_hand(mob/user, list/params) +/obj/machinery/fitness/heavy/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(!anchored) to_chat(user, "For safety reasons, you are required to have this equipment wrenched down before using it!") return @@ -98,7 +98,7 @@ idle_power_usage = 0 active_power_usage = 0 -/obj/machinery/scale/attack_hand(mob/user, list/params) +/obj/machinery/scale/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/anomaly_container.dm b/code/modules/xenoarcheaology/anomaly_container.dm index fc2efc0ad1a6..03bd5daf8d3d 100644 --- a/code/modules/xenoarcheaology/anomaly_container.dm +++ b/code/modules/xenoarcheaology/anomaly_container.dm @@ -14,7 +14,7 @@ if(A) contain(A) -/obj/structure/anomaly_container/attack_hand(mob/user, list/params) +/obj/structure/anomaly_container/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) release() /obj/structure/anomaly_container/attack_robot(var/mob/user) diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm index 28fba6a04554..b8ac29c3ecda 100644 --- a/code/modules/xenoarcheaology/artifacts/artifact.dm +++ b/code/modules/xenoarcheaology/artifacts/artifact.dm @@ -174,7 +174,7 @@ if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) secondary_effect.ToggleActivate(0) -/obj/machinery/artifact/attack_hand(mob/user, list/params) +/obj/machinery/artifact/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if (get_dist(user, src) > 1) to_chat(user, "You can't reach [src] from here.") return diff --git a/code/modules/xenoarcheaology/artifacts/gigadrill.dm b/code/modules/xenoarcheaology/artifacts/gigadrill.dm index 7f54c8337021..5ae80dcd2261 100644 --- a/code/modules/xenoarcheaology/artifacts/gigadrill.dm +++ b/code/modules/xenoarcheaology/artifacts/gigadrill.dm @@ -9,7 +9,7 @@ density = 1 layer = ABOVE_JUNK_LAYER -/obj/machinery/giga_drill/attack_hand(mob/user, list/params) +/obj/machinery/giga_drill/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(active) active = 0 icon_state = "gigadrill" diff --git a/code/modules/xenoarcheaology/artifacts/replicator.dm b/code/modules/xenoarcheaology/artifacts/replicator.dm index cb00da1b1a49..266241d4b343 100644 --- a/code/modules/xenoarcheaology/artifacts/replicator.dm +++ b/code/modules/xenoarcheaology/artifacts/replicator.dm @@ -138,7 +138,7 @@ last_process_time = world.time -/obj/machinery/replicator/attack_hand(mob/user, list/params) +/obj/machinery/replicator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/replicator/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm index 0c1a9bdd7621..e6bad31f5ae7 100644 --- a/code/modules/xenoarcheaology/tools/artifact_analyser.dm +++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm @@ -24,7 +24,7 @@ if(!owned_scanner) owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src) -/obj/machinery/artifact_analyser/attack_hand(mob/user, list/params) +/obj/machinery/artifact_analyser/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (NOPOWER|BROKEN) || get_dist(src, user) > 1) return diff --git a/code/modules/xenoarcheaology/tools/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm index ce198e5d8455..98635883c3fd 100644 --- a/code/modules/xenoarcheaology/tools/artifact_harvester.dm +++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm @@ -35,7 +35,7 @@ else return..() -/obj/machinery/artifact_harvester/attack_hand(mob/user, list/params) +/obj/machinery/artifact_harvester/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (NOPOWER|BROKEN)) return diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index e97e6c8398f5..f4e770f91a57 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -115,7 +115,7 @@ if(total_purity && fresh_coolant) coolant_purity = total_purity / fresh_coolant -/obj/machinery/radiocarbon_spectrometer/attack_hand(mob/user, list/params) +/obj/machinery/radiocarbon_spectrometer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/radiocarbon_spectrometer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/xenoarcheaology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm index 489349dc9c61..3928ef91e559 100644 --- a/code/modules/xenoarcheaology/tools/suspension_generator.dm +++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm @@ -35,7 +35,7 @@ else deactivate() -/obj/machinery/suspension_gen/attack_hand(mob/user, list/params) +/obj/machinery/suspension_gen/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(panel_open) if(cell) to_chat(user, SPAN_NOTICE("You remove [cell].")) diff --git a/code/modules/xenobio/machinery/processor.dm b/code/modules/xenobio/machinery/processor.dm index ab2f7b345c06..8d3c61b680a6 100644 --- a/code/modules/xenobio/machinery/processor.dm +++ b/code/modules/xenobio/machinery/processor.dm @@ -24,7 +24,7 @@ . = ..() . += "The automatic intake switch is in the [auto_mode? "On" : "Off"] position." -/obj/machinery/processor/attack_hand(mob/user, list/params) +/obj/machinery/processor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(processing) to_chat(user, "The processor is in the process of processing!") return diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm index c7ae4f1dc3fd..15047074c5ca 100644 --- a/code/modules/xenobio2/machinery/core_extractor.dm +++ b/code/modules/xenobio2/machinery/core_extractor.dm @@ -145,7 +145,7 @@ eject_slime() //Here lies the UI -/obj/machinery/slime/extractor/attack_hand(mob/user, list/params) +/obj/machinery/slime/extractor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm index dd46c95d3caa..620abc6c7c5e 100644 --- a/code/modules/xenobio2/machinery/gene_manipulators.dm +++ b/code/modules/xenobio2/machinery/gene_manipulators.dm @@ -59,7 +59,7 @@ /obj/machinery/xenobio/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/xenobio/attack_hand(mob/user, list/params) +/obj/machinery/xenobio/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) nano_ui_interact(user) /obj/machinery/xenobio/attackby(obj/item/W as obj, mob/user as mob) diff --git a/code/modules/xenobio2/machinery/injector_computer.dm b/code/modules/xenobio2/machinery/injector_computer.dm index da929dd1257a..44d7f3d741d2 100644 --- a/code/modules/xenobio2/machinery/injector_computer.dm +++ b/code/modules/xenobio2/machinery/injector_computer.dm @@ -23,7 +23,7 @@ injector.computer = null ..() -/obj/machinery/computer/xenobio2/attack_hand(mob/user, list/params) +/obj/machinery/computer/xenobio2/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(..()) return 1 nano_ui_interact(user) diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm index edc019043cfa..f7c078e9e401 100644 --- a/code/modules/xenobio2/machinery/slime_replicator.dm +++ b/code/modules/xenobio2/machinery/slime_replicator.dm @@ -99,7 +99,7 @@ eject_core() //Here lies the UI -/obj/machinery/slime/replicator/attack_hand(mob/user, list/params) +/obj/machinery/slime/replicator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/maps/generic/misc.dm b/maps/generic/misc.dm index 84ea1f48da55..11d5fd41ce79 100644 --- a/maps/generic/misc.dm +++ b/maps/generic/misc.dm @@ -68,7 +68,7 @@ /turf/simulated/floor/maglev/Entered(var/atom/movable/AM, var/atom/old_loc) if(isliving(AM) && prob(50)) track_zap(AM) -/turf/simulated/floor/maglev/attack_hand(mob/user, list/params) +/turf/simulated/floor/maglev/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(prob(75)) track_zap(user) /turf/simulated/floor/maglev/proc/track_zap(var/mob/living/user) From 5aa1416d3af2e05f38c47dcad7f191cf52619921 Mon Sep 17 00:00:00 2001 From: silicons Date: Mon, 17 Jul 2023 13:24:14 -0700 Subject: [PATCH 023/140] dme --- citadel.dme | 2 ++ code/datums/event_args/event_args.dm | 2 ++ 2 files changed, 4 insertions(+) diff --git a/citadel.dme b/citadel.dme index ef8d374c6640..fa39fa82ae20 100644 --- a/citadel.dme +++ b/citadel.dme @@ -793,6 +793,8 @@ #include "code\datums\elements\clothing\dynamic_recolor.dm" #include "code\datums\elements\items\darksight_granter.dm" #include "code\datums\elements\items\hud_granter.dm" +#include "code\datums\event_args\clickchain.dm" +#include "code\datums\event_args\event_args.dm" #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" diff --git a/code/datums/event_args/event_args.dm b/code/datums/event_args/event_args.dm index e69de29bb2d1..d7481f2535f5 100644 --- a/code/datums/event_args/event_args.dm +++ b/code/datums/event_args/event_args.dm @@ -0,0 +1,2 @@ +/datum/event_args + abstract_type = /datum/event_args From 06b20870996131393017b20b4f6199cccace3acb Mon Sep 17 00:00:00 2001 From: silicons Date: Thu, 20 Jul 2023 18:47:51 -0700 Subject: [PATCH 024/140] attack self refactor too --- citadel.dme | 3 +- code/_onclick/hud/_screen_object.dm | 6 ++ code/_onclick/telekinesis.dm | 2 +- code/_rendering/hud_style.dm | 54 +++++++++++++++ code/_rendering/mob_huds/hands.dm | 62 ++++++++++++++++++ code/_rendering/mob_huds/inventory.dm | 34 ---------- code/_rendering/mob_huds/mob_hud.dm | 32 ++++++++- .../game/gamemodes/changeling/powers/armor.dm | 2 +- code/game/gamemodes/cult/ritual.dm | 4 +- code/game/gamemodes/cult/soulstone.dm | 2 +- code/game/gamemodes/cult/talisman.dm | 2 +- code/game/gamemodes/nuclear/pinpointer.dm | 8 +-- code/game/gamemodes/technomancer/catalog.dm | 2 +- .../devices/disposable_teleporter.dm | 2 +- .../technomancer/devices/shield_armor.dm | 2 +- .../technomancer/devices/tesla_armor.dm | 2 +- code/game/gamemodes/technomancer/equipment.dm | 2 +- .../game/gamemodes/technomancer/spell_objs.dm | 2 +- code/game/machinery/cell_charger.dm | 2 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/arcade/orion.dm | 2 +- code/game/machinery/computer/guestpass.dm | 2 +- code/game/machinery/newscaster.dm | 2 +- code/game/machinery/pipe/construction.dm | 2 +- code/game/machinery/supplybeacon.dm | 2 +- code/game/machinery/wall_frames.dm | 2 +- code/game/objects/effects/mines.dm | 2 +- code/game/objects/items.dm | 7 +- code/game/objects/items/antag_spawners.dm | 4 +- code/game/objects/items/balls.dm | 2 +- code/game/objects/items/blueprints.dm | 2 +- code/game/objects/items/bodybag.dm | 4 +- code/game/objects/items/contraband.dm | 4 +- code/game/objects/items/crayons.dm | 8 +-- code/game/objects/items/devices/PDA/PDA.dm | 4 +- code/game/objects/items/devices/aicard.dm | 2 +- code/game/objects/items/devices/binoculars.dm | 2 +- .../objects/items/devices/body_snatcher_vr.dm | 2 +- .../objects/items/devices/chameleonproj.dm | 2 +- .../devices/communicator/communicator.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 8 +-- .../objects/items/devices/floor_painter.dm | 2 +- code/game/objects/items/devices/geiger.dm | 2 +- code/game/objects/items/devices/gps.dm | 2 +- .../game/objects/items/devices/holowarrant.dm | 2 +- .../objects/items/devices/lightreplacer.dm | 2 +- code/game/objects/items/devices/megaphone.dm | 2 +- code/game/objects/items/devices/multitool.dm | 2 +- code/game/objects/items/devices/paicard.dm | 2 +- .../objects/items/devices/pipe_painter.dm | 2 +- .../objects/items/devices/radio/beacon.dm | 2 +- .../objects/items/devices/radio/jammer.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 2 +- code/game/objects/items/devices/scanners.dm | 4 +- .../game/objects/items/devices/scanners_vr.dm | 2 +- code/game/objects/items/devices/spy_bug.dm | 4 +- .../objects/items/devices/suit_cooling.dm | 2 +- code/game/objects/items/devices/t_scanner.dm | 2 +- .../devices/tape_recorder/cassette_tape.dm | 2 +- .../devices/tape_recorder/tape_recorder.dm | 2 +- .../objects/items/devices/taperecorder.dm | 4 +- .../objects/items/devices/text_to_speech.dm | 2 +- .../objects/items/devices/transfer_valve.dm | 2 +- code/game/objects/items/devices/translator.dm | 2 +- code/game/objects/items/devices/tvcamera.dm | 2 +- code/game/objects/items/devices/uplink.dm | 4 +- code/game/objects/items/devices/whistle.dm | 2 +- code/game/objects/items/gifts.dm | 2 +- code/game/objects/items/glassjar.dm | 2 +- code/game/objects/items/godfigures.dm | 2 +- code/game/objects/items/gunbox.dm | 18 ++--- code/game/objects/items/holosign_creator.dm | 4 +- .../objects/items/id_cards/station_ids.dm | 2 +- .../objects/items/id_cards/syndicate_ids.dm | 2 +- code/game/objects/items/inducer.dm | 2 +- code/game/objects/items/pizza_voucher.dm | 2 +- code/game/objects/items/robobag.dm | 2 +- code/game/objects/items/robot/gripper.dm | 4 +- .../objects/items/robot/robot_upgrades.dm | 2 +- code/game/objects/items/signs.dm | 2 +- code/game/objects/items/spritechanger.dm | 2 +- .../objects/items/stacks/marker_beacons.dm | 2 +- code/game/objects/items/stacks/rods.dm | 2 +- .../game/objects/items/stacks/sheets/glass.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/items/stacks/telecrystal.dm | 2 +- code/game/objects/items/storage/_storage.dm | 4 +- code/game/objects/items/storage/boxes.dm | 2 +- .../objects/items/storage/laundry_basket.dm | 11 +--- code/game/objects/items/storage/secure.dm | 2 +- .../items/storage/single_use/_single_use.dm | 2 +- .../items/storage/single_use/med_pouch.dm | 2 +- code/game/objects/items/tools/crowbar.dm | 2 +- code/game/objects/items/tools/screwdriver.dm | 2 +- code/game/objects/items/tools/switchtool.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 2 +- code/game/objects/items/tools/wirecutters.dm | 2 +- code/game/objects/items/tools/wrench.dm | 2 +- code/game/objects/items/toys.dm | 26 ++++---- code/game/objects/items/weapons/AI_modules.dm | 10 +-- code/game/objects/items/weapons/RCD.dm | 4 +- code/game/objects/items/weapons/RPD.dm | 2 +- code/game/objects/items/weapons/RSF.dm | 2 +- .../objects/items/weapons/barrier_tape.dm | 2 +- code/game/objects/items/weapons/candle.dm | 2 +- .../objects/items/weapons/cigs_lighters.dm | 6 +- .../game/objects/items/weapons/clown_items.dm | 2 +- code/game/objects/items/weapons/cosmetics.dm | 6 +- code/game/objects/items/weapons/duct_tape.dm | 4 +- code/game/objects/items/weapons/explosives.dm | 2 +- .../objects/items/weapons/extinguisher.dm | 2 +- .../objects/items/weapons/flamethrower.dm | 2 +- .../objects/items/weapons/gift_wrappaper.dm | 8 +-- .../items/weapons/grenades/chem_grenade.dm | 2 +- .../objects/items/weapons/grenades/grenade.dm | 2 +- code/game/objects/items/weapons/handcuffs.dm | 26 -------- .../game/objects/items/weapons/hydroponics.dm | 2 +- .../items/weapons/implants/implantcircuits.dm | 2 +- .../items/weapons/implants/implanter.dm | 2 +- .../items/weapons/implants/implantpad.dm | 2 +- .../items/weapons/material/chainsaw.dm | 2 +- .../items/weapons/material/gravemarker.dm | 2 +- .../objects/items/weapons/material/knives.dm | 2 +- .../objects/items/weapons/material/misc.dm | 2 +- .../objects/items/weapons/melee/energy.dm | 6 +- code/game/objects/items/weapons/melee/misc.dm | 8 +-- code/game/objects/items/weapons/mop.dm | 2 +- code/game/objects/items/weapons/mop_deploy.dm | 2 +- code/game/objects/items/weapons/nullrod.dm | 4 +- code/game/objects/items/weapons/other.dm | 6 +- code/game/objects/items/weapons/scrolls.dm | 2 +- code/game/objects/items/weapons/shields.dm | 6 +- code/game/objects/items/weapons/stunbaton.dm | 2 +- .../objects/items/weapons/swords_axes_etc.dm | 4 +- code/game/objects/items/weapons/syndie.dm | 2 +- .../game/objects/items/weapons/tanks/tanks.dm | 2 +- .../objects/items/weapons/teleportation.dm | 4 +- code/game/objects/items/weapons/towels.dm | 2 +- code/game/objects/items/weapons/traps.dm | 2 +- code/game/objects/structures/bedsheet_bin.dm | 2 +- code/game/objects/structures/extinguisher.dm | 13 ++-- code/game/objects/structures/inflatable.dm | 6 +- .../structures/stool_bed_chair_nest/bed.dm | 4 +- .../stool_bed_chair_nest/wheelchair.dm | 2 +- code/game/objects/structures/watercloset.dm | 11 +--- code/modules/artifice/deadringer.dm | 2 +- code/modules/assembly/assembly.dm | 2 +- code/modules/assembly/holder.dm | 2 +- code/modules/assembly/igniter.dm | 2 +- code/modules/assembly/mousetrap.dm | 2 +- code/modules/assembly/shock_kit.dm | 2 +- code/modules/assembly/voice.dm | 2 +- code/modules/catalogue/cataloguer.dm | 2 +- code/modules/client/ui_style.dm | 15 +++-- code/modules/clothing/glasses/_glasses.dm | 8 +-- code/modules/clothing/glasses/hud.dm | 6 +- code/modules/clothing/gloves/miscellaneous.dm | 2 +- code/modules/clothing/gloves/rings/rings.dm | 6 +- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/head/helmet.dm | 6 +- code/modules/clothing/head/misc.dm | 4 +- code/modules/clothing/head/misc_special.dm | 6 +- code/modules/clothing/head/pilot_helmet.dm | 2 +- code/modules/clothing/head/soft_caps.dm | 2 +- code/modules/clothing/masks/breath.dm | 2 +- code/modules/clothing/masks/gasmask.dm | 4 +- code/modules/clothing/masks/miscellaneous.dm | 4 +- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/clothing/shoes/boots.dm | 2 +- code/modules/clothing/shoes/colour.dm | 2 +- code/modules/clothing/shoes/magboots.dm | 4 +- code/modules/clothing/spacesuits/void/void.dm | 2 +- code/modules/clothing/suits/armor.dm | 4 +- code/modules/clothing/suits/medieval_armor.dm | 4 +- .../clothing/under/accessories/accessory.dm | 6 +- .../clothing/under/accessories/armor.dm | 2 +- .../clothing/under/accessories/badges.dm | 6 +- .../clothing/under/accessories/clothing.dm | 2 +- .../clothing/under/accessories/lockets.dm | 2 +- .../clothing/under/accessories/permits.dm | 2 +- .../clothing/under/accessories/storage.dm | 2 +- .../detectivework/tools/evidencebag.dm | 2 +- code/modules/detectivework/tools/rag.dm | 2 +- .../detectivework/tools/sample_kits.dm | 2 +- code/modules/detectivework/tools/uvlight.dm | 2 +- .../modules/donatorreskins/donatorclothing.dm | 2 +- code/modules/economy/items/EFTPOS.dm | 2 +- code/modules/economy/items/cash.dm | 4 +- code/modules/economy/items/coins.dm | 2 +- code/modules/economy/items/retail_scanner.dm | 2 +- code/modules/fishing/aquarium/aquarium_kit.dm | 2 +- code/modules/fishing/equipment/rod.dm | 2 +- code/modules/food/food/condiment.dm | 2 +- code/modules/food/food/drinks.dm | 2 +- code/modules/food/food/drinks/bottle.dm | 2 +- code/modules/food/food/snacks.dm | 8 +-- code/modules/games/cards.dm | 6 +- code/modules/games/dice.dm | 4 +- code/modules/hardsuits/suits/ert.dm | 2 +- code/modules/holodeck/HolodeckObjects.dm | 2 +- .../modules/hydroponics/beekeeping/beehive.dm | 2 +- code/modules/hydroponics/grown.dm | 2 +- code/modules/hydroponics/seed_machines.dm | 2 +- code/modules/hydroponics/trays/tray_tools.dm | 2 +- code/modules/instruments/instruments/item.dm | 2 +- .../integrated_electronics/core/assemblies.dm | 2 +- .../core/assemblies/clothing.dm | 2 +- .../core/assemblies/device.dm | 2 +- .../integrated_electronics/core/detailer.dm | 2 +- .../integrated_electronics/core/printer.dm | 2 +- .../integrated_electronics/core/tools.dm | 6 +- .../subtypes/manipulation.dm | 6 +- .../integrated_electronics/subtypes/memory.dm | 2 +- .../subtypes/reagents.dm | 2 +- .../integrated_electronics/subtypes/smart.dm | 4 +- code/modules/inventory/inventory.dm | 4 +- code/modules/inventory/mob/hands.dm | 19 ++++++ code/modules/library/book.dm | 2 +- code/modules/library/lib_items.dm | 2 +- code/modules/lore_codex/codex.dm | 2 +- code/modules/materials/material_sheets.dm | 2 +- code/modules/mining/drilling/scanner.dm | 2 +- code/modules/mining/fulton.dm | 4 +- code/modules/mining/mine_items.dm | 4 +- code/modules/mining/resonator.dm | 2 +- code/modules/mining/resonator_vr.dm | 2 +- code/modules/mining/shelter_atoms.dm | 2 +- code/modules/mining/vertibore.dm | 2 +- code/modules/mob/grab.dm | 2 +- code/modules/mob/inventory.dm | 43 ++++++++++++ code/modules/mob/living/carbon/brain/MMI.dm | 4 +- .../mob/living/carbon/brain/posibrain.dm | 2 +- code/modules/mob/living/carbon/brain/robot.dm | 2 +- code/modules/mob/living/carbon/human/emote.dm | 7 +- code/modules/mob/living/carbon/inventory.dm | 25 +++---- code/modules/mob/living/living.dm | 1 + code/modules/mob/living/living_defines.dm | 4 -- .../silicon/robot/dogborg/dog_modules_vr.dm | 12 ++-- .../silicon/robot/dogborg/dog_sleeper_vr.dm | 2 +- .../mob/living/silicon/robot/robot_items.dm | 10 +-- code/modules/mob/living/simple_mob/hands.dm | 36 ---------- .../mob/living/simple_mob/simple_mob.dm | 4 ++ .../subtypes/animal/passive/mouse.dm | 2 +- .../simple_mob/subtypes/animal/pets/cat.dm | 2 +- .../subtypes/occult/constructs/_construct.dm | 18 +++-- code/modules/mob/mob_defines.dm | 8 ++- .../computers/modular_computer/interaction.dm | 2 +- code/modules/multiz/hoist.dm | 2 +- code/modules/nifsoft/nifsoft.dm | 2 +- code/modules/organs/external/external.dm | 2 +- .../organs/internal/species/adherent.dm | 2 +- code/modules/organs/organ.dm | 2 +- code/modules/paperwork/clipboard.dm | 2 +- code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/handlabeler.dm | 2 +- code/modules/paperwork/paper/paper.dm | 2 +- code/modules/paperwork/paper_bundle.dm | 2 +- code/modules/paperwork/paperbin.dm | 12 ++-- code/modules/paperwork/paperplane.dm | 2 +- code/modules/paperwork/pen.dm | 10 +-- code/modules/paperwork/stamps.dm | 2 +- code/modules/photography/camera.dm | 2 +- code/modules/photography/photo.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 2 +- .../guns/energy/kinetic_accelerator.dm | 2 +- code/modules/projectiles/guns/energy/pulse.dm | 2 +- .../projectiles/guns/energy/sizegun_vr.dm | 2 +- .../projectiles/guns/energy/special.dm | 2 +- .../projectiles/guns/launcher/crossbow.dm | 2 +- .../guns/launcher/grenade_launcher.dm | 4 +- .../projectiles/guns/launcher/pneumatic.dm | 2 +- .../projectiles/guns/launcher/syringe_gun.dm | 4 +- .../projectiles/guns/projectile/automatic.dm | 2 +- .../projectiles/guns/projectile/bow.dm | 2 +- .../projectiles/guns/projectile/contender.dm | 2 +- .../projectiles/guns/projectile/dartgun.dm | 2 +- .../projectiles/guns/projectile/shotgun.dm | 2 +- .../projectiles/guns/projectile/sniper.dm | 2 +- .../projectile/sniper/collapsible_sniper.dm | 2 +- .../modules/projectiles/magazines/magazine.dm | 2 +- code/modules/reagents/items/hypospray.dm | 2 +- .../reagents/machinery/dispenser/cartridge.dm | 2 +- code/modules/reagents/reagent_containers.dm | 2 +- .../reagent_containers/blood_pack_vr.dm | 2 +- .../reagents/reagent_containers/borghydro.dm | 2 +- .../reagents/reagent_containers/glass.dm | 2 +- .../reagents/reagent_containers/hard_candy.dm | 2 +- .../reagents/reagent_containers/hypospray.dm | 2 +- .../reagents/reagent_containers/organic.dm | 2 +- .../reagents/reagent_containers/spray.dm | 6 +- .../reagents/reagent_containers/syringes.dm | 2 +- .../reagent_containers/syringes_vr.dm | 2 +- code/modules/recycling/sortingmachinery.dm | 4 +- code/modules/resleeving/computers.dm | 2 +- code/modules/resleeving/implant.dm | 2 +- code/modules/resleeving/mirror.dm | 2 +- code/modules/resleeving/sleevecard.dm | 2 +- code/modules/shieldgen/directional_shield.dm | 4 +- code/modules/shieldgen/handheld_defuser.dm | 2 +- code/modules/shuttles/landmarks.dm | 2 +- code/modules/species/outsider/vox.dm | 2 - .../species/xenomorphs/alien_species.dm | 1 - code/modules/spells/artifacts.dm | 8 +-- code/modules/spells/spellbook.dm | 2 +- code/modules/telesci/bscyrstal.dm | 2 +- code/modules/vehicles/ridden/wheelchair.dm | 2 +- code/modules/vore/eating/leave_remains_vr.dm | 2 +- code/modules/vore/fluffstuff/custom_items.dm | 24 +++---- .../vore/fluffstuff/custom_items_cit.dm | 2 +- .../modules/vore/fluffstuff/guns/bsharpoon.dm | 2 +- .../guns/cell_loaded/cell_loaded.dm | 2 +- code/modules/vore/fluffstuff/guns/gunsword.dm | 2 +- code/modules/vore/resizing/holder_micro_vr.dm | 2 +- code/modules/xenoarcheaology/sampling.dm | 2 +- .../tools/ano_device_battery.dm | 2 +- code/modules/xenoarcheaology/tools/tools.dm | 8 +-- .../xenoarcheaology/tools/tools_pickaxe.dm | 2 +- code/modules/xenobio/items/slime_objects.dm | 4 +- .../xenobio2/machinery/gene_manipulators.dm | 2 +- .../xenobio2/mob/slime/slime_monkey.dm | 2 +- .../xenobio2/tools/xeno_trait_scanner.dm | 2 +- icons/screen/hud/hologram/inventory.dmi | Bin 0 -> 182 bytes icons/screen/hud/midnight/inventory.dmi | Bin 0 -> 182 bytes icons/screen/hud/minimalist/inventory.dmi | Bin 0 -> 182 bytes icons/screen/hud/orange/inventory.dmi | Bin 0 -> 182 bytes icons/screen/hud/white/inventory.dmi | Bin 0 -> 182 bytes 327 files changed, 719 insertions(+), 615 deletions(-) create mode 100644 code/_rendering/hud_style.dm create mode 100644 code/_rendering/mob_huds/hands.dm delete mode 100644 code/_rendering/mob_huds/inventory.dm create mode 100644 icons/screen/hud/hologram/inventory.dmi create mode 100644 icons/screen/hud/midnight/inventory.dmi create mode 100644 icons/screen/hud/minimalist/inventory.dmi create mode 100644 icons/screen/hud/orange/inventory.dmi create mode 100644 icons/screen/hud/white/inventory.dmi diff --git a/citadel.dme b/citadel.dme index 508f51ba0bb2..447b7af3d184 100644 --- a/citadel.dme +++ b/citadel.dme @@ -455,6 +455,7 @@ #include "code\_onclick\hud\inventory\inventory.dm" #include "code\_onclick\hud\objects\waypoint_tracker.dm" #include "code\_rendering\client.dm" +#include "code\_rendering\hud_style.dm" #include "code\_rendering\mob.dm" #include "code\_rendering\atom_huds\alternate_appearance.dm" #include "code\_rendering\atom_huds\atom_hud.dm" @@ -462,7 +463,7 @@ #include "code\_rendering\atom_huds\other_huds.dm" #include "code\_rendering\clickcatcher\clickcatcher.dm" #include "code\_rendering\fullscreen\fullscreen.dm" -#include "code\_rendering\mob_huds\inventory.dm" +#include "code\_rendering\mob_huds\hands.dm" #include "code\_rendering\mob_huds\mob_hud.dm" #include "code\_rendering\parallax\parallax.dm" #include "code\_rendering\parallax\parallax_holder.dm" diff --git a/code/_onclick/hud/_screen_object.dm b/code/_onclick/hud/_screen_object.dm index 62b532d484bd..68330249fa60 100644 --- a/code/_onclick/hud/_screen_object.dm +++ b/code/_onclick/hud/_screen_object.dm @@ -20,6 +20,12 @@ master = null return ..() +/** + * called to resync to a hud_style datum + */ +/atom/movable/screen/proc/sync_style(datum/hud_style/style) + return + /atom/movable/screen/text icon = null icon_state = null diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 8436d432f124..719d93a2927d 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -80,7 +80,7 @@ var/const/tk_maxrange = 15 if(slot != SLOT_ID_HANDS) qdel(src) -/obj/item/tk_grab/attack_self(mob/user) +/obj/item/tk_grab/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/_rendering/hud_style.dm b/code/_rendering/hud_style.dm new file mode 100644 index 000000000000..5e9646b3e3ac --- /dev/null +++ b/code/_rendering/hud_style.dm @@ -0,0 +1,54 @@ +GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) + +/proc/init_hud_styles() + . = list() + for(var/datum/hud_style/path as anything in subtypesof(/datum/hud_style)) + if(initial(path.abstract_type) == path) + continue + .[initial(path.id)] = new path + +/** + * default values are on /datum/hud_style + */ +/datum/hud_style + abstract_type = /datum/hud_style + /// style name + var/name = "Unknown" + /// style uid + var/id + + /// inventory icons + var/inventory_icons = 'icons/screen/hud/midnight/inventory.dmi' + /// inventory icons: big + var/inventory_icons_wide = 'icons/screen/hud/midnight/inventory_wide.dmi' + +/** + * midnight style just inherits defaults + */ +/datum/hud_style/midnight + id = "midnight" + +/datum/hud_style/orange + id = "orange" + inventory_icons = 'icons/screen/hud/orange/inventory.dmi' + inventory_icons_wide = 'icons/screen/hud/orange/inventory_wide.dmi' + +/datum/hud_style/old + id = "old" + inventory_icons = 'icons/screen/hud/old/inventory.dmi' + inventory_icons_wide = 'icons/screen/hud/old/inventory_wide.dmi' + +/datum/hud_style/white + id = "white" + inventory_icons = 'icons/screen/hud/white/inventory.dmi' + inventory_icons_wide = 'icons/screen/hud/white/inventory_wide.dmi' + +/datum/hud_style/minimalist + id = "minimalist" + inventory_icons = 'icons/screen/hud/minimalist/inventory.dmi' + inventory_icons_wide = 'icons/screen/hud/minimalist/inventory_wide.dmi' + +/datum/hud_style/hologram + id = "hologram" + inventory_icons = 'icons/screen/hud/hologram/inventory.dmi' + inventory_icons_wide = 'icons/screen/hud/hologram/inventory_wide.dmi' diff --git a/code/_rendering/mob_huds/hands.dm b/code/_rendering/mob_huds/hands.dm new file mode 100644 index 000000000000..a1f4c4b10d45 --- /dev/null +++ b/code/_rendering/mob_huds/hands.dm @@ -0,0 +1,62 @@ +/datum/mob_hud/hands + /// owning inventory + var/datum/inventory/host + /// ordered hand objects + var/list/atom/movable/screen/hand/instance/hands + /// swap hand object + var/atom/movable/screen/hand/swap_hand/swap_hand + /// equip object + var/atom/movable/screen/hand/equip_hand/equip_hand + /// use hand on self object + var/atom/movable/screen/hand/use_self_hand/use_self_hand + + +/atom/movable/screen/hand + name = "inventory" + icon = 'icons/screen/hud/midnight/inventory.dmi' + + /// our owning inventory datum + var/datum/inventory/host + +/atom/movable/screen/hand/Initialize(mapload, datum/inventory/host) + . = ..() + src.host = host + +/atom/movable/screen/hand/sync_style(datum/hud_style/style) + icon = hud.inventory_icons + +/** + * handle an inventory operation + * + * @params + * * user - clicking user; not necessarily the inventory's owner + * * slot_or_index - slot ID or numerical hand index + * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. + */ +/atom/movable/screen/hand/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) + +#warn impl all + +/atom/movable/screen/hand/instance + /// target hand index + var/hand_index + +/atom/movable/screen/hand/instance/Initialize(mapload, datum/inventory/host, hand_index) + . = ..() + src.hand_index = hand_index + synx_index(hand_index) + +/atom/movable/screen/hand/instance/proc/sync_index(index = hand_index) + screen_loc = SCREEN_LOC_INV_HAND(index) + var/index_of_side = round(index / 2) + name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" + icon_state = "hand-[index % 2? "left" : "right"]" + +/atom/movable/screen/hand/swap_hand + +/atom/movable/screen/hand/swap_hand/sync_style(datum/hud_style/style) + icon = hud.inventory_icons_wide + +/atom/movable/screen/hand/equip_hand + +/atom/movable/screen/hand/use_self_hand diff --git a/code/_rendering/mob_huds/inventory.dm b/code/_rendering/mob_huds/inventory.dm deleted file mode 100644 index 5c5d3c41b211..000000000000 --- a/code/_rendering/mob_huds/inventory.dm +++ /dev/null @@ -1,34 +0,0 @@ -/datum/mob_hud/inventory - -/atom/movable/screen/inventory - name = "inventory" - - /// our owning inventory datum - var/datum/inventory/host - /// our slot ID or index - var/target - -/atom/movable/screen/inventory/Initialize(mapload, datum/inventory/host, target) - . = ..() - src.target = target - src.host = host - auto_name_and_position(target) - -/atom/movable/screen/inventory/proc/auto_name_and_position(slot_or_index) - - -/** - * handle an inventory operation - * - * @params - * * user - clicking user; not necessarily the inventory's owner - * * slot_or_index - slot ID or numerical hand index - * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. - */ -/atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) - -#warn impl all - -/atom/movable/screen/inventory/hand - -/atom/movable/screen/inventory/hand/ diff --git a/code/_rendering/mob_huds/mob_hud.dm b/code/_rendering/mob_huds/mob_hud.dm index a71f424f65ec..e4bb588a172a 100644 --- a/code/_rendering/mob_huds/mob_hud.dm +++ b/code/_rendering/mob_huds/mob_hud.dm @@ -1,7 +1,35 @@ /** - * owned by one mob - * can be utilized by many + * owned by one mob as the user, and one mob as the owner * * therefore, keep screen locs as widescreen/viewrange agnostic as possible. */ /datum/mob_hud + /// mob we're for (aka rendering the state of) + var/mob/owner + /// mob that's using us to view - this is often times the owner too + var/mob/user + /// desired hud style - set at base of sync_client + var/datum/hud_style/style + +/datum/mob_hud/proc/screens() + return list() + +/datum/mob_hud/proc/images() + return list() + +/datum/mob_hud/proc/sync_client(client/C) + var/requested = C.prefs.ui_style + style = GLOB.hud_styles[all_ui_style_ids[requested]] + if(isnull(style)) + stack_trace("failed to get style [requested]") + style = new /datum/hud_style/midnight + +/datum/mob_hud/proc/apply_client(client/C) + C.screen += screens() + C.screen += images() + +/datum/mob_hud/proc/remove_client(client/C) + C.screen -= screens() + C.images -= images() + +#warn impl all diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm index 4d3753a5f2b0..2a3583ffa63b 100644 --- a/code/game/gamemodes/changeling/powers/armor.dm +++ b/code/game/gamemodes/changeling/powers/armor.dm @@ -70,7 +70,7 @@ if (magpulse) slowdown += 1 //It's already tied to a slowdown suit, 6 slowdown is huge. -/obj/item/clothing/shoes/magboots/changeling/attack_self(mob/user) +/obj/item/clothing/shoes/magboots/changeling/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 5cfca05ca47e..9c350d01fafd 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -308,7 +308,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," O.show_message("\The [user] beats \the [L] with \the [src]!", 1) to_chat(target, "You feel searing heat inside!") -/obj/item/book/tome/attack_self(mob/user) +/obj/item/book/tome/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -426,7 +426,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," w_class = ITEMSIZE_SMALL var/cultistsonly = 1 -/obj/item/book/tome/imbued/attack_self(mob/user) +/obj/item/book/tome/imbued/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/cult/soulstone.dm b/code/game/gamemodes/cult/soulstone.dm index 8f920f2e5e80..8398a4910f47 100644 --- a/code/game/gamemodes/cult/soulstone.dm +++ b/code/game/gamemodes/cult/soulstone.dm @@ -36,7 +36,7 @@ ///////////////////Options for using captured souls/////////////////////////////////////// -/obj/item/soulstone/attack_self(mob/user) +/obj/item/soulstone/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index eb148366e605..954c91b76f00 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -5,7 +5,7 @@ var/uses = 0 info = "


" -/obj/item/paper/talisman/attack_self(mob/user) +/obj/item/paper/talisman/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 3c3ce515eb64..b16d61f1bcaf 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -13,7 +13,7 @@ var/active = 0 -/obj/item/pinpointer/attack_self(mob/user) +/obj/item/pinpointer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -64,7 +64,7 @@ var/turf/location = null var/obj/target = null -/obj/item/pinpointer/advpinpointer/attack_self(mob/user) +/obj/item/pinpointer/advpinpointer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -189,7 +189,7 @@ var/mode = 0 //Mode 0 locates disk, mode 1 locates the shuttle var/obj/machinery/computer/shuttle_control/multi/syndicate/home = null -/obj/item/pinpointer/nukeop/attack_self(mob/user) +/obj/item/pinpointer/nukeop/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -278,7 +278,7 @@ var/shuttle_comp_id = null var/obj/machinery/computer/shuttle_control/our_shuttle = null -/obj/item/pinpointer/shuttle/attack_self(mob/user) +/obj/item/pinpointer/shuttle/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm index a82c86a27905..3d4b380ec177 100644 --- a/code/game/gamemodes/technomancer/catalog.dm +++ b/code/game/gamemodes/technomancer/catalog.dm @@ -97,7 +97,7 @@ // Proc: attack_self() // Parameters: 1 (user - the mob clicking on the catalog) // Description: Shows an HTML window, to buy equipment and spells, if the user is the legitimate owner. Otherwise it cannot be used. -/obj/item/technomancer_catalog/attack_self(mob/user) +/obj/item/technomancer_catalog/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm index 5e2f8d151737..0638ae976073 100644 --- a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm +++ b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm @@ -26,7 +26,7 @@ . = ..() . += "There are [uses] uses remaining." -/obj/item/disposable_teleporter/attack_self(mob/user) +/obj/item/disposable_teleporter/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm index 273428c41735..2c375edfb8f8 100644 --- a/code/game/gamemodes/technomancer/devices/shield_armor.dm +++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm @@ -73,7 +73,7 @@ playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) return 0 // This shield does not block all damage, so returning 0 is needed to tell the game to apply the new damage. -/obj/item/clothing/suit/armor/shield/attack_self(mob/user) +/obj/item/clothing/suit/armor/shield/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/devices/tesla_armor.dm b/code/game/gamemodes/technomancer/devices/tesla_armor.dm index 03668e4990e0..192465e3f09e 100644 --- a/code/game/gamemodes/technomancer/devices/tesla_armor.dm +++ b/code/game/gamemodes/technomancer/devices/tesla_armor.dm @@ -52,7 +52,7 @@ return 1 return 0 -/obj/item/clothing/suit/armor/tesla/attack_self(mob/user) +/obj/item/clothing/suit/armor/tesla/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm index 688ce6bccf90..e270c39a69d4 100644 --- a/code/game/gamemodes/technomancer/equipment.dm +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -193,7 +193,7 @@ slot_flags = SLOT_BELT attack_verb = list("beaten", "smashed", "struck", "whacked") -/obj/item/scepter/attack_self(mob/user) +/obj/item/scepter/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index 43c2527d9da9..dccfcd88f996 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -206,7 +206,7 @@ // Proc: attack_self() // Parameters: 1 (user - the Technomancer that invoked this proc) // Description: Tries to call on_use_cast() if it is allowed to do so. Don't override this, override on_use_cast() instead. -/obj/item/spell/attack_self(mob/user) +/obj/item/spell/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index ec7319aee547..bd1ac64789ec 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -145,7 +145,7 @@ w_class = ITEMSIZE_NORMAL materials = list(MAT_STEEL = 4000, MAT_GLASS = 1000) -/obj/item/cell_charger_kit/attack_self(mob/user) +/obj/item/cell_charger_kit/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 0bc0d3ca187f..304a13687020 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -525,7 +525,7 @@ var/diskcolor = pick(0,1,2) icon_state = "datadisk[diskcolor]" -/obj/item/disk/data/attack_self(mob/user) +/obj/item/disk/data/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index 9f33580bae53..58a624bf5c0f 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -506,7 +506,7 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events()) else . += SPAN_NOTICE("There's a little switch on the bottom. It's flipped up.") -/obj/item/orion_ship/attack_self(mob/user) +/obj/item/orion_ship/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 32ca21613fe4..eb290d92c5cc 100755 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -39,7 +39,7 @@ to_chat(usr, "Issuing reason: [reason].") return -/obj/item/card/id/guest/attack_self(mob/user) +/obj/item/card/id/guest/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index ab3db27ae82f..514af605b628 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -811,7 +811,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' -/obj/item/newspaper/attack_self(mob/user) +/obj/item/newspaper/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index ac6b4eb4122b..12842255a4c7 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -159,7 +159,7 @@ Buildable meters if(dir in GLOB.cornerdirs) setDir(turn(dir, 45)) -/obj/item/pipe/attack_self(mob/user) +/obj/item/pipe/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 4cff0452f79e..3b27f354648b 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -11,7 +11,7 @@ name = "inactive supermatter supply beacon" deploy_path = /obj/machinery/power/supply_beacon/supermatter -/obj/item/supply_beacon/attack_self(mob/user) +/obj/item/supply_beacon/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 8d70cbc0d2e7..79d98b6d8a2c 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -23,7 +23,7 @@ return ..() -/obj/item/frame/attack_self(mob/user) +/obj/item/frame/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index f4868b547b2f..473d58a1384a 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -223,7 +223,7 @@ var/countdown = 10 var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime. -/obj/item/mine/attack_self(mob/user) +/obj/item/mine/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 73cf8f98be0f..3fae2415aa57 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -773,12 +773,15 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. * * @params * * user - The person using us in hand + * * e_args - clickchain args * * @return TRUE to signal to overrides to stop the chain and do nothing. */ -/obj/item/proc/attack_self(mob/user) +/obj/item/proc/attack_self(mob/user, datum/event_args/clickchain/e_args) // SHOULD_CALL_PARENT(TRUE) // attack_self isn't really part of the item attack chain. + if(isnull(e_args)) + e_args = user.default_clickchain_event_args(src, params, TRUE) SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) if(interaction_flags_item & INTERACT_ITEM_ATTACK_SELF) interact(user) @@ -789,7 +792,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. * Used to allow for attack_self to be interrupted by signals in nearly all cases. * You should usually override this instead of attack_self. */ -/obj/item/proc/on_attack_self(mob/user) +/obj/item/proc/on_attack_self(mob/user, datum/event_args/clickchain/e_args) return //? Mob Armor diff --git a/code/game/objects/items/antag_spawners.dm b/code/game/objects/items/antag_spawners.dm index 9cd10e387e7a..75f921ac1ada 100644 --- a/code/game/objects/items/antag_spawners.dm +++ b/code/game/objects/items/antag_spawners.dm @@ -48,7 +48,7 @@ icon_state = "oldshieldoff" ghost_query_type = /datum/ghost_query/apprentice -/obj/item/antag_spawner/technomancer_apprentice/attack_self(mob/user) +/obj/item/antag_spawner/technomancer_apprentice/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -97,7 +97,7 @@ ghost_query_type = /datum/ghost_query/syndicate_drone var/drone_type = null -/obj/item/antag_spawner/syndicate_drone/attack_self(mob/user) +/obj/item/antag_spawner/syndicate_drone/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/balls.dm b/code/game/objects/items/balls.dm index 5c2fa1ba591f..70e988d46e9a 100644 --- a/code/game/objects/items/balls.dm +++ b/code/game/objects/items/balls.dm @@ -27,7 +27,7 @@ 'sound/items/toysqueak3.ogg' ) -/obj/item/toy/tennis/rainbow/attack_self(mob/user) +/obj/item/toy/tennis/rainbow/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 9f8a9b958a97..063f82058de0 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -46,7 +46,7 @@ var/can_expand_areas_into = AREA_SPACE // Can expand station areas only into space. var/can_rename_areas_in = AREA_STATION // Only station areas can be reanamed -/obj/item/blueprints/attack_self(mob/user) +/obj/item/blueprints/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index bf8b1c642e01..842e5fdaf238 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -7,7 +7,7 @@ icon_state = "bodybag_folded" w_class = ITEMSIZE_SMALL -/obj/item/bodybag/attack_self(mob/user) +/obj/item/bodybag/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -127,7 +127,7 @@ origin_tech = list(TECH_BIO = 4) var/obj/item/reagent_containers/syringe/syringe -/obj/item/bodybag/cryobag/attack_self(mob/user) +/obj/item/bodybag/cryobag/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm index 79b7b447da6c..1e86589cdc5c 100644 --- a/code/game/objects/items/contraband.dm +++ b/code/game/objects/items/contraband.dm @@ -49,7 +49,7 @@ item_state = "table_parts" w_class = ITEMSIZE_HUGE -/obj/item/stolenpackage/attack_self(mob/user) +/obj/item/stolenpackage/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -179,7 +179,7 @@ item_state = "table_parts" w_class = ITEMSIZE_HUGE -/obj/item/stolenpackageplus/attack_self(mob/user) +/obj/item/stolenpackageplus/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 179e438177b6..472e099540e9 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -42,7 +42,7 @@ colourName = "mime" uses = 0 -/obj/item/pen/crayon/mime/attack_self(mob/user) +/obj/item/pen/crayon/mime/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return //inversion @@ -63,7 +63,7 @@ colourName = "rainbow" uses = 0 -/obj/item/pen/crayon/rainbow/attack_self(mob/user) +/obj/item/pen/crayon/rainbow/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -165,7 +165,7 @@ colourName = "mime" uses = 0 -/obj/item/pen/crayon/marker/mime/attack_self(mob/user) +/obj/item/pen/crayon/marker/mime/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return //inversion @@ -186,7 +186,7 @@ colourName = "rainbow" uses = 0 -/obj/item/pen/crayon/marker/rainbow/attack_self(mob/user) +/obj/item/pen/crayon/marker/rainbow/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 6f0cfe4cc243..88faaee4ff7d 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -322,7 +322,7 @@ GLOBAL_LIST_EMPTY(PDAs) return 1 -/obj/item/pda/ai/attack_self(mob/user) +/obj/item/pda/ai/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -674,7 +674,7 @@ GLOBAL_LIST_EMPTY(PDAs) ui.set_auto_update(auto_update) //NOTE: graphic resources are loaded on client login -/obj/item/pda/attack_self(mob/user) +/obj/item/pda/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 3194dcbe82b3..f422dcc6a984 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -21,7 +21,7 @@ to_chat(user, "ERROR ERROR ERROR") return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/item/aicard/attack_self(mob/user) +/obj/item/aicard/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index 0e4c8aaf1084..2bf98bc0031c 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -12,7 +12,7 @@ //materials = list("metal" = 50, MAT_GLASS = 50) -/obj/item/binoculars/attack_self(mob/user) +/obj/item/binoculars/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/body_snatcher_vr.dm b/code/game/objects/items/devices/body_snatcher_vr.dm index a89be30cd710..46614d3613b6 100644 --- a/code/game/objects/items/devices/body_snatcher_vr.dm +++ b/code/game/objects/items/devices/body_snatcher_vr.dm @@ -67,7 +67,7 @@ else to_chat(user," A warning pops up on the LED display on the side of the device, informing you that the target is not able to have their mind swapped with!") -/obj/item/bodysnatcher/attack_self(mob/user) +/obj/item/bodysnatcher/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index ca04ee075ba9..60eff3bb76dc 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -24,7 +24,7 @@ . = ..() disrupt() -/obj/item/chameleon/attack_self(mob/user) +/obj/item/chameleon/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index e82c7391e25b..a4fbf5815dcc 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -218,7 +218,7 @@ var/global/list/obj/item/communicator/all_communicators = list() // Parameters: 1 (user - the mob that clicked the device in their hand) // Description: Makes an exonet datum if one does not exist, allocates an address for it, maintains the lists of all devies, clears the alert icon, and // finally makes NanoUI appear. -/obj/item/communicator/attack_self(mob/user) +/obj/item/communicator/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 2a5583c94fbd..15fd3ff0b056 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -119,7 +119,7 @@ /obj/item/flashlight/AltClick(mob/user) attack_self(user) -/obj/item/flashlight/attack_self(mob/user) +/obj/item/flashlight/attack_self(mob/user, datum/event_args/clickchain/e_args) if(power_use) if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc].") //To prevent some lighting anomalities. @@ -357,7 +357,7 @@ src.damtype = initial(src.damtype) update_appearance() -/obj/item/flashlight/flare/attack_self(mob/user) +/obj/item/flashlight/flare/attack_self(mob/user, datum/event_args/clickchain/e_args) // Usual checks if(!fuel) @@ -414,7 +414,7 @@ on = FALSE update_appearance() -/obj/item/flashlight/glowstick/attack_self(mob/user) +/obj/item/flashlight/glowstick/attack_self(mob/user, datum/event_args/clickchain/e_args) if(!fuel) to_chat(user, SPAN_NOTICE("The glowstick has already been turned on.")) @@ -476,5 +476,5 @@ /obj/item/flashlight/slime/update_appearance(updates = ~UPDATE_ICON_STATE) return ..() -/obj/item/flashlight/slime/attack_self(mob/user) +/obj/item/flashlight/slime/attack_self(mob/user, datum/event_args/clickchain/e_args) return //Bio-luminescence does not toggle. diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index 0469c6bdaa15..35b576a1e0ea 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -100,7 +100,7 @@ new painting_decal(F, painting_dir, painting_colour) -/obj/item/floor_painter/attack_self(mob/user) +/obj/item/floor_painter/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index f6029a911f9b..9bf7dce58944 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -131,7 +131,7 @@ current_tick_amount += amount update_appearance() -/obj/item/geiger_counter/attack_self(mob/user) +/obj/item/geiger_counter/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index d276e9d47e8a..01adcabe0ce3 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -161,7 +161,7 @@ update_icon() visible_message(SPAN_WARNING("[src] clicks, resetting itself from the electromagnetic interference.")) -/obj/item/gps/attack_self(mob/user) +/obj/item/gps/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm index d4caf4057537..0973c2c4079c 100644 --- a/code/game/objects/items/devices/holowarrant.dm +++ b/code/game/objects/items/devices/holowarrant.dm @@ -22,7 +22,7 @@ to_chat(user, "You have to go closer if you want to read it.") //hit yourself with it -/obj/item/holowarrant/attack_self(mob/user) +/obj/item/holowarrant/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index b86503f1b824..7d7a726422de 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -134,7 +134,7 @@ return -/obj/item/lightreplacer/attack_self(mob/user) +/obj/item/lightreplacer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index f00117a77351..0819a7aa7207 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -41,7 +41,7 @@ spamcheck = 0 return -/obj/item/megaphone/attack_self(mob/user) +/obj/item/megaphone/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index e01568003e6a..5dfd915266e1 100755 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -46,7 +46,7 @@ return update_icon() -/obj/item/multitool/attack_self(mob/user) +/obj/item/multitool/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 3cbe511fad9f..058a039c85d7 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -33,7 +33,7 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/paicard) QDEL_NULL(radio) return ..() -/obj/item/paicard/attack_self(mob/user) +/obj/item/paicard/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 03e712d293df..39d0b66f6786 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -22,7 +22,7 @@ P.change_color(pipe_colors[mode]) -/obj/item/pipe_painter/attack_self(mob/user) +/obj/item/pipe_painter/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 251606c0bcca..903c2961be38 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -88,7 +88,7 @@ GLOBAL_LIST_BOILERPLATE(all_beacons, /obj/item/radio/beacon) desc = "A label on it reads: Activate to have a singularity beacon teleported to your location." origin_tech = list(TECH_BLUESPACE = 1, TECH_ILLEGAL = 7) -/obj/item/radio/beacon/syndicate/attack_self(mob/user) +/obj/item/radio/beacon/syndicate/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index 91445e2888e9..974becc3ea39 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -78,7 +78,7 @@ var/global/list/active_radio_jammers = list() else return ..() -/obj/item/radio_jammer/attack_self(mob/user) +/obj/item/radio_jammer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 3d4d09b3e392..2dd3a60b1f55 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list( radio_controller.remove_object(src, radiochannels[ch_name]) return ..() -/obj/item/radio/attack_self(mob/user) +/obj/item/radio/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 7cd3bb4c9acf..3ed4749cd39f 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -377,7 +377,7 @@ HALOGEN COUNTER - Radcount on mobs return atmosanalyzer_scan(src, air, user) -/obj/item/analyzer/attack_self(mob/user) +/obj/item/analyzer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -433,7 +433,7 @@ HALOGEN COUNTER - Radcount on mobs else icon_state = initial(icon_state) -/obj/item/mass_spectrometer/attack_self(mob/user) +/obj/item/mass_spectrometer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/scanners_vr.dm b/code/game/objects/items/devices/scanners_vr.dm index ad23160b97c6..e5ff303b8080 100644 --- a/code/game/objects/items/devices/scanners_vr.dm +++ b/code/game/objects/items/devices/scanners_vr.dm @@ -23,7 +23,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob scan_mob(target, user) to_chat(user,"Not a compatible subject to work with!") -/obj/item/sleevemate/attack_self(mob/user) +/obj/item/sleevemate/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index dd8673d30f20..8ea9c02bf5b5 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -20,7 +20,7 @@ . = ..() camera = new camtype(src) -/obj/item/camerabug/attack_self(mob/user) +/obj/item/camerabug/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -137,7 +137,7 @@ var/obj/machinery/camera/bug/selected_camera var/list/obj/machinery/camera/bug/cameras = new() -/obj/item/bug_monitor/attack_self(mob/user) +/obj/item/bug_monitor/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index d32a4a0219a7..92e88aff1770 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -123,7 +123,7 @@ STOP_PROCESSING(SSobj, src) updateicon() -/obj/item/suit_cooling_unit/attack_self(mob/user) +/obj/item/suit_cooling_unit/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index b214d3e30146..9302c20813b1 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -26,7 +26,7 @@ /obj/item/t_scanner/AltClick() set_active(!on) -/obj/item/t_scanner/attack_self(mob/user) +/obj/item/t_scanner/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/tape_recorder/cassette_tape.dm b/code/game/objects/items/devices/tape_recorder/cassette_tape.dm index 4d1749bbc8de..1b28c5b47fd6 100644 --- a/code/game/objects/items/devices/tape_recorder/cassette_tape.dm +++ b/code/game/objects/items/devices/tape_recorder/cassette_tape.dm @@ -97,7 +97,7 @@ /obj/item/cassette_tape/fire_act() ruin() -/obj/item/cassette_tape/attack_self(mob/user) +/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm index 69c6379fafa2..21f53b5a2c7c 100644 --- a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm +++ b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm @@ -438,7 +438,7 @@ /obj/item/tape_recorder/proc/print_cooldown() TIMER_COOLDOWN_START(src, CD_INDEX_TAPE_PRINT, 30 SECONDS) -/obj/item/tape_recorder/attack_self(mob/user) +/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index c442990651bb..1f8a273fddb9 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -341,7 +341,7 @@ canprint = 1 -/obj/item/tape_recorder/attack_self(mob/user) +/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -389,7 +389,7 @@ /obj/item/cassette_tape/fire_act() ruin() -/obj/item/cassette_tape/attack_self(mob/user) +/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/text_to_speech.dm b/code/game/objects/items/devices/text_to_speech.dm index e2b96dd44629..e3a92ce20b05 100644 --- a/code/game/objects/items/devices/text_to_speech.dm +++ b/code/game/objects/items/devices/text_to_speech.dm @@ -6,7 +6,7 @@ w_class = ITEMSIZE_SMALL var/named -/obj/item/text_to_speech/attack_self(mob/user) +/obj/item/text_to_speech/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 47b3a19302cb..6dfc2d21303d 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -70,7 +70,7 @@ SStgui.update_uis(src) //Update all UIs attached to src return ..() -/obj/item/transfer_valve/attack_self(mob/user) +/obj/item/transfer_valve/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm index 7bd4ed16d291..f96be7693dc8 100644 --- a/code/game/objects/items/devices/translator.dm +++ b/code/game/objects/items/devices/translator.dm @@ -88,7 +88,7 @@ var/datum/translation_context/variable/ours = context ours.copy_knowledge(theirs) -/obj/item/universal_translator/attack_self(mob/user) +/obj/item/universal_translator/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index d05f63514c4b..b28dffbe7ea4 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -43,7 +43,7 @@ radio.hear_talk(M,msg,verb,speaking) ..() -/obj/item/tvcamera/attack_self(mob/user) +/obj/item/tvcamera/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index 67c2d29cc973..b78106587f9a 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -224,7 +224,7 @@ hidden_uplink = new(src, target_mind, telecrystals) icon_state = "radio" -/obj/item/radio/uplink/attack_self(mob/user) +/obj/item/radio/uplink/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -235,7 +235,7 @@ . = ..() hidden_uplink = new(src) -/obj/item/multitool/uplink/attack_self(mob/user) +/obj/item/multitool/uplink/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index 662185d6905c..e7bc479893c2 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -28,7 +28,7 @@ to_chat(usr, "You configure the hailer to shout \"[use_message]\".") -/obj/item/hailer/attack_self(mob/user) +/obj/item/hailer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/gifts.dm b/code/game/objects/items/gifts.dm index 3e21d1d47211..51449b6da972 100644 --- a/code/game/objects/items/gifts.dm +++ b/code/game/objects/items/gifts.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(possible_gifts) . = ..() . += SPAN_NOTICE("It contains \a [initial(contains_type.name)].") -/obj/item/a_gift/attack_self(mob/user) +/obj/item/a_gift/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index 5b5e9ca52c11..357939eccbc2 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -41,7 +41,7 @@ update_icon() return -/obj/item/glass_jar/attack_self(mob/user) +/obj/item/glass_jar/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/godfigures.dm b/code/game/objects/items/godfigures.dm index a459057dd7d2..7a7febc3fd23 100644 --- a/code/game/objects/items/godfigures.dm +++ b/code/game/objects/items/godfigures.dm @@ -10,7 +10,7 @@ throw_force = 10 w_class = ITEMSIZE_SMALL -/obj/item/godfig/attack_self(mob/user) +/obj/item/godfig/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/gunbox.dm b/code/game/objects/items/gunbox.dm index d78b46ad8dfd..018a3303657b 100644 --- a/code/game/objects/items/gunbox.dm +++ b/code/game/objects/items/gunbox.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" -/obj/item/gunbox/attack_self(mob/user) +/obj/item/gunbox/attack_self(mob/user, datum/event_args/clickchain/e_args) var/list/options = list() options["NT Mk58 (.45)"] = list(/obj/item/gun/ballistic/sec, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/flash) options["SW 625 Revolver (.45)"] = list(/obj/item/gun/ballistic/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber) @@ -24,7 +24,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" -/obj/item/gunbox/lethal/attack_self(mob/user) +/obj/item/gunbox/lethal/attack_self(mob/user, datum/event_args/clickchain/e_args) var/list/options = list() options["M1911 Dynamic (.45)"] = list(/obj/item/gun/ballistic/colt, /obj/item/ammo_magazine/m45, /obj/item/ammo_magazine/m45) options["SW 625 Revolver (.45)"] = list(/obj/item/gun/ballistic/revolver/detective45, /obj/item/ammo_magazine/s45, /obj/item/ammo_magazine/s45) @@ -46,7 +46,7 @@ icon_state = "gunbox" w_class = ITEMSIZE_HUGE -/obj/item/gunbox/attack_self(mob/user) +/obj/item/gunbox/attack_self(mob/user, datum/event_args/clickchain/e_args) var/list/options = list() options[".45 Pistol"] = list(/obj/item/gun/ballistic/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber) options[".45 Revolver"] = list(/obj/item/gun/ballistic/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber) @@ -67,7 +67,7 @@ icon_state = "gunbox" w_class = ITEMSIZE_HUGE -/obj/item/gunbox/marksman/attack_self(mob/user) +/obj/item/gunbox/marksman/attack_self(mob/user, datum/event_args/clickchain/e_args) var/list/options = list() options["Marksman Energy Rifle"] = list(/obj/item/gun/energy/sniperrifle/locked) options["M1A Garand"] = list(/obj/item/gun/ballistic/garand/sniper, /obj/item/storage/belt/security/tactical/bandolier, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter) // 7 clips, 56 rounds @@ -87,7 +87,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "donkbox" -/obj/item/gunbox/donksoft/attack_self(mob/user) +/obj/item/gunbox/donksoft/attack_self(mob/user, datum/event_args/clickchain/e_args) var/list/options = list() options["Classic DONKsoft Pistol"] = list(/obj/item/gun/ballistic/pistol/foam, /obj/item/ammo_magazine/mfoam/pistol, /obj/item/ammo_magazine/mfoam/pistol) options["Blue DONKsoft Pistol"] = list(/obj/item/gun/ballistic/pistol/foam/blue, /obj/item/ammo_magazine/mfoam/pistol, /obj/item/ammo_magazine/mfoam/pistol) @@ -107,7 +107,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "donkbox2" -/obj/item/gunbox/donksoft/shotgun/attack_self(mob/user) +/obj/item/gunbox/donksoft/shotgun/attack_self(mob/user, datum/event_args/clickchain/e_args) var/list/options = list() options["Classic DONKsoft Shotgun"] = list(/obj/item/gun/ballistic/shotgun/pump/foam, /obj/item/storage/box/foamdart, /obj/item/storage/box/foamdart) options["Blue DONKsoft Shotgun"] = list(/obj/item/gun/ballistic/shotgun/pump/foam/blue, /obj/item/storage/box/foamdart, /obj/item/storage/box/foamdart) @@ -126,7 +126,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "donkbox3" -/obj/item/gunbox/donksoft/smg/attack_self(mob/user) +/obj/item/gunbox/donksoft/smg/attack_self(mob/user, datum/event_args/clickchain/e_args) var/list/options = list() options["Classic DONKsoft SMG"] = list(/obj/item/gun/ballistic/automatic/advanced_smg/foam, /obj/item/ammo_magazine/mfoam/smg, /obj/item/ammo_magazine/mfoam/smg) options["Blue DONKsoft SMG"] = list(/obj/item/gun/ballistic/automatic/advanced_smg/foam/blue, /obj/item/ammo_magazine/mfoam/smg, /obj/item/ammo_magazine/mfoam/smg) @@ -145,7 +145,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" -/obj/item/gunbox/carrier/blueshield/attack_self(mob/user) +/obj/item/gunbox/carrier/blueshield/attack_self(mob/user, datum/event_args/clickchain/e_args) var/list/options = list() options["\improper Black Carrier"] = list(/obj/item/clothing/suit/storage/hooded/covertcarrier/blueshield) options["\improper Black-Short Carrier"] = list(/obj/item/clothing/suit/storage/hooded/covertcarrier/blueshield/alt) @@ -165,7 +165,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" -/obj/item/gunbox/armor/security/attack_self(mob/user) +/obj/item/gunbox/armor/security/attack_self(mob/user, datum/event_args/clickchain/e_args) var/list/options = list() options["\improper Flat Vest"] = list(/obj/item/clothing/suit/armor/vest) options["\improper Security Vest"] = list(/obj/item/clothing/suit/armor/vest/alt) diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 12c53c4f2d8a..c54fa49f67b8 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -48,7 +48,7 @@ else to_chat(user, "[src] is projecting at max capacity!") -/obj/item/holosign_creator/attack_self(mob/user) +/obj/item/holosign_creator/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -114,7 +114,7 @@ holosign_type = /obj/structure/holosign/barrier/cyborg var/shock = 0 -/obj/item/holosign_creator/cyborg/attack_self(mob/user) +/obj/item/holosign_creator/cyborg/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/id_cards/station_ids.dm b/code/game/objects/items/id_cards/station_ids.dm index edc8570f3826..00a536083cce 100644 --- a/code/game/objects/items/id_cards/station_ids.dm +++ b/code/game/objects/items/id_cards/station_ids.dm @@ -138,7 +138,7 @@ //dat += "" return dat -/obj/item/card/id/attack_self(mob/user) +/obj/item/card/id/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/id_cards/syndicate_ids.dm b/code/game/objects/items/id_cards/syndicate_ids.dm index 4b7829c017f9..afbbbc13fdf0 100644 --- a/code/game/objects/items/id_cards/syndicate_ids.dm +++ b/code/game/objects/items/id_cards/syndicate_ids.dm @@ -29,7 +29,7 @@ if(player_is_antag(user.mind)) to_chat(user, "The microscanner activates as you pass it over the ID, copying its access.") -/obj/item/card/id/syndicate/attack_self(mob/user) +/obj/item/card/id/syndicate/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index d807d6a8631c..fd4f05baa947 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -161,7 +161,7 @@ inducing = FALSE user.visible_message(SPAN_NOTICE("[user] recharged [A]."), SPAN_NOTICE("Rechraged [A] with [used] units of power.")) -/obj/item/inducer/attack_self(mob/user) +/obj/item/inducer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/pizza_voucher.dm b/code/game/objects/items/pizza_voucher.dm index 060e9f4c5f1f..716c214b4f48 100644 --- a/code/game/objects/items/pizza_voucher.dm +++ b/code/game/objects/items/pizza_voucher.dm @@ -20,7 +20,7 @@ "WE ALWAYS DELIVER! WE ALWAYS DELIVER! WE ALWAYS DELIVER!") desc = "A pocket-sized plastic slip with a button in the middle. \"[pick(descstrings)]\" is written on the back." -/obj/item/pizzavoucher/attack_self(mob/user) +/obj/item/pizzavoucher/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/robobag.dm b/code/game/objects/items/robobag.dm index 6b67f589540e..e13e00fdcd83 100644 --- a/code/game/objects/items/robobag.dm +++ b/code/game/objects/items/robobag.dm @@ -8,7 +8,7 @@ item_state = "bodybag_cryo_folded" origin_tech = list(TECH_ENGINEERING = 3) -/obj/item/bodybag/cryobag/robobag/attack_self(mob/user) +/obj/item/bodybag/cryobag/robobag/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/robot/gripper.dm b/code/game/objects/items/robot/gripper.dm index 184af1b4e6c9..9b605c4ed9d0 100644 --- a/code/game/objects/items/robot/gripper.dm +++ b/code/game/objects/items/robot/gripper.dm @@ -74,7 +74,7 @@ /obj/item/gripper/CtrlClick(mob/user) drop_item() -/obj/item/gripper/attack_self(mob/user) +/obj/item/gripper/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -313,7 +313,7 @@ /obj/item/gripper/no_use //Used when you want to hold and put items in other things, but not able to 'use' the item -/obj/item/gripper/no_use/attack_self(mob/user) +/obj/item/gripper/no_use/attack_self(mob/user, datum/event_args/clickchain/e_args) return /obj/item/gripper/no_use/organ/robotics diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 07b83075f195..ec1dce2e19d3 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -39,7 +39,7 @@ item_state = "cyborg_upgrade" var/heldname = "default name" -/obj/item/borg/upgrade/rename/attack_self(mob/user) +/obj/item/borg/upgrade/rename/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index 6e3166f33c58..4881d274069c 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -27,7 +27,7 @@ else return ..() -/obj/item/picket_sign/attack_self(mob/user) +/obj/item/picket_sign/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/spritechanger.dm b/code/game/objects/items/spritechanger.dm index 62a031f15100..1a8768742695 100644 --- a/code/game/objects/items/spritechanger.dm +++ b/code/game/objects/items/spritechanger.dm @@ -13,7 +13,7 @@ after the sprite has been set you can use it again to remove overlays that may h var/path var/state -/obj/item/spritechanger/attack_self(mob/user) +/obj/item/spritechanger/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm index 45ef3a8ad557..f0492249a2d2 100644 --- a/code/game/objects/items/stacks/marker_beacons.dm +++ b/code/game/objects/items/stacks/marker_beacons.dm @@ -50,7 +50,7 @@ var/list/marker_beacon_colors = list( /obj/item/stack/marker_beacon/update_icon() icon_state = "[initial(icon_state)][lowertext(picked_color)]" -/obj/item/stack/marker_beacon/attack_self(mob/user) +/obj/item/stack/marker_beacon/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 259293a41609..149a524307c3 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -73,7 +73,7 @@ var/global/list/datum/stack_recipe/rods_recipes = list( \ ..() /* -/obj/item/stack/rods/attack_self(mob/user) +/obj/item/stack/rods/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 4b9f7f8203cd..3edd996a9069 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -19,7 +19,7 @@ drop_sound = 'sound/items/drop/glass.ogg' pickup_sound = 'sound/items/pickup/glass.ogg' -/obj/item/stack/material/glass/attack_self(mob/user) +/obj/item/stack/material/glass/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d5333edad638..2960ae38866a 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -74,7 +74,7 @@ else . += "There is enough charge for [get_amount()]." -/obj/item/stack/attack_self(mob/user) +/obj/item/stack/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index f53c31ff9557..015fcf7e9758 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -23,7 +23,7 @@ to_chat(user, "There are not enough telecrystals to do that.") return NONE -/obj/item/stack/telecrystal/attack_self(mob/user) +/obj/item/stack/telecrystal/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/_storage.dm b/code/game/objects/items/storage/_storage.dm index f90b3d9b3772..68bc71ff00f4 100644 --- a/code/game/objects/items/storage/_storage.dm +++ b/code/game/objects/items/storage/_storage.dm @@ -598,7 +598,7 @@ O.emp_act(severity) ..() -/obj/item/storage/attack_self(mob/user) +/obj/item/storage/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -723,7 +723,7 @@ closed_state = "[initial(icon_state)]" . = ..() -/obj/item/storage/trinketbox/attack_self(mob/user) +/obj/item/storage/trinketbox/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index d9a32fdf14b2..b0dacffcfac3 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -42,7 +42,7 @@ // todo: implement dynamic state, like how /tg/ boxes work // BubbleWrap - A box can be folded up to make card -/obj/item/storage/box/attack_self(mob/user) +/obj/item/storage/box/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/laundry_basket.dm b/code/game/objects/items/storage/laundry_basket.dm index 34eb88f15d11..bbfe38b78c07 100644 --- a/code/game/objects/items/storage/laundry_basket.dm +++ b/code/game/objects/items/storage/laundry_basket.dm @@ -21,21 +21,12 @@ var/linked /obj/item/storage/laundry_basket/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.get_organ("r_hand") - if (H.hand) - temp = H.get_organ("l_hand") - if(!temp) - to_chat(user, "You need two hands to pick this up!") - return - if(user.get_inactive_held_item()) to_chat(user, "You need your other hand to be empty") return return ..() -/obj/item/storage/laundry_basket/attack_self(mob/user) +/obj/item/storage/laundry_basket/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 26347d284b6c..2e66168311a9 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -77,7 +77,7 @@ ..() -/obj/item/storage/secure/attack_self(mob/user) +/obj/item/storage/secure/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/single_use/_single_use.dm b/code/game/objects/items/storage/single_use/_single_use.dm index 7825fead571c..b9c3e4a8fb86 100644 --- a/code/game/objects/items/storage/single_use/_single_use.dm +++ b/code/game/objects/items/storage/single_use/_single_use.dm @@ -21,7 +21,7 @@ robot.hud_used.toggle_show_robot_modules() return ..(user, TRUE) -/obj/item/storage/single_use/attack_self(mob/user) +/obj/item/storage/single_use/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/single_use/med_pouch.dm b/code/game/objects/items/storage/single_use/med_pouch.dm index 5558fe6bbb71..6f5140b97876 100644 --- a/code/game/objects/items/storage/single_use/med_pouch.dm +++ b/code/game/objects/items/storage/single_use/med_pouch.dm @@ -50,7 +50,7 @@ . = ..() desc += instructions -/obj/item/storage/single_use/med_pouch/attack_self(mob/user) +/obj/item/storage/single_use/med_pouch/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 6edc8c1509e6..f6c84b1fbddc 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -112,7 +112,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/crowbar/power/attack_self(mob/user) +/obj/item/tool/crowbar/power/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 2ab66c31d2d8..b4defc579d1f 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -166,7 +166,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/screwdriver/power/attack_self(mob/user) +/obj/item/tool/screwdriver/power/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/switchtool.dm b/code/game/objects/items/tools/switchtool.dm index 64a57623544d..60cfa9dd6b41 100644 --- a/code/game/objects/items/tools/switchtool.dm +++ b/code/game/objects/items/tools/switchtool.dm @@ -104,7 +104,7 @@ module_string += "\a [module.name], " return module_string -/obj/item/switchtool/attack_self(mob/user) +/obj/item/switchtool/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 045b1dc029dc..f7c4601e6400 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -149,7 +149,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 50, 1) -/obj/item/weldingtool/attack_self(mob/user) +/obj/item/weldingtool/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index f2c4f501d63a..f7f8c37137f5 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -140,7 +140,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/wirecutters/power/attack_self(mob/user) +/obj/item/tool/wirecutters/power/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index acabc9ac3d7b..11efdd5b58a9 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -143,7 +143,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/wrench/power/attack_self(mob/user) +/obj/item/tool/wrench/power/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ba37a1099c89..393efe4ef4f7 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -265,7 +265,7 @@ w_class = ITEMSIZE_SMALL attack_verb = list("attacked", "struck", "hit") -/obj/item/toy/sword/attack_self(mob/user) +/obj/item/toy/sword/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -420,7 +420,7 @@ w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS | SLOT_HOLSTER -/obj/item/toy/bosunwhistle/attack_self(mob/user) +/obj/item/toy/bosunwhistle/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -438,7 +438,7 @@ var/cooldown = 0 //all credit to skasi for toy mech fun ideas -/obj/item/toy/prize/attack_self(mob/user) +/obj/item/toy/prize/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -525,7 +525,7 @@ . = ..() desc = "A \"Space Life\" brand [name]" -/obj/item/toy/figure/attack_self(mob/user) +/obj/item/toy/figure/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -790,7 +790,7 @@ playsound(src, bitesound, 20, 1) // Play bite sound in local area // Attack self -/obj/item/toy/plushie/carp/attack_self(mob/user) +/obj/item/toy/plushie/carp/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -902,7 +902,7 @@ var/last_message = 0 var/pokephrase = "Uww!" -/obj/item/toy/plushie/attack_self(mob/user) +/obj/item/toy/plushie/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1368,7 +1368,7 @@ var/cooldown = 0 var/list/possible_answers = list("Definitely.", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.") -/obj/item/toy/eight_ball/attack_self(mob/user) +/obj/item/toy/eight_ball/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1443,7 +1443,7 @@ w_class = ITEMSIZE_SMALL var/cooldown = 0 /* -/obj/item/toy/AI/attack_self(mob/user) +/obj/item/toy/AI/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1465,7 +1465,7 @@ w_class = ITEMSIZE_SMALL var/cooldown = 0 -/obj/item/toy/owl/attack_self(mob/user) +/obj/item/toy/owl/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1486,7 +1486,7 @@ w_class = ITEMSIZE_SMALL var/cooldown = 0 -/obj/item/toy/griffin/attack_self(mob/user) +/obj/item/toy/griffin/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1507,7 +1507,7 @@ w_class = ITEMSIZE_SMALL var/cooldown = 0 -/obj/item/toy/cowgirlprize/attack_self(mob/user) +/obj/item/toy/cowgirlprize/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1528,7 +1528,7 @@ w_class = ITEMSIZE_SMALL var/cooldown = 0 -/obj/item/toy/snakeoilprize/attack_self(mob/user) +/obj/item/toy/snakeoilprize/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1574,7 +1574,7 @@ max_w_class = ITEMSIZE_SMALL max_storage_space = INVENTORY_BOX_SPACE -/obj/item/storage/daki/attack_self(mob/user) +/obj/item/storage/daki/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 10a062f1352f..bc5058a13c33 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -130,7 +130,7 @@ AI MODULES desc = "A 'safeguard' AI module: 'Safeguard . Anyone threatening or attempting to harm is no longer to be considered a crew member, and is a threat which must be neutralized.'" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) -/obj/item/aiModule/safeguard/attack_self(mob/user) +/obj/item/aiModule/safeguard/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -159,7 +159,7 @@ AI MODULES desc = "A 'one crew member' AI module: 'Only is a crew member.'" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) //made with diamonds! -/obj/item/aiModule/oneHuman/attack_self(mob/user) +/obj/item/aiModule/oneHuman/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -243,7 +243,7 @@ AI MODULES desc = "A 'freeform' AI module: ''" origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) -/obj/item/aiModule/freeform/attack_self(mob/user) +/obj/item/aiModule/freeform/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -362,7 +362,7 @@ AI MODULES desc = "A 'freeform' Core AI module: ''" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) -/obj/item/aiModule/freeformcore/attack_self(mob/user) +/obj/item/aiModule/freeformcore/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -389,7 +389,7 @@ AI MODULES desc = "A hacked AI law module: ''" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6, TECH_ILLEGAL = 7) -/obj/item/aiModule/syndicate/attack_self(mob/user) +/obj/item/aiModule/syndicate/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index f12d4fac3951..d5ccf71dcddd 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -103,7 +103,7 @@ return TRUE // Changes which mode it is on. -/obj/item/rcd/attack_self(mob/user) +/obj/item/rcd/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -363,7 +363,7 @@ /obj/item/rcd/electric/mounted/hardsuit // Old method for swapping modes as there is no way to bring up the radial. -/obj/item/rcd/electric/mounted/hardsuit/attack_self(mob/user) +/obj/item/rcd/electric/mounted/hardsuit/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index fcaf1ab2cf4b..955e7b304515 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -106,7 +106,7 @@ // UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) // return ..() -/obj/item/pipe_dispenser/attack_self(mob/user) +/obj/item/pipe_dispenser/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 9f5624c674ab..0ff1907697b8 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -62,7 +62,7 @@ RSF else glasstype = /obj/item/reagent_containers/food/drinks/metaglass -/obj/item/rsf/attack_self(mob/user) +/obj/item/rsf/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/barrier_tape.dm b/code/game/objects/items/weapons/barrier_tape.dm index 40f9e73474d8..42a0173157a1 100644 --- a/code/game/objects/items/weapons/barrier_tape.dm +++ b/code/game/objects/items/weapons/barrier_tape.dm @@ -137,7 +137,7 @@ var/list/tape_roll_applications = list() update_icon() return ..() -/obj/item/barrier_tape_roll/attack_self(mob/user) +/obj/item/barrier_tape_roll/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index d902d74c9c4d..7f6e48f7ca78 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -61,7 +61,7 @@ var/turf/T = loc T.hotspot_expose(700, 5) -/obj/item/flame/candle/attack_self(mob/user) +/obj/item/flame/candle/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 1fe020c3069c..79bf2414c416 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -305,7 +305,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM else to_chat(user, "[src] is full.") -/obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user) +/obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user, datum/event_args/clickchain/e_args) if(lit == 1) if(user.a_intent == INTENT_HARM) user.visible_message("[user] drops and treads on the lit [src], putting it out instantly.") @@ -435,7 +435,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM . = ..() name = "empty [initial(name)]" -/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user) +/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user, datum/event_args/clickchain/e_args) if(lit == 1) if(user.a_intent == INTENT_HARM) user.visible_message("[user] empties the lit [src] on the floor!.") @@ -590,7 +590,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM item_state = icon_state base_state = icon_state -/obj/item/flame/lighter/attack_self(mob/user) +/obj/item/flame/lighter/attack_self(mob/user, datum/event_args/clickchain/e_args) if(!base_state) base_state = icon_state if(!lit) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index a2f72b9f9f97..0da5f599fbb8 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -69,7 +69,7 @@ /* * Bike Horns */ -/obj/item/bikehorn/attack_self(mob/user) +/obj/item/bikehorn/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 2ea8e4204ba7..e8601a1fa037 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -56,7 +56,7 @@ colour = pick("red","orange","yellow","jade","cyan","purple","pink","maroon","black","white") name = "[colour] lipstick" -/obj/item/lipstick/attack_self(mob/user) +/obj/item/lipstick/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -102,7 +102,7 @@ icon = 'icons/obj/items.dmi' icon_state = "purplecomb" -/obj/item/haircomb/attack_self(mob/user) +/obj/item/haircomb/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -130,7 +130,7 @@ icon_state = "trinketbox" var/list/ui_users = list() -/obj/item/makeover/attack_self(mob/user) +/obj/item/makeover/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/duct_tape.dm b/code/game/objects/items/weapons/duct_tape.dm index 3d8879846752..b1c248589a6b 100644 --- a/code/game/objects/items/weapons/duct_tape.dm +++ b/code/game/objects/items/weapons/duct_tape.dm @@ -129,7 +129,7 @@ return return ..() -/obj/item/duct_tape_roll/attack_self(mob/user) +/obj/item/duct_tape_roll/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -180,7 +180,7 @@ name = W.name + " (taped)" copy_overlays(W) -/obj/item/duct_tape_piece/attack_self(mob/user) +/obj/item/duct_tape_piece/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index bbe6642ae229..9d32a4fecc32 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -38,7 +38,7 @@ else ..() -/obj/item/plastique/attack_self(mob/user) +/obj/item/plastique/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index ba3640fb08b0..c1bc9f343d66 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -49,7 +49,7 @@ . = ..() . += "[icon2html(thing = src, target = user)] [src.name] contains [src.reagents.total_volume] units of water left!" -/obj/item/extinguisher/attack_self(mob/user) +/obj/item/extinguisher/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index b6c572d7eb89..bb484ccf038d 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -123,7 +123,7 @@ return -/obj/item/flamethrower/attack_self(mob/user) +/obj/item/flamethrower/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 3889fb03fcd2..81f1a1dc320c 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -25,7 +25,7 @@ else icon_state = "gift[pick(1, 2, 3)]" -/obj/item/gift/attack_self(mob/user) +/obj/item/gift/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -59,7 +59,7 @@ qdel(src) -/obj/item/a_gift/attack_self(mob/user) +/obj/item/a_gift/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -128,7 +128,7 @@ pixel_x = rand(-10,10) pixel_y = rand(-10,10) -/obj/item/gift/attack_self(mob/user) +/obj/item/gift/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -143,7 +143,7 @@ /obj/item/b_gift/legacy_ex_act() qdel(src) -/obj/item/b_gift/attack_self(mob/user) +/obj/item/b_gift/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 5ad09b4e7148..307607b60322 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -25,7 +25,7 @@ QDEL_LIST_NULL(beakers) return ..() -/obj/item/grenade/chem_grenade/attack_self(mob/user) +/obj/item/grenade/chem_grenade/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 1bbf42045cd8..1c0ccdd91c52 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -53,7 +53,7 @@ . += "The [src] is set for instant detonation." -/obj/item/grenade/attack_self(mob/user) +/obj/item/grenade/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index bbbdcd5fba66..7ea4ec31b21f 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -105,32 +105,6 @@ user.drop_all_held_items() user.stop_pulling() -var/last_chew = 0 -/mob/living/carbon/human/RestrainedClickOn(var/atom/A) - if (A != src) return ..() - if (last_chew + 26 > world.time) return - - var/mob/living/carbon/human/H = A - if (!H.handcuffed) return - if (H.a_intent != INTENT_HARM) return - if (H.zone_sel.selecting != O_MOUTH) return - if (H.wear_mask) return - if (istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket)) return - - var/obj/item/organ/external/O = H.organs_by_name[(H.hand % 2? BP_L_HAND : BP_R_HAND)] - if (!O) return - - var/datum/gender/T = GLOB.gender_datums[H.get_visible_gender()] - - var/s = "[H.name] chews on [T.his] [O.name]!" - H.visible_message(s, "You chew on your [O.name]!") - add_attack_logs(H,H,"chewed own [O.name]") - - if(O.take_damage(3,0,1,1,"teeth marks")) - H:UpdateDamageIcon() - - last_chew = world.time - /obj/item/handcuffs/fuzzy name = "fuzzy cuffs" icon_state = "fuzzycuff" diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index 0ce4b552f419..7637d95b7b91 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -14,7 +14,7 @@ w_class = ITEMSIZE_TINY var/list/item_quants = list() -/obj/item/seedbag/attack_self(mob/user) +/obj/item/seedbag/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implantcircuits.dm b/code/game/objects/items/weapons/implants/implantcircuits.dm index 9ec47f6d9943..7645e690e169 100644 --- a/code/game/objects/items/weapons/implants/implantcircuits.dm +++ b/code/game/objects/items/weapons/implants/implantcircuits.dm @@ -45,7 +45,7 @@ else ..() -/obj/item/implant/integrated_circuit/attack_self(mob/user) +/obj/item/implant/integrated_circuit/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 9c9737963af8..1856bd8319df 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -10,7 +10,7 @@ var/obj/item/implant/imp = null var/active = 1 -/obj/item/implanter/attack_self(mob/user) +/obj/item/implanter/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index cf82dc06c786..d767ea876fe1 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -48,7 +48,7 @@ return -/obj/item/implantpad/attack_self(mob/user) +/obj/item/implantpad/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/chainsaw.dm b/code/game/objects/items/weapons/material/chainsaw.dm index 064c8a5ec652..468b9e920501 100644 --- a/code/game/objects/items/weapons/material/chainsaw.dm +++ b/code/game/objects/items/weapons/material/chainsaw.dm @@ -58,7 +58,7 @@ on = 0 update_icon() -/obj/item/chainsaw/attack_self(mob/user) +/obj/item/chainsaw/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/gravemarker.dm b/code/game/objects/items/weapons/material/gravemarker.dm index 00fde5252715..9dc1d4640786 100644 --- a/code/game/objects/items/weapons/material/gravemarker.dm +++ b/code/game/objects/items/weapons/material/gravemarker.dm @@ -57,7 +57,7 @@ ..() -/obj/item/material/gravemarker/attack_self(mob/user) +/obj/item/material/gravemarker/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index aae4f571ae06..0791582e3091 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -55,7 +55,7 @@ force_divisor = 0.1 // 6 when wielded with hardness 60 (steel) thrown_force_divisor = 0.2 // 4 when thrown with weight 20 (steel) -/obj/item/material/butterfly/attack_self(mob/user) +/obj/item/material/butterfly/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 8b5a6ff49236..68ca39271707 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -100,7 +100,7 @@ w_class = ITEMSIZE_SMALL attack_verb = list("mushed", "splatted", "splooshed", "splushed") // Words that totally exist. -/obj/item/material/snow/snowball/attack_self(mob/user) +/obj/item/material/snow/snowball/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 4f8021a36601..d9592d7a3d8d 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -75,7 +75,7 @@ if(!bcell) . += "The blade does not have a power source installed." -/obj/item/melee/energy/attack_self(mob/user) +/obj/item/melee/energy/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -509,7 +509,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/melee/energy/blade/attack_self(mob/user) +/obj/item/melee/energy/blade/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -634,7 +634,7 @@ /obj/item/melee/energy/hfmachete/update_icon() icon_state = "[base_state][active]" -/obj/item/melee/energy/hfmachete/attack_self(mob/user) +/obj/item/melee/energy/hfmachete/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 4133ef1e5c11..1e9901a96611 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -48,7 +48,7 @@ . = ..() update_icon() -/obj/item/melee/umbrella/attack_self(mob/user) +/obj/item/melee/umbrella/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -267,7 +267,7 @@ if(SA_vulnerability & tm.mob_class) tm.apply_damage(SA_bonus_damage) // fuck em -/obj/item/melee/ashlander/elder/attack_self(mob/user) +/obj/item/melee/ashlander/elder/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -348,7 +348,7 @@ return 1 return 0 -/obj/item/melee/twohanded/attack_self(mob/user) +/obj/item/melee/twohanded/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -484,7 +484,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 50, 1) -/obj/item/melee/thermalcutter/attack_self(mob/user) +/obj/item/melee/thermalcutter/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index b47d9d0f31e5..c8df52a5dfcd 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/mop) create_reagents(30) -/obj/item/mop/attack_self(mob/user) +/obj/item/mop/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/mop_deploy.dm b/code/game/objects/items/weapons/mop_deploy.dm index 9fe51002d167..ca29a6a8d2d1 100644 --- a/code/game/objects/items/weapons/mop_deploy.dm +++ b/code/game/objects/items/weapons/mop_deploy.dm @@ -52,7 +52,7 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/mop_deploy/attack_self(mob/user) +/obj/item/mop_deploy/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/nullrod.dm b/code/game/objects/items/weapons/nullrod.dm index e9a3926575af..a61abe2db78b 100644 --- a/code/game/objects/items/weapons/nullrod.dm +++ b/code/game/objects/items/weapons/nullrod.dm @@ -40,7 +40,7 @@ if(SA_vulnerability & tm.mob_class) tm.apply_damage(SA_bonus_damage) // fuck em -/obj/item/nullrod/attack_self(mob/user) +/obj/item/nullrod/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -356,7 +356,7 @@ hitsound = 'sound/weapons/bite.ogg' var/used_blessing = FALSE -/obj/item/nullrod/carp/attack_self(mob/user) +/obj/item/nullrod/carp/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/other.dm b/code/game/objects/items/weapons/other.dm index 6a4075bbc7de..bd776e905995 100644 --- a/code/game/objects/items/weapons/other.dm +++ b/code/game/objects/items/weapons/other.dm @@ -84,7 +84,7 @@ flip_mobs() return ..() -/obj/item/bikehorn/golden/attack_self(mob/user) +/obj/item/bikehorn/golden/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -138,7 +138,7 @@ concealed_blade = temp_blade temp_blade.attack_self() -/obj/item/cane/concealed/attack_self(mob/user) +/obj/item/cane/concealed/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -207,7 +207,7 @@ damage_force = 3 var/on = 0 -/obj/item/cane/whitecane/collapsible/attack_self(mob/user) +/obj/item/cane/whitecane/collapsible/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 244c885ee6b2..31d96d62e6a2 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -10,7 +10,7 @@ throw_range = 20 origin_tech = list(TECH_BLUESPACE = 4) -/obj/item/teleportation_scroll/attack_self(mob/user) +/obj/item/teleportation_scroll/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index d7e95e16cef7..1cb715fd035f 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -124,7 +124,7 @@ return ..() return embedded_flash.attack_mob(arglist(args)) -/obj/item/shield/riot/flash/attack_self(mob/user) +/obj/item/shield/riot/flash/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -324,7 +324,7 @@ return (base_block_chance - round(damage / 3)) //block bullets and beams using the old block chance return base_block_chance -/obj/item/shield/energy/attack_self(mob/user) +/obj/item/shield/energy/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -400,7 +400,7 @@ else return 0 */ -/obj/item/shield/riot/tele/attack_self(mob/user) +/obj/item/shield/riot/tele/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 4810c8106726..d11c3252d8d9 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -108,7 +108,7 @@ else return ..() -/obj/item/melee/baton/attack_self(mob/user) +/obj/item/melee/baton/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 720eabe47c7a..ffcbcc6791bc 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -56,7 +56,7 @@ drop_sound = 'sound/items/drop/crowbar.ogg' pickup_sound = 'sound/items/pickup/crowbar.ogg' -/obj/item/melee/telebaton/attack_self(mob/user) +/obj/item/melee/telebaton/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -189,7 +189,7 @@ damage_force = 0 hitsound = "sound/items/bikehorn.ogg" -/obj/item/melee/stool/faiza/attack_self(mob/user) +/obj/item/melee/stool/faiza/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index c7eadc9c5c7a..d68f83d3e896 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -78,7 +78,7 @@ var/detonator_mode = 0 var/obj/item/syndie/c4explosive/bomb -/obj/item/flame/lighter/zippo/c4detonator/attack_self(mob/user) +/obj/item/flame/lighter/zippo/c4detonator/attack_self(mob/user, datum/event_args/clickchain/e_args) if(!detonator_mode) ..() diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 792dd885b539..a48d36eee239 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -209,7 +209,7 @@ var/list/global/tank_gauge_cache = list() -/obj/item/tank/attack_self(mob/user) +/obj/item/tank/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index b7665c9cbffb..3f56aa638f7e 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -23,7 +23,7 @@ origin_tech = list(TECH_MAGNET = 1) materials = list(MAT_STEEL = 400) -/obj/item/locator/attack_self(mob/user) +/obj/item/locator/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -133,7 +133,7 @@ Frequency: materials = list(MAT_STEEL = 10000) preserve_item = 1 -/obj/item/hand_tele/attack_self(mob/user) +/obj/item/hand_tele/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index 701d3619f125..52a4ae82c58d 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -23,7 +23,7 @@ if(SLOT_ID_BELT) sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/clothing/species/teshari/belt.dmi') -/obj/item/towel/attack_self(mob/user) +/obj/item/towel/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 66c96c503545..c06b35da2d3c 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -39,7 +39,7 @@ user.visible_message("[user] is putting the [src.name] on [T.his] head! It looks like [T.hes] trying to commit suicide.") return (BRUTELOSS) -/obj/item/beartrap/attack_self(mob/user) +/obj/item/beartrap/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index de114728f437..d47bb4c26c1c 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -19,7 +19,7 @@ LINEN BINS drop_sound = 'sound/items/drop/backpack.ogg' pickup_sound = 'sound/items/pickup/backpack.ogg' -/obj/item/bedsheet/attack_self(mob/user) +/obj/item/bedsheet/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 283c1df0a12f..dc2d9b224448 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -48,16 +48,11 @@ /obj/structure/extinguisher_cabinet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) if(isrobot(user)) return - if (ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - if (H.hand) - temp = H.organs_by_name["l_hand"] - if(temp && !temp.is_usable()) - to_chat(user, "You try to move your [temp.name], but cannot!") - return + if(!user.is_hand_functional(e_args.hand_index, TRUE)) + user.action_feedback(SPAN_WARNING(user.get_hand_fail_message(e_args.hand_index)), src) + return TRUE if(has_extinguisher) - user.put_in_hands(has_extinguisher) + user.put_in_hands_or_drop(has_extinguisher) to_chat(user, "You take [has_extinguisher] from [src].") has_extinguisher = null opened = 1 diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index b7d947573157..f2ff50a26b26 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -6,7 +6,7 @@ w_class = ITEMSIZE_NORMAL var/deploy_path = /obj/structure/inflatable -/obj/item/inflatable/attack_self(mob/user) +/obj/item/inflatable/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -252,7 +252,7 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "folded_wall_torn" -/obj/item/inflatable/torn/attack_self(mob/user) +/obj/item/inflatable/torn/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -265,7 +265,7 @@ icon = 'icons/obj/inflatable.dmi' icon_state = "folded_door_torn" -/obj/item/inflatable/door/torn/attack_self(mob/user) +/obj/item/inflatable/door/torn/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index bd6ac09aa5d9..063360f0f1ba 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -280,7 +280,7 @@ drop_sound = 'sound/items/drop/axe.ogg' pickup_sound = 'sound/items/pickup/axe.ogg' -/obj/item/roller/attack_self(mob/user) +/obj/item/roller/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -319,7 +319,7 @@ . = ..() held = new /obj/item/roller(src) -/obj/item/roller_holder/attack_self(mob/user) +/obj/item/roller_holder/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index feaae2b8b720..2e53cc27ce13 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -195,7 +195,7 @@ /// What we unfold to var/unfolded_type = /obj/structure/bed/chair/wheelchair -/obj/item/wheelchair/attack_self(mob/user) +/obj/item/wheelchair/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index d821fec9cb56..1201772c162d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -387,14 +387,9 @@ thing.update_icon() /obj/structure/sink/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) - if (ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - if (H.hand) - temp = H.organs_by_name["l_hand"] - if(temp && !temp.is_usable()) - to_chat(user, "You try to move your [temp.name], but cannot!") - return + if(!user.is_hand_functional(e_args.hand_index, FALSE)) + user.action_feedback(SPAN_WARNING(user.get_hand_fail_message(e_args.hand_index)), src) + return TRUE if(isrobot(user) || isAI(user)) return diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm index a6baaf731c9d..17058055f25d 100644 --- a/code/modules/artifice/deadringer.dm +++ b/code/modules/artifice/deadringer.dm @@ -28,7 +28,7 @@ reveal() watchowner = null -/obj/item/deadringer/attack_self(mob/user) +/obj/item/deadringer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 688c9ee74c6b..3572a8fcb0bc 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -97,7 +97,7 @@ return -/obj/item/assembly/attack_self(mob/user) +/obj/item/assembly/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index b433414c09e0..699cb1b7f533 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -109,7 +109,7 @@ else ..() -/obj/item/assembly_holder/attack_self(mob/user) +/obj/item/assembly_holder/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 686acf35a971..9bf167548071 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -32,7 +32,7 @@ return TRUE -/obj/item/assembly/igniter/attack_self(mob/user) +/obj/item/assembly/igniter/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 3d8909208891..4739fa09feb9 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -49,7 +49,7 @@ update_icon() pulse(0) -/obj/item/assembly/mousetrap/attack_self(mob/user) +/obj/item/assembly/mousetrap/attack_self(mob/user, datum/event_args/clickchain/e_args) if(!armed) to_chat(user, "You arm [src].") else diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index faa1c5842ee9..16937600a37f 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -33,7 +33,7 @@ add_fingerprint(user) return -/obj/item/assembly/shock_kit/attack_self(mob/user) +/obj/item/assembly/shock_kit/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 5ef693ad1a29..b366893fde73 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -25,7 +25,7 @@ T.visible_message("[icon2html(thing = src, target = world)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") -/obj/item/assembly/voice/attack_self(mob/user) +/obj/item/assembly/voice/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm index f69997cb875d..bbc1cbeb4e78 100644 --- a/code/modules/catalogue/cataloguer.dm +++ b/code/modules/catalogue/cataloguer.dm @@ -246,7 +246,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers) /obj/item/cataloguer/proc/adjust_points(amount) points_stored = max(0, points_stored += amount) -/obj/item/cataloguer/attack_self(mob/user) +/obj/item/cataloguer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/client/ui_style.dm b/code/modules/client/ui_style.dm index 77e7600b33c0..2c0c9c25477d 100644 --- a/code/modules/client/ui_style.dm +++ b/code/modules/client/ui_style.dm @@ -5,9 +5,17 @@ UI_STYLE_ORANGE = 'icons/mob/screen/orange.dmi', UI_STYLE_OLD = 'icons/mob/screen/old.dmi', UI_STYLE_WHITE = 'icons/mob/screen/white.dmi', - UI_STYLE_OLD_NOBORDER = 'icons/mob/screen/old-noborder.dmi', UI_STYLE_MINIMALIST = 'icons/mob/screen/minimalist.dmi', - UI_STYLE_HOLOGRAM = 'icons/mob/screen/holo.dmi' + UI_STYLE_HOLOGRAM = 'icons/mob/screen/holo.dmi', + ) + +/var/all_ui_style_ids = list( + UI_STYLE_MIDNIGHT = "midnight", + UI_STYLE_ORANGE = "orange", + UI_STYLE_OLD = "old", + UI_STYLE_WHITE = "white", + UI_STYLE_MINIMALIST = "minimalist", + UI_STYLE_HOLOGRAM = "holo", ) /var/all_ui_styles_robot = list( @@ -15,9 +23,8 @@ UI_STYLE_ORANGE = 'icons/mob/screen1_robot.dmi', UI_STYLE_OLD = 'icons/mob/screen1_robot.dmi', UI_STYLE_WHITE = 'icons/mob/screen1_robot.dmi', - UI_STYLE_OLD_NOBORDER = 'icons/mob/screen1_robot.dmi', UI_STYLE_MINIMALIST = 'icons/mob/screen1_robot_minimalist.dmi', - UI_STYLE_HOLOGRAM = 'icons/mob/screen1_robot_minimalist.dmi' + UI_STYLE_HOLOGRAM = 'icons/mob/screen1_robot_minimalist.dmi', ) var/global/list/all_tooltip_styles = list( diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index c93ccd1b092c..e0cb77f88a79 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -48,7 +48,7 @@ BLIND // can't see anything if(!isnull(vision_modifier)) user.remove_vision_modifier(vision_modifier) -/obj/item/clothing/glasses/attack_self(mob/user) +/obj/item/clothing/glasses/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -421,7 +421,7 @@ BLIND // can't see anything flash_protection = FLASH_PROTECTION_MAJOR tint = TINT_HEAVY -/obj/item/clothing/glasses/welding/attack_self(mob/user) +/obj/item/clothing/glasses/welding/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -542,7 +542,7 @@ BLIND // can't see anything toggleable = 1 activation_sound = 'sound/effects/pop.ogg' -/obj/item/clothing/glasses/sunglasses/sechud/aviator/attack_self(mob/user) +/obj/item/clothing/glasses/sunglasses/sechud/aviator/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -661,7 +661,7 @@ BLIND // can't see anything body_cover_flags = EYES species_restricted = list(SPECIES_TESHARI) -/obj/item/clothing/glasses/aerogelgoggles/attack_self(mob/user) +/obj/item/clothing/glasses/aerogelgoggles/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 901069a5bded..0e9ad315aa88 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -111,7 +111,7 @@ name = "[initial(name)]" user.visible_message("[user] deletes the prescription data on the [src.name].") -/obj/item/clothing/glasses/omnihud/attack_self(mob/user) +/obj/item/clothing/glasses/omnihud/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -209,7 +209,7 @@ vision_flags = SEE_TURFS //but they can spot breaches. Due to the way HUDs work, they don't provide darkvision up-close the way mesons do. -/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user) +/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -296,7 +296,7 @@ toggleable = 1 vision_flags = SEE_TURFS //but they can spot breaches. Due to the way HUDs work, they don't provide darkvision up-close the way mesons do. -/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user) +/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index b27cb6f697bd..559472ef526b 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -183,7 +183,7 @@ var/blessed = FALSE -/obj/item/clothing/gloves/swat/para/attack_self(mob/user) +/obj/item/clothing/gloves/swat/para/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/gloves/rings/rings.dm b/code/modules/clothing/gloves/rings/rings.dm index e56bf23c2770..f171cb9cefd7 100644 --- a/code/modules/clothing/gloves/rings/rings.dm +++ b/code/modules/clothing/gloves/rings/rings.dm @@ -6,7 +6,7 @@ icon_state = "diamond" item_state = "diamond_s" -/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user) +/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -100,7 +100,7 @@ icon_state = "seal-signet" var/nameset = FALSE -/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user) +/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -124,7 +124,7 @@ item_state = "wedring_g" var/partnername = "" -/obj/item/clothing/gloves/ring/wedding/attack_self(mob/user) +/obj/item/clothing/gloves/ring/wedding/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 89265c01d2e7..0e3e4d4fa0e6 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -22,7 +22,7 @@ unequip_sound = 'sound/items/drop/hat.ogg' pickup_sound = 'sound/items/pickup/hat.ogg' -/obj/item/clothing/head/attack_self(mob/user) +/obj/item/clothing/head/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 808e94c4bcd7..4c308883c305 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -64,7 +64,7 @@ valid_accessory_slots = ACCESSORY_SLOT_HELM_R action_button_name = "Toggle Visor" -/obj/item/clothing/head/helmet/riot/attack_self(mob/user) +/obj/item/clothing/head/helmet/riot/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -272,7 +272,7 @@ var/blessed = TRUE -/obj/item/clothing/head/helmet/para/attack_self(mob/user) +/obj/item/clothing/head/helmet/para/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -301,7 +301,7 @@ armor_type = /datum/armor/centcom/ert/paracausal action_button_name = "Enable Wards" -/obj/item/clothing/head/helmet/para/inquisitor/attack_self(mob/user) +/obj/item/clothing/head/helmet/para/inquisitor/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 6ccdf8b6df8d..61116267fea1 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -552,7 +552,7 @@ icon_state = "reindeer0" action_button_name = "Toggle Nose" -/obj/item/clothing/head/reindeer/attack_self(mob/user) +/obj/item/clothing/head/reindeer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -694,7 +694,7 @@ worn_render_flags = WORN_RENDER_SLOT_ONE_FOR_ALL action_button_name = "Toggle Hood" -/obj/item/clothing/head/cowl/attack_self(mob/user) +/obj/item/clothing/head/cowl/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 16a5667e23c0..d2fffa744773 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -31,7 +31,7 @@ drop_sound = 'sound/items/drop/helm.ogg' pickup_sound = 'sound/items/pickup/helm.ogg' -/obj/item/clothing/head/welding/attack_self(mob/user) +/obj/item/clothing/head/welding/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -130,7 +130,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 1) -/obj/item/clothing/head/cakehat/attack_self(mob/user) +/obj/item/clothing/head/cakehat/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -158,7 +158,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE cold_protection = HEAD -/obj/item/clothing/head/ushanka/attack_self(mob/user) +/obj/item/clothing/head/ushanka/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/pilot_helmet.dm b/code/modules/clothing/head/pilot_helmet.dm index b2031fb6d580..247d0e99d418 100644 --- a/code/modules/clothing/head/pilot_helmet.dm +++ b/code/modules/clothing/head/pilot_helmet.dm @@ -188,7 +188,7 @@ icon_state = "pilot_helmet2" action_button_name = "Toggle Visor" -/obj/item/clothing/head/pilot/alt/attack_self(mob/user) +/obj/item/clothing/head/pilot/alt/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index bd8df09b34e6..aafeaf6f7431 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -12,7 +12,7 @@ flipped=0 ..() -/obj/item/clothing/head/soft/attack_self(mob/user) +/obj/item/clothing/head/soft/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 52b25ed41fd9..d8a14bcc3620 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -29,7 +29,7 @@ to_chat(user, "You pull the mask up to cover your face.") update_worn_icon() -/obj/item/clothing/mask/breath/attack_self(mob/user) +/obj/item/clothing/mask/breath/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 3aae23b99227..f965e4086292 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -79,7 +79,7 @@ set src in usr adjust_mask(usr) -/obj/item/clothing/mask/gas/half/attack_self(mob/user) +/obj/item/clothing/mask/gas/half/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -122,7 +122,7 @@ to_chat(user, "Your mask moves to cover your mouth.") return -/obj/item/clothing/mask/gas/swat/vox/attack_self(mob/user) +/obj/item/clothing/mask/gas/swat/vox/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 6e508e8c4931..d3ef8b03c6d0 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -210,7 +210,7 @@ icon_state = "bandblack" item_state_slots = list(SLOT_ID_RIGHT_HAND = "bandblack", SLOT_ID_LEFT_HAND = "bandblack") -/obj/item/clothing/mask/bandana/attack_self(mob/user) +/obj/item/clothing/mask/bandana/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(src.icon_state == initial(icon_state)) src.icon_state = "[icon_state]_up" @@ -274,7 +274,7 @@ icon_state = "plainmask" inv_hide_flags = HIDEEARS|HIDEEYES|HIDEFACE -/obj/item/clothing/mask/paper/attack_self(mob/user) +/obj/item/clothing/mask/paper/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index a8665e24f73a..d1d446ccdadd 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -104,7 +104,7 @@ else return ..() -/obj/item/clothing/shoes/attack_self(mob/user) +/obj/item/clothing/shoes/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return //gtfo my shoe diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index 45ea2b1b6210..dd98addd7064 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -208,7 +208,7 @@ var/blessed = FALSE -/obj/item/clothing/shoes/boots/swat/para/attack_self(mob/user) +/obj/item/clothing/shoes/boots/swat/para/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 2ae6d1db50b9..64a35994c0d2 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -111,7 +111,7 @@ icon_state = "orange" chained = null -/obj/item/clothing/shoes/orange/attack_self(mob/user) +/obj/item/clothing/shoes/orange/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 52b8110e09ad..477a2b8d90f8 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -22,7 +22,7 @@ if (magpulse) slowdown += slowdown_on -/obj/item/clothing/shoes/magboots/attack_self(mob/user) +/obj/item/clothing/shoes/magboots/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -79,7 +79,7 @@ action_button_name = "Toggle the magclaws" -/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user) +/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user, datum/event_args/clickchain/e_args) if(src.magpulse) clothing_flags &= ~NOSLIP magpulse = 0 diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 1931d2d7e215..decea144cf29 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -223,7 +223,7 @@ to_chat(H, "You deploy your magboots.") // below is code for the action button method. im dumb. but it works? if you figure out a way to make it better tell me // hey peesh i made it better -hatter -/obj/item/clothing/suit/space/void/attack_self(mob/user) +/obj/item/clothing/suit/space/void/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 0aa95a12e929..ba0b6ef421f3 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -211,7 +211,7 @@ return PROJECTILE_FORCE_MISS return 0 -/obj/item/clothing/suit/armor/reactive/attack_self(mob/user) +/obj/item/clothing/suit/armor/reactive/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -763,7 +763,7 @@ var/anti_magic = FALSE var/blessed = FALSE -/obj/item/clothing/suit/armor/vest/para/attack_self(mob/user) +/obj/item/clothing/suit/armor/vest/para/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/suits/medieval_armor.dm b/code/modules/clothing/suits/medieval_armor.dm index 87e188ceb33c..1210de326dac 100644 --- a/code/modules/clothing/suits/medieval_armor.dm +++ b/code/modules/clothing/suits/medieval_armor.dm @@ -31,7 +31,7 @@ icon_state = "paladinhelm" action_button_name = "Toggle Visor" -/obj/item/clothing/head/helmet/medieval/paladin/attack_self(mob/user) +/obj/item/clothing/head/helmet/medieval/paladin/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -173,7 +173,7 @@ icon_state = "paladinhelm" action_button_name = "Toggle Visor" -/obj/item/clothing/head/medievalfake/paladin/attack_self(mob/user) +/obj/item/clothing/head/medievalfake/paladin/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 8229b441cd67..76ab44d18a9f 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -385,7 +385,7 @@ slot = ACCESSORY_SLOT_DECOR action_button_name = "Adjust Gaiter" -/obj/item/clothing/accessory/gaiter/attack_self(mob/user) +/obj/item/clothing/accessory/gaiter/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -547,7 +547,7 @@ overlay_state = "choker_cst_overlay" var/customized = 0 -/obj/item/clothing/accessory/choker/attack_self(mob/user) +/obj/item/clothing/accessory/choker/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -817,7 +817,7 @@ /obj/item/clothing/accessory/collar/holo/indigestible/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/clothing/accessory/collar/attack_self(mob/user) +/obj/item/clothing/accessory/collar/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm index 364b46c424cf..a3ecf4dc337d 100644 --- a/code/modules/clothing/under/accessories/armor.dm +++ b/code/modules/clothing/under/accessories/armor.dm @@ -483,7 +483,7 @@ camera_networks = list(NETWORK_CIV_HELMETS) -/obj/item/clothing/accessory/armor/helmetcamera/attack_self(mob/user) +/obj/item/clothing/accessory/armor/helmetcamera/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 48f3d897f39d..56bc675dfd5a 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -28,7 +28,7 @@ /obj/item/clothing/accessory/badge/proc/set_desc(var/mob/living/carbon/human/H) -/obj/item/clothing/accessory/badge/attack_self(mob/user) +/obj/item/clothing/accessory/badge/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -56,7 +56,7 @@ icon_state = "sheriff" item_state = "goldbadge" -/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user) +/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -79,7 +79,7 @@ icon_state = "holobadge-cord" slot_flags = SLOT_MASK | SLOT_TIE | SLOT_BELT -/obj/item/clothing/accessory/badge/holo/attack_self(mob/user) +/obj/item/clothing/accessory/badge/holo/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 6c2b8295d3c1..0ade7478b4d8 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -135,7 +135,7 @@ /obj/item/gun/ballistic, /obj/item/ammo_magazine, /obj/item/melee/baton) action_button_name = "Adjust Cloak" -/obj/item/clothing/accessory/poncho/rough_cloak/attack_self(mob/user) +/obj/item/clothing/accessory/poncho/rough_cloak/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/lockets.dm b/code/modules/clothing/under/accessories/lockets.dm index d2c97417ee2f..88e94cd416c7 100644 --- a/code/modules/clothing/under/accessories/lockets.dm +++ b/code/modules/clothing/under/accessories/lockets.dm @@ -11,7 +11,7 @@ var/open var/obj/item/held //Item inside locket. -/obj/item/clothing/accessory/locket/attack_self(mob/user) +/obj/item/clothing/accessory/locket/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/permits.dm b/code/modules/clothing/under/accessories/permits.dm index 428cf460fbb7..b6ab2ca4e1be 100755 --- a/code/modules/clothing/under/accessories/permits.dm +++ b/code/modules/clothing/under/accessories/permits.dm @@ -9,7 +9,7 @@ slot = ACCESSORY_SLOT_MEDAL var/owner = 0 //To prevent people from just renaming the thing if they steal it -/obj/item/clothing/accessory/permit/attack_self(mob/user) +/obj/item/clothing/accessory/permit/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 54c701d50edd..895b351efeae 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -41,7 +41,7 @@ hold.emp_act(severity) ..() -/obj/item/clothing/accessory/storage/attack_self(mob/user) +/obj/item/clothing/accessory/storage/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index 719eb9b967af..84a450514862 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -71,7 +71,7 @@ return -/obj/item/evidencebag/attack_self(mob/user) +/obj/item/evidencebag/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index dcb7dc037677..8aa518062d26 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -41,7 +41,7 @@ STOP_PROCESSING(SSobj, src) //so we don't continue turning to ash while gc'd return ..() -/obj/item/reagent_containers/glass/rag/attack_self(mob/user) +/obj/item/reagent_containers/glass/rag/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/sample_kits.dm b/code/modules/detectivework/tools/sample_kits.dm index 5eed168bd43d..9274e6f5a6c7 100644 --- a/code/modules/detectivework/tools/sample_kits.dm +++ b/code/modules/detectivework/tools/sample_kits.dm @@ -60,7 +60,7 @@ icon_state = "fingerprint0" item_state = "paper" -/obj/item/sample/print/attack_self(mob/user) +/obj/item/sample/print/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm index d420857cef92..4a77d06b2d8e 100644 --- a/code/modules/detectivework/tools/uvlight.dm +++ b/code/modules/detectivework/tools/uvlight.dm @@ -18,7 +18,7 @@ var/on = 0 var/step_alpha = 50 -/obj/item/uv_light/attack_self(mob/user) +/obj/item/uv_light/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/donatorreskins/donatorclothing.dm b/code/modules/donatorreskins/donatorclothing.dm index af6b47fa76f1..8d8dcde70e48 100644 --- a/code/modules/donatorreskins/donatorclothing.dm +++ b/code/modules/donatorreskins/donatorclothing.dm @@ -225,7 +225,7 @@ to_chat(user, "You pull the veil over to cover your face.") update_worn_icon() -/obj/item/clothing/mask/donator/dancer/attack_self(mob/user) +/obj/item/clothing/mask/donator/dancer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/EFTPOS.dm b/code/modules/economy/items/EFTPOS.dm index df2c0ffdd6bf..036900c24578 100644 --- a/code/modules/economy/items/EFTPOS.dm +++ b/code/modules/economy/items/EFTPOS.dm @@ -84,7 +84,7 @@ D.wrapped = R D.name = "small parcel - 'EFTPOS access code'" -/obj/item/eftpos/attack_self(mob/user) +/obj/item/eftpos/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/cash.dm b/code/modules/economy/items/cash.dm index 2d5428267df2..a58111b88a50 100644 --- a/code/modules/economy/items/cash.dm +++ b/code/modules/economy/items/cash.dm @@ -85,7 +85,7 @@ update_icon() return worth -/obj/item/spacecash/attack_self(mob/user) +/obj/item/spacecash/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -187,7 +187,7 @@ pickup_sound = 'sound/items/pickup/card.ogg' var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions. -/obj/item/spacecash/ewallet/attack_self(mob/user) +/obj/item/spacecash/ewallet/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/coins.dm b/code/modules/economy/items/coins.dm index a31ae4f52ed5..d182780e3689 100644 --- a/code/modules/economy/items/coins.dm +++ b/code/modules/economy/items/coins.dm @@ -103,7 +103,7 @@ to_chat(user, "You detach the string from the coin.") else ..() -/obj/item/coin/attack_self(mob/user) +/obj/item/coin/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/retail_scanner.dm b/code/modules/economy/items/retail_scanner.dm index d6729be41c36..2081ae1b4b72 100644 --- a/code/modules/economy/items/retail_scanner.dm +++ b/code/modules/economy/items/retail_scanner.dm @@ -46,7 +46,7 @@ setDir(SOUTH) pixel_y = 0 -/obj/item/retail_scanner/attack_self(mob/user) +/obj/item/retail_scanner/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index b3fd86920320..7531db693f60 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -18,6 +18,6 @@ icon_state = "construction_kit" w_class = WEIGHT_CLASS_TINY -/obj/item/aquarium_kit/attack_self(mob/user) +/obj/item/aquarium_kit/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() to_chat(user, SPAN_NOTICE("There's instruction and tools necessary to build aquarium inside. All you need is to start crafting.")) diff --git a/code/modules/fishing/equipment/rod.dm b/code/modules/fishing/equipment/rod.dm index d2e3ee710661..263de93af43e 100644 --- a/code/modules/fishing/equipment/rod.dm +++ b/code/modules/fishing/equipment/rod.dm @@ -80,7 +80,7 @@ SStgui.update_uis(src) update_icon() -/obj/item/fishing_rod/on_attack_self(mob/user) +/obj/item/fishing_rod/on_attack_self(mob/user, datum/event_args/clickchain/e_args) reel(user) /obj/item/fishing_rod/proc/reel(mob/user, atom/target) diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm index 9b43d560d41c..2149aaf82899 100644 --- a/code/modules/food/food/condiment.dm +++ b/code/modules/food/food/condiment.dm @@ -18,7 +18,7 @@ /obj/item/reagent_containers/food/condiment/attackby(var/obj/item/W as obj, var/mob/user as mob) return -/obj/item/reagent_containers/food/condiment/attack_self(mob/user) +/obj/item/reagent_containers/food/condiment/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm index 2dc89701ebac..950d916ae56d 100644 --- a/code/modules/food/food/drinks.dm +++ b/code/modules/food/food/drinks.dm @@ -25,7 +25,7 @@ price_tag = null return -/obj/item/reagent_containers/food/drinks/attack_self(mob/user) +/obj/item/reagent_containers/food/drinks/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/food/food/drinks/bottle.dm b/code/modules/food/food/drinks/bottle.dm index d4bf3f3e848b..eb52ffc29529 100644 --- a/code/modules/food/food/drinks/bottle.dm +++ b/code/modules/food/food/drinks/bottle.dm @@ -106,7 +106,7 @@ return ..() -/obj/item/reagent_containers/food/drinks/bottle/attack_self(mob/user) +/obj/item/reagent_containers/food/drinks/bottle/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 071602bfcf0f..4d0a06103034 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -44,7 +44,7 @@ M.put_in_hands(trash) qdel(src) -/obj/item/reagent_containers/food/snacks/attack_self(mob/user) +/obj/item/reagent_containers/food/snacks/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -929,7 +929,7 @@ heated_reagents = list("doctorsdelight" = 5, "hyperzine" = 0.75, "synaptizine" = 0.25) var/has_been_heated = 0 -/obj/item/reagent_containers/food/snacks/donkpocket/sinpocket/attack_self(mob/user) +/obj/item/reagent_containers/food/snacks/donkpocket/sinpocket/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1848,7 +1848,7 @@ . = ..() reagents.add_reagent("protein", 10) -/obj/item/reagent_containers/food/snacks/monkeycube/attack_self(mob/user) +/obj/item/reagent_containers/food/snacks/monkeycube/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -3288,7 +3288,7 @@ return . = ..() -/obj/item/pizzabox/attack_self(mob/user) +/obj/item/pizzabox/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index caeadc7eb698..5ed9c4b80dff 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -212,7 +212,7 @@ ..() -/obj/item/deck/attack_self(mob/user) +/obj/item/deck/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -287,7 +287,7 @@ pickup_sound = 'sound/items/pickup/paper.ogg' -/obj/item/pack/attack_self(mob/user) +/obj/item/pack/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -349,7 +349,7 @@ if(!cards.len) qdel(src) -/obj/item/hand/attack_self(mob/user) +/obj/item/hand/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/games/dice.dm b/code/modules/games/dice.dm index 1f2bce18295b..2b4b0dfc55e9 100644 --- a/code/modules/games/dice.dm +++ b/code/modules/games/dice.dm @@ -55,7 +55,7 @@ sides = 10 result = 10 -/obj/item/dice/attack_self(mob/user) +/obj/item/dice/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -148,7 +148,7 @@ /obj/item/dice, ) -/obj/item/storage/dicecup/attack_self(mob/user) +/obj/item/storage/dicecup/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/hardsuits/suits/ert.dm b/code/modules/hardsuits/suits/ert.dm index a2ec96dd72bd..bcb056128b60 100644 --- a/code/modules/hardsuits/suits/ert.dm +++ b/code/modules/hardsuits/suits/ert.dm @@ -154,7 +154,7 @@ /obj/item/hardsuit_module/self_destruct ) -/obj/item/hardsuit/ert/para/attack_self(mob/user) +/obj/item/hardsuit/ert/para/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 4883816a2f50..ceb492f48082 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -303,7 +303,7 @@ return TRUE return FALSE -/obj/item/holo/esword/attack_self(mob/user) +/obj/item/holo/esword/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index 97c1687a43a5..d172b85d523b 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -228,7 +228,7 @@ icon = 'icons/obj/apiary_bees_etc.dmi' icon_state = "apiary" -/obj/item/beehive_assembly/attack_self(mob/user) +/obj/item/beehive_assembly/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index cb1aa99cc2b9..73d7b7a759ce 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -258,7 +258,7 @@ to_chat(user, "\The [src] has fallen to bits.") qdel(src) -/obj/item/reagent_containers/food/snacks/grown/attack_self(mob/user) +/obj/item/reagent_containers/food/snacks/grown/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 01da23db0ed7..a95000a3cf1f 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -13,7 +13,7 @@ pixel_x = rand(-5,5) pixel_y = rand(-5,5) -/obj/item/disk/botany/attack_self(mob/user) +/obj/item/disk/botany/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index f4c2dd3b1028..871941697a7c 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -25,7 +25,7 @@ var/datum/seed/last_seed var/list/last_reagents -/obj/item/analyzer/plant_analyzer/attack_self(mob/user) +/obj/item/analyzer/plant_analyzer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/instruments/instruments/item.dm b/code/modules/instruments/instruments/item.dm index fb57de6ed604..2edc7bcafd35 100644 --- a/code/modules/instruments/instruments/item.dm +++ b/code/modules/instruments/instruments/item.dm @@ -50,7 +50,7 @@ user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like they're trying to commit suicide!") return (BRUTELOSS) -/obj/item/instrument/attack_self(mob/user) +/obj/item/instrument/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index ad6595ab77c0..dd064f340cc0 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -512,7 +512,7 @@ return TRUE return ..() -/obj/item/electronic_assembly/attack_self(mob/user) +/obj/item/electronic_assembly/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/assemblies/clothing.dm b/code/modules/integrated_electronics/core/assemblies/clothing.dm index 8e16c7c38421..fff71d9416c0 100644 --- a/code/modules/integrated_electronics/core/assemblies/clothing.dm +++ b/code/modules/integrated_electronics/core/assemblies/clothing.dm @@ -68,7 +68,7 @@ else ..() -/obj/item/clothing/attack_self(mob/user) +/obj/item/clothing/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/assemblies/device.dm b/code/modules/integrated_electronics/core/assemblies/device.dm index 688bff4a0b49..82b6a16278cc 100644 --- a/code/modules/integrated_electronics/core/assemblies/device.dm +++ b/code/modules/integrated_electronics/core/assemblies/device.dm @@ -39,7 +39,7 @@ if(opened) icon_state = icon_state + "-open" -/obj/item/assembly/electronic_assembly/attack_self(mob/user) +/obj/item/assembly/electronic_assembly/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm index e61b6cf9620d..16f0e3e4f888 100644 --- a/code/modules/integrated_electronics/core/detailer.dm +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -62,7 +62,7 @@ update_icon() return TRUE -/obj/item/integrated_electronics/detailer/attack_self(mob/user) +/obj/item/integrated_electronics/detailer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 27cbff30896a..38a0cfd97ac8 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -170,7 +170,7 @@ dirty_items = TRUE return ..() -/obj/item/integrated_circuit_printer/attack_self(mob/user) +/obj/item/integrated_circuit_printer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index c2df401d2d3f..957fa2ea4e31 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -77,7 +77,7 @@ [io.name] are not connected.") return -/obj/item/integrated_electronics/wirer/attack_self(mob/user) +/obj/item/integrated_electronics/wirer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -115,7 +115,7 @@ var/accepting_refs = FALSE var/copy_values = FALSE -/obj/item/integrated_electronics/debugger/attack_self(mob/user) +/obj/item/integrated_electronics/debugger/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -203,7 +203,7 @@ var/datum/integrated_io/selected_io = null var/mode = 0 -/obj/item/multitool/attack_self(mob/user) +/obj/item/multitool/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 3571166ea0b2..b4475d34c0a2 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -291,7 +291,7 @@ set_pin_data(IC_OUTPUT, 4, contents) push_data() -/obj/item/integrated_circuit/manipulation/grabber/attack_self(mob/user) +/obj/item/integrated_circuit/manipulation/grabber/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -854,7 +854,7 @@ else ..() -/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(mob/user) +/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -964,7 +964,7 @@ else return ..() -/obj/item/integrated_circuit/manipulation/grenade/attack_self(mob/user) +/obj/item/integrated_circuit/manipulation/grenade/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index fa68e0bea397..eb12a9a4e006 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -86,7 +86,7 @@ var/datum/integrated_io/O = outputs[1] O.push_data() -/obj/item/integrated_circuit/memory/constant/attack_self(mob/user) +/obj/item/integrated_circuit/memory/constant/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index e926e2d245ca..5d50e1bb91dc 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -309,7 +309,7 @@ attack_self(user) -/obj/item/integrated_circuit/input/beaker_connector/attack_self(mob/user) +/obj/item/integrated_circuit/input/beaker_connector/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index c1bfe041fbfd..6806b0c6a6d4 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -168,7 +168,7 @@ O.brainmob.remote_control=src set_pin_data(IC_OUTPUT, 1, O) -/obj/item/integrated_circuit/input/mmi_tank/attack_self(mob/user) +/obj/item/integrated_circuit/input/mmi_tank/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -295,7 +295,7 @@ O.pai.remote_control=src set_pin_data(IC_OUTPUT, 1, O) -/obj/item/integrated_circuit/input/pAI_connector/attack_self(mob/user) +/obj/item/integrated_circuit/input/pAI_connector/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/inventory/inventory.dm b/code/modules/inventory/inventory.dm index d9ce5264c9f7..48116d7c5031 100644 --- a/code/modules/inventory/inventory.dm +++ b/code/modules/inventory/inventory.dm @@ -5,8 +5,6 @@ //? basics /// owning mob var/mob/owner - /// hud datum - //? slots @@ -37,6 +35,8 @@ /mob/proc/init_inventory() return +//! unsorted below + /mob/proc/handle_item_denesting(obj/item/I, old_slot, flags, mob/user) // if the item was inside something, if(I.worn_inside) diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm index b406ba209f93..3ab69b2776b3 100644 --- a/code/modules/inventory/mob/hands.dm +++ b/code/modules/inventory/mob/hands.dm @@ -140,6 +140,25 @@ return FALSE return TRUE +/** + * hands are all empty? undefined behavior if we don't have hands. + */ +/mob/proc/hands_empty() + for(var/i in get_usable_hand_indices()) + if(isnull(held_items[i])) + continue + return FALSE + return TRUE + +/** + * returns number of empty hands + */ +/mob/proc/count_empty_hands() + . = 0 + for(var/i in 1 to length(held_items)) + if(isnull(held_items[i])) + .++ + //* Public API - Get *// /** diff --git a/code/modules/library/book.dm b/code/modules/library/book.dm index 3b95b546b4f2..d9159ad2408d 100644 --- a/code/modules/library/book.dm +++ b/code/modules/library/book.dm @@ -19,7 +19,7 @@ drop_sound = 'sound/items/drop/book.ogg' pickup_sound = 'sound/items/pickup/book.ogg' -/obj/item/book/attack_self(mob/user) +/obj/item/book/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 663c4b8e016b..783ba87a9f82 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -208,7 +208,7 @@ var/obj/item/book/book // Currently scanned book var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory -/obj/item/barcodescanner/attack_self(mob/user) +/obj/item/barcodescanner/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/lore_codex/codex.dm b/code/modules/lore_codex/codex.dm index 813841217fd6..e69ed4de4a23 100644 --- a/code/modules/lore_codex/codex.dm +++ b/code/modules/lore_codex/codex.dm @@ -12,7 +12,7 @@ tree = new(src, root_type) . = ..() -/obj/item/book/codex/attack_self(mob/user) +/obj/item/book/codex/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 17d6ac3e8461..278e1493e7f1 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -77,7 +77,7 @@ if(M) M.update_strings() return transfer -/obj/item/stack/material/attack_self(mob/user) +/obj/item/stack/material/attack_self(mob/user, datum/event_args/clickchain/e_args) if(!allow_window_autobuild || !material.build_windows(user, src)) return ..() diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 7cc2385854a9..1bec4b7d8a52 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -27,7 +27,7 @@ to_chat(usr, "New scan range set to [scanrange] step(s) around user, including current location.") . = ..() -/obj/item/mining_scanner/attack_self(mob/user) +/obj/item/mining_scanner/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 35f56c92edb8..75b2cc235a6a 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -29,7 +29,7 @@ var/global/list/total_extraction_beacons = list() . = ..() . +="It has [uses_left] use\s remaining." -/obj/item/extraction_pack/attack_self(mob/user) +/obj/item/extraction_pack/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -165,7 +165,7 @@ var/global/list/total_extraction_beacons = list() icon = 'icons/obj/stock_parts.dmi' icon_state = "subspace_amplifier" -/obj/item/fulton_core/attack_self(mob/user) +/obj/item/fulton_core/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index d39e5ce3562d..a9b78e6f55a1 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -194,7 +194,7 @@ active = 0 update_icon() -/obj/item/pickaxe/tyrmalin/attack_self(mob/user) +/obj/item/pickaxe/tyrmalin/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -373,7 +373,7 @@ else ..() -/obj/item/stack/flag/attack_self(mob/user) +/obj/item/stack/flag/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/resonator.dm b/code/modules/mining/resonator.dm index a1662ef4175f..f92ea59afb3f 100644 --- a/code/modules/mining/resonator.dm +++ b/code/modules/mining/resonator.dm @@ -33,7 +33,7 @@ spawn(burst_time) fieldsactive-- -/obj/item/resonator/attack_self(mob/user) +/obj/item/resonator/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/resonator_vr.dm b/code/modules/mining/resonator_vr.dm index af31d6ca29e0..d0b8376602b7 100644 --- a/code/modules/mining/resonator_vr.dm +++ b/code/modules/mining/resonator_vr.dm @@ -37,7 +37,7 @@ spawn(burst_time) fieldsactive-- -/obj/item/resonator/attack_self(mob/user) +/obj/item/resonator/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/shelter_atoms.dm b/code/modules/mining/shelter_atoms.dm index 29cfd36fa28b..8802b8a648e7 100644 --- a/code/modules/mining/shelter_atoms.dm +++ b/code/modules/mining/shelter_atoms.dm @@ -35,7 +35,7 @@ . += "This capsule has the [template.name] stored." . += template.description -/obj/item/survivalcapsule/attack_self(mob/user) +/obj/item/survivalcapsule/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/vertibore.dm b/code/modules/mining/vertibore.dm index bfc0b32e6fc9..1b8d8ce7e255 100644 --- a/code/modules/mining/vertibore.dm +++ b/code/modules/mining/vertibore.dm @@ -73,7 +73,7 @@ return . = ..() -/obj/item/vertibore/attack_self(mob/user) +/obj/item/vertibore/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/grab.dm b/code/modules/mob/grab.dm index f63e3b0dcdf3..ded808bc3f42 100644 --- a/code/modules/mob/grab.dm +++ b/code/modules/mob/grab.dm @@ -216,7 +216,7 @@ if(affecting.eye_blind < 3) affecting.Blind(3) -/obj/item/grab/attack_self(mob/user) +/obj/item/grab/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 866f9c3df63a..890b3c2cb340 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -57,3 +57,46 @@ // todo: actual flag like BUCKLING_IS_CONSIDERED_RESTRICTING or something if(buckled?.buckle_flags & (BUCKLING_NO_DEFAULT_RESIST | BUCKLING_NO_DEFAULT_UNBUCKLE)) unbuckle(BUCKLE_OP_FORCE) + +//* Hands *// + +/mob/proc/swap_hand(to_index) + #warn impl + +/mob/proc/get_active_hand_organ_key() + return null + +/mob/proc/get_active_hand_organ() + RETURN_TYPE(/obj/item/organ/external) + return null + +/mob/proc/get_hand_organ_key(index) + return null + +/mob/proc/get_hand_organ(index) + return null + +/mob/proc/is_hand_functional(index, fine_manipulation) + return TRUE + +/mob/proc/get_hand_index_of_organ(obj/item/organ/external/organ) + return null + +/mob/proc/get_active_arm_organ_key() + return null + +/mob/proc/get_active_arm_organ() + return null + +/mob/proc/get_arm_organ_key(index) + return null + +/mob/proc/get_arm_organ(index) + return null + +/mob/proc/get_hand_fail_message(index) + return "You try to move your [get_generalized_hand_name(index)], and should be able to, but can't. Report this to coders!" + +/mob/proc/get_generalized_hand_name(index) + var/number_on_side = round(index / 2) + return "[index % 2? "left" : "right"] hand[number_on_side > 1 && " #[number_on_side]"]" diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 7d50ff5c04de..c7d3629da44b 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -109,7 +109,7 @@ ..() //TODO: ORGAN REMOVAL UPDATE. Make the brain remain in the MMI so it doesn't lose organ data. -/obj/item/mmi/attack_self(mob/user) +/obj/item/mmi/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -249,7 +249,7 @@ H.mind.transfer(brainmob) return -/obj/item/mmi/digital/attack_self(mob/user) +/obj/item/mmi/digital/attack_self(mob/user, datum/event_args/clickchain/e_args) if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. to_chat(user, "You carefully locate the manual activation switch and start the [src]'s boot process.") diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index a5ad28c55bb6..69a8111e5c02 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -33,7 +33,7 @@ if(istype(ghost)) question(ghost) -/obj/item/mmi/digital/posibrain/attack_self(mob/user) +/obj/item/mmi/digital/posibrain/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm index ebb046540d5d..c35a17099b7b 100644 --- a/code/modules/mob/living/carbon/brain/robot.dm +++ b/code/modules/mob/living/carbon/brain/robot.dm @@ -29,7 +29,7 @@ to_chat(brainmob, "You feel slightly disoriented. That's normal when you're little more than a complex circuit.") return -/obj/item/mmi/digital/robot/attack_self(mob/user) +/obj/item/mmi/digital/robot/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index d7d46d8a682a..fcc10d4e9bb9 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -686,11 +686,8 @@ if ("signal") if (!src.restrained()) var/t1 = round(text2num(param)) - if (isnum(t1)) - if (t1 <= 5 && (!src.r_hand || !src.l_hand)) - message = "raises [t1] finger\s." - else if (t1 <= 10 && (!src.r_hand && !src.l_hand)) - message = "raises [t1] finger\s." + if (isnum(t1) && t1 <= (count_empty_hands() * 5)) + message = "raises [t1] finger\s." m_type = 1 if ("smile") diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 356eff97c042..93ce6b99dfa7 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -49,35 +49,38 @@ //* Hands *// -/mob/living/carbon/proc/get_active_hand_organ_key() +/mob/living/carbon/get_active_hand_organ_key() return get_hand_organ_key(active_hand) -/mob/living/carbon/proc/get_active_hand_organ() +/mob/living/carbon/get_active_hand_organ() RETURN_TYPE(/obj/item/organ/external) return get_organ(get_hand_organ_key(active_hand)) -/mob/living/carbon/proc/get_hand_organ_key(index) +/mob/living/carbon/get_hand_organ_key(index) #warn impl -/mob/living/carbon/proc/get_hand_organ(index) +/mob/living/carbon/get_hand_organ(index) return get_organ(get_hand_organ_key(index)) -/mob/living/carbon/proc/is_hand_functional(index) +/mob/living/carbon/is_hand_functional(index, fine_manipulation) var/obj/item/organ/external/part = get_hand_organ(index) #warn impl -/mob/living/carbon/proc/get_hand_index_of_organ(obj/item/organ/external/organ) +/mob/living/carbon/get_hand_index_of_organ(obj/item/organ/external/organ) #warn impl -/mob/living/carbon/proc/get_active_arm_organ_key() - return get_arm_organ_key(active_arm) +/mob/living/carbon/get_active_arm_organ_key() + return get_arm_organ_key(active_hand) -/mob/living/carbon/proc/get_active_arm_organ() +/mob/living/carbon/get_active_arm_organ() RETURN_TYPE(/obj/item/organ/external) return get_organ(get_arm_organ_key(active_hand)) -/mob/living/carbon/proc/get_arm_organ_key(index) +/mob/living/carbon/get_arm_organ_key(index) #warn impl -/mob/living/carbon/proc/get_arm_organ(index) +/mob/living/carbon/get_arm_organ(index) return get_organ(get_arm_organ_key(index)) + +/mob/living/carbon/get_hand_fail_message(index) + #warn impl diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 82ecb35bf44a..08e36a004a58 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -697,6 +697,7 @@ default behaviour is: animate(client, color = null, time = 10) /mob/living/swap_hand() + #warn nuke from orbit var/obj/item/was_active = length(held_items) <= active_hand? held_items[active_hand] : null if(active_hand >= length(held_items)) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 471f491126e7..e3988814138b 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -117,10 +117,6 @@ var/obj/item/tank/internal = null//Human/Monkey var/obj/item/clothing/mask/wear_mask = null//Carbon - // TODO: /tg/ arbitrary hand numbers - /// Set to TRUE to enable the use of hands and the hands hud - var/has_hands = FALSE - //? movement /// are we currently pushing (or trying to push) (or otherwise inside Bump() handling that deals with this crap) another atom? var/pushing_bumped_atom = FALSE diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index 5ad0d8412709..5d8b46c48b76 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -21,7 +21,7 @@ w_class = ITEMSIZE_NORMAL var/emagged = 0 -/obj/item/dogborg/jaws/small/attack_self(mob/user) +/obj/item/dogborg/jaws/small/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -62,7 +62,7 @@ attack_verb = list("nuzzled", "nosed", "booped") w_class = ITEMSIZE_TINY -/obj/item/dogborg/boop_module/attack_self(mob/user) +/obj/item/dogborg/boop_module/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -192,7 +192,7 @@ if(water.energy < 5) . += "[src] is dry." -/obj/item/dogborg/tongue/attack_self(mob/user) +/obj/item/dogborg/tongue/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -303,7 +303,7 @@ item_flags = ITEM_NOBLUDGEON var/enabled = FALSE -/obj/item/pupscrubber/attack_self(mob/user) +/obj/item/pupscrubber/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -349,7 +349,7 @@ var/cooldown = 0 var/datum/matter_synth/glass = null -/obj/item/lightreplacer/dogborg/attack_self(mob/user) +/obj/item/lightreplacer/dogborg/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return//Recharger refill is so last season. Now we recycle without magic! @@ -382,7 +382,7 @@ item_flags = ITEM_NOBLUDGEON throw_force = 0 -/obj/item/dogborg/pounce/attack_self(mob/user) +/obj/item/dogborg/pounce/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index cdc94e169f22..d415a775d6e9 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -178,7 +178,7 @@ hound = hound.loc hound.cell.charge = hound.cell.charge - amt -/obj/item/dogborg/sleeper/attack_self(mob/user) +/obj/item/dogborg/sleeper/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 83e565444b0d..fbe5426b4561 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -16,7 +16,7 @@ . = ..() files = new /datum/research/techonly(src) //Setup the research data holder. -/obj/item/portable_destructive_analyzer/attack_self(mob/user) +/obj/item/portable_destructive_analyzer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -274,7 +274,7 @@ name = "Printing Pen" var/mode = 1 -/obj/item/pen/robopen/attack_self(mob/user) +/obj/item/pen/robopen/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -335,7 +335,7 @@ if(istype(target,/obj/structure/table)) deploy_paper(get_turf(target)) -/obj/item/form_printer/attack_self(mob/user) +/obj/item/form_printer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -368,7 +368,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/borg/combat/shield/attack_self(mob/user) +/obj/item/borg/combat/shield/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -443,7 +443,7 @@ . += "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored." . += "It is set to deploy [mode ? "doors" : "walls"]" -/obj/item/inflatable_dispenser/attack_self(mob/user) +/obj/item/inflatable_dispenser/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/hands.dm b/code/modules/mob/living/simple_mob/hands.dm index 82d80f9989e2..33752ad247b9 100644 --- a/code/modules/mob/living/simple_mob/hands.dm +++ b/code/modules/mob/living/simple_mob/hands.dm @@ -1,39 +1,3 @@ -// Hand procs for player-controlled SA's -/mob/living/simple_mob/swap_hand() - src.hand = !( src.hand ) - if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) - if(hand) //This being 1 means the left hand is in use - hud_used.l_hand_hud_object.icon_state = "l_hand_active" - hud_used.r_hand_hud_object.icon_state = "r_hand_inactive" - else - hud_used.l_hand_hud_object.icon_state = "l_hand_inactive" - hud_used.r_hand_hud_object.icon_state = "r_hand_active" - return - -/mob/living/simple_mob/update_inv_r_hand() - if(QDESTROYING(src)) - return - - if(r_hand) - r_hand.screen_loc = ui_rhand //TODO - r_hand_sprite = r_hand.render_mob_appearance(src, 2, BODYTYPE_DEFAULT) - else - r_hand_sprite = null - - update_icon() - -/mob/living/simple_mob/update_inv_l_hand() - if(QDESTROYING(src)) - return - - if(l_hand) - l_hand.screen_loc = ui_lhand //TODO - l_hand_sprite = r_hand.render_mob_appearance(src, 1, BODYTYPE_DEFAULT) - else - l_hand_sprite = null - - update_icon() - //Can insert extra huds into the hud holder here. /mob/living/simple_mob/proc/extra_huds(var/datum/hud/hud,var/icon/ui_style,var/list/hud_elements) return diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index 265ec5a71d74..3a7d80f0e9c2 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -18,6 +18,10 @@ /// our innate darksight var/datum/vision/baseline/vision_innate = /datum/vision/baseline/default + //? Inventory + /// how many hands we have + var/hand_count = 0 + ///Tooltip description var/tt_desc = null diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 726da4d6fbc4..ccaea8f0385c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -154,7 +154,7 @@ else ..() -/obj/item/holder/mouse/attack_self(mob/user) +/obj/item/holder/mouse/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index 8b8d0817d799..de74c49683c8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -189,7 +189,7 @@ icon_state = "box" var/cattype = /mob/living/simple_mob/animal/passive/cat -/obj/item/cat_box/attack_self(mob/user) +/obj/item/cat_box/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm index c523d09dc3b2..50e86141e13e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm @@ -103,16 +103,14 @@ if(S.run_checks()) S.on_innate_cast(src) - if(l_hand && r_hand) //Make sure our hands aren't full. - if(istype(r_hand, /obj/item/spell)) //If they are full, perhaps we can still be useful. - var/obj/item/spell/r_spell = r_hand - if(r_spell.aspect == ASPECT_CHROMATIC) //Check if we can combine the new spell with one in our hands. - r_spell.on_combine_cast(S, src) - else if(istype(l_hand, /obj/item/spell)) - var/obj/item/spell/l_spell = l_hand - if(l_spell.aspect == ASPECT_CHROMATIC) //Check the other hand too. - l_spell.on_combine_cast(S, src) - else //Welp + if(hands_full()) + var/found = FALSE + for(var/obj/item/spell/spell as anything in get_held_item_of_type(/obj/item/spell)) + if(spell.aspect != ASPECT_CHROMATIC) + continue + found = TRUE + spell.on_combine_cast(S, src) + if(!found) to_chat(src, "You require a free manipulator to use this power.") return 0 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 4c6cca5c4a45..b672769c13fd 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -92,9 +92,13 @@ //? Inventory /// our inventory datum, if any. var/datum/inventory/inventory + /// hand huds + var/list/datum/mob_hud/hand_huds + #warn bad api for remote huds /// held items; indexed list. defaults to null, lazy. - /// 1, 3, 5, ... are left - /// 2, 4, 6, ... are right + /// the length of this is also the abstracted number of hands we should have + /// * 1, 3, 5, ... are left + /// * 2, 4, 6, ... are right var/list/obj/item/held_items /// active hand index - null or num. must always be in range of held_items indices! var/active_hand diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 28d7b007b54d..771aebfe981a 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -115,7 +115,7 @@ return ..() /// On-click handling. Turns on the computer if it's off and opens the GUI. -/obj/item/modular_computer/attack_self(mob/user) +/obj/item/modular_computer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/multiz/hoist.dm b/code/modules/multiz/hoist.dm index 3587c367b675..7ee02b21a099 100644 --- a/code/modules/multiz/hoist.dm +++ b/code/modules/multiz/hoist.dm @@ -10,7 +10,7 @@ icon = 'icons/obj/hoists.dmi' icon_state = "hoist_case" -/obj/item/hoist_kit/attack_self(mob/user) +/obj/item/hoist_kit/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm index 29df6b6df8b3..e8cf14f8566e 100644 --- a/code/modules/nifsoft/nifsoft.dm +++ b/code/modules/nifsoft/nifsoft.dm @@ -277,7 +277,7 @@ return return ..() -/obj/item/disk/nifsoft/compliance/attack_self(mob/user) +/obj/item/disk/nifsoft/compliance/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/organs/external/external.dm b/code/modules/organs/external/external.dm index 8c9de6487f6e..3ea1372c52a5 100644 --- a/code/modules/organs/external/external.dm +++ b/code/modules/organs/external/external.dm @@ -185,7 +185,7 @@ if(burn_damage) take_damage(0, burn_damage * emp_mod) -/obj/item/organ/external/attack_self(mob/user) +/obj/item/organ/external/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/organs/internal/species/adherent.dm b/code/modules/organs/internal/species/adherent.dm index 6b1f515b9cd0..e01b2dcec9a7 100644 --- a/code/modules/organs/internal/species/adherent.dm +++ b/code/modules/organs/internal/species/adherent.dm @@ -35,7 +35,7 @@ action.button_icon_state = "[base_action_state]-[active ? "on" : "off"]" if(action.button) action.button.UpdateIcon() -/obj/item/organ/internal/powered/attack_self(mob/user) +/obj/item/organ/internal/powered/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index c26400bdaccc..d2e53e796a0d 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -669,7 +669,7 @@ user.put_in_active_hand(O) qdel(src) -/obj/item/organ/attack_self(mob/user) +/obj/item/organ/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 388f9d2cf9e1..8ef7cc0a99e4 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -45,7 +45,7 @@ return ..() -/obj/item/clipboard/attack_self(mob/user) +/obj/item/clipboard/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 06187f4a0017..cbf70c5e54be 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -75,7 +75,7 @@ else return ..() -/obj/item/folder/attack_self(mob/user) +/obj/item/folder/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 8cbfb58ac9b5..1ba0526b07cf 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -53,7 +53,7 @@ "You label [target] as [label].") target.name = "[target.name] ([label])" -/obj/item/hand_labeler/attack_self(mob/user) +/obj/item/hand_labeler/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/paper/paper.dm b/code/modules/paperwork/paper/paper.dm index 65dada19f908..a724a2e67250 100644 --- a/code/modules/paperwork/paper/paper.dm +++ b/code/modules/paperwork/paper/paper.dm @@ -130,7 +130,7 @@ add_fingerprint(usr) return -/obj/item/paper/attack_self(mob/user) +/obj/item/paper/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 57edf291b884..889733f7f637 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -133,7 +133,7 @@ dat += P.html(user) user << browse(dat, "window=[name]") -/obj/item/paper_bundle/attack_self(mob/user) +/obj/item/paper_bundle/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 524827f04251..0e74a783dfb1 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -25,14 +25,10 @@ to_chat(user, "You pick up the [src].") /obj/item/paper_bin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - if (H.hand) - temp = H.organs_by_name["l_hand"] - if(temp && !temp.is_usable()) - to_chat(user, "You try to move your [temp.name], but cannot!") - return + if(!user.is_hand_functional(e_args.hand_index)) + user.action_feedback(SPAN_WARNING(user.get_hand_fail_message(e_args.hand_index)), src) + return TRUE + var/response = "" if(!papers.len) response = alert(user, "Do you take regular paper, or Carbon copy paper?", "Paper type request", "Regular", "Carbon-Copy", "Cancel") diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index fbadb527638e..9a24d40ca6b4 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -49,7 +49,7 @@ add_overlay(overlays_to_add) -/obj/item/paperplane/attack_self(mob/user) +/obj/item/paperplane/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 6a6bcf21ee32..5ec1aca60460 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -30,7 +30,7 @@ drop_sound = 'sound/items/drop/accessory.ogg' pickup_sound = 'sound/items/pickup/accessory.ogg' -/obj/item/pen/attack_self(mob/user) +/obj/item/pen/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -64,7 +64,7 @@ playsound(src, 'sound/items/penclick.ogg', 50, 1) return -/obj/item/pen/multi/attack_self(mob/user) +/obj/item/pen/multi/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -83,7 +83,7 @@ /obj/item/pen/click name = "clicker pen" -/obj/item/pen/click/attack_self(mob/user) +/obj/item/pen/click/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -253,7 +253,7 @@ /obj/item/pen/chameleon var/signature = "" -/obj/item/pen/chameleon/attack_self(mob/user) +/obj/item/pen/chameleon/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -352,7 +352,7 @@ . = ..() name = "[colourName] chalk" -/obj/item/pen/crayon/chalk/attack_self(mob/user) +/obj/item/pen/crayon/chalk/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 56f7204055e8..4d3d9bc8d34b 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -81,7 +81,7 @@ // Syndicate stamp to forge documents. -/obj/item/stamp/chameleon/attack_self(mob/user) +/obj/item/stamp/chameleon/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/photography/camera.dm b/code/modules/photography/camera.dm index a11c3b256afa..03aff0d0145c 100644 --- a/code/modules/photography/camera.dm +++ b/code/modules/photography/camera.dm @@ -27,7 +27,7 @@ size = nsize to_chat(usr, "Camera will now take [size]x[size] photos.") -/obj/item/camera/attack_self(mob/user) +/obj/item/camera/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/photography/photo.dm b/code/modules/photography/photo.dm index 8e837e515a24..9bddf881f48c 100644 --- a/code/modules/photography/photo.dm +++ b/code/modules/photography/photo.dm @@ -85,7 +85,7 @@ scribble_spans = data["spans"] photograph_id = data["photo"] -/obj/item/photo/attack_self(mob/user) +/obj/item/photo/attack_self(mob/user, datum/event_args/clickchain/e_args) user.examinate(src) return ..() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index bc5e1a9c832b..7434e1f49aa2 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -776,7 +776,7 @@ playsound(loc, selector_sound, 50, 1) return new_mode -/obj/item/gun/attack_self(mob/user) +/obj/item/gun/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 0b6fe122f5f0..9bf41a8baade 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -236,7 +236,7 @@ ..() load_ammo(A, user) -/obj/item/gun/ballistic/attack_self(mob/user) +/obj/item/gun/ballistic/attack_self(mob/user, datum/event_args/clickchain/e_args) if(firemodes.len > 1) switch_firemodes(user) else if(ammo_magazine) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index d7039f36f53a..0e81d9f8d7e6 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -643,7 +643,7 @@ name = "adjustable tracer bolts" desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color." -/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user) +/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 133769085385..9bc14aac2b30 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -29,7 +29,7 @@ projectile_type=/obj/projectile/beam/pulse charge_cost = 120 -/obj/item/gun/energy/pulse_rifle/destroyer/attack_self(mob/user) +/obj/item/gun/energy/pulse_rifle/destroyer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/energy/sizegun_vr.dm b/code/modules/projectiles/guns/energy/sizegun_vr.dm index c2940eb6c08b..12a3dc50fd7a 100644 --- a/code/modules/projectiles/guns/energy/sizegun_vr.dm +++ b/code/modules/projectiles/guns/energy/sizegun_vr.dm @@ -27,7 +27,7 @@ . = ..() add_obj_verb(src, /obj/item/gun/energy/sizegun/proc/select_size) -/obj/item/gun/energy/sizegun/attack_self(mob/user) +/obj/item/gun/energy/sizegun/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 7f0cec1c57a0..f835c9e47443 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -336,7 +336,7 @@ one_handed_penalty = 0 safety_state = GUN_SAFETY_OFF -/obj/item/gun/energy/service/attack_self(mob/user) +/obj/item/gun/energy/service/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm index d6ffac74dc63..15ce2f7be8f8 100644 --- a/code/modules/projectiles/guns/launcher/crossbow.dm +++ b/code/modules/projectiles/guns/launcher/crossbow.dm @@ -84,7 +84,7 @@ update_icon() ..() -/obj/item/gun/launcher/crossbow/attack_self(mob/user) +/obj/item/gun/launcher/crossbow/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index 259680e5efce..6fa49d48ce22 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -65,7 +65,7 @@ else to_chat(user, "[src] is empty.") -/obj/item/gun/launcher/grenade/attack_self(mob/user) +/obj/item/gun/launcher/grenade/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -104,7 +104,7 @@ damage_force = 5 max_grenades = 0 -/obj/item/gun/launcher/grenade/underslung/attack_self(mob/user) +/obj/item/gun/launcher/grenade/underslung/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index ba05789f710e..47ad170998e3 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -75,7 +75,7 @@ else if(istype(W) && item_storage.can_be_inserted(W)) item_storage.handle_item_insertion(W, user) -/obj/item/gun/launcher/pneumatic/attack_self(mob/user) +/obj/item/gun/launcher/pneumatic/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index f92a3bea3d48..30ee486266b1 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -27,7 +27,7 @@ name = "syringe dart" update_icon() -/obj/item/syringe_cartridge/attack_self(mob/user) +/obj/item/syringe_cartridge/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -95,7 +95,7 @@ darts -= next next = null -/obj/item/gun/launcher/syringe/attack_self(mob/user) +/obj/item/gun/launcher/syringe/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 38cbc7ba34de..ce8c3d5f0139 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -253,7 +253,7 @@ update_icon() update_worn_icon() -/obj/item/gun/ballistic/automatic/lmg/attack_self(mob/user) +/obj/item/gun/ballistic/automatic/lmg/attack_self(mob/user, datum/event_args/clickchain/e_args) if(cover_open) toggle_cover(user) //close the cover else diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index 62926541ea47..666bfaf21d87 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -41,7 +41,7 @@ return update_icon() -/obj/item/gun/ballistic/bow/attack_self(mob/user) +/obj/item/gun/ballistic/bow/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/contender.dm b/code/modules/projectiles/guns/projectile/contender.dm index eb286d9b9242..5d60f53f18fe 100644 --- a/code/modules/projectiles/guns/projectile/contender.dm +++ b/code/modules/projectiles/guns/projectile/contender.dm @@ -13,7 +13,7 @@ load_method = SINGLE_CASING heavy = TRUE -/obj/item/gun/ballistic/contender/attack_self(mob/user) +/obj/item/gun/ballistic/contender/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index fa3f25d45563..48732e46e643 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -136,7 +136,7 @@ for(var/obj/item/reagent_containers/glass/beaker/B in mixing) B.reagents.trans_to_obj(dart, mix_amount) -/obj/item/gun/ballistic/dartgun/attack_self(mob/user) +/obj/item/gun/ballistic/dartgun/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index b4470ed5d974..8d71108cb1ba 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -26,7 +26,7 @@ return chambered.get_projectile() return null -/obj/item/gun/ballistic/shotgun/pump/attack_self(mob/user) +/obj/item/gun/ballistic/shotgun/pump/attack_self(mob/user, datum/event_args/clickchain/e_args) // todo: this breaks other attack self interactions :( if(world.time >= recentpump + 10) pump(user) diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index 8012031cd2e5..77b7e94f643c 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -29,7 +29,7 @@ else icon_state = "heavysniper" -/obj/item/gun/ballistic/heavysniper/attack_self(mob/user) +/obj/item/gun/ballistic/heavysniper/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm b/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm index 3828b61bb9be..c127aecc1d7f 100644 --- a/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm @@ -68,7 +68,7 @@ . = ..() trigger_group = src -/obj/item/sniper_rifle_part/attack_self(mob/user) +/obj/item/sniper_rifle_part/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/magazines/magazine.dm b/code/modules/projectiles/magazines/magazine.dm index 90c6f42a507a..6d04c691f4b0 100644 --- a/code/modules/projectiles/magazines/magazine.dm +++ b/code/modules/projectiles/magazines/magazine.dm @@ -78,7 +78,7 @@ update_icon() // This dumps all the bullets right on the floor -/obj/item/ammo_magazine/attack_self(mob/user) +/obj/item/ammo_magazine/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/items/hypospray.dm b/code/modules/reagents/items/hypospray.dm index d2870b4e7af0..f88a0a76e1a0 100644 --- a/code/modules/reagents/items/hypospray.dm +++ b/code/modules/reagents/items/hypospray.dm @@ -105,7 +105,7 @@ inject_amount = amount usr.action_feedback(SPAN_NOTICE("[src] is now set to inject [amount] per use."), src) -/obj/item/hypospray/attack_self(mob/user) +/obj/item/hypospray/attack_self(mob/user, datum/event_args/clickchain/e_args) switch(inject_mode) if(HYPOSPRAY_MODE_INJECT) inject_mode = HYPOSPRAY_MODE_SPRAY diff --git a/code/modules/reagents/machinery/dispenser/cartridge.dm b/code/modules/reagents/machinery/dispenser/cartridge.dm index 69ae493929e1..e6784fec7af0 100644 --- a/code/modules/reagents/machinery/dispenser/cartridge.dm +++ b/code/modules/reagents/machinery/dispenser/cartridge.dm @@ -41,7 +41,7 @@ if(!is_open_container()) . += "The cap is sealed." -/obj/item/reagent_containers/cartridge/dispenser/attack_self(mob/user) +/obj/item/reagent_containers/cartridge/dispenser/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index cba898a73b20..3f22e436cf65 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -41,7 +41,7 @@ if(N) amount_per_transfer_from_this = N -/obj/item/reagent_containers/attack_self(mob/user) +/obj/item/reagent_containers/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/blood_pack_vr.dm b/code/modules/reagents/reagent_containers/blood_pack_vr.dm index 28ed0374d716..cb08f58ce888 100644 --- a/code/modules/reagents/reagent_containers/blood_pack_vr.dm +++ b/code/modules/reagents/reagent_containers/blood_pack_vr.dm @@ -1,4 +1,4 @@ -/obj/item/reagent_containers/blood/attack_self(mob/user) +/obj/item/reagent_containers/blood/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 937b0b308e3d..bcfa0ccaf190 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -94,7 +94,7 @@ add_attack_logs(user, L, "Borg injected with [reagent_ids[mode]]") to_chat(user, "[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining.") -/obj/item/reagent_containers/borghypo/attack_self(mob/user) +/obj/item/reagent_containers/borghypo/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return //Change the mode diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index e96e33355b7f..c344ce1f5852 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -61,7 +61,7 @@ base_desc = desc -/obj/item/reagent_containers/glass/attack_self(mob/user) +/obj/item/reagent_containers/glass/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/hard_candy.dm b/code/modules/reagents/reagent_containers/hard_candy.dm index bafbb1f5de76..ca045923f96d 100644 --- a/code/modules/reagents/reagent_containers/hard_candy.dm +++ b/code/modules/reagents/reagent_containers/hard_candy.dm @@ -34,7 +34,7 @@ user.put_in_hands(trash) qdel(src) -/obj/item/reagent_containers/hard_candy/attack_self(mob/user) +/obj/item/reagent_containers/hard_candy/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 79ae2e1fb7bc..d21b899daddb 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -392,7 +392,7 @@ icon_state = "[initial(icon_state)]_used" -/obj/item/reagent_containers/hypospray/glukoz/attack_self(mob/user) +/obj/item/reagent_containers/hypospray/glukoz/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/organic.dm b/code/modules/reagents/reagent_containers/organic.dm index bd055faca232..6242da0c093e 100644 --- a/code/modules/reagents/reagent_containers/organic.dm +++ b/code/modules/reagents/reagent_containers/organic.dm @@ -57,7 +57,7 @@ update_icon() -/obj/item/reagent_containers/organic/attack_self(mob/user) +/obj/item/reagent_containers/organic/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 727bd9a6c7af..1c039b84c2d9 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -69,7 +69,7 @@ D.set_up(my_target, spray_size, 10) return -/obj/item/reagent_containers/spray/attack_self(mob/user) +/obj/item/reagent_containers/spray/attack_self(mob/user, datum/event_args/clickchain/e_args) if(!possible_transfer_amounts) return amount_per_transfer_from_this = next_list_item(amount_per_transfer_from_this, possible_transfer_amounts) @@ -133,7 +133,7 @@ . = ..() . += "The safety is [safety ? "on" : "off"]." -/obj/item/reagent_containers/spray/pepper/attack_self(mob/user) +/obj/item/reagent_containers/spray/pepper/attack_self(mob/user, datum/event_args/clickchain/e_args) safety = !safety to_chat(usr, "You switch the safety [safety ? "on" : "off"].") @@ -234,7 +234,7 @@ . = ..() . += "The tank is [pumped ? "depressurized" : "pressurized"]." -/obj/item/reagent_containers/spray/squirt/attack_self(mob/user) +/obj/item/reagent_containers/spray/squirt/attack_self(mob/user, datum/event_args/clickchain/e_args) pumped = !pumped to_chat(usr, "You pump the handle [pumped ? "to depressurize" : "to pressurize"] the tank.") diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 51fef1c30868..477dde58bab7 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -37,7 +37,7 @@ . = ..() update_icon() -/obj/item/reagent_containers/syringe/attack_self(mob/user) +/obj/item/reagent_containers/syringe/attack_self(mob/user, datum/event_args/clickchain/e_args) switch(mode) if(SYRINGE_DRAW) mode = SYRINGE_INJECT diff --git a/code/modules/reagents/reagent_containers/syringes_vr.dm b/code/modules/reagents/reagent_containers/syringes_vr.dm index fd14a704f23b..5e744dd92c9f 100644 --- a/code/modules/reagents/reagent_containers/syringes_vr.dm +++ b/code/modules/reagents/reagent_containers/syringes_vr.dm @@ -66,7 +66,7 @@ eo.queue_syringe_infection() //Allow for capped syringe mode -/obj/item/reagent_containers/syringe/attack_self(mob/user) +/obj/item/reagent_containers/syringe/attack_self(mob/user, datum/event_args/clickchain/e_args) switch(mode) if(SYRINGE_CAPPED) mode = SYRINGE_DRAW diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 034ab565f5c1..2f29f88e6181 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -129,7 +129,7 @@ var/nameset = 0 var/tag_x -/obj/item/smallDelivery/attack_self(mob/user) +/obj/item/smallDelivery/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -346,7 +346,7 @@ return data -/obj/item/destTagger/attack_self(mob/user) +/obj/item/destTagger/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm index f46217b1248d..ebec0335d731 100644 --- a/code/modules/resleeving/computers.dm +++ b/code/modules/resleeving/computers.dm @@ -431,7 +431,7 @@ icon_state = "cmoemergency" item_state = "card-id" -/obj/item/cmo_disk_holder/attack_self(mob/user) +/obj/item/cmo_disk_holder/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm index 8c7ea90d32ce..5ac46a323400 100644 --- a/code/modules/resleeving/implant.dm +++ b/code/modules/resleeving/implant.dm @@ -62,7 +62,7 @@ icon_state = "[initial(icon_state)][imps.len]" germ_level = 0 -/obj/item/backup_implanter/attack_self(mob/user) +/obj/item/backup_implanter/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/mirror.dm b/code/modules/resleeving/mirror.dm index cee5c882fbec..073991acdd90 100644 --- a/code/modules/resleeving/mirror.dm +++ b/code/modules/resleeving/mirror.dm @@ -169,7 +169,7 @@ to_chat(usr, "You must target the torso.") return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/item/mirrortool/attack_self(mob/user) +/obj/item/mirrortool/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/sleevecard.dm b/code/modules/resleeving/sleevecard.dm index b6d75324ebaa..b880c5c0791e 100644 --- a/code/modules/resleeving/sleevecard.dm +++ b/code/modules/resleeving/sleevecard.dm @@ -41,7 +41,7 @@ QDEL_NULL(radio) return ..() -/obj/item/sleevecard/attack_self(mob/user) +/obj/item/sleevecard/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm index bf16d35435c4..0288f7a63fd4 100644 --- a/code/modules/shieldgen/directional_shield.dm +++ b/code/modules/shieldgen/directional_shield.dm @@ -206,7 +206,7 @@ for(var/obj/effect/directional_shield/S in active_shields) S.update_color(new_color) -/obj/item/shield_projector/attack_self(mob/user) +/obj/item/shield_projector/attack_self(mob/user, datum/event_args/clickchain/e_args) if(active) if(always_on) to_chat(user, "You can't seem to deactivate \the [src].") @@ -398,7 +398,7 @@ else my_tool.set_ready_state(1) -/obj/item/shield_projector/line/exosuit/attack_self(mob/user) +/obj/item/shield_projector/line/exosuit/attack_self(mob/user, datum/event_args/clickchain/e_args) if(active) if(always_on) to_chat(user, "You can't seem to deactivate \the [src].") diff --git a/code/modules/shieldgen/handheld_defuser.dm b/code/modules/shieldgen/handheld_defuser.dm index a5f66ccb3e06..e9c6ac1a5897 100644 --- a/code/modules/shieldgen/handheld_defuser.dm +++ b/code/modules/shieldgen/handheld_defuser.dm @@ -44,7 +44,7 @@ else icon_state = "hdiffuser_off" -/obj/item/shield_diffuser/attack_self(mob/user) +/obj/item/shield_diffuser/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index 8db534e39333..75f70737e1d2 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -168,7 +168,7 @@ light_color = "#3728ff" var/active -/obj/item/spaceflare/attack_self(mob/user) +/obj/item/spaceflare/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/species/outsider/vox.dm b/code/modules/species/outsider/vox.dm index 1f120ab4b3ba..b01a771cc920 100644 --- a/code/modules/species/outsider/vox.dm +++ b/code/modules/species/outsider/vox.dm @@ -121,10 +121,8 @@ H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), SLOT_ID_MASK, INV_OP_SILENT | INV_OP_FLUFFLESS) if(H.backbag == 1) H.equip_to_slot_or_del(new /obj/item/tank/vox(H), SLOT_ID_BACK, INV_OP_SILENT | INV_OP_FLUFFLESS) - H.internal = H.back else H.equip_to_slot_or_del(new /obj/item/tank/vox(H), /datum/inventory_slot_meta/abstract/hand/right, INV_OP_SILENT | INV_OP_FLUFFLESS) - H.internal = H.r_hand H.internal = locate(/obj/item/tank) in H.contents if(istype(H.internal,/obj/item/tank) && H.internals) H.internals.icon_state = "internal1" diff --git a/code/modules/species/xenomorphs/alien_species.dm b/code/modules/species/xenomorphs/alien_species.dm index 20b21f2e7cc5..791b07ef6516 100644 --- a/code/modules/species/xenomorphs/alien_species.dm +++ b/code/modules/species/xenomorphs/alien_species.dm @@ -330,7 +330,6 @@ has_a_intent = 1 has_m_intent = 1 has_warnings = 1 - has_hands = 1 has_drop = 1 has_throw = 1 has_resist = 1 diff --git a/code/modules/spells/artifacts.dm b/code/modules/spells/artifacts.dm index 4e65214f0fad..6d6c8a29dfec 100644 --- a/code/modules/spells/artifacts.dm +++ b/code/modules/spells/artifacts.dm @@ -12,7 +12,7 @@ damage_force = 10 hitsound = 'sound/items/welder2.ogg' -/obj/item/scrying/attack_self(mob/user) +/obj/item/scrying/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -48,7 +48,7 @@ var/rend_desc = "You should run now." var/spawn_fast = 0 //if 1, ignores checking for mobs on loc before spawning -/obj/item/veilrender/attack_self(mob/user) +/obj/item/veilrender/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -282,7 +282,7 @@ user.reset_perspective(null) user.unset_machine() -/obj/item/voodoo/attack_self(mob/user) +/obj/item/voodoo/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -385,7 +385,7 @@ REMOVE_TRAIT(user, TRAIT_MOBILITY_NOPICKUP, src) user.update_mobility_blocked() -/obj/item/warpwhistle/attack_self(mob/user) +/obj/item/warpwhistle/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index 053bb6f84895..8039e2a441bd 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -252,7 +252,7 @@ . = ..() name += spellname -/obj/item/spellbook/oneuse/attack_self(mob/user) +/obj/item/spellbook/oneuse/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/telesci/bscyrstal.dm b/code/modules/telesci/bscyrstal.dm index 74ec03d84bd6..0ef2f6d8bab4 100644 --- a/code/modules/telesci/bscyrstal.dm +++ b/code/modules/telesci/bscyrstal.dm @@ -14,7 +14,7 @@ pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) -/obj/item/ore/bluespace_crystal/attack_self(mob/user) +/obj/item/ore/bluespace_crystal/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vehicles/ridden/wheelchair.dm b/code/modules/vehicles/ridden/wheelchair.dm index 57aa7c1d4829..959d799b0560 100644 --- a/code/modules/vehicles/ridden/wheelchair.dm +++ b/code/modules/vehicles/ridden/wheelchair.dm @@ -52,7 +52,7 @@ /// What we unfold to var/unfolded_type = /obj/vehicle/ridden/wheelchair -/obj/item/wheelchair/attack_self(mob/user) +/obj/item/wheelchair/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm index c30bda572348..20ac298d56b3 100644 --- a/code/modules/vore/eating/leave_remains_vr.dm +++ b/code/modules/vore/eating/leave_remains_vr.dm @@ -90,7 +90,7 @@ pred_ckey = pred.ckey pred_name = pred.name -/obj/item/digestion_remains/attack_self(mob/user) +/obj/item/digestion_remains/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index d005d79482dc..ff3c0904f905 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -139,7 +139,7 @@ assignment = "Centcom Officer" -/obj/item/card/id/centcom/station/fluff/joanbadge/attack_self(mob/user) +/obj/item/card/id/centcom/station/fluff/joanbadge/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -211,7 +211,7 @@ icon_override = 'icons/vore/custom_items_vr.dmi' item_state = "Flag_Nanotrasen_mob" -/obj/item/flag/attack_self(mob/user) +/obj/item/flag/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -332,7 +332,7 @@ assignment = "CC Medical" var/configured = 0 -/obj/item/card/id/centcom/station/fluff/aronai/attack_self(mob/user) +/obj/item/card/id/centcom/station/fluff/aronai/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -445,7 +445,7 @@ if((state > 1) || !owner) STOP_PROCESSING(SSobj, src) -/obj/item/clothing/accessory/collar/vmcrystal/attack_self(mob/user) +/obj/item/clothing/accessory/collar/vmcrystal/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -567,7 +567,7 @@ var/last_use = 0 var/cooldown = 30 -/obj/item/cane/wand/attack_self(mob/user) +/obj/item/cane/wand/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -691,7 +691,7 @@ icon_state = "dragor_dot" w_class = ITEMSIZE_SMALL -/obj/item/fluff/dragor_dot/attack_self(mob/user) +/obj/item/fluff/dragor_dot/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -722,7 +722,7 @@ desc = "A primarily blue ID with a holographic 'WAH' etched onto its back. The letters do not obscure anything important on the card. It is shiny and it feels very bumpy." var/title_strings = list("Amaya Rahl's Wah-identification card", "Amaya Rahl's Wah-ID card") -/obj/item/card/id/fluff/amaya/attack_self(mob/user) +/obj/item/card/id/fluff/amaya/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -852,7 +852,7 @@ else return ..() -/obj/item/perfect_tele/attack_self(mob/user) +/obj/item/perfect_tele/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1117,7 +1117,7 @@ ..() -/obj/item/perfect_tele_beacon/attack_self(mob/user) +/obj/item/perfect_tele_beacon/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1211,7 +1211,7 @@ user.do_attack_animation(target) user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam -/obj/item/clothing/accessory/badge/holo/detective/ruda/attack_self(mob/user) +/obj/item/clothing/accessory/badge/holo/detective/ruda/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1443,7 +1443,7 @@ spawn(0) update_worn_icon() -/obj/item/melee/baton/fluff/stunstaff/attack_self(mob/user) +/obj/item/melee/baton/fluff/stunstaff/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -1515,7 +1515,7 @@ edge = initial(edge) w_class = initial(w_class) -/obj/item/melee/fluffstuff/attack_self(mob/user) +/obj/item/melee/fluffstuff/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/custom_items_cit.dm b/code/modules/vore/fluffstuff/custom_items_cit.dm index 788a573b9767..56058967f7a4 100644 --- a/code/modules/vore/fluffstuff/custom_items_cit.dm +++ b/code/modules/vore/fluffstuff/custom_items_cit.dm @@ -27,7 +27,7 @@ if((state > 1) || !owner) STOP_PROCESSING(SSobj, src) -/obj/item/clothing/accessory/collar/lifecrystal/attack_self(mob/user) +/obj/item/clothing/accessory/collar/lifecrystal/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/guns/bsharpoon.dm b/code/modules/vore/fluffstuff/guns/bsharpoon.dm index c2d4c74f8c4f..1264700e2306 100644 --- a/code/modules/vore/fluffstuff/guns/bsharpoon.dm +++ b/code/modules/vore/fluffstuff/guns/bsharpoon.dm @@ -73,7 +73,7 @@ var/turf/real_target = prob(failchance)? pick(trange(failrange, user)) : ToTurf AM.locationTransitForceMove(real_target, allow_pulled = FALSE, allow_grabbed = GRAB_AGGRESSIVE) -/obj/item/bluespace_harpoon/attack_self(mob/user) +/obj/item/bluespace_harpoon/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm index 4d029f72e859..5c82d2ca4435 100644 --- a/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm @@ -68,7 +68,7 @@ update_charge() update_icon() -/obj/item/gun/ballistic/cell_loaded/attack_self(mob/user) +/obj/item/gun/ballistic/cell_loaded/attack_self(mob/user, datum/event_args/clickchain/e_args) if(!chambered) return diff --git a/code/modules/vore/fluffstuff/guns/gunsword.dm b/code/modules/vore/fluffstuff/guns/gunsword.dm index 0661fbcfe596..14025bc3707a 100644 --- a/code/modules/vore/fluffstuff/guns/gunsword.dm +++ b/code/modules/vore/fluffstuff/guns/gunsword.dm @@ -93,7 +93,7 @@ attack_verb = list() -/obj/item/cell/device/weapon/gunsword/attack_self(mob/user) +/obj/item/cell/device/weapon/gunsword/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index ed0cefed95f5..0cb945908e54 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -22,7 +22,7 @@ for(var/mob/living/carbon/human/O in contents) O.request_strip_menu(usr) -/obj/item/holder/micro/attack_self(mob/user) +/obj/item/holder/micro/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm index 6fd30126ccf1..d7d9b23bf504 100644 --- a/code/modules/xenoarcheaology/sampling.dm +++ b/code/modules/xenoarcheaology/sampling.dm @@ -81,7 +81,7 @@ else to_chat(user, "You are unable to take a sample of [item_to_sample].") -/obj/item/core_sampler/attack_self(mob/user) +/obj/item/core_sampler/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index 86908954ae22..b5096f800c5a 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -48,7 +48,7 @@ else return ..() -/obj/item/anodevice/attack_self(mob/user) +/obj/item/anodevice/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index 34db36481cc1..f6a4bb03be15 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -44,7 +44,7 @@ var/last_scan_time = 0 var/scan_delay = 25 -/obj/item/ano_scanner/attack_self(mob/user) +/obj/item/ano_scanner/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -156,7 +156,7 @@ to_chat(user, "[icon2html(thing = src, target = world)] [src] pings [pick("madly","wildly","excitedly","crazily")]!") -/obj/item/depth_scanner/attack_self(mob/user) +/obj/item/depth_scanner/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -283,7 +283,7 @@ else icon_state = "pinoff" -/obj/item/beacon_locator/attack_self(mob/user) +/obj/item/beacon_locator/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -346,7 +346,7 @@ anomaly_scanner = new/obj/item/ano_scanner/integrated(src) depth_scanner = new/obj/item/depth_scanner(src) -/obj/item/xenoarch_multi_tool/attack_self(mob/user) +/obj/item/xenoarch_multi_tool/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm index e8ec2567e23e..30227365db28 100644 --- a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm +++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm @@ -173,7 +173,7 @@ w_class = 2 attack_verb = list("drilled") -/obj/item/pickaxe/excavationdrill/attack_self(mob/user) +/obj/item/pickaxe/excavationdrill/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenobio/items/slime_objects.dm b/code/modules/xenobio/items/slime_objects.dm index 9b948c1e0415..24c7a9fdb2b7 100644 --- a/code/modules/xenobio/items/slime_objects.dm +++ b/code/modules/xenobio/items/slime_objects.dm @@ -7,7 +7,7 @@ description_info = "Use in your hand to attempt to create a Promethean. It functions similarly to a positronic brain, in that a ghost is needed to become the Promethean." var/searching = 0 -/obj/item/slime_cube/attack_self(mob/user) +/obj/item/slime_cube/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -93,7 +93,7 @@ qdel(src) return . | CLICKCHAIN_DO_NOT_PROPAGATE -/obj/item/slime_crystal/attack_self(mob/user) +/obj/item/slime_crystal/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm index 620abc6c7c5e..c5a845a10ddc 100644 --- a/code/modules/xenobio2/machinery/gene_manipulators.dm +++ b/code/modules/xenobio2/machinery/gene_manipulators.dm @@ -20,7 +20,7 @@ var/list/genes = list() var/genesource = "unknown" -/obj/item/disk/xenobio/attack_self(mob/user) +/obj/item/disk/xenobio/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenobio2/mob/slime/slime_monkey.dm b/code/modules/xenobio2/mob/slime/slime_monkey.dm index ddf6313df394..723291732889 100644 --- a/code/modules/xenobio2/mob/slime/slime_monkey.dm +++ b/code/modules/xenobio2/mob/slime/slime_monkey.dm @@ -8,7 +8,7 @@ Slime cube lives here. icon_state = "slime cube" var/searching = 0 -/obj/item/slime_cube/attack_self(mob/user) +/obj/item/slime_cube/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenobio2/tools/xeno_trait_scanner.dm b/code/modules/xenobio2/tools/xeno_trait_scanner.dm index d1fbfd804612..673fe4d89d29 100644 --- a/code/modules/xenobio2/tools/xeno_trait_scanner.dm +++ b/code/modules/xenobio2/tools/xeno_trait_scanner.dm @@ -31,7 +31,7 @@ user.visible_message("\The [src] spits out a piece of paper.") return -/obj/item/analyzer/xeno_analyzer/attack_self(mob/user) +/obj/item/analyzer/xeno_analyzer/attack_self(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/icons/screen/hud/hologram/inventory.dmi b/icons/screen/hud/hologram/inventory.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf literal 0 HcmV?d00001 diff --git a/icons/screen/hud/midnight/inventory.dmi b/icons/screen/hud/midnight/inventory.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf literal 0 HcmV?d00001 diff --git a/icons/screen/hud/minimalist/inventory.dmi b/icons/screen/hud/minimalist/inventory.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf literal 0 HcmV?d00001 diff --git a/icons/screen/hud/orange/inventory.dmi b/icons/screen/hud/orange/inventory.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf literal 0 HcmV?d00001 diff --git a/icons/screen/hud/white/inventory.dmi b/icons/screen/hud/white/inventory.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf literal 0 HcmV?d00001 From e5ab66cecc524727628dd2e8815ff1853e777bb6 Mon Sep 17 00:00:00 2001 From: silicons Date: Thu, 20 Jul 2023 18:54:16 -0700 Subject: [PATCH 025/140] params go away --- .../dcs/signals/signals_atom/signals_atom_attack.dm | 2 +- .../dcs/signals/signals_mob/signals_mob_main.dm | 2 +- code/_onclick/hud/_screen_object.dm | 2 +- code/_onclick/mobs.dm | 4 ++-- code/_onclick/other_mobs.dm | 4 ++-- code/_rendering/mob_huds/hands.dm | 6 +++--- code/game/atoms/buckling.dm | 2 +- code/game/dna/dna_modifier.dm | 2 +- code/game/gamemodes/cult/cult_structures.dm | 2 +- code/game/gamemodes/cult/ritual.dm | 2 +- .../game/gamemodes/endgame/supermatter_cascade/blob.dm | 2 +- code/game/machinery/CableLayer.dm | 2 +- code/game/machinery/OpTable.dm | 2 +- code/game/machinery/Sleeper.dm | 2 +- code/game/machinery/_machinery.dm | 2 +- code/game/machinery/adv_med.dm | 2 +- code/game/machinery/ai_slipper.dm | 2 +- code/game/machinery/air_alarm.dm | 2 +- code/game/machinery/atm_ret_field.dm | 2 +- code/game/machinery/atmo_control.dm | 2 +- code/game/machinery/atmoalter/area_atmos_computer.dm | 2 +- code/game/machinery/atmoalter/canister.dm | 2 +- code/game/machinery/atmoalter/pump.dm | 4 ++-- code/game/machinery/atmoalter/scrubber.dm | 4 ++-- code/game/machinery/bioprinter.dm | 2 +- code/game/machinery/bomb_tester.dm | 2 +- code/game/machinery/camera/camera.dm | 2 +- code/game/machinery/camera/camera_assembly.dm | 2 +- code/game/machinery/cell_charger.dm | 2 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/Operating.dm | 2 +- code/game/machinery/computer/RCON_Console.dm | 2 +- code/game/machinery/computer/aifixer.dm | 2 +- code/game/machinery/computer/arcade/claw_machine.dm | 2 +- code/game/machinery/computer/atmos_alert.dm | 2 +- code/game/machinery/computer/atmos_control.dm | 2 +- code/game/machinery/computer/camera.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/command/card.dm | 2 +- code/game/machinery/computer/communications.dm | 2 +- code/game/machinery/computer/crew.dm | 2 +- code/game/machinery/computer/guestpass.dm | 2 +- code/game/machinery/computer/law.dm | 4 ++-- code/game/machinery/computer/medical.dm | 2 +- code/game/machinery/computer/message.dm | 2 +- code/game/machinery/computer/pod.dm | 4 ++-- code/game/machinery/computer/prisoner.dm | 2 +- code/game/machinery/computer/prisonshuttle.dm | 2 +- code/game/machinery/computer/robot.dm | 2 +- code/game/machinery/computer/security.dm | 2 +- code/game/machinery/computer/shutoff_monitor.dm | 2 +- code/game/machinery/computer/skills.dm | 2 +- code/game/machinery/computer/specops_shuttle.dm | 2 +- code/game/machinery/computer/station_alert.dm | 2 +- .../machinery/computer/supermatter_monitor_tgui.dm | 2 +- code/game/machinery/computer/supply.dm | 2 +- .../machinery/computer/syndicate_specops_shuttle.dm | 2 +- code/game/machinery/computer/timeclock_vr.dm | 2 +- code/game/machinery/cryo.dm | 2 +- code/game/machinery/deployable_vr.dm | 2 +- code/game/machinery/door_control.dm | 2 +- code/game/machinery/doorbell_vr.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/doors/airlock_control.dm | 4 ++-- code/game/machinery/doors/blast_door.dm | 2 +- code/game/machinery/doors/brigdoors.dm | 2 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- .../embedded_controller/embedded_controller_base.dm | 2 +- code/game/machinery/event.dm | 4 ++-- code/game/machinery/exonet_node.dm | 2 +- code/game/machinery/fire_alarm.dm | 4 ++-- code/game/machinery/flasher.dm | 2 +- code/game/machinery/floodlight.dm | 2 +- code/game/machinery/floor_light.dm | 2 +- code/game/machinery/floorlayer.dm | 2 +- code/game/machinery/holosign.dm | 2 +- code/game/machinery/igniter.dm | 4 ++-- code/game/machinery/iv_drip.dm | 2 +- code/game/machinery/jukebox.dm | 2 +- code/game/machinery/lightswitch.dm | 2 +- code/game/machinery/magnet.dm | 2 +- code/game/machinery/misc/bioscan_antenna.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- code/game/machinery/newscaster.dm | 2 +- code/game/machinery/nuclear_bomb.dm | 2 +- code/game/machinery/oxygen_pump.dm | 2 +- code/game/machinery/pda_multicaster.dm | 2 +- code/game/machinery/pipe/pipe_dispenser.dm | 2 +- code/game/machinery/pipe/pipelayer.dm | 2 +- code/game/machinery/pointdefense.dm | 2 +- code/game/machinery/portable_turret.dm | 4 ++-- code/game/machinery/recharger.dm | 2 +- code/game/machinery/records_scanner.dm | 2 +- code/game/machinery/requests_console.dm | 2 +- code/game/machinery/robot_fabricator.dm | 2 +- code/game/machinery/spaceheater.dm | 4 ++-- code/game/machinery/suit_storage/suit_cycler.dm | 2 +- .../machinery/suit_storage/suit_storage_massive.dm | 2 +- code/game/machinery/suit_storage/suit_storage_unit.dm | 2 +- code/game/machinery/supplybeacon.dm | 2 +- code/game/machinery/syndicatebeacon.dm | 6 +++--- code/game/machinery/telecomms/_telecomms.dm | 2 +- code/game/machinery/telecomms/logbrowser.dm | 2 +- code/game/machinery/telecomms/message_server.dm | 2 +- code/game/machinery/telecomms/telemonitor.dm | 2 +- code/game/machinery/teleporter/console.dm | 2 +- code/game/machinery/teleporter/projector.dm | 2 +- code/game/machinery/turret_control.dm | 2 +- code/game/machinery/vending.dm | 2 +- code/game/machinery/washing_machine.dm | 2 +- code/game/machinery/wishgranter.dm | 2 +- code/game/mecha/mech_fabricator.dm | 2 +- code/game/mecha/mecha.dm | 2 +- code/game/mecha/mecha_control_console.dm | 2 +- code/game/mecha/mecha_parts.dm | 4 ++-- code/game/mecha/micro/mecha_parts_vr.dm | 2 +- code/game/objects/effects/alien/aliens.dm | 4 ++-- code/game/objects/effects/chem/foam.dm | 2 +- code/game/objects/effects/debris/cleanable/humans.dm | 2 +- code/game/objects/effects/debris/cleanable/misc.dm | 2 +- code/game/objects/effects/decals/contraband.dm | 2 +- code/game/objects/effects/decals/remains.dm | 4 ++-- code/game/objects/effects/portals.dm | 2 +- code/game/objects/items.dm | 4 ++-- code/game/objects/items/bells.dm | 2 +- code/game/objects/items/bodybag.dm | 2 +- code/game/objects/items/devices/chameleonproj.dm | 2 +- code/game/objects/items/devices/defib.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 2 +- code/game/objects/items/devices/powersink.dm | 2 +- code/game/objects/items/devices/radio/electropack.dm | 2 +- code/game/objects/items/devices/radio/intercom.dm | 2 +- code/game/objects/items/devices/radio/jammer.dm | 2 +- code/game/objects/items/devices/radio/radio.dm | 2 +- .../items/devices/tape_recorder/tape_recorder.dm | 2 +- code/game/objects/items/devices/taperecorder.dm | 2 +- code/game/objects/items/shooting_range.dm | 2 +- code/game/objects/items/stacks/marker_beacons.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/items/storage/_storage.dm | 2 +- code/game/objects/items/storage/laundry_basket.dm | 2 +- code/game/objects/items/storage/quickdraw.dm | 2 +- code/game/objects/items/storage/secure.dm | 4 ++-- code/game/objects/items/tools/weldingtool.dm | 2 +- code/game/objects/items/toys.dm | 4 ++-- code/game/objects/items/uav.dm | 2 +- code/game/objects/items/weapons/barrier_tape.dm | 4 ++-- code/game/objects/items/weapons/duct_tape.dm | 2 +- code/game/objects/items/weapons/grenades/grenade.dm | 2 +- .../objects/items/weapons/implants/implantchair.dm | 2 +- code/game/objects/items/weapons/implants/implantpad.dm | 2 +- code/game/objects/items/weapons/stunbaton.dm | 2 +- code/game/objects/items/weapons/traps.dm | 2 +- code/game/objects/items/weapons/weldbackpack.dm | 2 +- code/game/objects/misc.dm | 2 +- code/game/objects/objs.dm | 2 +- code/game/objects/structures.dm | 2 +- code/game/objects/structures/ashlander.dm | 4 ++-- code/game/objects/structures/bedsheet_bin.dm | 2 +- code/game/objects/structures/bonfire.dm | 4 ++-- code/game/objects/structures/catwalk.dm | 2 +- code/game/objects/structures/charge_pylon.dm | 2 +- code/game/objects/structures/coathanger.dm | 2 +- .../game/objects/structures/crates_lockers/__closet.dm | 2 +- .../structures/crates_lockers/closets/coffin.dm | 2 +- .../structures/crates_lockers/closets/fireaxe.dm | 2 +- .../structures/crates_lockers/closets/statue.dm | 2 +- .../structures/crates_lockers/closets/walllocker.dm | 2 +- code/game/objects/structures/crates_lockers/crates.dm | 2 +- .../objects/structures/crates_lockers/largecrate.dm | 2 +- .../objects/structures/crates_lockers/vehiclecage.dm | 2 +- code/game/objects/structures/curtains.dm | 2 +- code/game/objects/structures/displaycase.dm | 2 +- code/game/objects/structures/extinguisher.dm | 2 +- code/game/objects/structures/fence.dm | 2 +- code/game/objects/structures/fireaxe.dm | 2 +- code/game/objects/structures/fitness.dm | 4 ++-- code/game/objects/structures/flora.dm | 4 ++-- code/game/objects/structures/flora/trees.dm | 2 +- code/game/objects/structures/ghost_pods/ghost_pods.dm | 2 +- code/game/objects/structures/girders.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/holoplant.dm | 2 +- code/game/objects/structures/holosign.dm | 2 +- code/game/objects/structures/inflatable.dm | 4 ++-- code/game/objects/structures/janicart.dm | 4 ++-- code/game/objects/structures/kitchen_foodcart.dm | 2 +- code/game/objects/structures/kitchen_spike.dm | 2 +- code/game/objects/structures/loot_piles.dm | 2 +- code/game/objects/structures/medical_stand_vr.dm | 2 +- code/game/objects/structures/mineral_bath.dm | 2 +- code/game/objects/structures/mirror.dm | 2 +- code/game/objects/structures/morgue.dm | 8 ++++---- code/game/objects/structures/noticeboard.dm | 2 +- code/game/objects/structures/props/beam_prism.dm | 4 ++-- code/game/objects/structures/props/nest.dm | 2 +- code/game/objects/structures/props/prop.dm | 2 +- code/game/objects/structures/props/puzzledoor.dm | 2 +- code/game/objects/structures/safe.dm | 2 +- code/game/objects/structures/simple_doors.dm | 2 +- code/game/objects/structures/snowman.dm | 2 +- code/game/objects/structures/stasis_cage.dm | 2 +- code/game/objects/structures/statues.dm | 2 +- .../structures/stool_bed_chair_nest/wheelchair.dm | 2 +- code/game/objects/structures/tank_dispenser.dm | 2 +- code/game/objects/structures/target_stake.dm | 2 +- code/game/objects/structures/transit_tubes.dm | 2 +- code/game/objects/structures/trash_pile.dm | 2 +- code/game/objects/structures/under_wardrobe.dm | 2 +- code/game/objects/structures/watercloset.dm | 10 +++++----- code/game/objects/structures/window.dm | 4 ++-- code/game/objects/structures/window_spawner.dm | 2 +- code/game/turfs/simulated/flooring/flooring_traps.dm | 2 +- code/game/turfs/simulated/floors/snow.dm | 2 +- code/game/turfs/simulated/wall_attacks.dm | 2 +- code/game/turfs/turf.dm | 2 +- code/modules/assembly/holder.dm | 2 +- code/modules/assembly/mousetrap.dm | 2 +- .../components/binary_devices/algae_generator_vr.dm | 2 +- .../machinery/components/binary_devices/heat_pump.dm | 2 +- .../components/binary_devices/massive_gas_pump.dm | 2 +- .../components/binary_devices/massive_heat_pump.dm | 2 +- .../components/binary_devices/passive_gate.dm | 2 +- .../machinery/components/binary_devices/pump.dm | 2 +- .../machinery/components/binary_devices/valve.dm | 4 ++-- .../machinery/components/omni_devices/omni_base.dm | 2 +- .../machinery/components/trinary_devices/filter.dm | 2 +- .../machinery/components/trinary_devices/mixer.dm | 2 +- .../machinery/components/trinary_devices/tvalve.dm | 4 ++-- .../machinery/components/unary/cold_sink.dm | 2 +- .../machinery/components/unary/heat_source.dm | 2 +- .../machinery/components/unary/outlet_injector.dm | 2 +- code/modules/awaymissions/bluespaceartillery.dm | 2 +- code/modules/awaymissions/gateway.dm | 4 ++-- code/modules/clothing/clothing_accessories.dm | 2 +- code/modules/clothing/masks/miscellaneous.dm | 2 +- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/clothing/suits/storage.dm | 2 +- code/modules/clothing/under/_under.dm | 2 +- code/modules/clothing/under/accessories/accessory.dm | 2 +- code/modules/clothing/under/accessories/holster.dm | 2 +- code/modules/clothing/under/accessories/storage.dm | 2 +- code/modules/detectivework/microscope/dnascanner.dm | 2 +- code/modules/detectivework/microscope/microscope.dm | 2 +- code/modules/economy/machines/ATM.dm | 2 +- code/modules/economy/machines/Accounts_DB.dm | 2 +- code/modules/economy/machines/cash_register.dm | 2 +- code/modules/economy/machines/mint.dm | 4 ++-- code/modules/economy/money_bag.dm | 2 +- code/modules/food/drinkingglass/extras.dm | 2 +- code/modules/food/food/snacks.dm | 4 ++-- code/modules/food/glass/bottle.dm | 2 +- .../food/kitchen/cooking_machines/_appliance.dm | 2 +- code/modules/food/kitchen/gibber.dm | 2 +- code/modules/food/kitchen/icecream.dm | 2 +- code/modules/food/kitchen/microwave.dm | 2 +- code/modules/food/kitchen/smartfridge.dm | 2 +- code/modules/games/cards.dm | 2 +- code/modules/hardsuits/pieces.dm | 2 +- code/modules/hardsuits/rig_attackby.dm | 2 +- code/modules/hardsuits/rig_pieces.dm | 2 +- code/modules/holodeck/HolodeckControl.dm | 2 +- code/modules/holodeck/HolodeckObjects.dm | 2 +- code/modules/holomap/station_holomap.dm | 2 +- code/modules/hydroponics/beekeeping/beehive.dm | 2 +- code/modules/hydroponics/seed_machines.dm | 2 +- code/modules/hydroponics/seed_storage.dm | 2 +- code/modules/hydroponics/spreading/spreading.dm | 2 +- .../hydroponics/spreading/spreading_response.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 2 +- code/modules/instruments/instruments/stationary.dm | 2 +- code/modules/library/lib_items.dm | 2 +- code/modules/library/lib_machines.dm | 6 +++--- code/modules/maps/away_missions/archive/wildwest.dm | 2 +- code/modules/maps/misc_maps/lavaland/_lavaland.dm | 4 ++-- code/modules/materials/material_sheets.dm | 2 +- code/modules/mining/drilling/drill.dm | 2 +- code/modules/mining/machine_processing.dm | 2 +- code/modules/mining/machine_stacking.dm | 2 +- code/modules/mining/mine_items.dm | 2 +- .../mining/ore_redemption_machine/equipment_vendor.dm | 2 +- code/modules/mining/shelter_atoms.dm | 2 +- code/modules/mob/living/bot/cleanbot.dm | 2 +- code/modules/mob/living/bot/farmbot.dm | 4 ++-- code/modules/mob/living/bot/floorbot.dm | 2 +- code/modules/mob/living/bot/medibot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 2 +- code/modules/mob/living/carbon/alien/alien_attacks.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- .../mob/living/carbon/human/human_attackhand.dm | 2 +- .../mob/living/carbon/human/traits/weaver_objs.dm | 4 ++-- code/modules/mob/living/defense.dm | 2 +- .../mob/living/silicon/robot/drone/drone_console.dm | 2 +- .../living/silicon/robot/drone/drone_manufacturer.dm | 2 +- code/modules/mob/living/silicon/robot/robot.dm | 2 +- code/modules/mob/living/simple_mob/defense.dm | 2 +- .../simple_mob/subtypes/animal/farm animals/cow.dm | 2 +- .../living/simple_mob/subtypes/animal/passive/fish.dm | 2 +- .../living/simple_mob/subtypes/animal/passive/mouse.dm | 2 +- .../living/simple_mob/subtypes/animal/pets/parrot.dm | 2 +- .../mob/living/simple_mob/subtypes/horror/Eddy.dm | 2 +- .../mob/living/simple_mob/subtypes/horror/Master.dm | 2 +- .../mob/living/simple_mob/subtypes/horror/Rickey.dm | 2 +- .../mob/living/simple_mob/subtypes/horror/Smiley.dm | 2 +- .../mob/living/simple_mob/subtypes/horror/Steve.dm | 2 +- .../mob/living/simple_mob/subtypes/horror/Willy.dm | 2 +- .../mob/living/simple_mob/subtypes/horror/bradley.dm | 2 +- .../mob/living/simple_mob/subtypes/horror/sally.dm | 2 +- .../mob/living/simple_mob/subtypes/horror/shittytim.dm | 2 +- .../mob/living/simple_mob/subtypes/horror/timling.dm | 2 +- .../living/simple_mob/subtypes/illusion/illusion.dm | 2 +- .../mob/living/simple_mob/subtypes/slime/slime.dm | 2 +- .../simple_mob/subtypes/slime/xenobio/defense.dm | 2 +- .../mob/living/simple_mob/subtypes/vore/c_pet.dm | 4 ++-- .../mob/living/simple_mob/subtypes/vore/otie.dm | 2 +- .../simple_mob/subtypes/vore/shadekin/shadekin.dm | 2 +- code/modules/modular_computers/NTNet/NTNet_relay.dm | 2 +- .../computers/modular_computer/interaction.dm | 2 +- code/modules/modular_computers/laptop_vendor.dm | 2 +- code/modules/multiz/hoist.dm | 4 ++-- code/modules/multiz/ladder.dm | 2 +- code/modules/multiz/structures_vr.dm | 2 +- code/modules/multiz/zmimic/mimic_movable.dm | 6 +++--- code/modules/overmap/legacy/overmap_shuttle.dm | 2 +- .../overmap/legacy/ships/computers/computer_shims.dm | 2 +- code/modules/overmap/legacy/ships/panicbutton.dm | 2 +- code/modules/paperwork/faxmachine.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 6 +++--- code/modules/paperwork/paperbin.dm | 4 ++-- code/modules/paperwork/photocopier.dm | 2 +- code/modules/power/antimatter/computer.dm | 2 +- code/modules/power/antimatter/control.dm | 2 +- code/modules/power/apc.dm | 2 +- code/modules/power/breaker_box.dm | 2 +- code/modules/power/cable.dm | 2 +- code/modules/power/fission/computer.dm | 2 +- code/modules/power/fission/engine.dm | 2 +- code/modules/power/fusion/core/_core.dm | 2 +- code/modules/power/fusion/core/core_control.dm | 2 +- .../modules/power/fusion/fuel_assembly/fuel_control.dm | 2 +- .../power/fusion/fuel_assembly/fuel_injector.dm | 2 +- code/modules/power/fusion/gyrotron/gyrotron_control.dm | 2 +- code/modules/power/generator.dm | 2 +- code/modules/power/generator_type2.dm | 2 +- code/modules/power/gravitygenerator.dm | 4 ++-- code/modules/power/grid_checker.dm | 2 +- code/modules/power/lighting/lighting.dm | 6 +++--- code/modules/power/port_gen.dm | 6 +++--- code/modules/power/sensors/sensor_monitoring.dm | 2 +- code/modules/power/singularity/collector.dm | 2 +- code/modules/power/singularity/containment_field.dm | 2 +- code/modules/power/singularity/emitter.dm | 2 +- code/modules/power/singularity/field_generator.dm | 2 +- .../particle_accelerator/particle_control.dm | 2 +- code/modules/power/singularity/singularity.dm | 2 +- code/modules/power/smes/smes.dm | 2 +- code/modules/power/smes/smes_construction.dm | 2 +- code/modules/power/solar.dm | 4 ++-- code/modules/power/supermatter/supermatter.dm | 2 +- code/modules/power/tesla/coil.dm | 4 ++-- code/modules/power/turbine.dm | 4 ++-- code/modules/projectiles/guns/ballistic.dm | 2 +- code/modules/projectiles/guns/energy.dm | 2 +- .../projectiles/guns/launcher/grenade_launcher.dm | 2 +- code/modules/projectiles/guns/launcher/pneumatic.dm | 2 +- code/modules/projectiles/guns/launcher/syringe_gun.dm | 2 +- code/modules/projectiles/guns/magnetic/bore.dm | 2 +- code/modules/projectiles/guns/magnetic/magnetic.dm | 2 +- code/modules/projectiles/guns/projectile/automatic.dm | 4 ++-- code/modules/projectiles/guns/projectile/bow.dm | 2 +- code/modules/projectiles/guns/projectile/pistol.dm | 6 +++--- code/modules/projectiles/guns/projectile/rocket.dm | 4 ++-- code/modules/projectiles/magazines/magazine.dm | 2 +- code/modules/projectiles/magazines/smartmag.dm | 2 +- code/modules/random_map/drop/droppod_doors.dm | 2 +- code/modules/reagents/chemistry/machinery.dm | 2 +- code/modules/reagents/distilling/distilling.dm | 2 +- code/modules/reagents/items/hypospray.dm | 2 +- code/modules/reagents/machinery/chem_master.dm | 2 +- code/modules/reagents/reagent_containers/glass.dm | 2 +- code/modules/reagents/reagent_containers/hypospray.dm | 2 +- code/modules/reagents/reagent_containers/organic.dm | 2 +- code/modules/reagents/reagent_containers/syringes.dm | 2 +- code/modules/recycling/conveyor2.dm | 6 +++--- code/modules/recycling/disposal.dm | 2 +- code/modules/recycling/sortingmachinery.dm | 2 +- code/modules/research/machinery/rdconsole.dm | 2 +- code/modules/research/machinery/rdmachines.dm | 2 +- code/modules/research/machinery/server.dm | 2 +- code/modules/resleeving/computers.dm | 2 +- code/modules/resleeving/infomorph.dm | 2 +- code/modules/resleeving/machines.dm | 4 ++-- code/modules/rogueminer_vr/zone_console.dm | 2 +- code/modules/security levels/keycard authentication.dm | 2 +- code/modules/shieldgen/emergency_shield.dm | 2 +- code/modules/shieldgen/energy_field.dm | 2 +- code/modules/shieldgen/energy_shield.dm | 2 +- code/modules/shieldgen/handheld_defuser.dm | 2 +- code/modules/shieldgen/sheldwallgen.dm | 4 ++-- code/modules/shieldgen/shield_capacitor.dm | 2 +- code/modules/shieldgen/shield_diffuser.dm | 2 +- code/modules/shieldgen/shield_gen.dm | 2 +- code/modules/shieldgen/shield_generator.dm | 2 +- code/modules/shuttles/shuttle_console.dm | 2 +- code/modules/species/protean/protean_blob.dm | 2 +- .../species/station/xenomorph_hybrids/hybrid_resin.dm | 2 +- code/modules/species/xenomorphs/alien_facehugger.dm | 4 ++-- code/modules/stockmarket/computer.dm | 2 +- code/modules/tables/tables.dm | 2 +- code/modules/telesci/hyper_pad.dm | 4 ++-- code/modules/telesci/quantum_pad.dm | 2 +- code/modules/telesci/telesci_computer.dm | 2 +- code/modules/turbolift/turbolift_console.dm | 2 +- code/modules/vehicles_legacy/bike.dm | 2 +- code/modules/vehicles_legacy/skateboard.dm | 2 +- code/modules/vehicles_legacy/train.dm | 2 +- code/modules/virus2/curer.dm | 2 +- code/modules/virus2/diseasesplicer.dm | 2 +- code/modules/virus2/dishincubator.dm | 2 +- code/modules/virus2/isolator.dm | 2 +- code/modules/vore/fluffstuff/custom_guns.dm | 2 +- code/modules/vore/fluffstuff/custom_items.dm | 4 ++-- code/modules/vore/weight/fitness_machines_vr.dm | 6 +++--- code/modules/xenoarcheaology/anomaly_container.dm | 2 +- code/modules/xenoarcheaology/artifacts/artifact.dm | 2 +- code/modules/xenoarcheaology/artifacts/gigadrill.dm | 2 +- code/modules/xenoarcheaology/artifacts/replicator.dm | 2 +- .../modules/xenoarcheaology/tools/artifact_analyser.dm | 2 +- .../xenoarcheaology/tools/artifact_harvester.dm | 2 +- .../modules/xenoarcheaology/tools/geosample_scanner.dm | 2 +- .../xenoarcheaology/tools/suspension_generator.dm | 2 +- code/modules/xenobio/machinery/processor.dm | 2 +- code/modules/xenobio2/machinery/core_extractor.dm | 2 +- code/modules/xenobio2/machinery/gene_manipulators.dm | 2 +- code/modules/xenobio2/machinery/injector_computer.dm | 2 +- code/modules/xenobio2/machinery/slime_replicator.dm | 2 +- maps/generic/misc.dm | 2 +- 439 files changed, 515 insertions(+), 515 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm index 6f84aa04ba96..2f3dc3f751bb 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -37,7 +37,7 @@ ////#define COMPONENT_SKIP_ATTACK (1<<1) /// From base of atom/attack_ghost(): (mob/observer/dead/ghost) #define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" -/// From base of atom/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args): (mob/user, list/modifiers) +/// From base of atom/attack_hand(mob/user, datum/event_args/clickchain/e_args): (mob/user, list/modifiers) ////#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" /// From base of atom/attack_paw(): (mob/user) ////#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 622538036f96..634f0a9d16d1 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -129,7 +129,7 @@ ////#define COMSIG_MOB_CLUMSY_SHOOT_FOOT "mob_clumsy_shoot_foot" /// From /obj/item/hand_item/slapper/attack_atom(): (source=obj/structure/table/slammed_table, mob/living/slammer) ////#define COMSIG_TABLE_SLAMMED "table_slammed" -/// From base of atom/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args): (mob/user, modifiers) +/// From base of atom/attack_hand(mob/user, datum/event_args/clickchain/e_args): (mob/user, modifiers) ////#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" /// From base of /obj/item/attack(): (mob/M, mob/user) ////#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" diff --git a/code/_onclick/hud/_screen_object.dm b/code/_onclick/hud/_screen_object.dm index 68330249fa60..b50a5bd76b3a 100644 --- a/code/_onclick/hud/_screen_object.dm +++ b/code/_onclick/hud/_screen_object.dm @@ -75,7 +75,7 @@ G.s_click(src) return 1 -/atom/movable/screen/grab/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/atom/movable/screen/grab/attack_hand(mob/user, datum/event_args/clickchain/e_args) return /atom/movable/screen/grab/attackby() diff --git a/code/_onclick/mobs.dm b/code/_onclick/mobs.dm index a27597ad2052..e71a9893f47d 100644 --- a/code/_onclick/mobs.dm +++ b/code/_onclick/mobs.dm @@ -28,12 +28,12 @@ /** * construct default event args for what we're doing to a target */ -/mob/proc/default_clickchain_event_args(atom/target, list/params, unarmed = FALSE) +/mob/proc/default_clickchain_event_args(atom/target, unarmed = FALSE) var/datum/event_args/clickchain/constructed = new constructed.initiator = src constructed.actor = src constructed.target = target - constructed.click_params = params + constructed.click_params = list() constructed.attack_intent = a_intent constructed.hand_index = active_hand if(!unarmed) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index eaa67bb1a840..efe82104c439 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -31,9 +31,9 @@ A.attack_hand(src) /// Return TRUE to cancel other attack hand effects that respect it. -/atom/proc/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/atom/proc/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(isnull(e_args)) - e_args = user.default_clickchain_event_args(src, params, TRUE) + e_args = user.default_clickchain_event_args(src, TRUE) . = _try_interact(user) //Return a non FALSE value to cancel whatever called this from propagating, if it respects it. diff --git a/code/_rendering/mob_huds/hands.dm b/code/_rendering/mob_huds/hands.dm index a1f4c4b10d45..c1f99ca678f3 100644 --- a/code/_rendering/mob_huds/hands.dm +++ b/code/_rendering/mob_huds/hands.dm @@ -23,7 +23,7 @@ src.host = host /atom/movable/screen/hand/sync_style(datum/hud_style/style) - icon = hud.inventory_icons + icon = style.inventory_icons /** * handle an inventory operation @@ -44,7 +44,7 @@ /atom/movable/screen/hand/instance/Initialize(mapload, datum/inventory/host, hand_index) . = ..() src.hand_index = hand_index - synx_index(hand_index) + sync_index(hand_index) /atom/movable/screen/hand/instance/proc/sync_index(index = hand_index) screen_loc = SCREEN_LOC_INV_HAND(index) @@ -55,7 +55,7 @@ /atom/movable/screen/hand/swap_hand /atom/movable/screen/hand/swap_hand/sync_style(datum/hud_style/style) - icon = hud.inventory_icons_wide + icon = style.inventory_icons_wide /atom/movable/screen/hand/equip_hand diff --git a/code/game/atoms/buckling.dm b/code/game/atoms/buckling.dm index 4ac3c3b1ecec..f74edc2d77c1 100644 --- a/code/game/atoms/buckling.dm +++ b/code/game/atoms/buckling.dm @@ -3,7 +3,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return ..() -/atom/movable/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/atom/movable/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 963f6aeb28fa..bd2c2925583d 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -331,7 +331,7 @@ src.add_hiddenprint(user) nano_ui_interact(user) -/obj/machinery/computer/scan_consolenew/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/scan_consolenew/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!..()) nano_ui_interact(user) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index e32fdec2470d..f9c26c4fe7a4 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -37,7 +37,7 @@ . = ..() START_PROCESSING(SSobj, src) -/obj/structure/cult/pylon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/cult/pylon/attack_hand(mob/user, datum/event_args/clickchain/e_args) attackpylon(user, 5) /obj/structure/cult/pylon/attack_generic(var/mob/user, var/damage) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 9c350d01fafd..15d84a12ae75 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -101,7 +101,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," return -/obj/effect/rune/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/rune/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!ishuman(user)) return var/mob/living/carbon/human/H = user diff --git a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm index 4e90dbb70d64..75ae6141559e 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm @@ -78,7 +78,7 @@ /turf/unsimulated/wall/supermatter/attack_ai(mob/user as mob) return user.examinate(src) -/turf/unsimulated/wall/supermatter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/turf/unsimulated/wall/supermatter/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.visible_message("\The [user] reaches out and touches \the [src]... And then blinks out of existance.",\ "You reach out and touch \the [src]. Everything immediately goes quiet. Your last thought is \"That was not a wise decision.\"",\ "You hear an unearthly noise.") diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 48ab65664690..36193d4bc333 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -17,7 +17,7 @@ . = ..() layCable(new_turf,M_Dir) -/obj/machinery/cablelayer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/cablelayer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!cable&&!on) to_chat(user, SPAN_WARNING("\The [src] doesn't have any cable loaded.")) return diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 59186cd478b1..445d9079de66 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -41,7 +41,7 @@ if(prob(25)) density = 0 -/obj/machinery/optable/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/optable/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(MUTATION_HULK in usr.mutations) visible_message(SPAN_DANGER("\The [usr] destroys \the [src]!")) density = FALSE diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index da488f2e56ba..1934a4a6b7cd 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -37,7 +37,7 @@ /obj/machinery/sleep_console/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/sleep_console/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/sleep_console/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return 1 diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 39f35ecd212a..fa5a847023e0 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -332,7 +332,7 @@ else return attack_hand(user) -/obj/machinery/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(IsAdminGhost(user)) return FALSE if(inoperable(MAINT)) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 86bcbe1d4f48..e16900ffc961 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -240,7 +240,7 @@ . = ..() return attack_hand(user) -/obj/machinery/body_scanconsole/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/body_scanconsole/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 2402a67993c6..5d4c4ba3da99 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -57,7 +57,7 @@ /obj/machinery/ai_slipper/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/ai_slipper/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/ai_slipper/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return if((get_dist(src, user) > 1)) diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 61330e28496f..b6ba4a0820d4 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -523,7 +523,7 @@ GLOBAL_LIST_EMPTY(air_alarms) /obj/machinery/alarm/attack_ai(mob/user) ui_interact(user) -/obj/machinery/alarm/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/alarm/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/atm_ret_field.dm b/code/game/machinery/atm_ret_field.dm index 3db0f97d1fa9..b6eb124f4725 100644 --- a/code/game/machinery/atm_ret_field.dm +++ b/code/game/machinery/atm_ret_field.dm @@ -218,7 +218,7 @@ update_nearby_tiles() //Force ZAS update . = ..() -/obj/structure/atmospheric_retention_field/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/atmospheric_retention_field/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(density) visible_message("You touch the retention field, and it crackles faintly. Tingly!") else diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index f34fd4adfdc4..5e37ab8d5ff5 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -86,7 +86,7 @@ radio_controller.remove_object(src, frequency) ..() -/obj/machinery/computer/general_air_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/general_air_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..(user)) return diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm index 80214301b225..c848575bde05 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/atmoalter/area_atmos_computer.dm @@ -21,7 +21,7 @@ /obj/machinery/computer/area_atmos/attack_ai(mob/user) return src.attack_hand(user) -/obj/machinery/computer/area_atmos/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/area_atmos/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..(user)) return ui_interact(user) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index d2e46791ecc5..a9bf1b528bfa 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -317,7 +317,7 @@ update_flag /obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/portable_atmospherics/canister/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/portable_atmospherics/canister/attack_hand(mob/user, datum/event_args/clickchain/e_args) return src.ui_interact(user) /obj/machinery/portable_atmospherics/canister/ui_state(mob/user, datum/tgui_module/module) diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index cdf02a482180..e180b4f944b1 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -110,7 +110,7 @@ . = ..() return src.attack_hand(user) -/obj/machinery/portable_atmospherics/powered/pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/portable_atmospherics/powered/pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/portable_atmospherics/powered/pump/ui_interact(mob/user, datum/tgui/ui) @@ -208,7 +208,7 @@ name = "[name] (ID [id])" -/obj/machinery/portable_atmospherics/powered/pump/huge/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/portable_atmospherics/powered/pump/huge/attack_hand(mob/user, datum/event_args/clickchain/e_args) to_chat(user, "You can't directly interact with this machine. Use the pump control console.") /obj/machinery/portable_atmospherics/powered/pump/huge/update_icon() diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index a7f1b4bb070e..97f582941e16 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -105,7 +105,7 @@ . = ..() return src.attack_hand(user) -/obj/machinery/portable_atmospherics/powered/scrubber/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/portable_atmospherics/powered/scrubber/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/portable_atmospherics/powered/scrubber/ui_interact(mob/user, datum/tgui/ui) @@ -181,7 +181,7 @@ name = "[name] (ID [id])" -/obj/machinery/portable_atmospherics/powered/scrubber/huge/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/portable_atmospherics/powered/scrubber/huge/attack_hand(mob/user, datum/event_args/clickchain/e_args) to_chat(user, "You can't directly interact with this machine. Use the scrubber control console.") /obj/machinery/portable_atmospherics/powered/scrubber/huge/update_icon() diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index f4ae84b670a1..da70f8466888 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -125,7 +125,7 @@ . = ..() -/obj/machinery/organ_printer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/organ_printer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/bomb_tester.dm b/code/game/machinery/bomb_tester.dm index 32a5e6acad85..a69419bf494c 100644 --- a/code/game/machinery/bomb_tester.dm +++ b/code/game/machinery/bomb_tester.dm @@ -109,7 +109,7 @@ return ..() -/obj/machinery/bomb_tester/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/bomb_tester/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) ui_interact(user) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index b7a9912ee3fe..3f9b5aaaf249 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -129,7 +129,7 @@ src.view_range = num GLOB.cameranet.updateVisibility(src, 0) -/obj/machinery/camera/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/camera/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/carbon/human/L = user if(!istype(L)) return diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 4f318c0cc7d2..392ad21852cb 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -149,7 +149,7 @@ else icon_state = "cameracase" -/obj/item/camera_assembly/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/camera_assembly/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!anchored) ..() diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index bd1ac64789ec..5f503e3233c4 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -81,7 +81,7 @@ else if(default_part_replacement(user, W)) return -/obj/machinery/cell_charger/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/cell_charger/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(charging) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 304a13687020..c40273d859a9 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -60,7 +60,7 @@ add_hiddenprint(user) return attack_hand(user) -/obj/machinery/clonepod/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/clonepod/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((isnull(occupant)) || (machine_stat & NOPOWER)) return if((!isnull(occupant)) && (occupant.stat != 2)) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 798cc4efdf7f..ca02f38cf66c 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -48,7 +48,7 @@ return ui_interact(user) -/obj/machinery/computer/operating/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/operating/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/game/machinery/computer/RCON_Console.dm b/code/game/machinery/computer/RCON_Console.dm index 1116fc62b2af..4525781d224e 100644 --- a/code/game/machinery/computer/RCON_Console.dm +++ b/code/game/machinery/computer/RCON_Console.dm @@ -26,7 +26,7 @@ // Proc: attack_hand() // Parameters: 1 (user - Person which clicked this computer) // Description: Opens UI of this machine. -/obj/machinery/computer/rcon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/rcon/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() ui_interact(user) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 795ee7036e2a..f54aac4c8c14 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -48,7 +48,7 @@ to_chat(user, SPAN_NOTICE("There is no AI loaded onto this computer, and no AI loaded onto [I]. What exactly are you trying to do here?")) return ..() -/obj/machinery/computer/aifixer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/aifixer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return ui_interact(user) diff --git a/code/game/machinery/computer/arcade/claw_machine.dm b/code/game/machinery/computer/arcade/claw_machine.dm index 9a42c68971ee..3eaf7bf603d0 100644 --- a/code/game/machinery/computer/arcade/claw_machine.dm +++ b/code/game/machinery/computer/arcade/claw_machine.dm @@ -160,7 +160,7 @@ /obj/machinery/computer/arcade/clawmachine/Initialize(mapload) . = ..() -/obj/machinery/computer/arcade/clawmachine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/arcade/clawmachine/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index af1fcd1a0b56..48b382835138 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -19,7 +19,7 @@ var/global/list/minor_air_alarms = list() atmosphere_alarm.unregister_alarm(src) return ..() -/obj/machinery/computer/atmos_alert/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/atmos_alert/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/computer/atmos_alert/ui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index c5822e912cd3..bc2cd89f9960 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -33,7 +33,7 @@ /obj/machinery/computer/atmoscontrol/attack_ai(mob/user) ui_interact(user) -/obj/machinery/computer/atmoscontrol/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/atmoscontrol/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index e6c6829c097d..c1c283cfa217 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -28,7 +28,7 @@ /obj/machinery/computer/security/ui_interact(mob/user, datum/tgui/ui = null) camera.ui_interact(user, ui) -/obj/machinery/computer/security/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/security/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 580fffde7d6b..3d1d5c390c39 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -94,7 +94,7 @@ /obj/machinery/computer/cloning/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/cloning/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/cloning/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) add_fingerprint(user) diff --git a/code/game/machinery/computer/command/card.dm b/code/game/machinery/computer/command/card.dm index 2a77a37b1f30..d5af54018f38 100644 --- a/code/game/machinery/computer/command/card.dm +++ b/code/game/machinery/computer/command/card.dm @@ -105,7 +105,7 @@ /obj/machinery/computer/card/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/card/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/card/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if(machine_stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 894ad9f15fcd..60b2b5e5a0d7 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -296,7 +296,7 @@ /obj/machinery/computer/communications/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/communications/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/communications/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if ((LEGACY_MAP_DATUM) && !(src.z in (LEGACY_MAP_DATUM).contact_levels)) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index b6de72b49577..3a7b5b353464 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -23,7 +23,7 @@ /obj/machinery/computer/crew/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/crew/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/crew/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index eb290d92c5cc..714648f3cf0d 100755 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -117,7 +117,7 @@ /obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/guestpass/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/guestpass/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 1bbf16bc7c3f..6fa875d9fe42 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -35,7 +35,7 @@ ..() -/obj/machinery/computer/aiupload/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/aiupload/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & NOPOWER) to_chat(user, "The upload computer has no power!") return @@ -71,7 +71,7 @@ return ..() -/obj/machinery/computer/borgupload/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/borgupload/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat& NOPOWER) to_chat(user, "The upload computer has no power!") return diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index a91ca58c0582..3d23d2bc9e2b 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -101,7 +101,7 @@ /obj/machinery/computer/med_data/attack_ai(user as mob) return attack_hand(user) -/obj/machinery/computer/med_data/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/med_data/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 66dc5d051803..34a9a25b70ed 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -78,7 +78,7 @@ linkedServer = message_servers[1] return ..() -/obj/machinery/computer/message_monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/message_monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return if(!istype(user)) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index c6fa49997344..60bdb0bf0fd8 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -46,7 +46,7 @@ /obj/machinery/computer/pod/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/pod/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/pod/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return @@ -142,7 +142,7 @@ title = "External Airlock Controls" req_access = list(ACCESS_FACTION_SYNDICATE) -/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access Denied") return diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 5a271b03478b..ecb33c9fe954 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -16,7 +16,7 @@ /obj/machinery/computer/prisoner/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/prisoner/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/prisoner/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm index 7fc855387013..6dbbceb577a5 100644 --- a/code/game/machinery/computer/prisonshuttle.dm +++ b/code/game/machinery/computer/prisonshuttle.dm @@ -27,7 +27,7 @@ var/prison_shuttle_timeleft = 0 /obj/machinery/computer/prison_shuttle/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/prison_shuttle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/prison_shuttle/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!src.allowed(user) && (!hacked)) to_chat(user, "Access Denied.") return diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index a9f92aa7c6e1..83b641ee5e3b 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -11,7 +11,7 @@ /obj/machinery/computer/robotics/attack_ai(var/mob/user as mob) ui_interact(user) -/obj/machinery/computer/robotics/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/robotics/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if(machine_stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 018eaba17b61..0d967cd6370a 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -87,7 +87,7 @@ /obj/machinery/computer/secure_data/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/secure_data/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/secure_data/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return add_fingerprint(user) diff --git a/code/game/machinery/computer/shutoff_monitor.dm b/code/game/machinery/computer/shutoff_monitor.dm index adda8e52c18c..b14ca4124b87 100644 --- a/code/game/machinery/computer/shutoff_monitor.dm +++ b/code/game/machinery/computer/shutoff_monitor.dm @@ -15,7 +15,7 @@ QDEL_NULL(monitor) ..() -/obj/machinery/computer/shutoff_monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/shutoff_monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() monitor.ui_interact(user) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index a907a7659224..80091b7af97b 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -65,7 +65,7 @@ return attack_hand(user) //Someone needs to break down the dat += into chunks instead of long ass lines. -/obj/machinery/computer/skills/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/skills/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if ((LEGACY_MAP_DATUM) && !(src.z in (LEGACY_MAP_DATUM).contact_levels)) diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm index 143636a06d95..a2011ddd404d 100644 --- a/code/game/machinery/computer/specops_shuttle.dm +++ b/code/game/machinery/computer/specops_shuttle.dm @@ -255,7 +255,7 @@ var/specops_shuttle_timeleft = 0 /obj/machinery/computer/specops_shuttle/emag_act(var/remaining_charges, var/mob/user) to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals.") -/obj/machinery/computer/specops_shuttle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/specops_shuttle/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access Denied.") return diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 66dbe82f28e5..ccbc8e8ca414 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -34,7 +34,7 @@ ui_interact(user) return -/obj/machinery/computer/station_alert/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/station_alert/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/computer/supermatter_monitor_tgui.dm b/code/game/machinery/computer/supermatter_monitor_tgui.dm index 921190479603..85d72ce850b8 100644 --- a/code/game/machinery/computer/supermatter_monitor_tgui.dm +++ b/code/game/machinery/computer/supermatter_monitor_tgui.dm @@ -17,7 +17,7 @@ /obj/machinery/computer/sm_monitor/attack_ai(mob/user) ui_interact(user) -/obj/machinery/computer/sm_monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/sm_monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index de2bf923edd2..64b508265f17 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -35,7 +35,7 @@ /obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/supplycomp/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/supplycomp/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if(!allowed(user)) diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm index 643a79f3f429..1b180cf54eca 100644 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm @@ -191,7 +191,7 @@ var/syndicate_elite_shuttle_timeleft = 0 /obj/machinery/computer/syndicate_elite_shuttle/emag_act(var/remaining_charges, var/mob/user) to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals.") -/obj/machinery/computer/syndicate_elite_shuttle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/syndicate_elite_shuttle/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access Denied.") return diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index 27cdee0ce97a..d1be30e31d28 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -65,7 +65,7 @@ return . = ..() -/obj/machinery/computer/timeclock/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/timeclock/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return user.set_machine(src) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 9dcf0e983dc1..b0917b4f3b63 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -79,7 +79,7 @@ if(occupant == user && !user.stat) go_out() -/obj/machinery/atmospherics/component/unary/cryo_cell/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/unary/cryo_cell/attack_hand(mob/user, datum/event_args/clickchain/e_args) nano_ui_interact(user) /** diff --git a/code/game/machinery/deployable_vr.dm b/code/game/machinery/deployable_vr.dm index 1bee4e7a83a0..94b6de54588e 100644 --- a/code/game/machinery/deployable_vr.dm +++ b/code/game/machinery/deployable_vr.dm @@ -56,7 +56,7 @@ topple() ..() -/obj/structure/barricade/cutout/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/barricade/cutout/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((. = ..())) return diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index d426765dc716..bc5580789279 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -34,7 +34,7 @@ playsound(src.loc, "sparks", 100, TRUE) return 1 -/obj/machinery/button/remote/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/button/remote/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/doorbell_vr.dm b/code/game/machinery/doorbell_vr.dm index 399385d26d76..3d223d562b12 100644 --- a/code/game/machinery/doorbell_vr.dm +++ b/code/game/machinery/doorbell_vr.dm @@ -111,7 +111,7 @@ else icon_state = "doorbell-standby" -/obj/machinery/button/doorbell/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/button/doorbell/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(..()) return diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5d4dec4ecd6e..94ea5654283a 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -654,7 +654,7 @@ About the new airlock wires panel: last_spark = world.time return ..() -/obj/machinery/door/airlock/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/door/airlock/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 100)) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 1fed6130f8b4..0cd9bda38c3b 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -174,7 +174,7 @@ else icon_state = "airlock_sensor_off" -/obj/machinery/airlock_sensor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/airlock_sensor/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/datum/signal/signal = new signal.transmission_method = TRANSMISSION_RADIO //radio signal signal.data["tag"] = master_tag @@ -260,7 +260,7 @@ return ..() -/obj/machinery/access_button/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/access_button/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() if(!allowed(user)) to_chat(user, "Access Denied") diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index d93c41c1a214..78801e9ded80 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -119,7 +119,7 @@ //Proc: attack_hand //Description: Attacked with empty hand. Only to allow special attack_bys. -/obj/machinery/door/blast/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/door/blast/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/X = user if(istype(X.species, /datum/species/xenos)) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 4a24bd8e08eb..ff739bf803b1 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -158,7 +158,7 @@ /obj/machinery/door_timer/attack_ai(mob/user) return src.attack_hand(user) -/obj/machinery/door_timer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/door_timer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 8b6a3a324e0a..848274bab338 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -200,7 +200,7 @@ /obj/machinery/door/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/door/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/door/attack_hand(mob/user, datum/event_args/clickchain/e_args) return src.attackby(user, user) /obj/machinery/door/attack_tk(mob/user as mob) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index afe23fc3b1f5..6f811a305650 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -150,7 +150,7 @@ GLOBAL_LIST_INIT(firelock_align_types, typecacheof(list( attack_hand(M) return 0 -/obj/machinery/door/firedoor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/door/firedoor/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(operating) return//Already doing something. diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 138c43696e14..98462b815b36 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -147,7 +147,7 @@ /obj/machinery/door/window/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/door/window/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/door/window/attack_hand(mob/user, datum/event_args/clickchain/e_args) src.add_fingerprint(user) if(istype(user,/mob/living/carbon/human)) diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index a90a2ae651be..0dd8534d7394 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -48,7 +48,7 @@ /obj/machinery/embedded_controller/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/embedded_controller/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/embedded_controller/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!user.IsAdvancedToolUser()) return 0 diff --git a/code/game/machinery/event.dm b/code/game/machinery/event.dm index 6ea2d298e760..2b73eeea0451 100644 --- a/code/game/machinery/event.dm +++ b/code/game/machinery/event.dm @@ -65,7 +65,7 @@ The goal here is to create esoteric or niche, specialized machines that follow t else return -/obj/machinery/magma_pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/magma_pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) interact(user) /obj/machinery/magma_pump/interact(mob/user) @@ -211,7 +211,7 @@ The goal here is to create esoteric or niche, specialized machines that follow t else return -/obj/machinery/magma_reservoir/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/magma_reservoir/attack_hand(mob/user, datum/event_args/clickchain/e_args) interact(user) /obj/machinery/magma_reservoir/interact(mob/user) diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm index 844783b41cbb..a5996a82b958 100644 --- a/code/game/machinery/exonet_node.dm +++ b/code/game/machinery/exonet_node.dm @@ -93,7 +93,7 @@ // Proc: attack_hand() // Parameters: 1 (user - the person clicking on the machine) // Description: Opens the TGUI interface with ui_interact() -/obj/machinery/exonet_node/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/exonet_node/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) // Proc: ui_interact() diff --git a/code/game/machinery/fire_alarm.dm b/code/game/machinery/fire_alarm.dm index 043f69e7e820..49fd1cb12d33 100644 --- a/code/game/machinery/fire_alarm.dm +++ b/code/game/machinery/fire_alarm.dm @@ -176,7 +176,7 @@ FIRE ALARM spawn(rand(0,15)) update_icon() -/obj/machinery/firealarm/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/firealarm/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER | BROKEN)) return @@ -295,7 +295,7 @@ Just a object used in constructing fire alarms idle_power_usage = 2 active_power_usage = 6 -/obj/machinery/partyalarm/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/partyalarm/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 64d07367a3c2..486a64b52d6f 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -127,7 +127,7 @@ name = "flasher button" desc = "A remote control switch for a mounted flasher." -/obj/machinery/button/flasher/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/button/flasher/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index d155a44d061d..e69f40624802 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -66,7 +66,7 @@ if(!turn_on(TRUE)) to_chat(user, "You try to turn on \the [src] but it does not work.") -/obj/machinery/floodlight/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/floodlight/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(open && cell) user.grab_item_from_interacted_with(cell, src) diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index 9a1d861ee950..825d2a9f7356 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -62,7 +62,7 @@ var/list/floor_light_cache = list() attack_hand(user) return -/obj/machinery/floor_light/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/floor_light/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_HARM && !issmall(user)) if(!isnull(damaged) && !(machine_stat & BROKEN)) diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index 336f25277f43..0f204b0b2156 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -32,7 +32,7 @@ old_turf = isturf(loc)? loc : null -/obj/machinery/floorlayer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/floorlayer/attack_hand(mob/user, datum/event_args/clickchain/e_args) on=!on user.visible_message( \ SPAN_NOTICE("[user] has [!on?"de":""]activated \the [src]."), \ diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 1aceb9587d42..8c5de02521e1 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -59,7 +59,7 @@ icon = 'icons/obj/power.dmi' icon_state = "crema_switch" -/obj/machinery/button/holosign/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/button/holosign/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 1bd269924f7c..e852ad1a01ab 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -13,7 +13,7 @@ /obj/machinery/igniter/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/igniter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/igniter/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return @@ -121,7 +121,7 @@ name = "ignition switch" desc = "A remote control switch for a mounted igniter." -/obj/machinery/button/ignition/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/button/ignition/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 6c7ce12e8dc3..10035ba35522 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -166,7 +166,7 @@ else return ..() -/obj/machinery/iv_drip/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/iv_drip/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(reagent_container) reagent_container.loc = get_turf(src) reagent_container = null diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 0b311d6362f3..43553ac87de3 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -299,7 +299,7 @@ /obj/machinery/media/jukebox/attack_ai(mob/user) return src.attack_hand(user) -/obj/machinery/media/jukebox/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/media/jukebox/attack_hand(mob/user, datum/event_args/clickchain/e_args) interact(user) /obj/machinery/media/jukebox/proc/explode() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 03f1d31b75f0..5fcaa7a6799c 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -52,7 +52,7 @@ /obj/machinery/light_switch/examine(mob/user, dist) . += SPAN_NOTICE("A light switch. It is [on? "on" : "off"].") -/obj/machinery/light_switch/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/light_switch/attack_hand(mob/user, datum/event_args/clickchain/e_args) on = !on diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 6ded067e09b7..db6d67a74fd5 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -251,7 +251,7 @@ /obj/machinery/magnetic_controller/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/magnetic_controller/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/magnetic_controller/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return user.set_machine(src) diff --git a/code/game/machinery/misc/bioscan_antenna.dm b/code/game/machinery/misc/bioscan_antenna.dm index 3b0cc1601e76..d74d2e85dadf 100644 --- a/code/game/machinery/misc/bioscan_antenna.dm +++ b/code/game/machinery/misc/bioscan_antenna.dm @@ -50,7 +50,7 @@ GLOBAL_LIST_EMPTY(bioscan_antenna_list) .[TOOL_MULTITOOL] = "change network" return merge_double_lazy_assoc_list(., ..()) -/obj/machinery/bioscan_antenna/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/bioscan_antenna/attack_hand(mob/user, datum/event_args/clickchain/e_args) // todo: better xenomorphs if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index acd60d82a916..e79a6cd38904 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -100,7 +100,7 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w /obj/machinery/navbeacon/attack_ai(var/mob/user) interact(user, 1) -/obj/machinery/navbeacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/navbeacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!user.IsAdvancedToolUser()) return FALSE diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 514af605b628..bfa7fa7a1ee5 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -250,7 +250,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/newscaster/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ +/obj/machinery/newscaster/attack_hand(mob/user, datum/event_args/clickchain/e_args) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ if(!ispowered || isbroken) return diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index c9c9dbec686a..b70518c69ae7 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -162,7 +162,7 @@ var/bomb_set return ..() -/obj/machinery/nuclearbomb/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/nuclearbomb/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(extended) if(!ishuman(user)) to_chat(user, "You don't have the dexterity to do this!") diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 4338940130ac..b4b7cda52ba7 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -51,7 +51,7 @@ attach_mask(target) src.add_fingerprint(usr) -/obj/machinery/oxygen_pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/oxygen_pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((machine_stat & MAINT) && tank) user.visible_message( \ SPAN_NOTICE("\The [user] removes \the [tank] from \the [src]."), \ diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm index 7f581fbe0a18..c4ea42b94f7b 100644 --- a/code/game/machinery/pda_multicaster.dm +++ b/code/game/machinery/pda_multicaster.dm @@ -46,7 +46,7 @@ /obj/machinery/pda_multicaster/attack_ai(mob/user) attack_hand(user) -/obj/machinery/pda_multicaster/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/pda_multicaster/attack_hand(mob/user, datum/event_args/clickchain/e_args) toggle_power(user) /obj/machinery/pda_multicaster/proc/toggle_power(mob/user) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 1d8ca71ecc8f..9e70e98fb5cb 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -11,7 +11,7 @@ var/disposals = FALSE -/obj/machinery/pipedispenser/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/pipedispenser/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((. = ..())) return ui_interact(user) diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index 8648ffb7a78a..c1e70b01eae9 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -51,7 +51,7 @@ old_turf = new_turf old_dir = turn(M_Dir, 180) -/obj/machinery/pipelayer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/pipelayer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if(panel_open) diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index f68ea70469af..e507c73585ad 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -39,7 +39,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) ui = new(user, src, "PointDefenseControl") // 400, 600 ui.open() -/obj/machinery/pointdefense_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/pointdefense_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index c808bf5df334..12a9b225e299 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -452,7 +452,7 @@ nano_ui_interact(user) -/obj/machinery/porta_turret/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/porta_turret/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(isLocked(user)) return @@ -1145,7 +1145,7 @@ ..() -/obj/machinery/porta_turret_construct/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/porta_turret_construct/attack_hand(mob/user, datum/event_args/clickchain/e_args) switch(build_step) if(4) if(!installation) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 9c1889603adc..79ec89de3661 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -100,7 +100,7 @@ else if(default_part_replacement(user, G)) return -/obj/machinery/recharger/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/recharger/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(istype(user,/mob/living/silicon)) return diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm index a2106766542f..cde0100d7846 100644 --- a/code/game/machinery/records_scanner.dm +++ b/code/game/machinery/records_scanner.dm @@ -36,7 +36,7 @@ obj/machinery/scanner else icon_state = "scanner_idle" -obj/machinery/scanner/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +obj/machinery/scanner/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(stat & NOPOWER) return if(!ishuman(user) || lastuser == user.real_name) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index e742f684a1ee..562282246392 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -119,7 +119,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() req_console_information -= department return ..() -/obj/machinery/requests_console/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/requests_console/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..(user)) return nano_ui_interact(user) diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index daabe33d3127..7edfddc96941 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -32,7 +32,7 @@ else to_chat(user, "The robot part maker is full. Please remove metal from the robot part maker in order to insert more.") -/obj/machinery/robotic_fabricator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/robotic_fabricator/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/dat if(..()) return diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 9e9fc77a6157..6bbabdc0d007 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -74,7 +74,7 @@ ..() return -/obj/machinery/space_heater/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/space_heater/attack_hand(mob/user, datum/event_args/clickchain/e_args) interact(user) /obj/machinery/space_heater/interact(mob/user as mob) @@ -230,7 +230,7 @@ return ..() -/obj/machinery/power/thermoregulator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/thermoregulator/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/game/machinery/suit_storage/suit_cycler.dm b/code/game/machinery/suit_storage/suit_cycler.dm index 6b6dc59437ec..21d24d547daa 100644 --- a/code/game/machinery/suit_storage/suit_cycler.dm +++ b/code/game/machinery/suit_storage/suit_cycler.dm @@ -260,7 +260,7 @@ updateUsrDialog() return 1 -/obj/machinery/suit_cycler/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/suit_cycler/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) diff --git a/code/game/machinery/suit_storage/suit_storage_massive.dm b/code/game/machinery/suit_storage/suit_storage_massive.dm index 6c0b3f4f62d6..66bc2f2d7b4a 100644 --- a/code/game/machinery/suit_storage/suit_storage_massive.dm +++ b/code/game/machinery/suit_storage/suit_storage_massive.dm @@ -65,7 +65,7 @@ dump_everything() qdel(src) -/obj/machinery/suit_storage_closet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/suit_storage_closet/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if(machine_stat & NOPOWER) diff --git a/code/game/machinery/suit_storage/suit_storage_unit.dm b/code/game/machinery/suit_storage/suit_storage_unit.dm index 15b9c4211acd..6f4cc420fd5f 100644 --- a/code/game/machinery/suit_storage/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage/suit_storage_unit.dm @@ -78,7 +78,7 @@ dump_everything() qdel(src) -/obj/machinery/suit_storage_unit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/suit_storage_unit/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if(machine_stat & NOPOWER) diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 3b27f354648b..d0505f961a35 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -57,7 +57,7 @@ return return ..() -/obj/machinery/power/supply_beacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/supply_beacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(expended) update_use_power(USE_POWER_OFF) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index b225acb6acc6..cf4c3e21ac52 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -15,7 +15,7 @@ var/selfdestructing = FALSE var/charges = 1 -/obj/machinery/syndicate_beacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/syndicate_beacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) usr.set_machine(src) var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) @@ -108,7 +108,7 @@ /obj/machinery/power/singularity_beacon/attack_ai(mob/user) return -/obj/machinery/power/singularity_beacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/singularity_beacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(anchored) return active ? Deactivate(user) : Activate(user) else @@ -159,7 +159,7 @@ //! ## VR FILE MERGE ## !// // Virgo modified syndie beacon, does not give objectives -/obj/machinery/syndicate_beacon/virgo/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/syndicate_beacon/virgo/attack_hand(mob/user, datum/event_args/clickchain/e_args) usr.set_machine(src) var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) diff --git a/code/game/machinery/telecomms/_telecomms.dm b/code/game/machinery/telecomms/_telecomms.dm index 26c0b1eb1a46..68cb7de5a1c0 100644 --- a/code/game/machinery/telecomms/_telecomms.dm +++ b/code/game/machinery/telecomms/_telecomms.dm @@ -363,7 +363,7 @@ return UI_CLOSE . = ..() -/obj/machinery/telecomms/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/telecomms/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/telecomms/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 25a3fa2d80d0..ab1e3be1d596 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -62,7 +62,7 @@ return data -/obj/machinery/computer/telecomms/server/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/telecomms/server/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/game/machinery/telecomms/message_server.dm b/code/game/machinery/telecomms/message_server.dm index 487157dfd705..4f3a91aad945 100644 --- a/code/game/machinery/telecomms/message_server.dm +++ b/code/game/machinery/telecomms/message_server.dm @@ -140,7 +140,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() Console.set_light(2) -/obj/machinery/message_server/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/message_server/attack_hand(mob/user, datum/event_args/clickchain/e_args) // to_chat(user, "There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentCom delays.") to_chat(user, "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]") active = !active diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index 155944c56783..73d6080d0a22 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -50,7 +50,7 @@ return data -/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/game/machinery/teleporter/console.dm b/code/game/machinery/teleporter/console.dm index 11ee010e97db..b6ef92850336 100644 --- a/code/game/machinery/teleporter/console.dm +++ b/code/game/machinery/teleporter/console.dm @@ -86,7 +86,7 @@ return -/obj/machinery/computer/teleporter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/teleporter/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/computer/teleporter/ui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) diff --git a/code/game/machinery/teleporter/projector.dm b/code/game/machinery/teleporter/projector.dm index c59e933c74f6..e817d0c16d1c 100644 --- a/code/game/machinery/teleporter/projector.dm +++ b/code/game/machinery/teleporter/projector.dm @@ -182,7 +182,7 @@ /obj/machinery/tele_projector/attack_ai() attack_hand() -/obj/machinery/tele_projector/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/tele_projector/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(engaged) disengage() else diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index a6e091c4250b..c9090a18b305 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -118,7 +118,7 @@ nano_ui_interact(user) -/obj/machinery/turretid/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/turretid/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(isLocked(user)) return diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index b2d474f77e76..c992c921aaf3 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -281,7 +281,7 @@ /obj/machinery/vending/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/vending/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/vending/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 065a41e8ff82..9a66ccc52958 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -120,7 +120,7 @@ ..() update_icon() -/obj/machinery/washing_machine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/washing_machine/attack_hand(mob/user, datum/event_args/clickchain/e_args) switch(state) if(1) state = 2 diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index 3442c677071d..c280619fabf2 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -9,7 +9,7 @@ var/charges = 1 var/insisting = 0 -/obj/machinery/wish_granter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/wish_granter/attack_hand(mob/user, datum/event_args/clickchain/e_args) usr.set_machine(src) if(charges <= 0) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 69ebaaa74199..5143cee72512 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -482,7 +482,7 @@ get_asset_datum(/datum/asset/spritesheet/materials) ) -/obj/machinery/mecha_part_fabricator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/mecha_part_fabricator/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if(!allowed(user)) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index c56049410a7a..497fa17bc2b0 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1006,7 +1006,7 @@ qdel(src) return -/obj/mecha/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/mecha/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user == occupant) show_radial_occupant(user) return diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 53b5058005ac..a90b672a238f 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -13,7 +13,7 @@ /obj/machinery/computer/mecha/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/computer/mecha/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/mecha/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index d5b8376a89e5..7f6ac5463c3a 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -22,7 +22,7 @@ ..() return -/obj/item/mecha_parts/chassis/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/mecha_parts/chassis/attack_hand(mob/user, datum/event_args/clickchain/e_args) return //! Ripley @@ -467,7 +467,7 @@ ..() return -/obj/item/mecha_parts/fighter/chassis/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/mecha_parts/fighter/chassis/attack_hand(mob/user, datum/event_args/clickchain/e_args) return diff --git a/code/game/mecha/micro/mecha_parts_vr.dm b/code/game/mecha/micro/mecha_parts_vr.dm index ee8e712cae03..fd6620f1bd64 100644 --- a/code/game/mecha/micro/mecha_parts_vr.dm +++ b/code/game/mecha/micro/mecha_parts_vr.dm @@ -17,7 +17,7 @@ ..() return -/obj/item/mecha_parts/micro/chassis/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/mecha_parts/micro/chassis/attack_hand(mob/user, datum/event_args/clickchain/e_args) return //Gopher diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index 3057aae6636a..09848698b3eb 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -104,7 +104,7 @@ health = max(0, health - tforce) healthcheck() -/obj/effect/alien/resin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/alien/resin/attack_hand(mob/user, datum/event_args/clickchain/e_args) usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if (MUTATION_HULK in usr.mutations) to_chat(usr, "You easily destroy the [name].") @@ -454,7 +454,7 @@ Alien plants should do something if theres a lot of poison if((status == GROWING) && (BURST == 0)) Grow() -/obj/effect/alien/egg/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/alien/egg/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/carbon/M = user if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)) diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 984379d7d427..ba85c26cc764 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -171,7 +171,7 @@ else if(metal == 1 || prob(50)) qdel(src) -/obj/structure/foamedmetal/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/foamedmetal/attack_hand(mob/user, datum/event_args/clickchain/e_args) if ((MUTATION_HULK in user.mutations) || (prob(75 - metal * 25))) user.visible_message("[user] smashes through the foamed metal.", "You smash through the metal foam wall.") qdel(src) diff --git a/code/game/objects/effects/debris/cleanable/humans.dm b/code/game/objects/effects/debris/cleanable/humans.dm index 1f8bbe0803b3..df61a4bd4dee 100644 --- a/code/game/objects/effects/debris/cleanable/humans.dm +++ b/code/game/objects/effects/debris/cleanable/humans.dm @@ -121,7 +121,7 @@ var/global/list/image/splatter_cache=list() add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) amount = 0 -/obj/effect/debris/cleanable/blood/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/debris/cleanable/blood/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/effects/debris/cleanable/misc.dm b/code/game/objects/effects/debris/cleanable/misc.dm index 8d685f85b545..116705be0599 100644 --- a/code/game/objects/effects/debris/cleanable/misc.dm +++ b/code/game/objects/effects/debris/cleanable/misc.dm @@ -15,7 +15,7 @@ icon_state = "ash" anchored = 1 -/obj/effect/debris/cleanable/ash/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/debris/cleanable/ash/attack_hand(mob/user, datum/event_args/clickchain/e_args) to_chat(user, "[src] sifts through your fingers.") var/turf/simulated/floor/F = get_turf(src) if (istype(F)) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 1b1d81d632b7..5588d702a59a 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -158,7 +158,7 @@ roll_and_drop(user.loc) return -/obj/structure/sign/poster/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/sign/poster/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(ruined) return diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index bbfed4fa61e2..1474b72b0d14 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -55,12 +55,12 @@ desc = "They look like human remains. They've been here a long time." icon_state = "mummified2" -/obj/effect/decal/remains/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/decal/remains/attack_hand(mob/user, datum/event_args/clickchain/e_args) to_chat(user, "[src] sinks together into a pile of ash.") var/turf/simulated/floor/F = get_turf(src) if (istype(F)) new /obj/effect/debris/cleanable/ash(F) qdel(src) -/obj/effect/decal/remains/robot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/decal/remains/robot/attack_hand(mob/user, datum/event_args/clickchain/e_args) return diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index da0faa38b999..57909d50366f 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -21,7 +21,7 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal) . = ..() teleport(AM) -/obj/effect/portal/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/portal/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(istype(user) && !(istype(user,/mob/living))) return //do not send ghosts, zshadows, ai eyes, etc spawn(0) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 3fae2415aa57..438eef2c53e6 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -285,7 +285,7 @@ else . = "" -/obj/item/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/attack_hand(mob/user, datum/event_args/clickchain/e_args) attempt_pickup(user) /obj/item/proc/attempt_pickup(mob/user) @@ -781,7 +781,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. // SHOULD_CALL_PARENT(TRUE) // attack_self isn't really part of the item attack chain. if(isnull(e_args)) - e_args = user.default_clickchain_event_args(src, params, TRUE) + e_args = user.default_clickchain_event_args(src, TRUE) SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) if(interaction_flags_item & INTERACT_ITEM_ATTACK_SELF) interact(user) diff --git a/code/game/objects/items/bells.dm b/code/game/objects/items/bells.dm index 293547310870..64d180cb4c39 100644 --- a/code/game/objects/items/bells.dm +++ b/code/game/objects/items/bells.dm @@ -18,7 +18,7 @@ if(broken) . += "It looks damaged, the ringer is stuck firmly inside." -/obj/item/deskbell/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/deskbell/attack_hand(mob/user, datum/event_args/clickchain/e_args) //This defines the radials and what call we're assiging to them. var/list/options = list() diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 842e5fdaf238..2c4185712196 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -161,7 +161,7 @@ QDEL_NULL(tank) return ..() -/obj/structure/closet/body_bag/cryobag/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/closet/body_bag/cryobag/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(used) var/confirm = tgui_alert(user, "Are you sure you want to open \the [src]? \The [src] will expire upon opening it.", "Confirm Opening", list("No", "Yes")) if(confirm == "Yes") diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 60eff3bb76dc..d81164f8c82e 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -110,7 +110,7 @@ to_chat(M, "Your chameleon-projector deactivates.") master.disrupt() -/obj/effect/dummy/chameleon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/dummy/chameleon/attack_hand(mob/user, datum/event_args/clickchain/e_args) for(var/mob/M in src) to_chat(M, "Your chameleon-projector deactivates.") master.disrupt() diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index d766420c34f3..dffc8d97a5da 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -66,7 +66,7 @@ /obj/item/defib_kit/ui_action_click() toggle_paddles() -/obj/item/defib_kit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/defib_kit/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(loc == user) toggle_paddles() else diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 15fd3ff0b056..d13fa88092b4 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -192,7 +192,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return ..() -/obj/item/flashlight/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/flashlight/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(cell) cell.update_appearance() diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index be715160e3e0..38ad7a3f0e84 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -70,7 +70,7 @@ /obj/item/powersink/attack_ai() return -/obj/item/powersink/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/powersink/attack_hand(mob/user, datum/event_args/clickchain/e_args) switch(mode) if(0) ..() diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index f21a86e586ec..4f407dabc91a 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -15,7 +15,7 @@ var/code = 2 -/obj/item/radio/electropack/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/radio/electropack/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(src == user.item_by_slot(SLOT_ID_BACK)) to_chat(user, "You need help taking this off!") return diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 788f1c0425ec..92d3f003aeb1 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -135,7 +135,7 @@ spawn (0) attack_self(user) -/obj/item/radio/intercom/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/radio/intercom/attack_hand(mob/user, datum/event_args/clickchain/e_args) src.add_fingerprint(user) spawn (0) attack_self(user) diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index 974becc3ea39..37f4c11af984 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -69,7 +69,7 @@ var/global/list/active_radio_jammers = list() update_icon() -/obj/item/radio_jammer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/radio_jammer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src && power_source) to_chat(user,"You eject \the [power_source] from \the [src].") user.put_in_hands(power_source) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 2dd3a60b1f55..667abfc52d10 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -810,7 +810,7 @@ GLOBAL_DATUM_INIT(virtual_announcer_ai, /mob/living/silicon/ai/announcer, new(nu /obj/item/bluespace_radio/ui_action_click() toggle_handset() -/obj/item/bluespace_radio/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/bluespace_radio/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(loc == user) toggle_handset() else diff --git a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm index 21f53b5a2c7c..25d81ed08450 100644 --- a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm +++ b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm @@ -62,7 +62,7 @@ tape.ruin() //Fires destroy the tape return ..() -/obj/item/tape_recorder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/tape_recorder/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(tape) eject() diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 1f8a273fddb9..b1b5b3a1972d 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -57,7 +57,7 @@ return ..() -/obj/item/tape_recorder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/tape_recorder/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(mytape) eject() diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 738560c44430..ec6830e8ff4d 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -29,7 +29,7 @@ return ..() -/obj/item/target/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/target/attack_hand(mob/user, datum/event_args/clickchain/e_args) // taking pinned targets off! var/obj/structure/target_stake/stake for(var/obj/structure/target_stake/T in view(3,src)) diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm index f0492249a2d2..80d536052a09 100644 --- a/code/game/objects/items/stacks/marker_beacons.dm +++ b/code/game/objects/items/stacks/marker_beacons.dm @@ -106,7 +106,7 @@ var/list/marker_beacon_colors = list( icon_state = "[initial(icon_state)][lowertext(picked_color)]-on" set_light(light_range, light_power, marker_beacon_colors[picked_color]) -/obj/structure/marker_beacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/marker_beacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) to_chat(user, "You start picking [src] up...") if(do_after(user, remove_speed, target = src)) var/obj/item/stack/marker_beacon/M = new(loc) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2960ae38866a..c065dda393f4 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -352,7 +352,7 @@ if(!amount) break -/obj/item/stack/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/stack/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) change_stack(user, 1) else diff --git a/code/game/objects/items/storage/_storage.dm b/code/game/objects/items/storage/_storage.dm index 68bc71ff00f4..2535f0c70050 100644 --- a/code/game/objects/items/storage/_storage.dm +++ b/code/game/objects/items/storage/_storage.dm @@ -448,7 +448,7 @@ W.add_fingerprint(user) return handle_item_insertion(W, user) -/obj/item/storage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/storage/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.l_store == src && !H.get_active_held_item()) //Prevents opening if it's in a pocket. diff --git a/code/game/objects/items/storage/laundry_basket.dm b/code/game/objects/items/storage/laundry_basket.dm index bbfe38b78c07..9f99e4818ca7 100644 --- a/code/game/objects/items/storage/laundry_basket.dm +++ b/code/game/objects/items/storage/laundry_basket.dm @@ -20,7 +20,7 @@ collection_mode = 1 var/linked -/obj/item/storage/laundry_basket/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/storage/laundry_basket/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item()) to_chat(user, "You need your other hand to be empty") return diff --git a/code/game/objects/items/storage/quickdraw.dm b/code/game/objects/items/storage/quickdraw.dm index 2c21b571f4fa..380ea42fceba 100644 --- a/code/game/objects/items/storage/quickdraw.dm +++ b/code/game/objects/items/storage/quickdraw.dm @@ -14,7 +14,7 @@ //When set to 1, a click while it is equipped will instead move the first item inside it to your hand var/quickmode = 0 -/obj/item/storage/quickdraw/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/storage/quickdraw/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(src.loc == user) //If they aren't holding us, we do nothing special if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 2e66168311a9..944edaa90f3f 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -155,7 +155,7 @@ w_class = ITEMSIZE_LARGE max_storage_space = ITEMSIZE_COST_NORMAL * 4 -/obj/item/storage/secure/briefcase/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/storage/secure/briefcase/attack_hand(mob/user, datum/event_args/clickchain/e_args) if ((src.loc == user) && (src.locked == 1)) to_chat(user, "[src] is locked and cannot be opened!") else if ((src.loc == user) && (!src.locked)) @@ -216,5 +216,5 @@ /obj/item/pen ) -/obj/item/storage/secure/safe/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/storage/secure/safe/attack_hand(mob/user, datum/event_args/clickchain/e_args) return attack_self(user) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index f7c4601e6400..4a974ed9b85e 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -617,7 +617,7 @@ update_icon() return 0 -/obj/item/weldingtool/electric/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/weldingtool/electric/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(power_supply) power_supply.update_icon() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 393efe4ef4f7..bbf4fa2128dd 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -447,7 +447,7 @@ playsound(user, 'sound/mecha/mechstep.ogg', 20, 1) cooldown = world.time -/obj/item/toy/prize/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/toy/prize/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(loc == user) if(cooldown < world.time - 8) to_chat(user, "You play with [src].") @@ -855,7 +855,7 @@ density = 1 var/phrase = "I don't want to exist anymore!" -/obj/structure/plushie/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/plushie/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(user.a_intent == INTENT_HELP) user.visible_message("\The [user] hugs [src]!","You hug [src]!") diff --git a/code/game/objects/items/uav.dm b/code/game/objects/items/uav.dm index 5880d7ae623c..ea9a5f46a5fd 100644 --- a/code/game/objects/items/uav.dm +++ b/code/game/objects/items/uav.dm @@ -64,7 +64,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/uav/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/uav/attack_hand(mob/user, datum/event_args/clickchain/e_args) //Has to be on the ground to work with it properly if(!isturf(loc)) return ..() diff --git a/code/game/objects/items/weapons/barrier_tape.dm b/code/game/objects/items/weapons/barrier_tape.dm index 42a0173157a1..d32715848e47 100644 --- a/code/game/objects/items/weapons/barrier_tape.dm +++ b/code/game/objects/items/weapons/barrier_tape.dm @@ -133,7 +133,7 @@ var/list/tape_roll_applications = list() update_icon() return ..() -/obj/item/barrier_tape_roll/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/barrier_tape_roll/attack_hand(mob/user, datum/event_args/clickchain/e_args) update_icon() return ..() @@ -334,7 +334,7 @@ var/list/tape_roll_applications = list() /obj/item/barrier_tape_segment/attackby(obj/item/W as obj, mob/user as mob) breaktape(user) -/obj/item/barrier_tape_segment/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/barrier_tape_segment/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (user.a_intent == INTENT_HELP && src.allowed(user)) user.show_viewers("\The [user] lifts \the [src], allowing passage.") for(var/obj/item/barrier_tape_segment/T in gettapeline()) diff --git a/code/game/objects/items/weapons/duct_tape.dm b/code/game/objects/items/weapons/duct_tape.dm index b1c248589a6b..003b3ddc6919 100644 --- a/code/game/objects/items/weapons/duct_tape.dm +++ b/code/game/objects/items/weapons/duct_tape.dm @@ -202,7 +202,7 @@ qdel(I) to_chat(user, "You place \the [I] back into \the [src].") -/obj/item/duct_tape_piece/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/duct_tape_piece/attack_hand(mob/user, datum/event_args/clickchain/e_args) anchored = FALSE return ..() // Pick it up now that it's unanchored. diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 1c0ccdd91c52..db4ebad96717 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -111,7 +111,7 @@ ..() return -/obj/item/grenade/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/grenade/attack_hand(mob/user, datum/event_args/clickchain/e_args) walk(src, null, null) ..() return diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 76c0f3f4849a..2cae7f68f0de 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -24,7 +24,7 @@ ..() add_implants() -/obj/machinery/implantchair/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/implantchair/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) var/health_text = "" if(src.occupant) diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index d767ea876fe1..75797e384b42 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -21,7 +21,7 @@ return -/obj/item/implantpad/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/implantpad/attack_hand(mob/user, datum/event_args/clickchain/e_args) if ((src.case && user.is_holding(src))) user.put_in_active_hand(case) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index d11c3252d8d9..07482434cd91 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -94,7 +94,7 @@ else to_chat(user, "This cell is not fitted for [src].") -/obj/item/melee/baton/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/melee/baton/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(bcell && !integrated_cell) bcell.update_icon() diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index c06b35da2d3c..08d62d860041 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -85,7 +85,7 @@ if(!has_buckled_mobs()) anchored = FALSE -/obj/item/beartrap/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/beartrap/attack_hand(mob/user, datum/event_args/clickchain/e_args) // check unbuckle first if(click_unbuckle_interaction(user)) return CLICKCHAIN_DO_NOT_PROPAGATE diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index bda4a4375ac5..008684576f8b 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -84,7 +84,7 @@ to_chat(user,"The tank scoffs at your insolence. It only provides services to welders.") return -/obj/item/weldpack/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/weldpack/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/wearer = user if(wearer.back == src) diff --git a/code/game/objects/misc.dm b/code/game/objects/misc.dm index 88b96361d13b..ff1c8d1d2e4c 100644 --- a/code/game/objects/misc.dm +++ b/code/game/objects/misc.dm @@ -7,7 +7,7 @@ /obj/structure/signpost/attackby(obj/item/W, mob/user) return attack_hand(user) -/obj/structure/signpost/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/signpost/attack_hand(mob/user, datum/event_args/clickchain/e_args) switch(tgui_alert(user, "Do you want to go to SS13?", "Travel", list("Yes", "No"))) if("Yes") user.forceMove(SSjob.get_latejoin_spawnpoint(faction = JOB_FACTION_STATION)) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 20f2c2ead35d..0ed22b8ceaa6 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -251,7 +251,7 @@ /obj/proc/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) return -/obj/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(Adjacent(user)) add_fingerprint(user) ..() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 1897836c9333..5d43207f90b5 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -31,7 +31,7 @@ return ..() -/obj/structure/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(breakable) if(MUTATION_HULK in user.mutations) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) diff --git a/code/game/objects/structures/ashlander.dm b/code/game/objects/structures/ashlander.dm index 7003c47b138d..d6dc439fa194 100644 --- a/code/game/objects/structures/ashlander.dm +++ b/code/game/objects/structures/ashlander.dm @@ -294,7 +294,7 @@ src.updateUsrDialog() return 0 -/obj/structure/ashlander/calcinator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/ashlander/calcinator/attack_hand(mob/user, datum/event_args/clickchain/e_args) interact(user) /obj/structure/ashlander/calcinator/AltClick(mob/user) @@ -382,7 +382,7 @@ . = ..() set_light(3, 2, "#9463bb") -/obj/structure/ashlander/statue/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/ashlander/statue/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/choice = tgui_alert(user, "Do you wish to pray to the statue?", "Interact With the Statue", list("Yes", "No")) if(choice != "Yes") return diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index d47bb4c26c1c..dbe766e60704 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -216,7 +216,7 @@ LINEN BINS hidden = I to_chat(user, "You hide [I] among the sheets.") -/obj/structure/bedsheetbin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/bedsheetbin/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(amount >= 1) amount-- diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 0998fc207e5c..591e08f51911 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -81,7 +81,7 @@ else return ..() -/obj/structure/bonfire/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/bonfire/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(has_buckled_mobs()) return ..() @@ -288,7 +288,7 @@ else return ..() -/obj/structure/fireplace/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/fireplace/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(get_fuel_amount()) remove_fuel(user) diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index fcd2bc2c6580..bbaeb5701d50 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -143,7 +143,7 @@ . = ..() activate() -/obj/effect/catwalk_plated/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/catwalk_plated/attack_hand(mob/user, datum/event_args/clickchain/e_args) attack_generic() /obj/effect/catwalk_plated/attack_ghost() diff --git a/code/game/objects/structures/charge_pylon.dm b/code/game/objects/structures/charge_pylon.dm index b564745e4ea0..a08b901a7ad9 100644 --- a/code/game/objects/structures/charge_pylon.dm +++ b/code/game/objects/structures/charge_pylon.dm @@ -12,7 +12,7 @@ if(Adjacent(user)) attack_hand(user) -/obj/structure/adherent_pylon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/adherent_pylon/attack_hand(mob/user, datum/event_args/clickchain/e_args) charge_user(user) /obj/structure/adherent_pylon/proc/charge_user(var/mob/living/user) diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index 93032959f29e..c144af7dc09b 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -6,7 +6,7 @@ var/obj/item/clothing/suit/coat var/list/allowed = list(/obj/item/clothing/suit/storage/toggle/labcoat, /obj/item/clothing/suit/storage/det_trench) -/obj/structure/coatrack/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/coatrack/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.visible_message("[user] takes [coat] off \the [src].", "You take [coat] off the \the [src]") if(!user.put_in_active_hand(coat)) coat.loc = get_turf(user) diff --git a/code/game/objects/structures/crates_lockers/__closet.dm b/code/game/objects/structures/crates_lockers/__closet.dm index 5e4a08b463e1..063494983e66 100644 --- a/code/game/objects/structures/crates_lockers/__closet.dm +++ b/code/game/objects/structures/crates_lockers/__closet.dm @@ -419,7 +419,7 @@ if(!open()) to_chat(user, "It won't budge!") -/obj/structure/closet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/closet/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(locked && secure) togglelock(user) diff --git a/code/game/objects/structures/crates_lockers/closets/coffin.dm b/code/game/objects/structures/crates_lockers/closets/coffin.dm index 4fcaabed2a3f..26ffde2190a5 100644 --- a/code/game/objects/structures/crates_lockers/closets/coffin.dm +++ b/code/game/objects/structures/crates_lockers/closets/coffin.dm @@ -40,7 +40,7 @@ else icon_state = "closed" -/obj/structure/closet/grave/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/closet/grave/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(opened) visible_message("[user] starts to climb into \the [src.name].", \ "You start to lower yourself into \the [src.name].") diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index f05214c1acb1..0e67bbc67ce6 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -109,7 +109,7 @@ update_icon() -/obj/structure/closet/fireaxecabinet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/closet/fireaxecabinet/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/hasaxe = 0 if(fireaxe) hasaxe = 1 diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 99c71a001e59..aece3f9e5179 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -110,7 +110,7 @@ /obj/structure/closet/statue/relaymove() return -/obj/structure/closet/statue/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/closet/statue/attack_hand(mob/user, datum/event_args/clickchain/e_args) return /obj/structure/closet/statue/verb_toggleopen() diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm index d695b741763c..55470f57d2aa 100644 --- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm @@ -27,7 +27,7 @@ /obj/structure/closet/walllocker/emerglocker/attackby(obj/item/W as obj, mob/user as mob) return -/obj/structure/closet/walllocker/emerglocker/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/closet/walllocker/emerglocker/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc) if(!amount) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index dbaa2a6902d6..108e66175242 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -171,7 +171,7 @@ else to_chat(usr, "This mob type can't use this verb.") -/obj/structure/closet/crate/secure/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/closet/crate/secure/attack_hand(mob/user, datum/event_args/clickchain/e_args) src.add_fingerprint(user) if(locked) src.togglelock(user) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index efd120bda089..4bb56477eef5 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -61,7 +61,7 @@ */ -/obj/structure/largecrate/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/largecrate/attack_hand(mob/user, datum/event_args/clickchain/e_args) to_chat(user, "You need a crowbar to pry this open!") return diff --git a/code/game/objects/structures/crates_lockers/vehiclecage.dm b/code/game/objects/structures/crates_lockers/vehiclecage.dm index b0afaad71886..ef74b57a8224 100644 --- a/code/game/objects/structures/crates_lockers/vehiclecage.dm +++ b/code/game/objects/structures/crates_lockers/vehiclecage.dm @@ -23,7 +23,7 @@ load_vehicle(I) update_icon() -/obj/structure/vehiclecage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/vehiclecage/attack_hand(mob/user, datum/event_args/clickchain/e_args) to_chat(user, "You need a wrench to take this apart!") return diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index 223299c64b76..20e9fb5c81a7 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -20,7 +20,7 @@ else ..(P, def_zone) -/obj/structure/curtain/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/curtain/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(get_turf(loc), "rustle", 15, 1, -5) toggle() ..() diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 2f9d287685f4..4b22f4c6d4f9 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -63,7 +63,7 @@ ..() return -/obj/structure/displaycase/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/displaycase/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (src.destroyed && src.occupied) new /obj/item/gun/energy/captain( src.loc ) to_chat(user, "You deactivate the hover field built into the case.") diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index dc2d9b224448..1b9e65264e67 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -45,7 +45,7 @@ update_icon() -/obj/structure/extinguisher_cabinet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/extinguisher_cabinet/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(isrobot(user)) return if(!user.is_hand_functional(e_args.hand_index, TRUE)) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 5675378f88d8..c88030d1d33d 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -142,7 +142,7 @@ desc = "It looks like it has a strong padlock attached." locked = TRUE -/obj/structure/fence/door/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/fence/door/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(can_open(user)) toggle(user) else diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index bed55c62d67b..3370d9d4927d 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -92,7 +92,7 @@ toggle_close_open() -/obj/structure/fireaxecabinet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/fireaxecabinet/attack_hand(mob/user, datum/event_args/clickchain/e_args) //var/hasaxe = 0 //Fuck this. Fuck everything about this. Who wrote this. Why. //if(fireaxe) // hasaxe = 1 diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm index 3c59dcef31d1..d045852b8948 100644 --- a/code/game/objects/structures/fitness.dm +++ b/code/game/objects/structures/fitness.dm @@ -10,7 +10,7 @@ density = 1 var/list/hit_message = list("hit", "punch", "kick", "robust") -/obj/structure/fitness/punchingbag/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/fitness/punchingbag/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!istype(user)) ..() return @@ -38,7 +38,7 @@ weight = ((weight) % qualifiers.len) + 1 to_chat(user, "You set the machine's weight level to [weight].") -/obj/structure/fitness/weightlifter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/fitness/weightlifter/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!istype(user)) return if(user.loc != src.loc) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index a19ea09ab254..4c05a23cc666 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -394,7 +394,7 @@ /obj/structure/flora/sif icon = 'icons/obj/flora/sifflora.dmi' -/obj/structure/flora/sif/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/flora/sif/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (user.a_intent == INTENT_HARM) if(do_after(user, 5 SECONDS)) user.visible_message("\The [user] digs up \the [src.name].", "You dig up \the [src.name].") @@ -515,7 +515,7 @@ var/gift_type = /obj/item/b_gift var/list/ckeys_that_took = list() -/obj/structure/flora/pumpkin/pumpkin_patch/presents/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/flora/pumpkin/pumpkin_patch/presents/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index 9bd3cc262e7c..0eced706c35e 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -170,7 +170,7 @@ /obj/structure/flora/tree/pine/xmas/presents/choose_icon_state() return "pinepresents" -/obj/structure/flora/tree/pine/xmas/presents/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/flora/tree/pine/xmas/presents/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm index c84432dc07d6..7b11898ee8a6 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm @@ -43,7 +43,7 @@ /obj/structure/ghost_pod/manual var/confirm_before_open = FALSE // Recommended to be TRUE if the pod contains a surprise. -/obj/structure/ghost_pod/manual/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/ghost_pod/manual/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!used) if(confirm_before_open) if(alert(user, "Are you sure you want to touch \the [src]?", "Confirm", "No", "Yes") == "No") diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d95fd87a5821..a3eec890b155 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -299,7 +299,7 @@ girder_material.place_dismantled_product(get_turf(src), 2) qdel(src) -/obj/structure/girder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/girder/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (MUTATION_HULK in user.mutations) visible_message("[user] smashes [src] apart!") dismantle() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 190a6d67c793..a83e978cbc39 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -28,7 +28,7 @@ /obj/structure/grille/Bumped(atom/user) if(ismob(user)) shock(user, 70) -/obj/structure/grille/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/grille/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.setClickCooldown(user.get_attack_speed()) playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) diff --git a/code/game/objects/structures/holoplant.dm b/code/game/objects/structures/holoplant.dm index 83365877733f..72e061502521 100644 --- a/code/game/objects/structures/holoplant.dm +++ b/code/game/objects/structures/holoplant.dm @@ -21,7 +21,7 @@ . = ..() activate() -/obj/machinery/holoplant/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/holoplant/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!istype(user) || interference) return diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index ecd0b301f873..c83d64b89205 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -24,7 +24,7 @@ projector = null return ..() -/obj/structure/holosign/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/holosign/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index f2ff50a26b26..a7cf8c022998 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -72,7 +72,7 @@ /obj/structure/inflatable/blob_act() puncture() -/obj/structure/inflatable/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/inflatable/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) return @@ -175,7 +175,7 @@ if(get_dist(user,src) <= 1) //not remotely though return TryToSwitchState(user) -/obj/structure/inflatable/door/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/inflatable/door/attack_hand(mob/user, datum/event_args/clickchain/e_args) return TryToSwitchState(user) /obj/structure/inflatable/door/CanAllowThrough(atom/movable/mover, turf/target) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index c064ce77f12e..8732fd941acd 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -88,7 +88,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) mybag.attackby(I, user) -/obj/structure/janitorialcart/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/janitorialcart/attack_hand(mob/user, datum/event_args/clickchain/e_args) nano_ui_interact(user) return @@ -209,7 +209,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) to_chat(user, "You hook the trashbag onto the [callme].") mybag = I -/obj/structure/bed/chair/janicart/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/bed/chair/janicart/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(mybag) user.grab_item_from_interacted_with(mybag, src) mybag = null diff --git a/code/game/objects/structures/kitchen_foodcart.dm b/code/game/objects/structures/kitchen_foodcart.dm index 97b8ac64e396..ac70e805479b 100644 --- a/code/game/objects/structures/kitchen_foodcart.dm +++ b/code/game/objects/structures/kitchen_foodcart.dm @@ -22,7 +22,7 @@ return return ..() -/obj/structure/foodcart/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/foodcart/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(contents.len) var/obj/item/reagent_containers/food/choice = input("What would you like to grab from the cart?") as null|obj in contents if(choice) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 823cfd395b26..f7a359b6621d 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -50,7 +50,7 @@ meat = 5 return 1 -/obj/structure/kitchenspike/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/kitchenspike/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..() || !occupied) return meat-- diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index c6da2f8f1932..1ed7ac7d0dc9 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -42,7 +42,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh var/list/rare_loot = list() // Rare is powerful, or somewhat unique items. var/list/very_rare_loot = list()// Very Rare really powerful, or at least unique items. -/obj/structure/loot_pile/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/loot_pile/attack_hand(mob/user, datum/event_args/clickchain/e_args) //Human mob if(isliving(user)) var/mob/living/L = user diff --git a/code/game/objects/structures/medical_stand_vr.dm b/code/game/objects/structures/medical_stand_vr.dm index ede5f913474f..49477212b588 100644 --- a/code/game/objects/structures/medical_stand_vr.dm +++ b/code/game/objects/structures/medical_stand_vr.dm @@ -164,7 +164,7 @@ update_icon() -/obj/structure/medical_stand/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/medical_stand/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/list/available_options = list() if (tank) available_options += "Toggle valve" diff --git a/code/game/objects/structures/mineral_bath.dm b/code/game/objects/structures/mineral_bath.dm index 71e5cef8500d..99aa3f0743c2 100644 --- a/code/game/objects/structures/mineral_bath.dm +++ b/code/game/objects/structures/mineral_bath.dm @@ -66,7 +66,7 @@ START_PROCESSING(SSobj, src) return TRUE -/obj/structure/adherent_bath/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/adherent_bath/attack_hand(mob/user, datum/event_args/clickchain/e_args) eject_occupant() /obj/structure/adherent_bath/proc/eject_occupant() diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 33fec7176ddb..9863886324cf 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -18,7 +18,7 @@ pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28) pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0 -/obj/structure/mirror/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/mirror/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!glass) return if(shattered) return diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 5393491e03e0..cedd2d94ca1d 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -82,7 +82,7 @@ if(Adjacent(user)) attack_hand(user) -/obj/structure/morgue/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/morgue/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (src.connected) close() else @@ -173,7 +173,7 @@ if(Adjacent(user)) attack_hand(user) -/obj/structure/m_tray/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/m_tray/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (src.connected) for(var/atom/movable/A as mob|obj in src.loc) if (!( A.anchored )) @@ -227,7 +227,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium) src.icon_state = "crema1" return -/obj/structure/morgue/crematorium/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/morgue/crematorium/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (cremating) to_chat(usr, "It's locked.") return @@ -350,7 +350,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium) req_access = list(ACCESS_GENERAL_CREMATOR) id = 1 -/obj/machinery/button/crematorium/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/button/crematorium/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if(src.allowed(user)) diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index a9efe527b4f7..df4b3e64a557 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -43,7 +43,7 @@ new /obj/item/frame/noticeboard( src.loc ) qdel(src) -/obj/structure/noticeboard/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/noticeboard/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.do_examinate(src) // Since Topic() never seems to interact with usr on more than a superficial diff --git a/code/game/objects/structures/props/beam_prism.dm b/code/game/objects/structures/props/beam_prism.dm index d23075fcc589..a4dda5f9fd64 100644 --- a/code/game/objects/structures/props/beam_prism.dm +++ b/code/game/objects/structures/props/beam_prism.dm @@ -43,7 +43,7 @@ var/degrees_to_rotate = -1 * degrees_from_north animate(src, transform = turn(src.transform, degrees_to_rotate), time = 2) -/obj/structure/prop/prism/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/prop/prism/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() if(rotation_lock) @@ -157,7 +157,7 @@ var/list/my_turrets = list() var/dialID = null -/obj/structure/prop/prismcontrol/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/prop/prismcontrol/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() var/confirm = input("Do you want to try to rotate \the [src]?", "[name]") in list("Yes", "No") diff --git a/code/game/objects/structures/props/nest.dm b/code/game/objects/structures/props/nest.dm index 3c51fb6b6e3e..6be58cfc5d36 100644 --- a/code/game/objects/structures/props/nest.dm +++ b/code/game/objects/structures/props/nest.dm @@ -34,7 +34,7 @@ STOP_PROCESSING(SSobj, src) ..() -/obj/structure/prop/nest/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // Used to tell the player that this isn't useful for anything. +/obj/structure/prop/nest/attack_hand(mob/user, datum/event_args/clickchain/e_args) // Used to tell the player that this isn't useful for anything. ..() if(user && prob(disturbance_spawn_chance)) spawn_creature(get_turf(src)) diff --git a/code/game/objects/structures/props/prop.dm b/code/game/objects/structures/props/prop.dm index 29f3530e6c38..f62c7ebb1707 100644 --- a/code/game/objects/structures/props/prop.dm +++ b/code/game/objects/structures/props/prop.dm @@ -9,7 +9,7 @@ anchored = TRUE var/interaction_message = null -/obj/structure/prop/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // Used to tell the player that this isn't useful for anything. +/obj/structure/prop/attack_hand(mob/user, datum/event_args/clickchain/e_args) // Used to tell the player that this isn't useful for anything. if(!istype(user)) return FALSE if(!interaction_message) diff --git a/code/game/objects/structures/props/puzzledoor.dm b/code/game/objects/structures/props/puzzledoor.dm index 9004768f34e6..e29f87019b03 100644 --- a/code/game/objects/structures/props/puzzledoor.dm +++ b/code/game/objects/structures/props/puzzledoor.dm @@ -53,7 +53,7 @@ locks -= L ..() -/obj/machinery/door/blast/puzzle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/door/blast/puzzle/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(check_locks()) force_toggle(1, user) else diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 75c4d6e8587f..1b1910cce833 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -70,7 +70,7 @@ FLOOR SAFES icon_state = initial(icon_state) -/obj/structure/safe/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/safe/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) var/dat = "
" dat += "[open ? "Close" : "Open"] [src] | - [dial * 5] +" diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index dbf006b582aa..538a90283aa1 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -61,7 +61,7 @@ if(get_dist(user,src) <= 1) //not remotely though return TryToSwitchState(user) -/obj/structure/simple_door/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/simple_door/attack_hand(mob/user, datum/event_args/clickchain/e_args) return TryToSwitchState(user) /obj/structure/simple_door/CanAllowThrough(atom/movable/mover, turf/target) diff --git a/code/game/objects/structures/snowman.dm b/code/game/objects/structures/snowman.dm index 1217016743d1..378c0eb103de 100644 --- a/code/game/objects/structures/snowman.dm +++ b/code/game/objects/structures/snowman.dm @@ -5,7 +5,7 @@ desc = "A happy little snowman smiles back at you!" anchored = 1 -/obj/structure/snowman/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/snowman/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_HARM) to_chat(user, "In one hit, [src] easily crumples into a pile of snow. You monster.") var/turf/simulated/floor/F = get_turf(src) diff --git a/code/game/objects/structures/stasis_cage.dm b/code/game/objects/structures/stasis_cage.dm index 84003cf71ab6..86770411625b 100644 --- a/code/game/objects/structures/stasis_cage.dm +++ b/code/game/objects/structures/stasis_cage.dm @@ -14,7 +14,7 @@ if(A) contain(A) -/obj/structure/stasis_cage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/stasis_cage/attack_hand(mob/user, datum/event_args/clickchain/e_args) release() /obj/structure/stasis_cage/attack_robot(var/mob/user) diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 9b7b5b0eb8c1..479074058ebf 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -82,7 +82,7 @@ ..() CheckHardness() -/obj/structure/statue/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/statue/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) user.visible_message("[user] rubs some dust off from the [name]'s surface.", \ "You rub some dust off from the [name]'s surface.") diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 2e53cc27ce13..c9e3ca63abe9 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -97,7 +97,7 @@ create_track() driving = 0 -/obj/structure/bed/chair/wheelchair/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/bed/chair/wheelchair/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (pulling_along) MouseDrop(usr) return ..() diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 668260bf763c..8bf54aac2d88 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -44,7 +44,7 @@ return attack_hand(user) ..() -/obj/structure/dispenser/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/dispenser/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) var/dat = "[src]

" dat += "Oxygen tanks: [oxygentanks] - [oxygentanks ? "Dispense" : "empty"]
" diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 73a8f4032ec8..6e5d072fc65d 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -29,7 +29,7 @@ else return ..() -/obj/structure/target_stake/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/target_stake/attack_hand(mob/user, datum/event_args/clickchain/e_args) // taking pinned targets off! if(pinned_target) pinned_target.layer = OBJ_LAYER diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm index 63d443422b14..b97b223f780b 100644 --- a/code/game/objects/structures/transit_tubes.dm +++ b/code/game/objects/structures/transit_tubes.dm @@ -119,7 +119,7 @@ return -/obj/structure/transit_tube/station/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/transit_tube/station/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!pod_moving) for(var/obj/structure/transit_tube_pod/pod in loc) if(!pod.moving && (pod.dir in directions())) diff --git a/code/game/objects/structures/trash_pile.dm b/code/game/objects/structures/trash_pile.dm index 4dac6dec6eb6..700648a1b607 100644 --- a/code/game/objects/structures/trash_pile.dm +++ b/code/game/objects/structures/trash_pile.dm @@ -82,7 +82,7 @@ else return ..() -/obj/structure/trash_pile/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/trash_pile/attack_hand(mob/user, datum/event_args/clickchain/e_args) //Human mob if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index 8d894bfac3b3..20277e35c478 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -5,7 +5,7 @@ icon_state = "cabinet_closed" density = 1 -/obj/structure/undies_wardrobe/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/undies_wardrobe/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!human_who_can_use_underwear(user)) to_chat(user, "Sadly there's nothing in here for you to wear.") return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 1201772c162d..3b4c12ce6cde 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -17,7 +17,7 @@ open = round(rand(0, 1)) update_icon() -/obj/structure/toilet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/toilet/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(swirlie) usr.setClickCooldown(user.get_attack_speed()) usr.visible_message("[user] slams the toilet seat onto [swirlie.name]'s head!", "You slam the toilet seat onto [swirlie.name]'s head!", "You hear reverberating porcelain.") @@ -172,7 +172,7 @@ anchored = 1 mouse_opacity = 0 -/obj/machinery/shower/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/shower/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/M = user if(!istype(M)) return @@ -386,7 +386,7 @@ thing.reagents.clear_reagents() thing.update_icon() -/obj/structure/sink/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/sink/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!user.is_hand_functional(e_args.hand_index, FALSE)) user.action_feedback(SPAN_WARNING(user.get_hand_fail_message(e_args.hand_index)), src) return TRUE @@ -490,7 +490,7 @@ icon_state = "puddle" desc = "A small pool of some liquid, ostensibly water." -/obj/structure/sink/puddle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/sink/puddle/attack_hand(mob/user, datum/event_args/clickchain/e_args) icon_state = "puddle-splash" ..() icon_state = "puddle" @@ -514,7 +514,7 @@ reagents.add_reagent(dispensedreagent, 20) /* Okay, just straight up, I tried to code this like blood overlays, but I just do NOT understand the system. If someone wants to sort it, enable this too. -/obj/structure/sink/oil_well/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/sink/oil_well/attack_hand(mob/user, datum/event_args/clickchain/e_args) flick("puddle-oil-splash",src) reagents.reaction(M, 20) //Covers target in 20u of oil. to_chat(M, "You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water.") diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index b582393db11f..f0f70bb7ab10 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -275,7 +275,7 @@ playsound(loc, 'sound/effects/Glasshit.ogg', 50, TRUE) -/obj/structure/window/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/window/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.setClickCooldown(user.get_attack_speed()) if (MUTATION_HULK in user.mutations) // Do we really still need these? @@ -937,7 +937,7 @@ var/range = 7 -/obj/machinery/button/windowtint/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/button/windowtint/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (..()) return TRUE else diff --git a/code/game/objects/structures/window_spawner.dm b/code/game/objects/structures/window_spawner.dm index 4d84e6b04519..b5824d2f2bab 100644 --- a/code/game/objects/structures/window_spawner.dm +++ b/code/game/objects/structures/window_spawner.dm @@ -14,7 +14,7 @@ var/win_path = /obj/structure/window/basic var/activated -/obj/effect/wingrille_spawn/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/wingrille_spawn/attack_hand(mob/user, datum/event_args/clickchain/e_args) attack_generic() /obj/effect/wingrille_spawn/attack_ghost() diff --git a/code/game/turfs/simulated/flooring/flooring_traps.dm b/code/game/turfs/simulated/flooring/flooring_traps.dm index fe1e1b6b69ca..af68f1cb4441 100644 --- a/code/game/turfs/simulated/flooring/flooring_traps.dm +++ b/code/game/turfs/simulated/flooring/flooring_traps.dm @@ -31,7 +31,7 @@ else if (tripped) icon_state = "[initial(icon_state)]_tripped" -/turf/simulated/floor/trap/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/turf/simulated/floor/trap/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(tripped) to_chat(usr, "You reset the triggered mechanism.") tripped = 0 diff --git a/code/game/turfs/simulated/floors/snow.dm b/code/game/turfs/simulated/floors/snow.dm index 30a6049b95c9..aa55a079196b 100644 --- a/code/game/turfs/simulated/floors/snow.dm +++ b/code/game/turfs/simulated/floors/snow.dm @@ -39,7 +39,7 @@ else ..() -/turf/simulated/floor/outdoors/snow/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/turf/simulated/floor/outdoors/snow/attack_hand(mob/user, datum/event_args/clickchain/e_args) visible_message("[user] starts scooping up some snow.", "You start scooping up some snow.") if(do_after(user, 1 SECOND)) user.put_in_hands_or_drop(new /obj/item/stack/material/snow) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index e6e0e64dbb39..68e8d951b1ad 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -106,7 +106,7 @@ return 0 -/turf/simulated/wall/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/turf/simulated/wall/attack_hand(mob/user, datum/event_args/clickchain/e_args) radiate() add_fingerprint(user) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index d7cbe0e25d93..328f40f94752 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -248,7 +248,7 @@ /turf/proc/is_solid_structure() return TRUE -/turf/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/turf/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() //QOL feature, clicking on turf can toggle doors, unless pulling something if(!user.pulling) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 699cb1b7f533..fb687109d6ad 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -86,7 +86,7 @@ a_right.holder_movement() -/obj/item/assembly_holder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args)//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess +/obj/item/assembly_holder/attack_hand(mob/user, datum/event_args/clickchain/e_args)//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 4739fa09feb9..fd0556e3ae1f 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -69,7 +69,7 @@ playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) -/obj/item/assembly/mousetrap/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/assembly/mousetrap/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm b/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm index e50a75b2f2e2..05553ad93018 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm @@ -139,7 +139,7 @@ to_chat(user, SPAN_NOTICE("You cannot insert this item into \the [src]!")) return -/obj/machinery/atmospherics/component/binary/algae_farm/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/algae_farm/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm index 97c46bd7ca3d..16490335c53e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm @@ -117,7 +117,7 @@ "You hear ratchet.") deconstruct() -/obj/machinery/atmospherics/component/binary/heat_pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/heat_pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return src.add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm index 8364561ad586..86be2b8988e2 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm @@ -147,7 +147,7 @@ return data -/obj/machinery/atmospherics/component/binary/massive_gas_pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/massive_gas_pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm index 4815e79cfa87..857a8d3cdf7d 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm @@ -184,7 +184,7 @@ return data -/obj/machinery/atmospherics/component/binary/massive_heat_pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/massive_heat_pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 9e9482482aa4..7b882d1e40bc 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -168,7 +168,7 @@ update_icon() return -/obj/machinery/atmospherics/component/binary/passive_gate/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/passive_gate/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 23958364d5a3..17e0a5403f9e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -231,7 +231,7 @@ Thus, the two variables affect pump operation are set in New(): . = ..() ui_interact(user) -/obj/machinery/atmospherics/component/binary/pump/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index 9d50aab66b7f..192ad5373df5 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -130,7 +130,7 @@ /obj/machinery/atmospherics/valve/attack_ai(mob/user as mob) return -/obj/machinery/atmospherics/valve/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/valve/attack_hand(mob/user, datum/event_args/clickchain/e_args) src.add_fingerprint(usr) update_icon() sleep(10) @@ -234,7 +234,7 @@ /obj/machinery/atmospherics/valve/digital/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/atmospherics/valve/digital/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/valve/digital/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!powered()) return if(!src.allowed(user)) diff --git a/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm b/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm index 11359239d639..89870088bd7d 100644 --- a/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm +++ b/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm @@ -102,7 +102,7 @@ return TRUE return FALSE -/obj/machinery/atmospherics/component/quaternary/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/quaternary/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 0f3d18101e1c..ee60ca1bc2da 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -111,7 +111,7 @@ if(frequency) set_frequency(frequency) -/obj/machinery/atmospherics/component/trinary/atmos_filter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/trinary/atmos_filter/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if(!src.allowed(user)) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index 8c82c1922bfe..ef346706e391 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -95,7 +95,7 @@ data["node2_dir"] = dir_name(node_connects[2],TRUE) return data -/obj/machinery/atmospherics/component/trinary/mixer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/trinary/mixer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm b/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm index 65970d348d35..fe00ea4c413f 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm @@ -160,7 +160,7 @@ /obj/machinery/atmospherics/tvalve/attack_ai(mob/user as mob) return -/obj/machinery/atmospherics/tvalve/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/tvalve/attack_hand(mob/user, datum/event_args/clickchain/e_args) src.add_fingerprint(usr) animation() sleep(10) @@ -284,7 +284,7 @@ /obj/machinery/atmospherics/tvalve/digital/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/atmospherics/tvalve/digital/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/tvalve/digital/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!powered()) return if(!src.allowed(user)) diff --git a/code/modules/atmospherics/machinery/components/unary/cold_sink.dm b/code/modules/atmospherics/machinery/components/unary/cold_sink.dm index f09fbc1e7b6f..0129ea3913d2 100644 --- a/code/modules/atmospherics/machinery/components/unary/cold_sink.dm +++ b/code/modules/atmospherics/machinery/components/unary/cold_sink.dm @@ -59,7 +59,7 @@ /obj/machinery/atmospherics/component/unary/freezer/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/atmospherics/component/unary/freezer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/unary/freezer/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/atmospherics/component/unary/freezer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/atmospherics/machinery/components/unary/heat_source.dm b/code/modules/atmospherics/machinery/components/unary/heat_source.dm index 89a76a805636..d530c967bdf1 100644 --- a/code/modules/atmospherics/machinery/components/unary/heat_source.dm +++ b/code/modules/atmospherics/machinery/components/unary/heat_source.dm @@ -73,7 +73,7 @@ /obj/machinery/atmospherics/component/unary/heater/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/atmospherics/component/unary/heater/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/unary/heater/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/atmospherics/component/unary/heater/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm index 502a8aa68d3c..f3e14012826c 100644 --- a/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm @@ -197,7 +197,7 @@ /obj/machinery/atmospherics/component/unary/outlet_injector/hide(var/i) update_underlays() -/obj/machinery/atmospherics/component/unary/outlet_injector/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/unary/outlet_injector/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/atmospherics/component/unary/outlet_injector/proc/toggle_injecting() diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index d75bb18cd4a0..519137c15b43 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -20,7 +20,7 @@ /obj/structure/artilleryplaceholder/decorative density = 0 -/obj/machinery/artillerycontrol/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/artillerycontrol/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) var/dat = "Bluespace Artillery Control:
" dat += "Locked on
" diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index aa0acac3189e..16caedbeb287 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -105,7 +105,7 @@ update_icon() -/obj/machinery/gateway/centerstation/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/gateway/centerstation/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!ready) detect() return @@ -215,7 +215,7 @@ update_icon() -/obj/machinery/gateway/centeraway/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/gateway/centeraway/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!ready) detect() return diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm index 2cac53bbb8bd..ff1e4155d1da 100644 --- a/code/modules/clothing/clothing_accessories.dm +++ b/code/modules/clothing/clothing_accessories.dm @@ -160,7 +160,7 @@ ..() -/obj/item/clothing/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/attack_hand(mob/user, datum/event_args/clickchain/e_args) //only forward to the attached accessory if the clothing is equipped (not in a storage) if(LAZYLEN(accessories) && src.loc == user) for(var/obj/item/clothing/accessory/A in accessories) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index d3ef8b03c6d0..5633e36bbea4 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -21,7 +21,7 @@ say_verbs = list("mumbles", "says") // Clumsy folks can't take the mask off themselves. -/obj/item/clothing/mask/muzzle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/mask/muzzle/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.item_by_slot(SLOT_ID_MASK) == src && !user.IsAdvancedToolUser()) return 0 ..() diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index d1d446ccdadd..4ca2ec00fb05 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -67,7 +67,7 @@ update_icon() -/obj/item/clothing/shoes/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/shoes/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(can_hold_knife == 1 && holding && src.loc == user) draw_knife() return diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index 174f69ac4a3b..ec96cd2ea7b1 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -16,7 +16,7 @@ ..() ToggleButtons() -/obj/item/clothing/suit/storage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/suit/storage/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (pockets.handle_attack_hand(user)) ..(user) diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 6e6aa877e078..e29ffcf37d6c 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -67,7 +67,7 @@ var/icon/rolled_down_sleeves_icon = 'icons/mob/clothing/uniform_sleeves_rolled.dmi' // todo kick to item flag for auto-unequip-without-clickdrag -/obj/item/clothing/under/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/under/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(LAZYLEN(accessories)) ..() if ((ishuman(usr) || issmall(usr)) && src.loc == user) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 76ab44d18a9f..7be28d63f7b5 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -132,7 +132,7 @@ ..() //default attack_hand behaviour -/obj/item/clothing/accessory/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(accessory_host) return //we aren't an object on the ground so don't call parent ..() diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 494d74013a32..51f9126f6e3e 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -66,7 +66,7 @@ w_class = initial(w_class) clear_holster() -/obj/item/clothing/accessory/holster/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/holster/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (accessory_host && (slot & ACCESSORY_SLOT_UTILITY)) if(holstered) unholster(user) diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 895b351efeae..5e669915d657 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -19,7 +19,7 @@ if (!hide_on_roll) on_rolled["down"] = icon_state -/obj/item/clothing/accessory/storage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/storage/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (accessory_host) //if we are part of a suit hold.open(user) return diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm index 7ec106ff1902..2d52fb60f440 100644 --- a/code/modules/detectivework/microscope/dnascanner.dm +++ b/code/modules/detectivework/microscope/dnascanner.dm @@ -142,7 +142,7 @@ /obj/machinery/dnaforensics/attack_ai(mob/user) ui_interact(user) -/obj/machinery/dnaforensics/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/dnaforensics/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/dnaforensics/update_icon() diff --git a/code/modules/detectivework/microscope/microscope.dm b/code/modules/detectivework/microscope/microscope.dm index 6feb15780270..cef5c5c207d2 100644 --- a/code/modules/detectivework/microscope/microscope.dm +++ b/code/modules/detectivework/microscope/microscope.dm @@ -25,7 +25,7 @@ return return ..() -/obj/machinery/microscope/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/microscope/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!sample) to_chat(user, "The microscope has no sample to examine.") diff --git a/code/modules/economy/machines/ATM.dm b/code/modules/economy/machines/ATM.dm index c803d0a4e6ce..7c285fec34e9 100644 --- a/code/modules/economy/machines/ATM.dm +++ b/code/modules/economy/machines/ATM.dm @@ -308,7 +308,7 @@ GLOBAL_LIST_INIT(atm_sounds, list('sound/items/polaroid1.ogg', 'sound/items/pola authenticated_account = null account_security_level = 0 -/obj/machinery/atm/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/atm/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(istype(user, /mob/living/silicon)) to_chat (user, SPAN_WARNING("A firewall prevents you from interfacing with this device!")) return diff --git a/code/modules/economy/machines/Accounts_DB.dm b/code/modules/economy/machines/Accounts_DB.dm index dc7eab52e358..1659b10f635b 100644 --- a/code/modules/economy/machines/Accounts_DB.dm +++ b/code/modules/economy/machines/Accounts_DB.dm @@ -57,7 +57,7 @@ attack_hand(user) -/obj/machinery/account_database/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/account_database/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return nano_ui_interact(user) diff --git a/code/modules/economy/machines/cash_register.dm b/code/modules/economy/machines/cash_register.dm index 2cce9f0fefb9..460be83a49fb 100644 --- a/code/modules/economy/machines/cash_register.dm +++ b/code/modules/economy/machines/cash_register.dm @@ -39,7 +39,7 @@ . += "It's completely empty." -/obj/machinery/cash_register/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/cash_register/attack_hand(mob/user, datum/event_args/clickchain/e_args) // Don't be accessible from the wrong side of the machine if(get_dir(src, user) & global.reverse_dir[src.dir]) return diff --git a/code/modules/economy/machines/mint.dm b/code/modules/economy/machines/mint.dm index ab1b2530f3a9..7b1e0dabbc88 100644 --- a/code/modules/economy/machines/mint.dm +++ b/code/modules/economy/machines/mint.dm @@ -81,7 +81,7 @@ if(processed) qdel(O) -/obj/machinery/mineral/mint/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/mineral/mint/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/dat = "Coin Press
" @@ -474,7 +474,7 @@ /obj/machinery/coinbank/attack_ai(mob/user as mob) attack_hand(user) -/obj/machinery/coinbank/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/coinbank/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return wires.Interact(user) diff --git a/code/modules/economy/money_bag.dm b/code/modules/economy/money_bag.dm index 65309d859ad7..1372c0a41aa3 100644 --- a/code/modules/economy/money_bag.dm +++ b/code/modules/economy/money_bag.dm @@ -8,7 +8,7 @@ throw_force = 2.0 w_class = ITEMSIZE_LARGE -/obj/item/moneybag/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/moneybag/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/amt_supermatter = 0 var/amt_bananium = 0 var/amt_mhydrogen = 0 diff --git a/code/modules/food/drinkingglass/extras.dm b/code/modules/food/drinkingglass/extras.dm index 03076e0d39df..1cd915c36314 100644 --- a/code/modules/food/drinkingglass/extras.dm +++ b/code/modules/food/drinkingglass/extras.dm @@ -26,7 +26,7 @@ else return ..() -/obj/item/reagent_containers/food/drinks/glass2/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/food/drinks/glass2/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(src != user.get_inactive_held_item()) return ..() diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 4d0a06103034..4c701d4206fe 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -3263,7 +3263,7 @@ icon_state = "pizzabox[boxes.len+1]" add_overlay(overlays_to_add) -/obj/item/pizzabox/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/pizzabox/attack_hand(mob/user, datum/event_args/clickchain/e_args) if( open && pizza ) user.put_in_hands( pizza ) @@ -4825,7 +4825,7 @@ END CITADEL CHANGE */ bitesize = 1 nutriment_amt = 10 -/obj/item/reagent_containers/food/snacks/chipplate/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/food/snacks/chipplate/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() var/obj/item/reagent_containers/food/snacks/returningitem = new vendingobject(loc) returningitem.reagents.clear_reagents() diff --git a/code/modules/food/glass/bottle.dm b/code/modules/food/glass/bottle.dm index a31358e828f0..cfefbdefce2e 100644 --- a/code/modules/food/glass/bottle.dm +++ b/code/modules/food/glass/bottle.dm @@ -26,7 +26,7 @@ ..() update_icon() -/obj/item/reagent_containers/glass/bottle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/glass/bottle/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() update_icon() diff --git a/code/modules/food/kitchen/cooking_machines/_appliance.dm b/code/modules/food/kitchen/cooking_machines/_appliance.dm index c48635d79c0b..7b77d96bf462 100644 --- a/code/modules/food/kitchen/cooking_machines/_appliance.dm +++ b/code/modules/food/kitchen/cooking_machines/_appliance.dm @@ -543,7 +543,7 @@ smoke.set_up(10, 0, get_turf(src), 300) smoke.start() -/obj/machinery/appliance/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/appliance/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (cooking_objs.len) if (removal_menu(user)) return diff --git a/code/modules/food/kitchen/gibber.dm b/code/modules/food/kitchen/gibber.dm index 62fdfd3e6b1e..34e763484ee0 100644 --- a/code/modules/food/kitchen/gibber.dm +++ b/code/modules/food/kitchen/gibber.dm @@ -74,7 +74,7 @@ src.go_out() return -/obj/machinery/gibber/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/gibber/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return if(operating) diff --git a/code/modules/food/kitchen/icecream.dm b/code/modules/food/kitchen/icecream.dm index 5c3fb0f2bd8f..e54a00bfec2b 100644 --- a/code/modules/food/kitchen/icecream.dm +++ b/code/modules/food/kitchen/icecream.dm @@ -61,7 +61,7 @@ reagents.add_reagent("sugar", 5) reagents.add_reagent("ice", 5) -/obj/machinery/icecream_vat/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/icecream_vat/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index 8b7113801105..594473efb783 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -160,7 +160,7 @@ if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) attack_hand(user) -/obj/machinery/microwave/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/microwave/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/code/modules/food/kitchen/smartfridge.dm b/code/modules/food/kitchen/smartfridge.dm index 4427446e9636..835837ee68e5 100644 --- a/code/modules/food/kitchen/smartfridge.dm +++ b/code/modules/food/kitchen/smartfridge.dm @@ -200,7 +200,7 @@ /obj/machinery/smartfridge/attack_ai(mob/user as mob) attack_hand(user) -/obj/machinery/smartfridge/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/smartfridge/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return wires.Interact(user) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 5ed9c4b80dff..50c6f629155b 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -67,7 +67,7 @@ return ..() -/obj/item/deck/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/deck/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/carbon/human/H = user if(istype(src.loc, /obj/item/storage) || src == H.r_store || src == H.l_store || src.loc == user) // so objects can be removed from storage containers or pockets. also added a catch-all, so if it's in the mob you'll pick it up. ..() diff --git a/code/modules/hardsuits/pieces.dm b/code/modules/hardsuits/pieces.dm index a87fef5fb747..f1ddbe6630b5 100644 --- a/code/modules/hardsuits/pieces.dm +++ b/code/modules/hardsuits/pieces.dm @@ -85,7 +85,7 @@ hardsuit = null return ..() -/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(tacknife) tacknife.loc = get_turf(src) if(user.put_in_active_hand(tacknife)) diff --git a/code/modules/hardsuits/rig_attackby.dm b/code/modules/hardsuits/rig_attackby.dm index 9a62ef653e5e..f7cf9dbea187 100644 --- a/code/modules/hardsuits/rig_attackby.dm +++ b/code/modules/hardsuits/rig_attackby.dm @@ -169,7 +169,7 @@ ..() -/obj/item/hardsuit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/hardsuit/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(electrified != 0) if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here. diff --git a/code/modules/hardsuits/rig_pieces.dm b/code/modules/hardsuits/rig_pieces.dm index 3f0cfa3a1f57..b2e149926bd4 100644 --- a/code/modules/hardsuits/rig_pieces.dm +++ b/code/modules/hardsuits/rig_pieces.dm @@ -164,7 +164,7 @@ SPECIES_ZORREN_HIGH, ) -/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(tacknife) tacknife.loc = get_turf(src) if(user.put_in_active_hand(tacknife)) diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 90e8a682e4e4..ff1c860129dd 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -75,7 +75,7 @@ /obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/HolodeckControl/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/HolodeckControl/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return user.set_machine(src) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index ceb492f48082..cf5f76e56cf2 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -418,7 +418,7 @@ /obj/machinery/readybutton/attackby(obj/item/W as obj, mob/user as mob) to_chat(user, "The device is a solid button, there's nothing you can do with it!") -/obj/machinery/readybutton/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/readybutton/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") diff --git a/code/modules/holomap/station_holomap.dm b/code/modules/holomap/station_holomap.dm index 9c07db29955a..93d066a9af41 100644 --- a/code/modules/holomap/station_holomap.dm +++ b/code/modules/holomap/station_holomap.dm @@ -70,7 +70,7 @@ // floor_markings.layer = FLOOR_DECAL_LAYER update_icon() -/obj/machinery/station_map/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/station_map/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(watching_mob && (watching_mob != user)) to_chat(user, "Someone else is currently watching the holomap.") return diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index d172b85d523b..f8ef828f5fd9 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -122,7 +122,7 @@ qdel(src) return -/obj/machinery/beehive/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/beehive/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!closed) if(honeycombs < 100) to_chat(user, "There are no filled honeycombs.") diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index a95000a3cf1f..66ab21dd9114 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -63,7 +63,7 @@ /obj/machinery/botany/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/botany/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/botany/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/botany/proc/finished_task() diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 8c7e115e671b..fc2e50c7b633 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -206,7 +206,7 @@ /obj/item/seeds/whitebeetseed = 3 ) -/obj/machinery/seed_storage/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/seed_storage/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 88acceb31139..4510f8551e8e 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -34,7 +34,7 @@ density = 0 color = DEAD_PLANT_COLOUR -/obj/effect/dead_plant/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/dead_plant/attack_hand(mob/user, datum/event_args/clickchain/e_args) qdel(src) /obj/effect/dead_plant/attackby() diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index bbc38b04e3aa..dc1c354debd9 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -34,7 +34,7 @@ if(!M.apply_damage(base_damage, BRUTE, target_zone, blocked, soaked, used_weapon=src)) return 0 -/obj/effect/plant/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/plant/attack_hand(mob/user, datum/event_args/clickchain/e_args) manual_unbuckle(user) /obj/effect/plant/attack_generic(var/mob/user) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index fda9e92b925f..7329e6ed2cee 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -581,7 +581,7 @@ else if(harvest) harvest(user) -/obj/machinery/portable_atmospherics/hydroponics/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/portable_atmospherics/hydroponics/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(istype(usr,/mob/living/silicon)) return diff --git a/code/modules/instruments/instruments/stationary.dm b/code/modules/instruments/instruments/stationary.dm index 618bdac17e8f..3816f079ed9b 100644 --- a/code/modules/instruments/instruments/stationary.dm +++ b/code/modules/instruments/instruments/stationary.dm @@ -23,7 +23,7 @@ return (usr.default_can_use_topic(src) < UI_UPDATE) //can play with MUTATION_TELEKINESIS and while resting because fun. /// CITRP EDIT UNTIL INTERACTION REFACTOR PORT! -/obj/structure/musician/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/musician/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 783ba87a9f82..8a8ffabfd442 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -54,7 +54,7 @@ else ..() -/obj/structure/bookcase/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/bookcase/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(contents.len) var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents if(choice) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 1e756331d3fe..db4d731db3d2 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -31,7 +31,7 @@ var/category = "Any" var/author -/obj/machinery/librarypubliccomp/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/librarypubliccomp/attack_hand(mob/user, datum/event_args/clickchain/e_args) usr.set_machine(src) var/dat = "Library Visitor\n" // switch(screenstate) @@ -160,7 +160,7 @@ var/obj/item/book/M = new path(null) all_books[M.title] = M -/obj/machinery/librarycomp/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/librarycomp/attack_hand(mob/user, datum/event_args/clickchain/e_args) usr.set_machine(src) var/dat = "Book Inventory Management\n" // switch(screenstate) @@ -476,7 +476,7 @@ if(!user.attempt_insert_item_for_installation(I, src)) return -/obj/machinery/libraryscanner/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/libraryscanner/attack_hand(mob/user, datum/event_args/clickchain/e_args) usr.set_machine(src) var/dat = "Scanner Control Interface\n" // if(cache) diff --git a/code/modules/maps/away_missions/archive/wildwest.dm b/code/modules/maps/away_missions/archive/wildwest.dm index 2c14ea2699a7..f70a41d6eab6 100644 --- a/code/modules/maps/away_missions/archive/wildwest.dm +++ b/code/modules/maps/away_missions/archive/wildwest.dm @@ -20,7 +20,7 @@ var/chargesa = 1 var/insistinga = 0 -/obj/machinery/wish_granter_dark/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/wish_granter_dark/attack_hand(mob/user, datum/event_args/clickchain/e_args) usr.set_machine(src) if(chargesa <= 0) diff --git a/code/modules/maps/misc_maps/lavaland/_lavaland.dm b/code/modules/maps/misc_maps/lavaland/_lavaland.dm index 5d041df011f8..aaa79f82be1a 100644 --- a/code/modules/maps/misc_maps/lavaland/_lavaland.dm +++ b/code/modules/maps/misc_maps/lavaland/_lavaland.dm @@ -22,7 +22,7 @@ use_power = USE_POWER_IDLE interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE_SILICON -/obj/machinery/lavaland_entryportal/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/lavaland_entryportal/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(istype(user, /mob/living/silicon/ai)) // lets not teleport AI cores return if(inoperable(MAINT)) @@ -58,7 +58,7 @@ anchored = 1 -/obj/effect/lavaland_exitportal/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/lavaland_exitportal/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(istype(usr, /mob/living/silicon/ai)) return if(do_after(user, 10)) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 278e1493e7f1..3c961ef20422 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -284,7 +284,7 @@ update_mass() return -/obj/item/stack/material/supermatter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/stack/material/supermatter/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() update_mass() diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 0f141067520b..a5932bb30093 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -174,7 +174,7 @@ return ..() -/obj/machinery/mining/drill/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/mining/drill/attack_hand(mob/user, datum/event_args/clickchain/e_args) check_supports() if (panel_open && cell && user.Adjacent(src)) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 58776f0dde27..928af6aa4c9b 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -30,7 +30,7 @@ inserted_id.forceMove(loc) //Prevents deconstructing from deleting whatever ID was inside it. . = ..() -/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return interact(user) diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 9d52de828745..917e97fe2714 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -24,7 +24,7 @@ stack_trace("Stacking machine console at [COORD(src)] could not find its machine!") qdel(src) -/obj/machinery/mineral/stacking_unit_console/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/mineral/stacking_unit_console/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index a9b78e6f55a1..4e396c7c2830 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -364,7 +364,7 @@ else ..() -/obj/item/stack/flag/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/stack/flag/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(upright) upright = 0 icon_state = base_state diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index d2853a154d35..f202bb75299b 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -117,7 +117,7 @@ else icon_state = "[initial(icon_state)]-off" -/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return interact(user) diff --git a/code/modules/mining/shelter_atoms.dm b/code/modules/mining/shelter_atoms.dm index 8802b8a648e7..1bee5e9538a5 100644 --- a/code/modules/mining/shelter_atoms.dm +++ b/code/modules/mining/shelter_atoms.dm @@ -210,7 +210,7 @@ return FALSE -/obj/item/gps/computer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gps/computer/attack_hand(mob/user, datum/event_args/clickchain/e_args) attack_self(user) //Bed diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 844f5d6199a1..584fc7b9a5d7 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -140,7 +140,7 @@ else icon_state = "cleanbot[on]" -/mob/living/bot/cleanbot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/bot/cleanbot/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /mob/living/bot/cleanbot/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index d1a9e13a2d15..88a88aa29d23 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -69,7 +69,7 @@ return data -/mob/living/bot/farmbot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/bot/farmbot/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -408,5 +408,5 @@ created_name = t -/obj/item/farmbot_arm_assembly/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/farmbot_arm_assembly/attack_hand(mob/user, datum/event_args/clickchain/e_args) return //it's a converted watertank, no you cannot pick it up and put it in your backpack diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 3b895c1f0ceb..da649d6b1152 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -89,7 +89,7 @@ return data -/mob/living/bot/floorbot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/bot/floorbot/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /mob/living/bot/floorbot/emag_act(var/remaining_charges, var/mob/user) diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index f9a86ed439b7..d35196164a97 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -221,7 +221,7 @@ busy = FALSE update_appearance() -/mob/living/bot/medibot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/bot/medibot/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 42fd5a5bafb5..d26d06db5c1b 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -162,7 +162,7 @@ return data -/mob/living/bot/secbot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/bot/secbot/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /mob/living/bot/secbot/ui_act(action, list/params, datum/tgui/ui) diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index 605d99c8066c..e73e816f1e14 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -3,7 +3,7 @@ /mob/living/carbon/alien/attack_ui(slot_id) return -/mob/living/carbon/alien/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/carbon/alien/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index b0dc0ec46e16..697e62e511bc 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -38,7 +38,7 @@ N.show_message("[M] bursts out of [src]!", 2) ..() -/mob/living/carbon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/carbon/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/carbon/M = user if(!istype(M)) return ..() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index ca4e279f6ef3..3a84bd7ff392 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -25,7 +25,7 @@ return u_attack return null -/mob/living/carbon/human/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/carbon/human/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/datum/gender/TT = GLOB.gender_datums[user.get_visible_gender()] var/mob/living/carbon/human/H = user if(istype(H)) diff --git a/code/modules/mob/living/carbon/human/traits/weaver_objs.dm b/code/modules/mob/living/carbon/human/traits/weaver_objs.dm index 5d7e1216a7d8..0a96e9592c9f 100644 --- a/code/modules/mob/living/carbon/human/traits/weaver_objs.dm +++ b/code/modules/mob/living/carbon/human/traits/weaver_objs.dm @@ -34,7 +34,7 @@ var/global/list/weavable_items = list() if(damage) qdel(src) -/obj/effect/weaversilk/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/weaversilk/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() if(user.a_intent == INTENT_HARM) to_chat(user,"You easily tear down [name].") @@ -81,7 +81,7 @@ var/global/list/weavable_items = list() return ..() -/obj/structure/bed/double/weaversilk_nest/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/bed/double/weaversilk_nest/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() if(user.a_intent == INTENT_HARM && !has_buckled_mobs()) to_chat(user,"You easily tear down [name].") diff --git a/code/modules/mob/living/defense.dm b/code/modules/mob/living/defense.dm index 6e7902af425b..5873f5c3ccfa 100644 --- a/code/modules/mob/living/defense.dm +++ b/code/modules/mob/living/defense.dm @@ -92,7 +92,7 @@ return 0 // Clicking with an empty hand -/mob/living/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index d0cdab442a84..218602f96833 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -19,7 +19,7 @@ return UI_CLOSE return ..() -/obj/machinery/computer/drone_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/drone_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 482b56fbfa1f..d3191e7e0615 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -184,7 +184,7 @@ var/obj/machinery/drone_fabricator/chosen_fabricator = all_fabricators[choice] chosen_fabricator.create_drone(src.client) -/obj/machinery/drone_fabricator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/drone_fabricator/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!is_spawn_safe) is_spawn_safe = TRUE to_chat(user, "You inform the fabricator that it is safe for drones to roam around.") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 7fef4b284e01..15decb30b780 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -811,7 +811,7 @@ module = null updatename("Default") -/mob/living/silicon/robot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/silicon/robot/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(. & CLICKCHAIN_DO_NOT_PROPAGATE) return diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index aa2aa36ca68d..aaaeee01ee90 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -1,5 +1,5 @@ // When someone clicks us with an empty hand -/mob/living/simple_mob/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm index b233f023b3d7..7290939e558f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm @@ -62,7 +62,7 @@ if(udder && prob(5)) udder.add_reagent("milk", rand(5, 10)) -/mob/living/simple_mob/animal/passive/cow/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/cow/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/M = user if(!istype(M)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm index fa8d7e1ab287..b8a415f8ec3b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm @@ -110,7 +110,7 @@ var/obj/belly/B = loc sting(B.owner) -/mob/living/simple_mob/animal/passive/fish/koi/poisonous/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/fish/koi/poisonous/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index ccaea8f0385c..4307ab4ff5c0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -145,7 +145,7 @@ emote_hear = list("squeeks","squeaks","squiks") emote_see = list("runs in a circle", "shakes", "scritches at something") -/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/hander = user if(!istype(hander)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm index fdde288d5245..68b14992e3d5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm @@ -72,7 +72,7 @@ return ..() // Clicked on by empty hand. -/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm index de30215ab8db..74bb4b3ce8a0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Eddy/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Eddy/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm index 4d080eb131b0..21c6050bb64e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm @@ -53,7 +53,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Master/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Master/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm index 58744ee7422f..dceaeaf09fd0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm @@ -54,7 +54,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Rickey/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Rickey/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm index 5bc8c4a93c8d..4b920ea947ea 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm @@ -53,7 +53,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Helix/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Helix/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm index 920b1c40e896..8c60a85dec85 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm @@ -58,7 +58,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Steve/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Steve/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm index 61d28718e2f7..9cba0951e05e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm @@ -54,7 +54,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Willy/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Willy/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm index 4a85c2c626aa..1b761a944857 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/bradley/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/bradley/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm b/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm index cc96651ba183..8c705c9380c7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm @@ -51,7 +51,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Sally/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Sally/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm index a75875f4df23..43ede7d5622a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/BigTim/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/BigTim/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm b/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm index 7d4a7bf22837..8ac34a45ef71 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/TinyTim/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/TinyTim/attack_hand(mob/user, datum/event_args/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm index 6685dc2c155f..18e87ed82e6c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm +++ b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm @@ -54,7 +54,7 @@ return PROJECTILE_FORCE_MISS -/mob/living/simple_mob/illusion/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/illusion/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/M = user if(!istype(M)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm index 3447826f0f4c..54dfe51f3832 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm @@ -155,7 +155,7 @@ adjustBruteLoss(-1) // Clicked on by empty hand. -/mob/living/simple_mob/slime/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/slime/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm index 71edd7b2ee75..40b9428b8646 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm @@ -2,7 +2,7 @@ // Clicked on by empty hand. // Handles trying to wrestle a slime off of someone being eatten. -/mob/living/simple_mob/slime/xenobio/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/slime/xenobio/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm index 8a9079d74560..a98185251de4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm @@ -40,7 +40,7 @@ has_langs = list("Coulrian") -/mob/living/simple_mob/animal/passive/honkpet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/honkpet/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_DISARM) return icon_state = pick("c_pet", "m_pet") .=..() @@ -78,7 +78,7 @@ "rad" = 0 ) -/mob/living/simple_mob/animal/passive/mimepet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/mimepet/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_DISARM) icon_state = pick("dave1", "dave2", "dave3", "dave5" , "dave6" , "dave7" , "dave8" , "dave9" , "dave10") .=..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index 653859f8a09e..c3f5cebbd869 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -219,7 +219,7 @@ //Pet 4 friendly -/mob/living/simple_mob/otie/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/otie/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/M = user if(!istype(M)) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm index 41847013b344..c0271cc26c4a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm @@ -374,7 +374,7 @@ hud_elements |= energyhud // When someone clicks us with an empty hand -/mob/living/simple_mob/shadekin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/shadekin/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(user.a_intent == INTENT_HELP) shy_approach = FALSE //ACCLIMATED diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 11ab6dffcf97..181ec37992d6 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -70,7 +70,7 @@ ui.open() ui.set_auto_update(1) -/obj/machinery/ntnet_relay/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/ntnet_relay/attack_hand(mob/user, datum/event_args/clickchain/e_args) nano_ui_interact(user) /obj/machinery/ntnet_relay/Topic(href, href_list) diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 771aebfe981a..98b6e341bcff 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -109,7 +109,7 @@ /obj/item/modular_computer/attack_ai(mob/user) return attack_self(user) -/obj/item/modular_computer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/modular_computer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(anchored) return attack_self(user) return ..() diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index ecdbdaf26763..a9d5c376da38 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -214,7 +214,7 @@ return 1 return 0 -/obj/machinery/lapvend/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/lapvend/attack_hand(mob/user, datum/event_args/clickchain/e_args) nano_ui_interact(user) /obj/machinery/lapvend/nano_ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) diff --git a/code/modules/multiz/hoist.dm b/code/modules/multiz/hoist.dm index 7ee02b21a099..303454d688e6 100644 --- a/code/modules/multiz/hoist.dm +++ b/code/modules/multiz/hoist.dm @@ -28,7 +28,7 @@ var/obj/structure/hoist/source_hoist description_info = "Click and drag someone (or any object) to this to attach them to the clamp. If you are within reach, when you click and drag this to a turf adjacent to you, it will move the attached object there and release it." -/obj/effect/hoist_hook/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/hoist_hook/attack_hand(mob/user, datum/event_args/clickchain/e_args) return // This has to be overridden so that it works properly. /obj/effect/hoist_hook/MouseDroppedOnLegacy(atom/movable/AM,mob/user) @@ -175,7 +175,7 @@ return -/obj/structure/hoist/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/hoist/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (!ishuman(user)) return diff --git a/code/modules/multiz/ladder.dm b/code/modules/multiz/ladder.dm index aded8cbc6e03..4d077b383554 100644 --- a/code/modules/multiz/ladder.dm +++ b/code/modules/multiz/ladder.dm @@ -37,7 +37,7 @@ attack_hand(user) return -/obj/structure/ladder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/ladder/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/multiz/structures_vr.dm b/code/modules/multiz/structures_vr.dm index 8a3bfa53a6e0..620d4de8543a 100644 --- a/code/modules/multiz/structures_vr.dm +++ b/code/modules/multiz/structures_vr.dm @@ -27,7 +27,7 @@ return //do not send ghosts, zshadows, ai eyes, etc teleport(AM) -/obj/structure/portal_subtle/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/portal_subtle/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(istype(user) && !(istype(user,/mob/living))) return //do not send ghosts, zshadows, ai eyes, etc spawn(0) diff --git a/code/modules/multiz/zmimic/mimic_movable.dm b/code/modules/multiz/zmimic/mimic_movable.dm index c6a770c1dd68..effc69fb7842 100644 --- a/code/modules/multiz/zmimic/mimic_movable.dm +++ b/code/modules/multiz/zmimic/mimic_movable.dm @@ -186,7 +186,7 @@ /atom/movable/openspace/mimic/attackby(obj/item/W, mob/user) to_chat(user, SPAN_NOTICE("\The [src] is too far away.")) -/atom/movable/openspace/mimic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/atom/movable/openspace/mimic/attack_hand(mob/user, datum/event_args/clickchain/e_args) to_chat(user, SPAN_NOTICE("You cannot reach \the [src] from here.")) /atom/movable/openspace/mimic/examine(...) @@ -218,7 +218,7 @@ /atom/movable/openspace/turf_proxy/attackby(obj/item/W, mob/user) loc.attackby(W, user) -/atom/movable/openspace/turf_proxy/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/atom/movable/openspace/turf_proxy/attack_hand(mob/user, datum/event_args/clickchain/e_args) loc.attack_hand(user) /atom/movable/openspace/turf_proxy/attack_generic(mob/user as mob) @@ -245,7 +245,7 @@ /atom/movable/openspace/turf_mimic/attackby(obj/item/W, mob/user) loc.attackby(W, user) -/atom/movable/openspace/turf_mimic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/atom/movable/openspace/turf_mimic/attack_hand(mob/user, datum/event_args/clickchain/e_args) to_chat(user, SPAN_NOTICE("You cannot reach \the [src] from here.")) /atom/movable/openspace/turf_mimic/attack_generic(mob/user as mob) diff --git a/code/modules/overmap/legacy/overmap_shuttle.dm b/code/modules/overmap/legacy/overmap_shuttle.dm index 4bb7edb0c3ec..0402d18d198c 100644 --- a/code/modules/overmap/legacy/overmap_shuttle.dm +++ b/code/modules/overmap/legacy/overmap_shuttle.dm @@ -134,7 +134,7 @@ opened = 1 //shows open so you can diagnose 'oops, no gas' easily icon_state = "fuel_port_empty" //set the default state just to be safe -/obj/structure/fuel_port/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/fuel_port/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!opened) to_chat(user, "The door is secured tightly. You'll need a crowbar to open it.") return diff --git a/code/modules/overmap/legacy/ships/computers/computer_shims.dm b/code/modules/overmap/legacy/ships/computers/computer_shims.dm index f49827c35bfb..27cebb726b04 100644 --- a/code/modules/overmap/legacy/ships/computers/computer_shims.dm +++ b/code/modules/overmap/legacy/ships/computers/computer_shims.dm @@ -80,7 +80,7 @@ // If you don't call parent in this proc, you must make all appropriate checks yourself. // If you do, you must respect the return value. -/obj/machinery/computer/ship/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/ship/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((. = ..())) return if(!allowed(user)) diff --git a/code/modules/overmap/legacy/ships/panicbutton.dm b/code/modules/overmap/legacy/ships/panicbutton.dm index e944841610fb..53beab421bb2 100644 --- a/code/modules/overmap/legacy/ships/panicbutton.dm +++ b/code/modules/overmap/legacy/ships/panicbutton.dm @@ -23,7 +23,7 @@ else icon_state = "[initial(icon_state)]" -/obj/structure/panic_button/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/panic_button/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!istype(user)) return ..() diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 4a571cf57d4f..76a869fd071b 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -32,7 +32,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins if(!(("[department]" in alldepartments) || ("[department]" in admin_departments())) ) alldepartments |= department -/obj/machinery/photocopier/faxmachine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/photocopier/faxmachine/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) nano_ui_interact(user) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 3710a56731c6..d50857cb7b26 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -61,7 +61,7 @@ else to_chat(user, SPAN_NOTICE("You can't put [P] in [src]!")) -/obj/structure/filingcabinet/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/filingcabinet/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(contents.len <= 0) to_chat(user, SPAN_NOTICE("\The [src] is empty.")) return @@ -150,7 +150,7 @@ virgin = 0 //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. -/obj/structure/filingcabinet/security/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/filingcabinet/security/attack_hand(mob/user, datum/event_args/clickchain/e_args) populate() ..() @@ -187,7 +187,7 @@ virgin = 0 //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. -/obj/structure/filingcabinet/medical/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/filingcabinet/medical/attack_hand(mob/user, datum/event_args/clickchain/e_args) populate() ..() diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 0e74a783dfb1..4c03b5492e8b 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -24,7 +24,7 @@ return to_chat(user, "You pick up the [src].") -/obj/item/paper_bin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/paper_bin/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!user.is_hand_functional(e_args.hand_index)) user.action_feedback(SPAN_WARNING(user.get_hand_fail_message(e_args.hand_index)), src) return TRUE @@ -98,7 +98,7 @@ icon_state = "paper_bundle" papers = /obj/item/paper/natural -/obj/item/paper_bin/bundlenatural/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/paper_bin/bundlenatural/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(amount < 1) qdel(src) return ..() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 69d8d0ffb5af..08cc5a5e186e 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -27,7 +27,7 @@ /obj/machinery/photocopier/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/photocopier/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/photocopier/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) nano_ui_interact(user) diff --git a/code/modules/power/antimatter/computer.dm b/code/modules/power/antimatter/computer.dm index 248ce9835824..00cec9e31ba2 100644 --- a/code/modules/power/antimatter/computer.dm +++ b/code/modules/power/antimatter/computer.dm @@ -64,7 +64,7 @@ /obj/machinery/computer/am_engine/attack_paw(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/am_engine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/am_engine/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return user.machine = src diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 0f95265d50d8..f6e3f295afea 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -177,7 +177,7 @@ return -/obj/machinery/power/am_control_unit/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/am_control_unit/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(anchored) interact(user) return diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index f1f40c1cc865..bd7be0854cac 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -933,7 +933,7 @@ GLOBAL_LIST_EMPTY(apcs) wires.cut_all() update_icon() -/obj/machinery/power/apc/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/apc/attack_hand(mob/user, datum/event_args/clickchain/e_args) // if (!can_use(user)) This already gets called in interact() and in topic() // return if(!user) diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 97e81220894a..f0773b027686 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -72,7 +72,7 @@ busy = 0 -/obj/machinery/power/breakerbox/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/breakerbox/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(update_locked) to_chat(user, "System locked. Please try again later.") return diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 83b3c7cdeef5..639e86647c88 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -999,7 +999,7 @@ GLOBAL_LIST_INIT(possible_cable_coil_colours, list( -/obj/item/stack/cable_coil/alien/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/stack/cable_coil/alien/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (user.get_inactive_held_item() == src) var/N = input("How many units of wire do you want to take from [src]? You can only take up to [amount] at a time.", "Split stacks", 1) as num|null if(N && N <= amount) diff --git a/code/modules/power/fission/computer.dm b/code/modules/power/fission/computer.dm index 0d8c51857978..fa86327e92f2 100644 --- a/code/modules/power/fission/computer.dm +++ b/code/modules/power/fission/computer.dm @@ -37,7 +37,7 @@ /obj/machinery/computer/fission_monitor/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/fission_monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/fission_monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/power/fission/engine.dm b/code/modules/power/fission/engine.dm index 937816af951a..e59063c63b89 100644 --- a/code/modules/power/fission/engine.dm +++ b/code/modules/power/fission/engine.dm @@ -106,7 +106,7 @@ var/power = (decay_heat / REACTOR_RADS_TO_MJ) * max(healthmul, 0.1) radiation_pulse(src, max(power * REACTOR_RADIATION_MULTIPLIER, 0), RAD_FALLOFF_ENGINE_FISSION) -/obj/machinery/power/fission/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/fission/attack_hand(mob/user, datum/event_args/clickchain/e_args) nano_ui_interact(user) /obj/machinery/power/fission/attack_robot(mob/user) diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm index 329961937d80..0905c9d9f32d 100644 --- a/code/modules/power/fusion/core/_core.dm +++ b/code/modules/power/fusion/core/_core.dm @@ -98,7 +98,7 @@ var/list/fusion_cores = list() if(owned_field) owned_field.ChangeFieldStrength(value) -/obj/machinery/power/fusion_core/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/fusion_core/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!Adjacent(user)) // As funny as it was for the AI to hug-kill the tokamak field from a distance... return visible_message("\The [user] hugs \the [src] to make it feel better!") diff --git a/code/modules/power/fusion/core/core_control.dm b/code/modules/power/fusion/core/core_control.dm index cbd09629dbe9..15ee7e3a814c 100644 --- a/code/modules/power/fusion/core/core_control.dm +++ b/code/modules/power/fusion/core/core_control.dm @@ -21,7 +21,7 @@ /obj/machinery/computer/fusion_core_control/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/fusion_core_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/fusion_core_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_control.dm b/code/modules/power/fusion/fuel_assembly/fuel_control.dm index 3d24a531430e..caa6a8a8135b 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_control.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_control.dm @@ -10,7 +10,7 @@ /obj/machinery/computer/fusion_fuel_control/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/fusion_fuel_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/fusion_fuel_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm index 0983a1a53921..f3a9abbaf56a 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm @@ -79,7 +79,7 @@ var/list/fuel_injectors = list() return ..() -/obj/machinery/fusion_fuel_injector/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/fusion_fuel_injector/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(injecting) to_chat(user, "Shut \the [src] off before playing with the fuel rod!") diff --git a/code/modules/power/fusion/gyrotron/gyrotron_control.dm b/code/modules/power/fusion/gyrotron/gyrotron_control.dm index 4c2313635647..fd4283085490 100644 --- a/code/modules/power/fusion/gyrotron/gyrotron_control.dm +++ b/code/modules/power/fusion/gyrotron/gyrotron_control.dm @@ -11,7 +11,7 @@ /obj/machinery/computer/gyrotron_control/attack_ai(var/mob/user) attack_hand(user) -/obj/machinery/computer/gyrotron_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/gyrotron_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 2ba489f76e7e..62b2cca9483a 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -187,7 +187,7 @@ GLOBAL_LIST_EMPTY(all_turbines) else ..() -/obj/machinery/power/generator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/generator/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER) || !anchored) return diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm index 7d71f1a5dcd1..2c4ae6a8a4d3 100644 --- a/code/modules/power/generator_type2.dm +++ b/code/modules/power/generator_type2.dm @@ -94,7 +94,7 @@ interact(user) -/obj/machinery/power/generator_type2/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/generator_type2/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 6f97632e5f27..85b8f0322374 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -77,7 +77,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) /obj/machinery/gravity_generator/part/get_status() return main_part?.get_status() -/obj/machinery/gravity_generator/part/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/gravity_generator/part/attack_hand(mob/user, datum/event_args/clickchain/e_args) return main_part.attack_hand(user) /obj/machinery/gravity_generator/part/set_broken() @@ -237,7 +237,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) return return ..() -/obj/machinery/gravity_generator/main/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/gravity_generator/main/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((. = ..())) return ui_interact(user) diff --git a/code/modules/power/grid_checker.dm b/code/modules/power/grid_checker.dm index 99136da69434..cec075759a11 100644 --- a/code/modules/power/grid_checker.dm +++ b/code/modules/power/grid_checker.dm @@ -51,7 +51,7 @@ else if(istype(W, /obj/item/multitool) || W.is_wirecutter()) attack_hand(user) -/obj/machinery/power/grid_checker/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/grid_checker/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!user) return add_fingerprint(user) diff --git a/code/modules/power/lighting/lighting.dm b/code/modules/power/lighting/lighting.dm index de2a3d8de5d8..489ff1240bde 100644 --- a/code/modules/power/lighting/lighting.dm +++ b/code/modules/power/lighting/lighting.dm @@ -77,7 +77,7 @@ var/global/list/light_type_cache = list() else to_chat(user, "This casing doesn't support power cells for backup power.") -/obj/machinery/light_construct/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/light_construct/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return . // obj/machinery/attack_hand returns 1 if user can't use the machine @@ -852,7 +852,7 @@ var/global/list/light_type_cache = list() // attack with hand - remove tube/bulb // if hands aren't protected and the light is on, burn the player -/obj/machinery/light/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/light/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) @@ -898,7 +898,7 @@ var/global/list/light_type_cache = list() // create a light tube/bulb item and put it in the user's hand user.put_in_active_hand(remove_bulb()) //puts it in our active hand -/obj/machinery/light/flamp/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/light/flamp/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(lamp_shade) if(status == LIGHT_EMPTY) to_chat(user, "There is no [get_fitting_name()] in this light.") diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 615fc89ef043..e97fc888f42c 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -42,7 +42,7 @@ /obj/machinery/power/powered() return 1 //doesn't require an external power source -/obj/machinery/power/port_gen/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/port_gen/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return if(!anchored) @@ -301,7 +301,7 @@ return return ..() -/obj/machinery/power/port_gen/pacman/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/port_gen/pacman/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() if (!anchored) return @@ -612,7 +612,7 @@ log_and_message_admins("[ADMIN_LOOKUPFLW(Proj.firer)] triggered an Abductor Core explosion at [x],[y],[z] via projectile.") asplod() -/obj/machinery/power/rtg/abductor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/rtg/abductor/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!istype(user) || (. = ..())) return diff --git a/code/modules/power/sensors/sensor_monitoring.dm b/code/modules/power/sensors/sensor_monitoring.dm index 1fbe66ad3d8c..ae610062805a 100644 --- a/code/modules/power/sensors/sensor_monitoring.dm +++ b/code/modules/power/sensors/sensor_monitoring.dm @@ -41,7 +41,7 @@ ..() // On user click opens the UI of this computer. -/obj/machinery/computer/power_monitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/power_monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index bbc11c3f3232..c62c43957ef5 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -45,7 +45,7 @@ AddComponent(/datum/component/radiation_listener) rad_insulation = active? rad_insulation_active : rad_insulation_inactive -/obj/machinery/power/rad_collector/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/rad_collector/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(anchored) if(!src.locked) toggle_power() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index ced2ca32ac34..9ef06127fb17 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -21,7 +21,7 @@ FG2.cleanup() . = ..() -/obj/machinery/containment_field/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/containment_field/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(get_dist(src, user) > 1) return 0 else diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 6c2161db06e6..d7a900fe6e9c 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -58,7 +58,7 @@ else icon_state = "emitter" -/obj/machinery/power/emitter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/emitter/attack_hand(mob/user, datum/event_args/clickchain/e_args) src.add_fingerprint(user) activate(user) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 6413ff08d32c..a696d810db2d 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -73,7 +73,7 @@ field_generator power level display return -/obj/machinery/field_generator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/field_generator/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(state == 2) if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on if(src.active >= 1) diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 17aa345dd83d..c015c559f851 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -34,7 +34,7 @@ wires = null return ..() -/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(construction_state >= 3) interact(user) else if(construction_state == 2) // Wires exposed diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index e50dec3c4c08..5ed2036034cb 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -46,7 +46,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) STOP_PROCESSING(SSobj, src) return ..() -/obj/singularity/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/singularity/attack_hand(mob/user, datum/event_args/clickchain/e_args) consume(user) return 1 diff --git a/code/modules/power/smes/smes.dm b/code/modules/power/smes/smes.dm index c91e03cbd72c..e6c5b8efe683 100644 --- a/code/modules/power/smes/smes.dm +++ b/code/modules/power/smes/smes.dm @@ -241,7 +241,7 @@ GLOBAL_LIST_EMPTY(smeses) add_hiddenprint(user) ui_interact(user) -/obj/machinery/power/smes/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/smes/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) ui_interact(user) diff --git a/code/modules/power/smes/smes_construction.dm b/code/modules/power/smes/smes_construction.dm index 92668e4dfa71..4e9019ab335d 100644 --- a/code/modules/power/smes/smes_construction.dm +++ b/code/modules/power/smes/smes_construction.dm @@ -111,7 +111,7 @@ // Proc: attack_hand() // Parameters: None // Description: Opens the UI as usual, and if cover is removed opens the wiring panel. -/obj/machinery/power/smes/buildable/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/smes/buildable/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() if(open_hatch) wires.Interact(usr) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index f29ee7d1b32d..327752a5e9b6 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -216,7 +216,7 @@ GLOBAL_LIST_EMPTY(solars_list) var/tracker = 0 var/glass_type = null -/obj/item/solar_assembly/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/solar_assembly/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!anchored || !isturf(loc)) // You can't pick it up ..() @@ -397,7 +397,7 @@ GLOBAL_LIST_EMPTY(solars_list) add_overlay(image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir))) return -/obj/machinery/power/solar_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/solar_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!..()) interact(user) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index f4c826366ce4..253a8a1b723f 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -400,7 +400,7 @@ /obj/machinery/power/supermatter/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/power/supermatter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/supermatter/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()] user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... [TU.his] body starts to glow and bursts into flames before flashing into ash.",\ "You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\ diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index fa34e6df156b..6fca824d238d 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -59,7 +59,7 @@ return wires.Interact(user) return ..() -/obj/machinery/power/tesla_coil/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/tesla_coil/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_GRAB && user_buckle_mob(user.pulling, user)) return ..() @@ -125,7 +125,7 @@ return return ..() -/obj/machinery/power/grounding_rod/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/grounding_rod/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.a_intent == INTENT_GRAB && user_buckle_mob(user.pulling, user)) return ..() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 4873ef91757d..8556ed420f2f 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -273,7 +273,7 @@ updateDialog() -/obj/machinery/power/turbine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/turbine/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((. = ..())) return src.interact(user) @@ -340,7 +340,7 @@ id = new_ident return -/obj/machinery/computer/turbine_computer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/turbine_computer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((. = ..())) return src.interact(user) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 9bf41a8baade..440c5091280c 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -249,7 +249,7 @@ unload_ammo(user) update_icon() -/obj/item/gun/ballistic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user, allow_dump=0) else diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index f4d89263e10a..a684b44ae032 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -155,7 +155,7 @@ ..() load_ammo(A, user) -/obj/item/gun/energy/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/energy/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user) else diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index 6fa49d48ce22..89315079f6be 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -77,7 +77,7 @@ else ..() -/obj/item/gun/launcher/grenade/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/grenade/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload(user) else diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 47ad170998e3..880b4bf7552c 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -59,7 +59,7 @@ else to_chat(user, "There is nothing to remove in \the [src].") -/obj/item/gun/launcher/pneumatic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/pneumatic/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_hopper(user) else diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 30ee486266b1..4716f8325b67 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -108,7 +108,7 @@ next = darts[1] add_fingerprint(user) -/obj/item/gun/launcher/syringe/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/syringe/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(!darts.len) to_chat(user, "[src] is empty.") diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm index 26f1218b12ee..d8ce28668169 100644 --- a/code/modules/projectiles/guns/magnetic/bore.dm +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -48,7 +48,7 @@ if(mat_storage) . += image(icon, "[icon_state]_loaded") -/obj/item/gun/magnetic/matfed/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) // It doesn't keep a loaded item inside. +/obj/item/gun/magnetic/matfed/attack_hand(mob/user, datum/event_args/clickchain/e_args) // It doesn't keep a loaded item inside. if(user.get_inactive_held_item() == src) var/obj/item/removing diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index c64f7f147ba4..351acb273fa2 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -149,7 +149,7 @@ return . = ..() -/obj/item/gun/magnetic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/magnetic/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) var/obj/item/removing diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index ce8c3d5f0139..002d123119b6 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -170,7 +170,7 @@ else ..() -/obj/item/gun/ballistic/automatic/z8/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/automatic/z8/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src && use_launcher) launcher.unload(user) else @@ -259,7 +259,7 @@ else return ..() //once closed, behave like normal -/obj/item/gun/ballistic/automatic/lmg/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/automatic/lmg/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!cover_open && user.get_inactive_held_item() == src) toggle_cover(user) //open the cover else diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index 666bfaf21d87..3c2eaa19eac2 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -54,7 +54,7 @@ else return -/obj/item/gun/ballistic/bow/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/bow/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user, allow_dump=0) else diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 3e1bd21903e8..f186dae7f2a7 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -74,7 +74,7 @@ icon_state = "colt-taj" /*//apart of reskins that have two sprites, touching may result in frustration and breaks -/obj/item/gun/ballistic/colt/detective/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/colt/detective/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!unique_reskin && loc == user) reskin_gun(user) return @@ -211,7 +211,7 @@ name = "compact signal pistol" magazine_type = /obj/item/ammo_magazine/m9mm/compact/flash -/obj/item/gun/ballistic/pistol/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/pistol/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(silenced) if(!user.is_holding(src)) @@ -431,7 +431,7 @@ else ..() -/obj/item/gun/ballistic/konigin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/konigin/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src && use_shotgun) shotgun.unload_ammo(user) else diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index f7304d36cea4..a2ea1d9e6e06 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -45,7 +45,7 @@ else ..() -/obj/item/gun/ballistic/rocket/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/rocket/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload(user) else @@ -86,7 +86,7 @@ to_chat(user, "You cannot reload the [src]!") return -/obj/item/gun/ballistic/rocket/collapsible/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/rocket/collapsible/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) to_chat(user, "You cannot unload the [src]'s munition!") return diff --git a/code/modules/projectiles/magazines/magazine.dm b/code/modules/projectiles/magazines/magazine.dm index 6d04c691f4b0..16714a236cee 100644 --- a/code/modules/projectiles/magazines/magazine.dm +++ b/code/modules/projectiles/magazines/magazine.dm @@ -102,7 +102,7 @@ return // This puts one bullet from the magazine into your hand -/obj/item/ammo_magazine/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/ammo_magazine/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(can_remove_ammo) // For Smart Magazines if(user.get_inactive_held_item() == src) if(stored_ammo.len) diff --git a/code/modules/projectiles/magazines/smartmag.dm b/code/modules/projectiles/magazines/smartmag.dm index 57e3e329910f..217dd6324c3e 100644 --- a/code/modules/projectiles/magazines/smartmag.dm +++ b/code/modules/projectiles/magazines/smartmag.dm @@ -109,7 +109,7 @@ ..() // You can remove the power cell from the magazine by hand, but it's way slower than using a screwdriver -/obj/item/ammo_magazine/smart/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/ammo_magazine/smart/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(attached_cell) to_chat(user, "You struggle to remove \the [attached_cell] from \the [src].") diff --git a/code/modules/random_map/drop/droppod_doors.dm b/code/modules/random_map/drop/droppod_doors.dm index b7944a5be577..23252c5d6d66 100644 --- a/code/modules/random_map/drop/droppod_doors.dm +++ b/code/modules/random_map/drop/droppod_doors.dm @@ -23,7 +23,7 @@ /obj/structure/droppod_door/attack_generic(var/mob/user) attack_hand(user) -/obj/structure/droppod_door/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/droppod_door/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(deploying) return to_chat(user, "You prime the explosive bolts. Better get clear!") sleep(30) diff --git a/code/modules/reagents/chemistry/machinery.dm b/code/modules/reagents/chemistry/machinery.dm index bc3f7caef7ed..09372c8e22ef 100644 --- a/code/modules/reagents/chemistry/machinery.dm +++ b/code/modules/reagents/chemistry/machinery.dm @@ -160,7 +160,7 @@ if(AM in holdingitems) holdingitems -= AM -/obj/machinery/reagentgrinder/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/reagentgrinder/attack_hand(mob/user, datum/event_args/clickchain/e_args) interact(user) /obj/machinery/reagentgrinder/interact(mob/user as mob) // The microwave Menu //I am reasonably certain that this is not a microwave diff --git a/code/modules/reagents/distilling/distilling.dm b/code/modules/reagents/distilling/distilling.dm index 3f25475de57f..375e53527b50 100644 --- a/code/modules/reagents/distilling/distilling.dm +++ b/code/modules/reagents/distilling/distilling.dm @@ -108,7 +108,7 @@ ..() -/obj/machinery/portable_atmospherics/powered/reagent_distillery/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/portable_atmospherics/powered/reagent_distillery/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/list/options = list() options["examine"] = radial_examine options["use"] = radial_use diff --git a/code/modules/reagents/items/hypospray.dm b/code/modules/reagents/items/hypospray.dm index f88a0a76e1a0..a71d59e88309 100644 --- a/code/modules/reagents/items/hypospray.dm +++ b/code/modules/reagents/items/hypospray.dm @@ -58,7 +58,7 @@ icon_state = "[initial(icon_state)][vial_state]" return ..() -/obj/item/hypospray/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/hypospray/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.is_holding_inactive(src)) if(isnull(loaded)) user.action_feedback(SPAN_WARNING("[src] has no vial loaded."), src) diff --git a/code/modules/reagents/machinery/chem_master.dm b/code/modules/reagents/machinery/chem_master.dm index 020e7458c4f2..0440800c5d2a 100644 --- a/code/modules/reagents/machinery/chem_master.dm +++ b/code/modules/reagents/machinery/chem_master.dm @@ -147,7 +147,7 @@ pill_bottle = null return ..() -/obj/machinery/chem_master/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/chem_master/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & BROKEN) return user.set_machine(src) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index c344ce1f5852..e76d9cbeb8c6 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -168,7 +168,7 @@ . = ..() update_icon() -/obj/item/reagent_containers/glass/beaker/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/glass/beaker/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() update_icon() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index d21b899daddb..7478433b60a0 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -94,7 +94,7 @@ volume = loaded_vial.volume reagents.maximum_volume = loaded_vial.reagents.maximum_volume -/obj/item/reagent_containers/hypospray/vial/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/hypospray/vial/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(loaded_vial) reagents.trans_to_holder(loaded_vial.reagents,volume) diff --git a/code/modules/reagents/reagent_containers/organic.dm b/code/modules/reagents/reagent_containers/organic.dm index 6242da0c093e..92ef0fd3e232 100644 --- a/code/modules/reagents/reagent_containers/organic.dm +++ b/code/modules/reagents/reagent_containers/organic.dm @@ -52,7 +52,7 @@ . = ..() update_icon() -/obj/item/reagent_containers/organic/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/organic/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() update_icon() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 477dde58bab7..739abc9405b3 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -47,7 +47,7 @@ return update_icon() -/obj/item/reagent_containers/syringe/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/syringe/attack_hand(mob/user, datum/event_args/clickchain/e_args) ..() update_icon() diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index d1469b53348a..8269a1e0e844 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -150,7 +150,7 @@ return ..() // attack with hand, move pulled object onto conveyor -/obj/machinery/conveyor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/conveyor/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!CHECK_ALL_MOBILITY(user, MOBILITY_CAN_MOVE | MOBILITY_CAN_USE)) return if(isnull(user.pulling) || user.pulling.anchored) @@ -254,7 +254,7 @@ C.setmove() // attack with hand, switch position -/obj/machinery/conveyor_switch/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/conveyor_switch/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access denied.") return @@ -315,7 +315,7 @@ desc = "A conveyor control switch. It appears to only go in one direction." // attack with hand, switch position -/obj/machinery/conveyor_switch/oneway/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/conveyor_switch/oneway/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(position == 0) position = convdir else diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index efa9766326d9..fd53755c3873 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -218,7 +218,7 @@ interact(user, 1) // human interact with machine -/obj/machinery/disposal/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/disposal/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & BROKEN) return diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 2f29f88e6181..2fa01a2cf030 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -13,7 +13,7 @@ var/label_x var/tag_x -/obj/structure/bigDelivery/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/bigDelivery/attack_hand(mob/user, datum/event_args/clickchain/e_args) unwrap() /obj/structure/bigDelivery/proc/unwrap() diff --git a/code/modules/research/machinery/rdconsole.dm b/code/modules/research/machinery/rdconsole.dm index fcd0ce9691e1..ff8b5bf473ce 100644 --- a/code/modules/research/machinery/rdconsole.dm +++ b/code/modules/research/machinery/rdconsole.dm @@ -165,7 +165,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "" return dat.Join() -/obj/machinery/computer/rdconsole/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/rdconsole/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/modules/research/machinery/rdmachines.dm b/code/modules/research/machinery/rdmachines.dm index 5c67d3449fbb..857f282aa3eb 100644 --- a/code/modules/research/machinery/rdmachines.dm +++ b/code/modules/research/machinery/rdmachines.dm @@ -14,7 +14,7 @@ var/list/stored_materials = list() // Materials this machine can accept. var/list/hidden_materials = list() // Materials this machine will not display, unless it contains them. Must be in the materials list as well. -/obj/machinery/r_n_d/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/r_n_d/attack_hand(mob/user, datum/event_args/clickchain/e_args) return /obj/machinery/r_n_d/proc/getMaterialType(var/name) diff --git a/code/modules/research/machinery/server.dm b/code/modules/research/machinery/server.dm index 42c4bfe67877..0d9691134792 100644 --- a/code/modules/research/machinery/server.dm +++ b/code/modules/research/machinery/server.dm @@ -284,7 +284,7 @@ target.files.known_tech |= from.files.known_tech return TRUE -/obj/machinery/computer/rdservercontrol/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/rdservercontrol/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm index ebec0335d731..fa53f77311fc 100644 --- a/code/modules/resleeving/computers.dm +++ b/code/modules/resleeving/computers.dm @@ -135,7 +135,7 @@ /obj/machinery/computer/transhuman/resleeving/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/transhuman/resleeving/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/transhuman/resleeving/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) add_fingerprint(user) diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm index 5715a6b7a6fe..f361f522a82d 100644 --- a/code/modules/resleeving/infomorph.dm +++ b/code/modules/resleeving/infomorph.dm @@ -340,7 +340,7 @@ var/list/infomorph_emotions = list( if(stat != 2) close_up() return -/mob/living/silicon/infomorph/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/silicon/infomorph/attack_hand(mob/user, datum/event_args/clickchain/e_args) visible_message("[user.name] boops [src] on the head.") close_up() diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index 1b78180954c3..af54d0194e20 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -341,7 +341,7 @@ return 1 -/obj/machinery/transhuman/synthprinter/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/transhuman/synthprinter/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((busy == 0) || (machine_stat & NOPOWER)) return to_chat(user, "Current print cycle is [busy]% complete.") @@ -430,7 +430,7 @@ manip_rating += M.rating blur_amount = (48 - manip_rating * 8) -/obj/machinery/transhuman/resleever/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/transhuman/resleever/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) var/health_text = "" var/mind_text = "" diff --git a/code/modules/rogueminer_vr/zone_console.dm b/code/modules/rogueminer_vr/zone_console.dm index 0b877bebe915..2b21546f3c3d 100644 --- a/code/modules/rogueminer_vr/zone_console.dm +++ b/code/modules/rogueminer_vr/zone_console.dm @@ -32,7 +32,7 @@ /obj/machinery/computer/roguezones/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/roguezones/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/roguezones/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index 8b4c9b27ffe7..32255ef3a454 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -68,7 +68,7 @@ if(machine_stat & NOPOWER) icon_state = "auth_off" -/obj/machinery/keycard_auth/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/keycard_auth/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") return diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index ea9b041e18d2..5b5dddca4d88 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -250,7 +250,7 @@ malfunction = 1 checkhp() -/obj/machinery/shieldgen/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/shieldgen/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(locked) to_chat(user, "The machine is locked, you are unable to use it.") return diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index e1cdc158efac..c192b551a253 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -64,7 +64,7 @@ /obj/effect/energy_field/take_damage(var/damage) adjust_strength(-damage / 20) -/obj/effect/energy_field/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/energy_field/attack_hand(mob/user, datum/event_args/clickchain/e_args) impact_effect(3) // Harmless, but still produces the 'impact' effect. ..() diff --git a/code/modules/shieldgen/energy_shield.dm b/code/modules/shieldgen/energy_shield.dm index b9dc2b2c0b90..60f4b79fc52d 100644 --- a/code/modules/shieldgen/energy_shield.dm +++ b/code/modules/shieldgen/energy_shield.dm @@ -162,7 +162,7 @@ animate(src, alpha = initial(alpha), time = 1 SECOND) // Just for fun -/obj/effect/shield/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/shield/attack_hand(mob/user, datum/event_args/clickchain/e_args) flash_adjacent_segments(3) /obj/effect/shield/take_damage(var/damage, var/damtype, var/hitby) diff --git a/code/modules/shieldgen/handheld_defuser.dm b/code/modules/shieldgen/handheld_defuser.dm index e9c6ac1a5897..100273d6f5df 100644 --- a/code/modules/shieldgen/handheld_defuser.dm +++ b/code/modules/shieldgen/handheld_defuser.dm @@ -61,7 +61,7 @@ to_chat(user, "The charge meter reads [cell ? cell.percent() : 0]%") to_chat(user, "It is [enabled ? "enabled" : "disabled"].") -/obj/item/shield_diffuser/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/shield_diffuser/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) if(cell) cell.update_icon() diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index 555ff2039332..1ef47d88a1c9 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -25,7 +25,7 @@ var/max_stored_power = 50000 //50 kW use_power = USE_POWER_OFF //Draws directly from power net. Does not use APC power. -/obj/machinery/shieldwallgen/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/shieldwallgen/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(state != 1) to_chat(user, "The shield generator needs to be firmly secured to the floor first.") return 1 @@ -257,7 +257,7 @@ update_nearby_tiles() ..() -/obj/machinery/shieldwall/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/shieldwall/attack_hand(mob/user, datum/event_args/clickchain/e_args) return diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index 4e469b90c69b..fa9df4e2fb27 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -67,7 +67,7 @@ else ..() -/obj/machinery/shield_capacitor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/shield_capacitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN)) return interact(user) diff --git a/code/modules/shieldgen/shield_diffuser.dm b/code/modules/shieldgen/shield_diffuser.dm index bea4300310cf..728ba2f4d02b 100644 --- a/code/modules/shieldgen/shield_diffuser.dm +++ b/code/modules/shieldgen/shield_diffuser.dm @@ -55,7 +55,7 @@ else icon_state = "fdiffuser_on" -/obj/machinery/shield_diffuser/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/shield_diffuser/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((. = ..())) return if(alarm) diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 478212344081..fed4cc1374a7 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -94,7 +94,7 @@ /obj/machinery/shield_gen/attack_ai(user as mob) return src.attack_hand(user) -/obj/machinery/shield_gen/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/shield_gen/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (BROKEN)) return interact(user) diff --git a/code/modules/shieldgen/shield_generator.dm b/code/modules/shieldgen/shield_generator.dm index d5f226c6a506..fa0cb4f34efd 100644 --- a/code/modules/shieldgen/shield_generator.dm +++ b/code/modules/shieldgen/shield_generator.dm @@ -431,7 +431,7 @@ return data -/obj/machinery/power/shield_generator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/shield_generator/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((. = ..())) return if(panel_open && Adjacent(user)) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 7d8ee10cfc03..4ee17bc81a8a 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -11,7 +11,7 @@ var/skip_act = FALSE var/tgui_subtemplate = "ShuttleControlConsoleDefault" -/obj/machinery/computer/shuttle_control/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/shuttle_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..(user)) return if(!allowed(user)) diff --git a/code/modules/species/protean/protean_blob.dm b/code/modules/species/protean/protean_blob.dm index f8ab8cf2c479..9795eec4caeb 100644 --- a/code/modules/species/protean/protean_blob.dm +++ b/code/modules/species/protean/protean_blob.dm @@ -258,7 +258,7 @@ else return ..() -/mob/living/simple_mob/protean_blob/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/protean_blob/attack_hand(mob/user, datum/event_args/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm b/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm index c186cde43e3a..8fe80f855ee5 100644 --- a/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm +++ b/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm @@ -218,7 +218,7 @@ health = max(0, health - tforce) healthcheck() -/obj/effect/alien/hybrid_resin/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/effect/alien/hybrid_resin/attack_hand(mob/user, datum/event_args/clickchain/e_args) usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if (MUTATION_HULK in usr.mutations) to_chat(usr, "You easily destroy the [name].") diff --git a/code/modules/species/xenomorphs/alien_facehugger.dm b/code/modules/species/xenomorphs/alien_facehugger.dm index 722216a6e837..844ad101669e 100644 --- a/code/modules/species/xenomorphs/alien_facehugger.dm +++ b/code/modules/species/xenomorphs/alien_facehugger.dm @@ -30,7 +30,7 @@ var/const/MAX_ACTIVE_TIME = 400 var/strength = 5 var/attached = 0 -/obj/item/clothing/mask/facehugger/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/clothing/mask/facehugger/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((stat == CONSCIOUS && !sterile)) if(Attach(user)) return @@ -312,7 +312,7 @@ var/const/MAX_ACTIVE_TIME = 400 var/strength = 5 var/attached = 0 -/mob/living/simple_mob/animal/space/alien/facehugger/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/space/alien/facehugger/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((stat == CONSCIOUS && !sterile)) if(Attach(user)) diff --git a/code/modules/stockmarket/computer.dm b/code/modules/stockmarket/computer.dm index 29457b945c09..410b2291a2a5 100644 --- a/code/modules/stockmarket/computer.dm +++ b/code/modules/stockmarket/computer.dm @@ -13,7 +13,7 @@ . = ..() logged_in = "Cargo Department" -/obj/machinery/computer/stockexchange/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/stockexchange/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..(user)) return diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index d070e6597da1..ddc8a6057994 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -185,7 +185,7 @@ var/list/table_icon_cache = list() return ..() -/obj/structure/table/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/table/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/X = user if(istype(X.species, /datum/species/xenos)) diff --git a/code/modules/telesci/hyper_pad.dm b/code/modules/telesci/hyper_pad.dm index 8b796b144a7f..500e76663a08 100644 --- a/code/modules/telesci/hyper_pad.dm +++ b/code/modules/telesci/hyper_pad.dm @@ -54,7 +54,7 @@ if(primary) primary.attack_ghost(ghost) -/obj/machinery/hyperpad/centre/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/hyperpad/centre/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -75,7 +75,7 @@ src.add_fingerprint(user) startteleport(user) -/obj/machinery/hyperpad/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/hyperpad/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(primary) primary.attack_hand(user) diff --git a/code/modules/telesci/quantum_pad.dm b/code/modules/telesci/quantum_pad.dm index 728072d88d36..cdaa8d7f4e91 100644 --- a/code/modules/telesci/quantum_pad.dm +++ b/code/modules/telesci/quantum_pad.dm @@ -78,7 +78,7 @@ else icon_state = initial(icon_state) -/obj/machinery/power/quantumpad/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/power/quantumpad/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 24ad04abc370..d8bd2f913cff 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -77,7 +77,7 @@ /obj/machinery/computer/telescience/attack_ai(mob/user) src.attack_hand(user) -/obj/machinery/computer/telescience/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/telescience/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return nano_ui_interact(user) diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm index fb3c1d6ce85d..db32b2ab089c 100644 --- a/code/modules/turbolift/turbolift_console.dm +++ b/code/modules/turbolift/turbolift_console.dm @@ -39,7 +39,7 @@ /obj/structure/lift/attack_generic(var/mob/user) return attack_hand(user) -/obj/structure/lift/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/lift/attack_hand(mob/user, datum/event_args/clickchain/e_args) return interact(user) /obj/structure/lift/interact(var/mob/user) diff --git a/code/modules/vehicles_legacy/bike.dm b/code/modules/vehicles_legacy/bike.dm index 4ed18d7ad076..cdaacf4ada7f 100644 --- a/code/modules/vehicles_legacy/bike.dm +++ b/code/modules/vehicles_legacy/bike.dm @@ -120,7 +120,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/vehicle_old/bike/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/vehicle_old/bike/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user == load) unload(load, user) to_chat(user, "You unbuckle yourself from \the [src].") diff --git a/code/modules/vehicles_legacy/skateboard.dm b/code/modules/vehicles_legacy/skateboard.dm index 710652be8cc4..605d290f6dd7 100644 --- a/code/modules/vehicles_legacy/skateboard.dm +++ b/code/modules/vehicles_legacy/skateboard.dm @@ -47,7 +47,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/vehicle_old/skateboard/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/vehicle_old/skateboard/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user == load) unbuckle_mob(load, user) to_chat(user, "You unbuckle yourself from \the [src].") diff --git a/code/modules/vehicles_legacy/train.dm b/code/modules/vehicles_legacy/train.dm index 1299fa77430a..bcf7c34b970b 100644 --- a/code/modules/vehicles_legacy/train.dm +++ b/code/modules/vehicles_legacy/train.dm @@ -110,7 +110,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/vehicle_old/train/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/vehicle_old/train/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.stat || user.restrained() || !Adjacent(user)) return 0 diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm index d0a8ee24707d..dad5ef2c796b 100644 --- a/code/modules/virus2/curer.dm +++ b/code/modules/virus2/curer.dm @@ -36,7 +36,7 @@ /obj/machinery/computer/curer/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/curer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/curer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return user.machine = src diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm index 5a34669d1e35..5f6c66f24a0b 100644 --- a/code/modules/virus2/diseasesplicer.dm +++ b/code/modules/virus2/diseasesplicer.dm @@ -38,7 +38,7 @@ /obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/diseasesplicer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/diseasesplicer/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index af366ed0192b..9f7c4ba25f54 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -45,7 +45,7 @@ src.attack_hand(user) -/obj/machinery/disease2/incubator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/disease2/incubator/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return nano_ui_interact(user) diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm index 3e49f61cdb9b..cb1495d11797 100644 --- a/code/modules/virus2/isolator.dm +++ b/code/modules/virus2/isolator.dm @@ -41,7 +41,7 @@ src.attack_hand(user) -/obj/machinery/disease2/isolator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/disease2/isolator/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return ui_interact(user) diff --git a/code/modules/vore/fluffstuff/custom_guns.dm b/code/modules/vore/fluffstuff/custom_guns.dm index 2adc4c4569a7..cf0fe9e1ab57 100644 --- a/code/modules/vore/fluffstuff/custom_guns.dm +++ b/code/modules/vore/fluffstuff/custom_guns.dm @@ -150,7 +150,7 @@ chambered = AC update_icon() -/obj/item/gun/ballistic/revolver/mateba/fluff/tasald_corlethian/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/revolver/mateba/fluff/tasald_corlethian/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user, allow_dump = 1) else diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index ff3c0904f905..e6d7392a5d23 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -843,7 +843,7 @@ ..() -/obj/item/perfect_tele/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/perfect_tele/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(user.get_inactive_held_item() == src && power_source) to_chat(user,"You eject \the [power_source] from \the [src].") user.put_in_hands(power_source) @@ -1105,7 +1105,7 @@ tele_hand = null return ..() -/obj/item/perfect_tele_beacon/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/item/perfect_tele_beacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) if((user.ckey != creator) && !(user.ckey in warned_users)) warned_users |= user.ckey var/choice = alert(user,"This device is a translocator beacon. Having it on your person may mean that anyone \ diff --git a/code/modules/vore/weight/fitness_machines_vr.dm b/code/modules/vore/weight/fitness_machines_vr.dm index 98c9975dd4e5..c7f3a7e2e873 100644 --- a/code/modules/vore/weight/fitness_machines_vr.dm +++ b/code/modules/vore/weight/fitness_machines_vr.dm @@ -11,7 +11,7 @@ var/cooldown = 10 var/weightloss_power = 1 -/obj/machinery/fitness/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/fitness/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return @@ -68,7 +68,7 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) return -/obj/machinery/fitness/heavy/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/fitness/heavy/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(!anchored) to_chat(user, "For safety reasons, you are required to have this equipment wrenched down before using it!") return @@ -98,7 +98,7 @@ idle_power_usage = 0 active_power_usage = 0 -/obj/machinery/scale/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/scale/attack_hand(mob/user, datum/event_args/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/anomaly_container.dm b/code/modules/xenoarcheaology/anomaly_container.dm index 03bd5daf8d3d..b2211c98c00c 100644 --- a/code/modules/xenoarcheaology/anomaly_container.dm +++ b/code/modules/xenoarcheaology/anomaly_container.dm @@ -14,7 +14,7 @@ if(A) contain(A) -/obj/structure/anomaly_container/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/structure/anomaly_container/attack_hand(mob/user, datum/event_args/clickchain/e_args) release() /obj/structure/anomaly_container/attack_robot(var/mob/user) diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm index b8ac29c3ecda..6cb9a5140fd1 100644 --- a/code/modules/xenoarcheaology/artifacts/artifact.dm +++ b/code/modules/xenoarcheaology/artifacts/artifact.dm @@ -174,7 +174,7 @@ if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) secondary_effect.ToggleActivate(0) -/obj/machinery/artifact/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/artifact/attack_hand(mob/user, datum/event_args/clickchain/e_args) if (get_dist(user, src) > 1) to_chat(user, "You can't reach [src] from here.") return diff --git a/code/modules/xenoarcheaology/artifacts/gigadrill.dm b/code/modules/xenoarcheaology/artifacts/gigadrill.dm index 5ae80dcd2261..4125087d6803 100644 --- a/code/modules/xenoarcheaology/artifacts/gigadrill.dm +++ b/code/modules/xenoarcheaology/artifacts/gigadrill.dm @@ -9,7 +9,7 @@ density = 1 layer = ABOVE_JUNK_LAYER -/obj/machinery/giga_drill/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/giga_drill/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(active) active = 0 icon_state = "gigadrill" diff --git a/code/modules/xenoarcheaology/artifacts/replicator.dm b/code/modules/xenoarcheaology/artifacts/replicator.dm index 266241d4b343..f55ac2a2cc49 100644 --- a/code/modules/xenoarcheaology/artifacts/replicator.dm +++ b/code/modules/xenoarcheaology/artifacts/replicator.dm @@ -138,7 +138,7 @@ last_process_time = world.time -/obj/machinery/replicator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/replicator/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/replicator/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm index e6bad31f5ae7..4c1a8df0734b 100644 --- a/code/modules/xenoarcheaology/tools/artifact_analyser.dm +++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm @@ -24,7 +24,7 @@ if(!owned_scanner) owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src) -/obj/machinery/artifact_analyser/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/artifact_analyser/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (NOPOWER|BROKEN) || get_dist(src, user) > 1) return diff --git a/code/modules/xenoarcheaology/tools/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm index 98635883c3fd..8ea00506a1cc 100644 --- a/code/modules/xenoarcheaology/tools/artifact_harvester.dm +++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm @@ -35,7 +35,7 @@ else return..() -/obj/machinery/artifact_harvester/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/artifact_harvester/attack_hand(mob/user, datum/event_args/clickchain/e_args) add_fingerprint(user) if(machine_stat & (NOPOWER|BROKEN)) return diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index f4e770f91a57..5522b7dc4266 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -115,7 +115,7 @@ if(total_purity && fresh_coolant) coolant_purity = total_purity / fresh_coolant -/obj/machinery/radiocarbon_spectrometer/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/radiocarbon_spectrometer/attack_hand(mob/user, datum/event_args/clickchain/e_args) ui_interact(user) /obj/machinery/radiocarbon_spectrometer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/xenoarcheaology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm index 3928ef91e559..602fc206ba82 100644 --- a/code/modules/xenoarcheaology/tools/suspension_generator.dm +++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm @@ -35,7 +35,7 @@ else deactivate() -/obj/machinery/suspension_gen/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/suspension_gen/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(panel_open) if(cell) to_chat(user, SPAN_NOTICE("You remove [cell].")) diff --git a/code/modules/xenobio/machinery/processor.dm b/code/modules/xenobio/machinery/processor.dm index 8d3c61b680a6..49dd713736f2 100644 --- a/code/modules/xenobio/machinery/processor.dm +++ b/code/modules/xenobio/machinery/processor.dm @@ -24,7 +24,7 @@ . = ..() . += "The automatic intake switch is in the [auto_mode? "On" : "Off"] position." -/obj/machinery/processor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/processor/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(processing) to_chat(user, "The processor is in the process of processing!") return diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm index 15047074c5ca..0594c704a199 100644 --- a/code/modules/xenobio2/machinery/core_extractor.dm +++ b/code/modules/xenobio2/machinery/core_extractor.dm @@ -145,7 +145,7 @@ eject_slime() //Here lies the UI -/obj/machinery/slime/extractor/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/slime/extractor/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm index c5a845a10ddc..7f7cf4a54ad5 100644 --- a/code/modules/xenobio2/machinery/gene_manipulators.dm +++ b/code/modules/xenobio2/machinery/gene_manipulators.dm @@ -59,7 +59,7 @@ /obj/machinery/xenobio/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/xenobio/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/xenobio/attack_hand(mob/user, datum/event_args/clickchain/e_args) nano_ui_interact(user) /obj/machinery/xenobio/attackby(obj/item/W as obj, mob/user as mob) diff --git a/code/modules/xenobio2/machinery/injector_computer.dm b/code/modules/xenobio2/machinery/injector_computer.dm index 44d7f3d741d2..cf5ef9833a15 100644 --- a/code/modules/xenobio2/machinery/injector_computer.dm +++ b/code/modules/xenobio2/machinery/injector_computer.dm @@ -23,7 +23,7 @@ injector.computer = null ..() -/obj/machinery/computer/xenobio2/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/computer/xenobio2/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(..()) return 1 nano_ui_interact(user) diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm index f7c078e9e401..86fad6052e8f 100644 --- a/code/modules/xenobio2/machinery/slime_replicator.dm +++ b/code/modules/xenobio2/machinery/slime_replicator.dm @@ -99,7 +99,7 @@ eject_core() //Here lies the UI -/obj/machinery/slime/replicator/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/obj/machinery/slime/replicator/attack_hand(mob/user, datum/event_args/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/maps/generic/misc.dm b/maps/generic/misc.dm index 11d5fd41ce79..30ab3716ab3f 100644 --- a/maps/generic/misc.dm +++ b/maps/generic/misc.dm @@ -68,7 +68,7 @@ /turf/simulated/floor/maglev/Entered(var/atom/movable/AM, var/atom/old_loc) if(isliving(AM) && prob(50)) track_zap(AM) -/turf/simulated/floor/maglev/attack_hand(mob/user, list/params, datum/event_args/clickchain/e_args) +/turf/simulated/floor/maglev/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(prob(75)) track_zap(user) /turf/simulated/floor/maglev/proc/track_zap(var/mob/living/user) From d3614d9310bddb7d92340226695c22b76c400758 Mon Sep 17 00:00:00 2001 From: silicons Date: Thu, 20 Jul 2023 19:12:55 -0700 Subject: [PATCH 026/140] more --- citadel.dme | 2 +- code/_onclick/hud/_screen_object.dm | 2 +- code/_rendering/mob_huds/hands.dm | 62 ---------------- code/_rendering/mob_huds/inventory.dm | 72 +++++++++++++++++++ code/_rendering/mob_huds/mob_hud.dm | 7 +- code/game/objects/items.dm | 25 +++---- code/modules/assembly/mousetrap.dm | 2 +- code/modules/games/cards.dm | 10 +-- code/modules/inventory/inventory.dm | 16 +++++ code/modules/inventory/item/rendering.dm | 2 +- code/modules/mob/inventory.dm | 24 ++++++- code/modules/mob/living/living.dm | 25 ------- .../mob/living/simple_mob/simple_mob_vr.dm | 2 +- .../simple_mob/subtypes/animal/sif/racoon.dm | 2 +- .../simple_mob/subtypes/humanoid/possessed.dm | 1 + .../subtypes/occult/constructs/_construct.dm | 2 +- code/modules/mob/mob_defines.dm | 5 +- 17 files changed, 136 insertions(+), 125 deletions(-) delete mode 100644 code/_rendering/mob_huds/hands.dm create mode 100644 code/_rendering/mob_huds/inventory.dm diff --git a/citadel.dme b/citadel.dme index 447b7af3d184..11a08e07a260 100644 --- a/citadel.dme +++ b/citadel.dme @@ -463,7 +463,7 @@ #include "code\_rendering\atom_huds\other_huds.dm" #include "code\_rendering\clickcatcher\clickcatcher.dm" #include "code\_rendering\fullscreen\fullscreen.dm" -#include "code\_rendering\mob_huds\hands.dm" +#include "code\_rendering\mob_huds\inventory.dm" #include "code\_rendering\mob_huds\mob_hud.dm" #include "code\_rendering\parallax\parallax.dm" #include "code\_rendering\parallax\parallax_holder.dm" diff --git a/code/_onclick/hud/_screen_object.dm b/code/_onclick/hud/_screen_object.dm index b50a5bd76b3a..c2c481b1ee82 100644 --- a/code/_onclick/hud/_screen_object.dm +++ b/code/_onclick/hud/_screen_object.dm @@ -23,7 +23,7 @@ /** * called to resync to a hud_style datum */ -/atom/movable/screen/proc/sync_style(datum/hud_style/style) +/atom/movable/screen/proc/sync_style(datum/hud_style/style, alpha, color) return /atom/movable/screen/text diff --git a/code/_rendering/mob_huds/hands.dm b/code/_rendering/mob_huds/hands.dm deleted file mode 100644 index c1f99ca678f3..000000000000 --- a/code/_rendering/mob_huds/hands.dm +++ /dev/null @@ -1,62 +0,0 @@ -/datum/mob_hud/hands - /// owning inventory - var/datum/inventory/host - /// ordered hand objects - var/list/atom/movable/screen/hand/instance/hands - /// swap hand object - var/atom/movable/screen/hand/swap_hand/swap_hand - /// equip object - var/atom/movable/screen/hand/equip_hand/equip_hand - /// use hand on self object - var/atom/movable/screen/hand/use_self_hand/use_self_hand - - -/atom/movable/screen/hand - name = "inventory" - icon = 'icons/screen/hud/midnight/inventory.dmi' - - /// our owning inventory datum - var/datum/inventory/host - -/atom/movable/screen/hand/Initialize(mapload, datum/inventory/host) - . = ..() - src.host = host - -/atom/movable/screen/hand/sync_style(datum/hud_style/style) - icon = style.inventory_icons - -/** - * handle an inventory operation - * - * @params - * * user - clicking user; not necessarily the inventory's owner - * * slot_or_index - slot ID or numerical hand index - * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. - */ -/atom/movable/screen/hand/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) - -#warn impl all - -/atom/movable/screen/hand/instance - /// target hand index - var/hand_index - -/atom/movable/screen/hand/instance/Initialize(mapload, datum/inventory/host, hand_index) - . = ..() - src.hand_index = hand_index - sync_index(hand_index) - -/atom/movable/screen/hand/instance/proc/sync_index(index = hand_index) - screen_loc = SCREEN_LOC_INV_HAND(index) - var/index_of_side = round(index / 2) - name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" - icon_state = "hand-[index % 2? "left" : "right"]" - -/atom/movable/screen/hand/swap_hand - -/atom/movable/screen/hand/swap_hand/sync_style(datum/hud_style/style) - icon = style.inventory_icons_wide - -/atom/movable/screen/hand/equip_hand - -/atom/movable/screen/hand/use_self_hand diff --git a/code/_rendering/mob_huds/inventory.dm b/code/_rendering/mob_huds/inventory.dm new file mode 100644 index 000000000000..04d4793b1210 --- /dev/null +++ b/code/_rendering/mob_huds/inventory.dm @@ -0,0 +1,72 @@ +/datum/mob_hud/inventory + /// owning inventory + var/datum/inventory/host + /// ordered hand objects + var/list/atom/movable/screen/inventory/hand/hands + /// swap hand object + var/atom/movable/screen/inventory/swap_hand/swap_hand + /// equip object + var/atom/movable/screen/inventory/equip_hand/equip_hand + /// use hand on self object + var/atom/movable/screen/inventory/use_self_hand/use_self_hand + +/datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot_meta/slot_or_index) + +/datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot_meta/slot_or_index) + +#warn impl all + +/atom/movable/screen/inventory + name = "inventory" + icon = 'icons/screen/hud/midnight/inventory.dmi' + + /// our owning mob hud + var/datum/mob_hud/inventory/hud + +/atom/movable/screen/inventory/Initialize(mapload, datum/mob_hud/inventory/hud) + . = ..() + src.hud = hud + sync_style(hud.style) + +/atom/movable/screen/inventory/sync_style(datum/hud_style/style, style_alpha, style_color) + icon = style.inventory_icons + alpha = style_alpha + color = style_color + +/** + * handle an inventory operation + * + * @params + * * user - clicking user; not necessarily the inventory's owner + * * slot_or_index - slot ID or numerical hand index + * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. + */ +/atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) + +#warn impl all + +/atom/movable/screen/inventory/hand + /// target hand index + var/hand_index + +/atom/movable/screen/inventory/hand/Initialize(mapload, datum/inventory/host, hand_index) + . = ..() + src.hand_index = hand_index + sync_index(hand_index) + +/atom/movable/screen/inventory/hand/proc/sync_index(index = hand_index) + screen_loc = SCREEN_LOC_INV_HAND(index) + var/index_of_side = round(index / 2) + name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" + icon_state = "hand-[index % 2? "left" : "right"]" + +/atom/movable/screen/inventory/swap_hand + +/atom/movable/screen/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) + icon = style.inventory_icons_wide + alpha = style_alpha + color = style_color + +/atom/movable/screen/inventory/equip_hand + +/atom/movable/screen/inventory/use_self_hand diff --git a/code/_rendering/mob_huds/mob_hud.dm b/code/_rendering/mob_huds/mob_hud.dm index e4bb588a172a..fe1af586a0c2 100644 --- a/code/_rendering/mob_huds/mob_hud.dm +++ b/code/_rendering/mob_huds/mob_hud.dm @@ -6,8 +6,8 @@ /datum/mob_hud /// mob we're for (aka rendering the state of) var/mob/owner - /// mob that's using us to view - this is often times the owner too - var/mob/user + /// users using us + var/list/mob/using /// desired hud style - set at base of sync_client var/datum/hud_style/style @@ -18,11 +18,12 @@ return list() /datum/mob_hud/proc/sync_client(client/C) - var/requested = C.prefs.ui_style + var/requested = C.prefs.UI_style style = GLOB.hud_styles[all_ui_style_ids[requested]] if(isnull(style)) stack_trace("failed to get style [requested]") style = new /datum/hud_style/midnight + #warn take alpha/etc into account /datum/mob_hud/proc/apply_client(client/C) C.screen += screens() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 438eef2c53e6..33f30b458eeb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -286,36 +286,29 @@ . = "" /obj/item/attack_hand(mob/user, datum/event_args/clickchain/e_args) - attempt_pickup(user) + attempt_pickup(user, e_args) -/obj/item/proc/attempt_pickup(mob/user) +/obj/item/proc/attempt_pickup(mob/user, datum/event_args/clickchain/e_args) if (!user) return if(anchored) user.action_feedback(SPAN_NOTICE("\The [src] won't budge, you can't pick it up!"), src) - return + return FALSE if(!CHECK_MOBILITY(user, MOBILITY_CAN_PICKUP)) user.action_feedback(SPAN_WARNING("You can't do that right now."), src) - return + return FALSE - if (hasorgans(user)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - if (H.hand) - temp = H.organs_by_name["l_hand"] - if(temp && !temp.is_usable()) - to_chat(user, "You try to move your [temp.name], but cannot!") - return - if(!temp) - to_chat(user, "You try to use your hand, but realize it is no longer attached!") - return + var/hand_index = isnull(e_args)? active_hand : e_args.hand_index + if(!user.is_hand_functional(isnull(e_args)? active_hand : e_args.hand_index)) + user.action_feedback(SPAN_WARNING(user.get_hand_fail_message(hand_index)), src) + return FALSE var/old_loc = src.loc throwing?.terminate() - if(user.put_in_active_hand(src)) + if(user.put_in_hand(src, hand_index)) if(isturf(old_loc)) var/obj/effect/temporary_effect/item_pickup_ghost/ghost = new(old_loc) ghost.assumeform(src) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index fd0556e3ae1f..328568a9e66e 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -56,7 +56,7 @@ if((MUTATION_CLUMSY in user.mutations) && prob(50)) var/which_hand = "l_hand" var/mob/living/carbon/human/H = ishuman(user)? user : null - if(!H?.hand) + if(!(H?.active_hand % 2)) which_hand = "r_hand" triggered(user, which_hand) user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 50c6f629155b..d5fa99754f79 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -246,10 +246,7 @@ if(!istype(usr, /mob/living/simple_mob)) if( !usr.get_active_held_item() ) //if active hand is empty var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - - if (H.hand) - temp = H.organs_by_name["l_hand"] + var/obj/item/organ/external/temp = H.get_active_hand_organ() if(temp && !temp.is_usable()) to_chat(user,"You try to move your [temp.name], but cannot!") return @@ -262,10 +259,7 @@ if(!istype(usr, /mob/living/simple_mob)) if( !usr.get_active_held_item() ) //if active hand is empty var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - - if (H.hand) - temp = H.organs_by_name["l_hand"] + var/obj/item/organ/external/temp = H.get_active_hand_organ() if(temp && !temp.is_usable()) to_chat(user,"You try to move your [temp.name], but cannot!") return diff --git a/code/modules/inventory/inventory.dm b/code/modules/inventory/inventory.dm index 48116d7c5031..d5c2da8555dc 100644 --- a/code/modules/inventory/inventory.dm +++ b/code/modules/inventory/inventory.dm @@ -5,6 +5,8 @@ //? basics /// owning mob var/mob/owner + /// hud datum, if any + var/datum/mob_hud/inventory/hud //? slots @@ -19,6 +21,20 @@ owner = null return ..() +/** + * called when an item is added to inventory + */ +/datum/inventory/proc/item_entered(obj/item/item, datum/inventory_slot_meta/slot_or_index) + hud?.add_item(item, slot_or_index) + +/** + * called when an item is removed from inventory + */ +/datum/inventory/proc/item_exited(obj/item/item, datum/inventory_slot_meta/slot_or_index) + hud?.remove_item(item, slot_or_index) + +#warn hook above 2 + /** * returns list() of items with body_cover_flags */ diff --git a/code/modules/inventory/item/rendering.dm b/code/modules/inventory/item/rendering.dm index e1899294b4c4..a66fd84afaf0 100644 --- a/code/modules/inventory/item/rendering.dm +++ b/code/modules/inventory/item/rendering.dm @@ -265,7 +265,7 @@ if(SLOT_ID_HANDCUFFED) M.update_inv_handcuffed() if(SLOT_ID_HANDS) - ASSERT("why did we go here when we should have short-circuited at the held_index check?") + CRASH("why did we go here when we should have short-circuited at the held_index check?") if(SLOT_ID_HEAD) M.update_inv_head() if(SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 890b3c2cb340..931845b7415e 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -61,7 +61,29 @@ //* Hands *// /mob/proc/swap_hand(to_index) - #warn impl + var/obj/item/was_active = length(held_items) <= active_hand? held_items[active_hand] : null + var/old_index = active_hand + + if(isnull(to_index)) + if(active_hand >= length(held_items)) + active_hand = length(held_items)? 1 : null + else + ++active_hand + else + if(to_index > length(held_items)) + return FALSE + active_hand = to_index + + . = TRUE + + inventory?.hud?.swap_active_hand(old_index, active_hand) + + //! LEGACY + // We just swapped hands, so the thing in our inactive hand will notice it's not the focus + if(!isnull(was_active)) + if(was_active.zoom) + was_active.zoom() + //! End /mob/proc/get_active_hand_organ_key() return null diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 08e36a004a58..62288a09e2ec 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -696,31 +696,6 @@ default behaviour is: else // No colors, so remove the client's color. animate(client, color = null, time = 10) -/mob/living/swap_hand() - #warn nuke from orbit - var/obj/item/was_active = length(held_items) <= active_hand? held_items[active_hand] : null - - if(active_hand >= length(held_items)) - active_hand = length(held_items)? 1 : null - else - ++active_hand - - #warn hud elements - if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) - if(hand) //This being 1 means the left hand is in use - hud_used.l_hand_hud_object.icon_state = "l_hand_active" - hud_used.r_hand_hud_object.icon_state = "r_hand_inactive" - else - hud_used.l_hand_hud_object.icon_state = "l_hand_inactive" - hud_used.r_hand_hud_object.icon_state = "r_hand_active" - - //! LEGACY - // We just swapped hands, so the thing in our inactive hand will notice it's not the focus - if(!isnull(was_active)) - if(was_active.zoom) - was_active.zoom() - //! End - /mob/proc/activate_hand(selhand) /mob/living/activate_hand(selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand. diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index 58346b975f1c..2bc7239265cc 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -170,7 +170,7 @@ /mob/living/simple_mob/UnarmedAttack(var/atom/A, var/proximity) . = ..() - if(a_intent == INTENT_GRAB && isliving(A) && !has_hands) + if(a_intent == INTENT_GRAB && isliving(A) && !hand_count) animal_nom(A) /mob/living/simple_mob/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm index 10c2ea79fcdf..6c44eee659bc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm @@ -28,7 +28,7 @@ maxHealth = 50 health = 50 randomized = TRUE - has_hands = TRUE + hand_count = 2 humanoid_hands = TRUE pass_flags = ATOM_PASS_TABLE diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm index 6f86ee2f2e96..6dd8e2db4970 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm @@ -38,6 +38,7 @@ attack_sound = "punch" armor_legacy_mob = list(melee = 30, bullet = 10, laser = 20,energy = 25, bomb = 20, bio = 100, rad = 100) //This should be the same as the base RIG. + hand_count = 2 has_hands = 1 humanoid_hands = 1 diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm index 50e86141e13e..364a92684bdc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm @@ -40,7 +40,7 @@ mob_class = MOB_CLASS_DEMONIC ui_icons = 'icons/mob/screen1_construct.dmi' - has_hands = 1 + hand_count = 2 hand_form = "stone manipulators" response_help = "thinks better of touching" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index b672769c13fd..4e3319504798 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -92,9 +92,8 @@ //? Inventory /// our inventory datum, if any. var/datum/inventory/inventory - /// hand huds - var/list/datum/mob_hud/hand_huds - #warn bad api for remote huds + /// inventory hud used + var/datum/mob_hud/inventory/using_inventory_hud /// held items; indexed list. defaults to null, lazy. /// the length of this is also the abstracted number of hands we should have /// * 1, 3, 5, ... are left From 7fea70f353865dc6b964faaeca2899c0679dfff7 Mon Sep 17 00:00:00 2001 From: silicons Date: Thu, 20 Jul 2023 19:26:57 -0700 Subject: [PATCH 027/140] patches --- citadel.dme | 1 + code/__DEFINES/mobs/hands.dm | 8 +++++ code/game/objects/effects/misc.dm | 9 ----- code/game/objects/items.dm | 5 ++- code/game/objects/structures/extinguisher.dm | 5 ++- code/game/objects/structures/watercloset.dm | 5 ++- code/modules/flufftext/Hallucination.dm | 6 ++-- code/modules/games/cards.dm | 10 ++---- code/modules/inventory/mob/hands.dm | 18 ++++++++++ code/modules/mob/grab.dm | 19 ++++++++++- code/modules/mob/inventory.dm | 13 +++++-- code/modules/mob/living/carbon/human/emote.dm | 2 +- code/modules/mob/living/inventory.dm | 34 ------------------- code/modules/paperwork/paperbin.dm | 5 ++- .../station/station_special_abilities.dm | 6 ++-- 15 files changed, 73 insertions(+), 73 deletions(-) create mode 100644 code/__DEFINES/mobs/hands.dm diff --git a/citadel.dme b/citadel.dme index 11a08e07a260..ffd4969272a3 100644 --- a/citadel.dme +++ b/citadel.dme @@ -221,6 +221,7 @@ #include "code\__DEFINES\mobs\actions.dm" #include "code\__DEFINES\mobs\characteristics.dm" #include "code\__DEFINES\mobs\grab.dm" +#include "code\__DEFINES\mobs\hands.dm" #include "code\__DEFINES\mobs\health.dm" #include "code\__DEFINES\mobs\intent.dm" #include "code\__DEFINES\mobs\mobility.dm" diff --git a/code/__DEFINES/mobs/hands.dm b/code/__DEFINES/mobs/hands.dm new file mode 100644 index 000000000000..ac9f9c21e65d --- /dev/null +++ b/code/__DEFINES/mobs/hands.dm @@ -0,0 +1,8 @@ +//* hand manipulation levels + +/// use keyboards / precision work +#define HAND_MANIPULATION_PRECISE 3 +/// pick up an item roughly +#define HAND_MANIPULATION_GENERAL 2 +/// just hit your hand against something +#define HAND_MANIPULATION_DULL 1 diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index fa98b68a7a2f..c6bfb89c89bd 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -117,15 +117,6 @@ icon_state = "begin" anchored = TRUE -/obj/effect/list_container - name = "list container" - -/obj/effect/list_container/mobl - name = "mobl" - var/master = null - - var/list/container = list( ) - /obj/effect/stop icon_state = "empty" name = "Geas" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 33f30b458eeb..d9424799b4bf 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -301,9 +301,8 @@ return FALSE var/hand_index = isnull(e_args)? active_hand : e_args.hand_index - if(!user.is_hand_functional(isnull(e_args)? active_hand : e_args.hand_index)) - user.action_feedback(SPAN_WARNING(user.get_hand_fail_message(hand_index)), src) - return FALSE + if(!user.standard_hand_usability_check(src, hand_index, HAND_MANIPULATION_GENERAL)) + return var/old_loc = src.loc diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 1b9e65264e67..56c02215312d 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -48,9 +48,8 @@ /obj/structure/extinguisher_cabinet/attack_hand(mob/user, datum/event_args/clickchain/e_args) if(isrobot(user)) return - if(!user.is_hand_functional(e_args.hand_index, TRUE)) - user.action_feedback(SPAN_WARNING(user.get_hand_fail_message(e_args.hand_index)), src) - return TRUE + if(!user.standard_hand_usability_check(src, e_args.hand_index, HAND_MANIPULATION_GENERAL)) + return if(has_extinguisher) user.put_in_hands_or_drop(has_extinguisher) to_chat(user, "You take [has_extinguisher] from [src].") diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 3b4c12ce6cde..f2d04d52ea79 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -387,9 +387,8 @@ thing.update_icon() /obj/structure/sink/attack_hand(mob/user, datum/event_args/clickchain/e_args) - if(!user.is_hand_functional(e_args.hand_index, FALSE)) - user.action_feedback(SPAN_WARNING(user.get_hand_fail_message(e_args.hand_index)), src) - return TRUE + if(!user.standard_hand_usability_check(src, e_args.hand_index, HAND_MANIPULATION_GENERAL)) + return if(isrobot(user) || isAI(user)) return diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 39c3e0bd2433..5ec1b7138906 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -37,9 +37,9 @@ Gunshots/explosions/opening doors/less rare audio (done) //to_chat(src, "Traitor Items") if(!halitem) halitem = new - var/list/slots_free = list(ui_lhand,ui_rhand) - if(l_hand) slots_free -= ui_lhand - if(r_hand) slots_free -= ui_rhand + var/list/slots_free = list() + for(var/i in get_empty_hand_indices()) + slots_free += SCREEN_LOC_INV_HAND(i) if(istype(src,/mob/living/carbon/human)) var/mob/living/carbon/human/H = src if(!H.belt) slots_free += ui_belt diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index d5fa99754f79..0c976945b4ff 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -245,10 +245,7 @@ if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr)))))) if(!istype(usr, /mob/living/simple_mob)) if( !usr.get_active_held_item() ) //if active hand is empty - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.get_active_hand_organ() - if(temp && !temp.is_usable()) - to_chat(user,"You try to move your [temp.name], but cannot!") + if(!user.standard_hand_usability_check(src, user.active_hand, HAND_MANIPULATION_GENERAL)) return to_chat(user,"You pick up [src].") @@ -258,10 +255,7 @@ if((user == usr && (!( usr.restrained() ) && (!( usr.stat ) && (usr.contents.Find(src) || in_range(src, usr)))))) if(!istype(usr, /mob/living/simple_mob)) if( !usr.get_active_held_item() ) //if active hand is empty - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.get_active_hand_organ() - if(temp && !temp.is_usable()) - to_chat(user,"You try to move your [temp.name], but cannot!") + if(!user.standard_hand_usability_check(src, user.active_hand, HAND_MANIPULATION_GENERAL)) return to_chat(user,"You pick up [src].") diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm index 3ab69b2776b3..871a41524d58 100644 --- a/code/modules/inventory/mob/hands.dm +++ b/code/modules/inventory/mob/hands.dm @@ -243,6 +243,24 @@ . = held_items?.Find(I) return .? . : null +/** + * get full indices + */ +/mob/proc/get_full_hand_indices() + . = list() + for(var/i in 1 to length(held_items)) + if(!isnull(held_items[i])) + . += i + +/** + * get empty indices + */ +/mob/proc/get_empty_hand_indices() + . = list() + for(var/i in 1 to length(held_items)) + if(isnull(held_items[i])) + . += i + /** * returns held item in active hand */ diff --git a/code/modules/mob/grab.dm b/code/modules/mob/grab.dm index ded808bc3f42..e013320685f3 100644 --- a/code/modules/mob/grab.dm +++ b/code/modules/mob/grab.dm @@ -7,16 +7,33 @@ for(var/obj/item/grab/G in get_held_items()) .[G.affecting] = G.state + /** - * returns everyone we're grabbing, recursively; this can include ourselves! + * returns everyone we're grabbing, recursively, associated to grab state; this can include ourselves! */ /mob/proc/grabbing_recursive(list/L = list()) RETURN_TYPE(/list) . = L for(var/obj/item/grab/G in get_held_items()) + if(.[G.affecting] >= G.state) + continue .[G.affecting] = max(.[G.affecting], G.state) grabbing_recursive(G.affecting) +/** + * returns everyone we're grabbing, recursively; this can include ourselves! + */ +/mob/proc/grabbing_recursive(list/L = list()) + RETURN_TYPE(/list) + if(src in L) + return + . = L + for(var/obj/item/grab/G in get_held_items()) + if(G.affecting in .) + continue + . |= G.affecting + grabbing_recursive(G.affecting) + /** * check the grab state of us to someone * diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 931845b7415e..3248d6384cef 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -61,6 +61,8 @@ //* Hands *// /mob/proc/swap_hand(to_index) + #warn all of this doesn't properly support multi-user. + var/obj/item/was_active = length(held_items) <= active_hand? held_items[active_hand] : null var/old_index = active_hand @@ -98,7 +100,7 @@ /mob/proc/get_hand_organ(index) return null -/mob/proc/is_hand_functional(index, fine_manipulation) +/mob/proc/is_hand_functional(index, manipulation_level) return TRUE /mob/proc/get_hand_index_of_organ(obj/item/organ/external/organ) @@ -116,9 +118,16 @@ /mob/proc/get_arm_organ(index) return null -/mob/proc/get_hand_fail_message(index) +/mob/proc/get_hand_fail_message(index, manipulation_level) return "You try to move your [get_generalized_hand_name(index)], and should be able to, but can't. Report this to coders!" /mob/proc/get_generalized_hand_name(index) var/number_on_side = round(index / 2) return "[index % 2? "left" : "right"] hand[number_on_side > 1 && " #[number_on_side]"]" + + +//* Hands - Helpers *// + +/mob/proc/standard_hand_usability_check(atom/target, hand_index, manipulation_level) + if(!is_hand_functional(hand_index, manipulation_level)) + action_feedback(SPAN_WARNING(get_hand_fail_message(hand_index, manipulation_level)), target) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index fcc10d4e9bb9..19ae56f272d5 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -806,7 +806,7 @@ if ("handshake") m_type = 1 - if (!src.restrained() && !src.r_hand) + if (!restrained() && !hands_full()) var/mob/living/M = null if (param) for (var/mob/living/A in view(1, null)) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 92dd2ff8911f..ffb5e5919b51 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -71,40 +71,6 @@ //* Misc - Legacy *// -/mob/living/ret_grab(obj/effect/list_container/mobl/L as obj, flag) - if ((!( istype(l_hand, /obj/item/grab) ) && !( istype(r_hand, /obj/item/grab) ))) - if (!( L )) - return null - else - return L.container - else - if (!( L )) - L = new /obj/effect/list_container/mobl( null ) - L.container += src - L.master = src - if (istype(l_hand, /obj/item/grab)) - var/obj/item/grab/G = l_hand - if (!( L.container.Find(G.affecting) )) - L.container += G.affecting - if (G.affecting) - G.affecting.ret_grab(L, 1) - if (istype(r_hand, /obj/item/grab)) - var/obj/item/grab/G = r_hand - if (!( L.container.Find(G.affecting) )) - L.container += G.affecting - if (G.affecting) - G.affecting.ret_grab(L, 1) - if (!( flag )) - if (L.master == src) - var/list/temp = list( ) - temp += L.container - //L = null - qdel(L) - return temp - else - return L.container - return - /mob/living/mode() set name = "Activate Held Object" set category = "Object" diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 4c03b5492e8b..5b836f615cb6 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -25,9 +25,8 @@ to_chat(user, "You pick up the [src].") /obj/item/paper_bin/attack_hand(mob/user, datum/event_args/clickchain/e_args) - if(!user.is_hand_functional(e_args.hand_index)) - user.action_feedback(SPAN_WARNING(user.get_hand_fail_message(e_args.hand_index)), src) - return TRUE + if(!user.standard_hand_usability_check(src, e_args.hand_index, HAND_MANIPULATION_GENERAL)) + return var/response = "" if(!papers.len) diff --git a/code/modules/species/station/station_special_abilities.dm b/code/modules/species/station/station_special_abilities.dm index 361667122515..ac7a3a893598 100644 --- a/code/modules/species/station/station_special_abilities.dm +++ b/code/modules/species/station/station_special_abilities.dm @@ -161,9 +161,9 @@ //to_chat(src, "Traitor Items") if(!halitem) halitem = new - var/list/slots_free = list(ui_lhand,ui_rhand) - if(get_left_held_item()) slots_free -= ui_lhand - if(get_right_held_item()) slots_free -= ui_rhand + var/list/slots_free = list() + for(var/i in get_empty_hand_indices()) + slots_free += SCREEN_LOC_INV_HAND(i) if(istype(src,/mob/living/carbon/human)) var/mob/living/carbon/human/H = src if(!H.belt) slots_free += ui_belt From 9f8144e6630c3970b30b0f8bc552ac3d7294c7f7 Mon Sep 17 00:00:00 2001 From: silicons Date: Thu, 20 Jul 2023 19:31:07 -0700 Subject: [PATCH 028/140] fixes --- code/game/turfs/simulated/wall_attacks.dm | 13 ++++++------- code/modules/mob/grab.dm | 7 ++++--- .../mob/living/carbon/human/human_attackhand.dm | 10 ++-------- code/modules/mob/movement.dm | 2 +- 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 68e8d951b1ad..cf2ab3e002d0 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -107,6 +107,9 @@ return 0 /turf/simulated/wall/attack_hand(mob/user, datum/event_args/clickchain/e_args) + . = ..() + if(.) + return radiate() add_fingerprint(user) @@ -128,19 +131,15 @@ if(INTENT_HARM) //since only humans have organs_by_name but carbons still have intents this check only applies to humans //it's hacky but it works - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/organ/external/E = H.organs_by_name[M.hand % 2? BP_L_HAND : BP_R_HAND] - if (!(E.is_usable())) - to_chat(user, SPAN_WARNING("You can't use that hand.")) - return + if(!user.standard_hand_usability_check(src, e_args.hand_index, HAND_MANIPULATION_DULL)) + return if(rotting && !reinf_material) M.visible_message(SPAN_DANGER("[M.name] punches \the [src] and it crumbles!"), SPAN_DANGER("You punch \the [src] and it crumbles!")) dismantle_wall() playsound(src, get_sfx("punch"), 20) else M.visible_message(SPAN_DANGER("[M.name] punches \the [src]!"), SPAN_DANGER("You punch \the [src]!")) - M.apply_damage(3, BRUTE, M.hand % 2? BP_L_HAND : BP_R_HAND) + M.apply_damage(3, BRUTE, e_args.hand_index? BP_L_HAND : BP_R_HAND) playsound(src, get_sfx("punch"), 20) else diff --git a/code/modules/mob/grab.dm b/code/modules/mob/grab.dm index e013320685f3..b37efd808060 100644 --- a/code/modules/mob/grab.dm +++ b/code/modules/mob/grab.dm @@ -23,7 +23,7 @@ /** * returns everyone we're grabbing, recursively; this can include ourselves! */ -/mob/proc/grabbing_recursive(list/L = list()) +/mob/proc/grabbing_recursive_flat(list/L = list()) RETURN_TYPE(/list) if(src in L) return @@ -61,10 +61,11 @@ /** * are we being grabbed * - * @return TRUE / FALSE + * @return null, or highest state */ /mob/proc/is_grabbed() - return length(grabbed_by) + for(var/mob/M as anything in grabbed_by) + . = max(., M.check_grab(src)) /** * are we being grabbed by someone diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 3a84bd7ff392..ce409b2a9b2c 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -318,14 +318,8 @@ //Used to attack a joint through grabbing /mob/living/carbon/human/proc/grab_joint(var/mob/living/user, var/def_zone) - var/has_grab = 0 - for(var/obj/item/grab/G in list(user.l_hand, user.r_hand)) - if(G.affecting == src && G.state == GRAB_NECK) - has_grab = 1 - break - - if(!has_grab) - return FALSE + if(user.check_grab(src) < GRAB_NECK) + return if(!def_zone) def_zone = user.zone_sel.selecting var/target_zone = check_zone(def_zone) diff --git a/code/modules/mob/movement.dm b/code/modules/mob/movement.dm index a1d8a8784a62..603ee89367d0 100644 --- a/code/modules/mob/movement.dm +++ b/code/modules/mob/movement.dm @@ -293,7 +293,7 @@ //Something with pulling things if(locate(/obj/item/grab, mob)) add_delay_grab = 7 - var/list/grabbed = mob.ret_grab() + var/list/grabbed = mob.grabbing_recursive_flat() if(grabbed) if(grabbed.len == 2) grabbed -= mob From 82ed7a1c53347029df5174d0fdfb9b5c54ef8142 Mon Sep 17 00:00:00 2001 From: silicons Date: Thu, 20 Jul 2023 20:35:14 -0700 Subject: [PATCH 029/140] icons --- icons/screen/hud/hologram/inventory.dmi | Bin 182 -> 862 bytes icons/screen/hud/midnight/inventory.dmi | Bin 182 -> 1934 bytes icons/screen/hud/minimalist/inventory.dmi | Bin 182 -> 930 bytes icons/screen/hud/old/inventory.dmi | Bin 0 -> 1179 bytes icons/screen/hud/orange/inventory.dmi | Bin 182 -> 2713 bytes icons/screen/hud/white/inventory.dmi | Bin 182 -> 1028 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/screen/hud/old/inventory.dmi diff --git a/icons/screen/hud/hologram/inventory.dmi b/icons/screen/hud/hologram/inventory.dmi index cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f..a499ba49e7690498cf7dff8f4879328755e35d33 100644 GIT binary patch delta 858 zcmV-g1Eu`70p12BiBL{Q4GJ0x0000DNk~Le0000$0000$2nGNE0IF$m-T(jqh><}P zf0c_n4#F@H1#9mqo{~Cn0oYMpf`loMd^U_onrt1e*%$7L_t(|ob6h>QsY1nY_6P;68ch7qN{RF z1o8cZzkjJ4MdIG4)nn#D2`2cJhI{9So{lUSqx0PqgrpCQ>be}JC@ ze>-|CF#!k`#McJ*07i`EN9G4lY&%7$;?4;G0IRT_st85oUIE}U@zvOYOofZ@0VM%W z9mN`!dj(dB{Tfj9e#d@XU-x~#Ow9(vEN~sJr6F+W2%w6&MGv4PxCmdSyT-|@Q7VEO zJVcIlqMhvt70GM3s&I?|6wD(0f8B}mM+KJPyJhVg3%(%&$ixXeAPUq<1WH~e9gCxi zvsQqI2;p}Dk4r5=O%deD%kC}_ds4@ubWe(Dfq1QmLMs3zzXPz1kfwsMgobMy+G-Ir z0`TPD!u|~og^&Tg!L|r?;hrfGwjrhkyG|v7wg>R!sTYtC64uERNCXK=f1E%4oLC3Y z6hTTx_5!dr(7rfQ52Vq7M7U-9#RpMS1XIa(;+nC+IpnKR_4EP#FesHwCEr>Auo(C} zLH!!m%md^NJH@^=I_wME&WeA?OfW?-X5ypqpZoWKB62;z>Wl7BG~tg4F!UR~6`Jx( z0cuxotkImG3!q)M8w->0e_vht^0Q;r@WuxOjiSe}}*?g_I~?djJ3c07*qoM6N<$f?3CmBLDyZ literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf diff --git a/icons/screen/hud/midnight/inventory.dmi b/icons/screen/hud/midnight/inventory.dmi index cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f..00f6bc7c377fd3afa25176788bfd70e83c6804e0 100644 GIT binary patch literal 1934 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 UXhOw9f&c&j07*qoM6N<$f?i{m^#A|> literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf diff --git a/icons/screen/hud/minimalist/inventory.dmi b/icons/screen/hud/minimalist/inventory.dmi index cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f..79b599a95c49026160ac76741dd20630036e17c4 100644 GIT binary patch delta 926 zcmV;P17ZBO0ip*biBL{Q4GJ0x0000DNk~Le0000$0000$2nGNE0IF$m-T(jqiIG7Q ze~pYg3d1lE1#9go9(L`JU#lkA1QqrjM6}i}Bo0W6bNv*qQpMdom^UqM!#zys$3QEW zs_z9J*Ta$AN0SLWE@yJWn#HzJEgHk4k+`I;XclY8B`p;mCvtO%FW&f9ee%51ESkl- z_%L00fBVm&#W3~g$3S0<9!2RF6ahK_e*gm1Nkl6 z$|t3YSPM&GEhtr_E2T+i(PRPX*n&HBiaYQ z07%o+3;FBy0^j^cJV}z|>5`mto{8ta_#>C3--wX_Wm#VE@L`Z`%=sZ50aaC9f2*px zZbbwYc0UD$;3m+MhGVvQG?i&9ztn>% zu>k0JQ54eqgb?c@$ec$mw4<);e?>wV3D9+2Hs!c)h(ef%puG_KX6Ho|Me!$4&Ou86 zbiQp{XxnzVbt?nyGZA4{0MU8I7!X2~Lf~^YgJ2XzPsW&%vu#@-gaAILD}vStK&OU6 zi1!h;o$n2Oiy-41I<69H)UGZurSy*wXhdDtAR6Whj4`O|x_4A`{QVWuf9eRM-Qdvq zwR&3@!>NHH7`0(SgqU*PMSvV~$l`-Z#~AMgFt7{>OxNg3_5v!7DZA$QjaPzG1TLn6 zieoAN?*9k{0elQMK47;Pe{F`u^bzI=Ip@|=WJ!`J^NzN;%Cfwua-GuMAijVvpH3$$ z20b1Rt>I0S-0ubs0z7C;2aNvzl9}wyTLVZA} z4+!-ECT*AyA+}T>puG;j24xG5D2kqVeQjVz4EdL?2t$3qa&xwU-3u@|1x)|p*@i2A zsQ|ivZ`XoL{*eH4|Lxa?YyMCl01)Z}c3mIv3slbEo$T&xCjbBd07*qoM6N<$f=Rum A3IG5A literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf diff --git a/icons/screen/hud/old/inventory.dmi b/icons/screen/hud/old/inventory.dmi new file mode 100644 index 0000000000000000000000000000000000000000..39b0a729817b019c06fa71bccf2ceabb55f96bb7 GIT binary patch literal 1179 zcmV;M1Z4Y(P)V=-0C=30j5`X$Fc1Z6?I|91?T}xqCddR8_8mmDvKAa0q{X>@3RkI;bn{@| zw7B(mKf(>3HZE1x1s2!Ck<3e?W>{R#WHQT?bstrOGAx=Lme|dlv>_9vR9KwIq!OOI z^QT#4%0H?zC+)&RW#d2EUmh*`(ZLO#-hK#0>Hel7@c;k=%}GQ-RCt{2TDxi^F%-QT zTqJQ}Fr-N8Kq?o;0YiRZD>vJu$TzrfwOb|FRZ^w!H*Ar{&HTf%Qw%Or1(q%Cg@D0@ zldy%f#f--DkZfsuC5=fA7-DHg=boc0O+2~;E{4CrHrP!U0077+5Pr9aS|$M3upI{( z1+{#G6=IoC2mEUTIQiFaX2~b_5m(*>NBr3g;N%CdX2{=|ukVa*j2}J&>=3a+>f$Hu7s;D=MnYCIdo2F;Lj%28aWARQrXrI!gc}W3&Pn%uUxYP}(H@jzTfJSQ9 zn9e+)^Vk$yM#RE99o|4Q-3<@mtgUW>ngIgw01!EU8vPxH7L2GjyKCV^ENK+upT8dD zjgdk5DG&`RN2e3difEZ&V2gN;rJC*p=#N1oCdA^WGY_USdB_c~n5El*Y5)%q)r6FI zI;YS+r5lal*QqW=H3L?QfX?Yg(&;SPjrnz$CU8-CBhvjGI^qFzG9WfVM4A`A$t-Qe zyxxhIF@nbshOy|9C>Y2o%S6C z62bmpV)kLR2w=4cgefm;SAh0!0XnA;&Y>Vs){YL@_$7Ju3_vEY0;>B$#1cLYD73sE znPXEK+cJN4518CX@6AmHAv+Ur#J@Ix-E@JBf{g)UL3A|ch`%Q5Z~_PX8{rvZ3 zZy#g3g22U)*(PNVw-NbZDEw{{wR8ZkVLJ{o7-shXTQeXN>ViKpAW6r^7o+6l>KMpi zSTMmAe~GJ&9$$c59Sgf%@E89RL?$P_C%v%`&w=!wk`F2b{FVJJ!2A|4 zzlCo?4wXF{1_X};TH&(u1%Ya?U zFu`LH)dvv2uN;@M0mScvs6K!PV#^55x2--v)dVF2MB)Lm^#L}FAbuYzUmqY^CK%Wz zo}&`=0oW#R@q1MtfMr5jyiR?9>QYoPfc3^3kGy5|0azyJ)(7b9L&_PzO%RcqtPkM4 zds!cV{X`Je2kgqR(=_FmhN=1hQTB<%JE;#4?GGkqpY_JTdShYA%i2{?x;`K;P}YtO z+4yC7wG6-}uL3IjLc|t64Jfp{J)2`w8QU^{_GIYlIC?j4FbLV1fGhsQ0QPVTWH8(q tAQnVNW3KpXvJMw;!O!ahtP@uS{{gU2zp=V7g2n&<002ovPDHLkV1gLL8>avO literal 0 HcmV?d00001 diff --git a/icons/screen/hud/orange/inventory.dmi b/icons/screen/hud/orange/inventory.dmi index cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f..9030ee3dfb9c4579611de69e6696e37203e41876 100644 GIT binary patch literal 2713 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 T{{c_U00000NkvXXu0mjf=|~)! literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf diff --git a/icons/screen/hud/white/inventory.dmi b/icons/screen/hud/white/inventory.dmi index cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f..fa3d324eb20fe749d35fc35971408202412bb9d9 100644 GIT binary patch delta 980 zcmV;_11tQt0fY#DiBL{Q4GJ0x0000DNk~Le0000$0000$2m=5B0G+pi>;M1&T2M?> zMZmzoPEJlaIXQ80aY#r=V`F1&ZEe55zjk(ZSXfxY!^3=he0_a=W@ct;YHCA6L!zRh zr>Cc+q@=gEx2meDg@uK=xw%$WRY=A3Y*keU1VU*0zEuaEAdq@ka&##If?9RAW)5uUMc)(DaB6YMxOJz9;Jy{03Q}Ht z0#VBCeJW61qB+q0DkEwI0fEwp>kz$$XcdH<5pK7}e^3Q+*%Mr7iqKfi0Whmj!PSsN zvcblYPLy&W$ygn+lOmV{*;$0kr;0u>N2sNcw{huL9!_W&-aFe}LCkRb2}OdoLmU`N3E zgP;#Qe-O=q?++LP&L8Ynf%OLg!Ril;mN9|tg3TW=1e`zEcVa#H1F#8?#9oNw-7_)r zG6(T)^x|^_$@_mfkuv&pu_OnWFP5DCiL32D`-49b*0KxULt-!h0000ERLtq!mDzkr_yOZh5gCNHGWagt!9fZ(w8ic$+`hyY`+nP=d$P#W93qW^#hW9UyN31LIR^ R|8+nXgQu&X%Q~loCIBE@AB_M2 From 27d4fc0a6eaada79d480b1ac3e82380496cf5a20 Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 21 Jul 2023 20:46:22 -0700 Subject: [PATCH 030/140] licenses --- citadel.dme | 1 + code/game/rendering/client.dm | 3 + code/game/rendering/hud_style.dm | 3 + code/game/rendering/mob.dm | 3 + code/game/rendering/mob_huds/inventory.dm | 3 + code/game/rendering/mob_huds/mob_hud.dm | 3 + code/game/rendering/parallax/parallax.dm | 3 + .../rendering/parallax/parallax_holder.dm | 3 + .../rendering/parallax/parallax_object.dm | 2 + code/game/rendering/parallax/types/space.dm | 12 - code/game/rendering/perspectives/darksight.dm | 3 + .../rendering/perspectives/perspective.dm | 3 + code/game/rendering/perspectives/vision.dm | 3 + .../rendering/plane_masters/plane_holder.dm | 3 + .../rendering/plane_masters/plane_master.dm | 3 + .../rendering/plane_masters/plane_render.dm | 3 + code/game/rendering/screen.dm | 527 +----------------- code/game/rendering/screen_legacy.dm | 526 +++++++++++++++++ 18 files changed, 570 insertions(+), 537 deletions(-) create mode 100644 code/game/rendering/screen_legacy.dm diff --git a/citadel.dme b/citadel.dme index f1b8d4f3abe6..d63ee68d8b36 100644 --- a/citadel.dme +++ b/citadel.dme @@ -1850,6 +1850,7 @@ #include "code\game\rendering\hud_style.dm" #include "code\game\rendering\mob.dm" #include "code\game\rendering\screen.dm" +#include "code\game\rendering\screen_legacy.dm" #include "code\game\rendering\atom_huds\alternate_appearance.dm" #include "code\game\rendering\atom_huds\atom_hud.dm" #include "code\game\rendering\atom_huds\data_huds.dm" diff --git a/code/game/rendering/client.dm b/code/game/rendering/client.dm index 6891410a47ad..0c0992b6a33f 100644 --- a/code/game/rendering/client.dm +++ b/code/game/rendering/client.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + //? clickcatcher /** diff --git a/code/game/rendering/hud_style.dm b/code/game/rendering/hud_style.dm index 5e9646b3e3ac..c073973070dc 100644 --- a/code/game/rendering/hud_style.dm +++ b/code/game/rendering/hud_style.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) /proc/init_hud_styles() diff --git a/code/game/rendering/mob.dm b/code/game/rendering/mob.dm index 7a82238544b7..330437dc91e7 100644 --- a/code/game/rendering/mob.dm +++ b/code/game/rendering/mob.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + // todo: rendering handling/init/destruction should be on mob and client // mob side should handle mob state // client side should handle apply/remove/switch. diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index 04d4793b1210..e4b6962611f9 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /datum/mob_hud/inventory /// owning inventory var/datum/inventory/host diff --git a/code/game/rendering/mob_huds/mob_hud.dm b/code/game/rendering/mob_huds/mob_hud.dm index fe1af586a0c2..8df18f91b3da 100644 --- a/code/game/rendering/mob_huds/mob_hud.dm +++ b/code/game/rendering/mob_huds/mob_hud.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * owned by one mob as the user, and one mob as the owner * diff --git a/code/game/rendering/parallax/parallax.dm b/code/game/rendering/parallax/parallax.dm index dbd27ae762e0..ef6e047170c7 100644 --- a/code/game/rendering/parallax/parallax.dm +++ b/code/game/rendering/parallax/parallax.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * Holds parallax information. */ diff --git a/code/game/rendering/parallax/parallax_holder.dm b/code/game/rendering/parallax/parallax_holder.dm index e018f065419c..b605e5f9824a 100644 --- a/code/game/rendering/parallax/parallax_holder.dm +++ b/code/game/rendering/parallax/parallax_holder.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * # Parallax holders * diff --git a/code/game/rendering/parallax/parallax_object.dm b/code/game/rendering/parallax/parallax_object.dm index 813d7d121249..e870a14dc0c9 100644 --- a/code/game/rendering/parallax/parallax_object.dm +++ b/code/game/rendering/parallax/parallax_object.dm @@ -1,3 +1,5 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// /atom/movable/screen/parallax_layer icon = 'icons/screen/parallax/parallax.dmi' diff --git a/code/game/rendering/parallax/types/space.dm b/code/game/rendering/parallax/types/space.dm index 767890f71b6a..fd4518033678 100644 --- a/code/game/rendering/parallax/types/space.dm +++ b/code/game/rendering/parallax/types/space.dm @@ -35,15 +35,3 @@ /atom/movable/screen/parallax_layer/space/random/asteroids icon_state = "asteroids" - -// /atom/movable/screen/parallax_layer/space/planet -// icon_state = "planet" -// blend_mode = BLEND_OVERLAY -// absolute = TRUE //Status of seperation -// speed = 3 -// layer = 30 -// dynamic_self_tile = FALSE - -// /atom/movable/screen/parallax_layer/space/planet/ShouldSee(client/C, atom/location) -// var/turf/T = get_turf(location) -// return ..() && T && is_station_level(T.z) diff --git a/code/game/rendering/perspectives/darksight.dm b/code/game/rendering/perspectives/darksight.dm index cbaa62e51553..0bfb15002d4c 100644 --- a/code/game/rendering/perspectives/darksight.dm +++ b/code/game/rendering/perspectives/darksight.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /atom/movable/screen/darksight_fov icon = SOFT_DARKSIGHT_15X15_ICON icon_state = "full-square" diff --git a/code/game/rendering/perspectives/perspective.dm b/code/game/rendering/perspectives/perspective.dm index f4c1274e8752..11ca3a532eda 100644 --- a/code/game/rendering/perspectives/perspective.dm +++ b/code/game/rendering/perspectives/perspective.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * MOB PERRSPECTIVE SYSTEM * diff --git a/code/game/rendering/perspectives/vision.dm b/code/game/rendering/perspectives/vision.dm index 88392753ec4d..ecdf2a095f56 100644 --- a/code/game/rendering/perspectives/vision.dm +++ b/code/game/rendering/perspectives/vision.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + GLOBAL_LIST_EMPTY(cached_vision_holders) /proc/cached_vision_holder(datum/vision/path_or_instance) diff --git a/code/game/rendering/plane_masters/plane_holder.dm b/code/game/rendering/plane_masters/plane_holder.dm index eb34d3c92fdf..af7ae5a564ae 100644 --- a/code/game/rendering/plane_masters/plane_holder.dm +++ b/code/game/rendering/plane_masters/plane_holder.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /datum/plane_holder /// plane masters by type var/list/masters diff --git a/code/game/rendering/plane_masters/plane_master.dm b/code/game/rendering/plane_masters/plane_master.dm index 93acb24cf66d..f97de16a0b0f 100644 --- a/code/game/rendering/plane_masters/plane_master.dm +++ b/code/game/rendering/plane_masters/plane_master.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /atom/movable/screen/plane_master icon = null icon_state = null diff --git a/code/game/rendering/plane_masters/plane_render.dm b/code/game/rendering/plane_masters/plane_render.dm index 6cc1ca351c09..68d021eea30c 100644 --- a/code/game/rendering/plane_masters/plane_render.dm +++ b/code/game/rendering/plane_masters/plane_render.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * lazy man's render plates, used for specific usecases. */ diff --git a/code/game/rendering/screen.dm b/code/game/rendering/screen.dm index c2c481b1ee82..b04003ea4831 100644 --- a/code/game/rendering/screen.dm +++ b/code/game/rendering/screen.dm @@ -1,535 +1,12 @@ -/* - Screen objects - Todo: improve/re-implement +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// - Screen objects are only used for the hud and should not appear anywhere "in-game". - They are used with the client/screen list and the screen_loc var. - For more information, see the byond documentation on the screen_loc and screen vars. -*/ /atom/movable/screen - name = "" - icon = 'icons/mob/screen1.dmi' appearance_flags = PIXEL_SCALE | NO_CLIENT_COLOR - layer = HUD_LAYER_BASE - plane = HUD_PLANE atom_colouration_system = FALSE - var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - var/datum/hud/hud = null // A reference to the owner HUD, if any. - -/atom/movable/screen/Destroy() - master = null - return ..() /** * called to resync to a hud_style datum */ /atom/movable/screen/proc/sync_style(datum/hud_style/style, alpha, color) return - -/atom/movable/screen/text - icon = null - icon_state = null - mouse_opacity = 0 - screen_loc = "CENTER-7,CENTER-7" - maptext_height = 480 - maptext_width = 480 - -/atom/movable/screen/close - name = "close" - -/atom/movable/screen/close/Click() - if(master) - if(istype(master, /obj/item/storage)) - var/obj/item/storage/S = master - S.close(usr) - return 1 - - -/atom/movable/screen/item_action - var/obj/item/owner - -/atom/movable/screen/item_action/Destroy() - . = ..() - owner = null - -/atom/movable/screen/item_action/Click() - if(!usr || !owner) - return 1 - if(!usr.canClick()) - return - - if(usr.stat || usr.restrained() || !CHECK_MOBILITY(usr, MOBILITY_CAN_USE)) - return 1 - - if(!(owner in usr)) - return 1 - - owner.ui_action_click() - return 1 - -/atom/movable/screen/grab - name = "grab" - -/atom/movable/screen/grab/Click() - var/obj/item/grab/G = master - G.s_click(src) - return 1 - -/atom/movable/screen/grab/attack_hand(mob/user, datum/event_args/clickchain/e_args) - return - -/atom/movable/screen/grab/attackby() - return - - -/atom/movable/screen/storage - name = "storage" - -/atom/movable/screen/storage/Click() - if(!usr.canClick()) - return 1 - if(!CHECK_MOBILITY(usr, MOBILITY_CAN_STORAGE)) - return 1 - if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech - return 1 - if(master) - var/obj/item/I = usr.get_active_held_item() - if(I) - usr.ClickOn(master) - return 1 - -/atom/movable/screen/zone_sel - name = "damage zone" - icon_state = "zone_sel" - screen_loc = ui_zonesel - var/selecting = BP_TORSO - -/atom/movable/screen/zone_sel/Click(location, control,params) - var/list/PL = params2list(params) - var/icon_x = text2num(PL["icon-x"]) - var/icon_y = text2num(PL["icon-y"]) - var/old_selecting = selecting //We're only going to update_icon() if there's been a change - - switch(icon_y) - if(1 to 3) //Feet - switch(icon_x) - if(10 to 15) - selecting = BP_R_FOOT - if(17 to 22) - selecting = BP_L_FOOT - else - return 1 - if(4 to 9) //Legs - switch(icon_x) - if(10 to 15) - selecting = BP_R_LEG - if(17 to 22) - selecting = BP_L_LEG - else - return 1 - if(10 to 13) //Hands and groin - switch(icon_x) - if(8 to 11) - selecting = BP_R_HAND - if(12 to 20) - selecting = BP_GROIN - if(21 to 24) - selecting = BP_L_HAND - else - return 1 - if(14 to 22) //Chest and arms to shoulders - switch(icon_x) - if(8 to 11) - selecting = BP_R_ARM - if(12 to 20) - selecting = BP_TORSO - if(21 to 24) - selecting = BP_L_ARM - else - return 1 - if(23 to 30) //Head, but we need to check for eye or mouth - if(icon_x in 12 to 20) - selecting = BP_HEAD - switch(icon_y) - if(23 to 24) - if(icon_x in 15 to 17) - selecting = O_MOUTH - if(26) //Eyeline, eyes are on 15 and 17 - if(icon_x in 14 to 18) - selecting = O_EYES - if(25 to 27) - if(icon_x in 15 to 17) - selecting = O_EYES - - if(old_selecting != selecting) - update_icon() - return 1 - -/atom/movable/screen/zone_sel/proc/set_selected_zone(bodypart) - var/old_selecting = selecting - selecting = bodypart - if(old_selecting != selecting) - update_icon() - -/atom/movable/screen/zone_sel/update_icon() - cut_overlays() - add_overlay(image('icons/mob/zone_sel.dmi', "[selecting]")) - -/// The UI Button to open the TGUI Crafting Menu -/atom/movable/screen/craft - name = "crafting menu" - icon = 'icons/mob/screen/midnight.dmi' - icon_state = "craft" - screen_loc = ui_smallquad - -/atom/movable/screen/craft/Click(location, control, params) - var/datum/component/personal_crafting/C = usr.GetComponent(/datum/component/personal_crafting) - C?.ui_interact(usr) - -/atom/movable/screen/Click(location, control, params) - ..() //Why the FUCK was this not called before - if(!usr) - return TRUE - switch(name) - if("toggle") - if(usr.hud_used.inventory_shown) - usr.hud_used.inventory_shown = 0 - usr.client.screen -= usr.hud_used.other - else - usr.hud_used.inventory_shown = 1 - usr.client.screen += usr.hud_used.other - - usr.hud_used.hidden_inventory_update() - - if("equip") - if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech - return 1 - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - H.quick_equip() - - if("resist") - if(isliving(usr)) - var/mob/living/L = usr - L.resist() - - if("mov_intent") - // todo: reworks - if(isliving(usr)) - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(C.legcuffed) - to_chat(C, "You are legcuffed! You cannot run until you get [C.legcuffed] removed!") - C.m_intent = "walk" //Just incase - C.hud_used.move_intent.icon_state = "walking" - return 1 - var/mob/living/L = usr - L.toggle_move_intent() - if("m_intent") - if(!usr.m_int) - switch(usr.m_intent) - if("run") - usr.m_int = "13,14" - if("walk") - usr.m_int = "14,14" - if("face") - usr.m_int = "15,14" - else - usr.m_int = null - if("walk") - usr.m_intent = "walk" - usr.m_int = "14,14" - if("face") - usr.m_intent = "face" - usr.m_int = "15,14" - if("run") - usr.m_intent = "run" - usr.m_int = "13,14" - if("Reset Machine") - usr.unset_machine() - if("internal") - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(CHECK_MOBILITY(C, MOBILITY_CAN_USE)) - if(C.internal) - C.internal = null - to_chat(C, "No longer running on internals.") - if(C.internals) - C.internals.icon_state = "internal0" - else - - var/no_mask - if(!(C.wear_mask && C.wear_mask.clothing_flags & ALLOWINTERNALS)) - var/mob/living/carbon/human/H = C - if(!(H.head && H.head.clothing_flags & ALLOWINTERNALS)) - no_mask = 1 - - if(no_mask) - to_chat(C, "You are not wearing a suitable mask or helmet.") - return 1 - else - // groan. lazy time. - // location name - var/list/locnames = list() - // tank ref, can include nulls! FIRST VALID TANK FROM THIS IS CHOSEN. - var/list/tanks = list() - // first, hand - locnames += "in your hand" - tanks += C.get_active_held_item() - // yes, the above can result in duplicates. - // snowflake rig handling, second highest priority - if(istype(C.back, /obj/item/hardsuit)) - var/obj/item/hardsuit/R = C.back - if(R.air_supply && R?.is_activated()) - locnames += "in your hardsuit" - tanks += R.air_supply - // now, slots - if(ishuman(C)) - var/mob/living/carbon/human/H = C - // suit storage - locnames += "on your suit" - tanks += H.s_store - // hands - for(var/obj/item/tank/tank as anything in H.get_held_items_of_type(/obj/item/tank)) - locnames += "in your [tank.held_index % 2? "right" : "left"] hand" - tanks += tank - // pockets - locnames += "in your left pocket" - tanks += H.l_store - locnames += "in your right pocket" - tanks += H.r_store - // belt - locnames += "on your belt" - tanks += H.belt - // back - locnames += "on your back" - tanks += H.back - else - // back - locnames += "on your back" - tanks += C.back - // no more hugbox and stupid "smart" checks. take the first one we can find and use it. they can use active hand to override if needed. - for(var/index = 1 to length(tanks)) - if(!istype(tanks[index], /obj/item/tank)) - continue - C.internal = tanks[index] - to_chat(C, "You are now running on internals from [tanks[index]] on your [locnames[index]]") - if(C.internals) - C.internals.icon_state = "internal1" - return - to_chat(C, "You don't have an internals tank.") - return - if("act_intent") - usr.a_intent_change(INTENT_HOTKEY_RIGHT) - if(INTENT_HELP) - usr.a_intent = INTENT_HELP - usr.hud_used.action_intent.icon_state = "intent_help" - if(INTENT_HARM) - usr.a_intent = INTENT_HARM - usr.hud_used.action_intent.icon_state = "intent_harm" - if(INTENT_GRAB) - usr.a_intent = INTENT_GRAB - usr.hud_used.action_intent.icon_state = "intent_grab" - if(INTENT_DISARM) - usr.a_intent = INTENT_DISARM - usr.hud_used.action_intent.icon_state = "intent_disarm" - - if("pull") - usr.stop_pulling() - if("drop") - if(usr.client) - usr.client.drop_item() - - if("module") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr -// if(R.module) -// R.hud_used.toggle_show_robot_modules() -// return 1 - R.pick_module() - - if("inventory") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - if(R.module) - R.hud_used.toggle_show_robot_modules() - return 1 - else - to_chat(R, "You haven't selected a module yet.") - - if("radio") - if(issilicon(usr)) - usr:radio_menu() - if("panel") - if(issilicon(usr)) - usr:installed_modules() - - if("store") - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - if(R.module) - R.uneq_active() - R.hud_used.update_robot_modules_display() - else - to_chat(R, "You haven't selected a module yet.") - - if("module1") - if(istype(usr, /mob/living/silicon/robot)) - usr:toggle_module(1) - - if("module2") - if(istype(usr, /mob/living/silicon/robot)) - usr:toggle_module(2) - - if("module3") - if(istype(usr, /mob/living/silicon/robot)) - usr:toggle_module(3) - - if("AI Core") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.view_core() - - if("Show Camera List") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - var/camera = input(AI) in AI.get_camera_list() - AI.ai_camera_list(camera) - - if("Track With Camera") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - var/target_name = input(AI) in AI.trackable_mobs() - AI.ai_camera_track(target_name) - - if("Toggle Camera Light") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.toggle_camera_light() - - if("Crew Monitoring") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.subsystem_crew_monitor() - - if("Show Crew Manifest") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.ai_roster() - - if("Show Alerts") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.subsystem_alarm_monitor() - - if("Announcement") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.ai_announcement() - - if("Call Emergency Shuttle") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.ai_call_shuttle() - - if("State Laws") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.ai_checklaws() - - if("PDA - Send Message") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.aiPDA.cmd_send_pdamesg(usr) - - if("PDA - Show Message Log") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.aiPDA.cmd_show_message_log(usr) - - if("Take Image") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.take_image() - - if("View Images") - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - AI.view_images() - else - return attempt_vr(src,"Click_vr",list(location,control,params)) - return 1 - -//! ## VR FILE MERGE ## !// - -/atom/movable/screen/proc/Click_vr(location, control, params) - if(!usr) return 1 - switch(name) - - //Shadekin - if("darkness") - var/turf/T = get_turf(usr) - var/darkness = round(1 - T.get_lumcount(),0.1) - to_chat(usr,"Darkness: [darkness]") - if("energy") - var/mob/living/simple_mob/shadekin/SK = usr - if(istype(SK)) - to_chat(usr,"Energy: [SK.energy] ([SK.dark_gains])") - var/mob/living/carbon/human/H = usr - if(istype(H) && istype(H.species, /datum/species/shadekin)) - to_chat(usr,"Energy: [H.shadekin_get_energy(H)]") - - if("danger level") - var/mob/living/carbon/human/H = usr - if(istype(H) && istype(H.species, /datum/species/shapeshifter/xenochimera)) - if(H.feral > 50) - to_chat(usr, "You are currently completely feral.") - else if(H.feral > 10) - to_chat(usr, "You are currently crazed and confused.") - else if(H.feral > 0) - to_chat(usr, "You are currently acting on instinct.") - else - to_chat(usr, "You are currently calm and collected.") - if(H.feral > 0) - var/feral_passing = TRUE - if(H.traumatic_shock > min(60, H.nutrition/10)) - to_chat(usr, "Your pain prevents you from regaining focus.") - feral_passing = FALSE - if(H.feral + H.nutrition < 150) - to_chat(usr, "Your hunger prevents you from regaining focus.") - feral_passing = FALSE - if(H.jitteriness >= 100) - to_chat(usr, "Your jitterness prevents you from regaining focus.") - feral_passing = FALSE - if(feral_passing) - var/turf/T = get_turf(H) - if(T.get_lumcount() <= 0.1) - to_chat(usr, "You are slowly calming down in darkness' safety...") - else - to_chat(usr, "You are slowly calming down... But safety of darkness is much preferred.") - else - if(H.nutrition < 150) - to_chat(usr, "Your hunger is slowly making you unstable.") - - else - return 0 - - return 1 - - -// Character setup stuff -/atom/movable/screen/setup_preview - - var/datum/preferences/pref - -/atom/movable/screen/setup_preview/Destroy() - pref = null - return ..() - -// Background 'floor' -/atom/movable/screen/setup_preview/bg - mouse_over_pointer = MOUSE_HAND_POINTER - -/atom/movable/screen/setup_preview/bg/Click(params) - pref?.bgstate = next_list_item(pref.bgstate, pref.bgstate_options) - pref?.update_preview_icon() diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm new file mode 100644 index 000000000000..7a5fdeab6bae --- /dev/null +++ b/code/game/rendering/screen_legacy.dm @@ -0,0 +1,526 @@ +/* + Screen objects + Todo: improve/re-implement + + Screen objects are only used for the hud and should not appear anywhere "in-game". + They are used with the client/screen list and the screen_loc var. + For more information, see the byond documentation on the screen_loc and screen vars. +*/ +/atom/movable/screen + icon = 'icons/mob/screen1.dmi' + layer = HUD_LAYER_BASE + plane = HUD_PLANE + var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. + var/datum/hud/hud = null // A reference to the owner HUD, if any. + +/atom/movable/screen/Destroy() + master = null + return ..() + +/atom/movable/screen/text + icon = null + icon_state = null + mouse_opacity = 0 + screen_loc = "CENTER-7,CENTER-7" + maptext_height = 480 + maptext_width = 480 + +/atom/movable/screen/close + name = "close" + +/atom/movable/screen/close/Click() + if(master) + if(istype(master, /obj/item/storage)) + var/obj/item/storage/S = master + S.close(usr) + return 1 + + +/atom/movable/screen/item_action + var/obj/item/owner + +/atom/movable/screen/item_action/Destroy() + . = ..() + owner = null + +/atom/movable/screen/item_action/Click() + if(!usr || !owner) + return 1 + if(!usr.canClick()) + return + + if(usr.stat || usr.restrained() || !CHECK_MOBILITY(usr, MOBILITY_CAN_USE)) + return 1 + + if(!(owner in usr)) + return 1 + + owner.ui_action_click() + return 1 + +/atom/movable/screen/grab + name = "grab" + +/atom/movable/screen/grab/Click() + var/obj/item/grab/G = master + G.s_click(src) + return 1 + +/atom/movable/screen/grab/attack_hand(mob/user, datum/event_args/clickchain/e_args) + return + +/atom/movable/screen/grab/attackby() + return + + +/atom/movable/screen/storage + name = "storage" + +/atom/movable/screen/storage/Click() + if(!usr.canClick()) + return 1 + if(!CHECK_MOBILITY(usr, MOBILITY_CAN_STORAGE)) + return 1 + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech + return 1 + if(master) + var/obj/item/I = usr.get_active_held_item() + if(I) + usr.ClickOn(master) + return 1 + +/atom/movable/screen/zone_sel + name = "damage zone" + icon_state = "zone_sel" + screen_loc = ui_zonesel + var/selecting = BP_TORSO + +/atom/movable/screen/zone_sel/Click(location, control,params) + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + var/old_selecting = selecting //We're only going to update_icon() if there's been a change + + switch(icon_y) + if(1 to 3) //Feet + switch(icon_x) + if(10 to 15) + selecting = BP_R_FOOT + if(17 to 22) + selecting = BP_L_FOOT + else + return 1 + if(4 to 9) //Legs + switch(icon_x) + if(10 to 15) + selecting = BP_R_LEG + if(17 to 22) + selecting = BP_L_LEG + else + return 1 + if(10 to 13) //Hands and groin + switch(icon_x) + if(8 to 11) + selecting = BP_R_HAND + if(12 to 20) + selecting = BP_GROIN + if(21 to 24) + selecting = BP_L_HAND + else + return 1 + if(14 to 22) //Chest and arms to shoulders + switch(icon_x) + if(8 to 11) + selecting = BP_R_ARM + if(12 to 20) + selecting = BP_TORSO + if(21 to 24) + selecting = BP_L_ARM + else + return 1 + if(23 to 30) //Head, but we need to check for eye or mouth + if(icon_x in 12 to 20) + selecting = BP_HEAD + switch(icon_y) + if(23 to 24) + if(icon_x in 15 to 17) + selecting = O_MOUTH + if(26) //Eyeline, eyes are on 15 and 17 + if(icon_x in 14 to 18) + selecting = O_EYES + if(25 to 27) + if(icon_x in 15 to 17) + selecting = O_EYES + + if(old_selecting != selecting) + update_icon() + return 1 + +/atom/movable/screen/zone_sel/proc/set_selected_zone(bodypart) + var/old_selecting = selecting + selecting = bodypart + if(old_selecting != selecting) + update_icon() + +/atom/movable/screen/zone_sel/update_icon() + cut_overlays() + add_overlay(image('icons/mob/zone_sel.dmi', "[selecting]")) + +/// The UI Button to open the TGUI Crafting Menu +/atom/movable/screen/craft + name = "crafting menu" + icon = 'icons/mob/screen/midnight.dmi' + icon_state = "craft" + screen_loc = ui_smallquad + +/atom/movable/screen/craft/Click(location, control, params) + var/datum/component/personal_crafting/C = usr.GetComponent(/datum/component/personal_crafting) + C?.ui_interact(usr) + +/atom/movable/screen/Click(location, control, params) + ..() //Why the FUCK was this not called before + if(!usr) + return TRUE + switch(name) + if("toggle") + if(usr.hud_used.inventory_shown) + usr.hud_used.inventory_shown = 0 + usr.client.screen -= usr.hud_used.other + else + usr.hud_used.inventory_shown = 1 + usr.client.screen += usr.hud_used.other + + usr.hud_used.hidden_inventory_update() + + if("equip") + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech + return 1 + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + H.quick_equip() + + if("resist") + if(isliving(usr)) + var/mob/living/L = usr + L.resist() + + if("mov_intent") + // todo: reworks + if(isliving(usr)) + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(C.legcuffed) + to_chat(C, "You are legcuffed! You cannot run until you get [C.legcuffed] removed!") + C.m_intent = "walk" //Just incase + C.hud_used.move_intent.icon_state = "walking" + return 1 + var/mob/living/L = usr + L.toggle_move_intent() + if("m_intent") + if(!usr.m_int) + switch(usr.m_intent) + if("run") + usr.m_int = "13,14" + if("walk") + usr.m_int = "14,14" + if("face") + usr.m_int = "15,14" + else + usr.m_int = null + if("walk") + usr.m_intent = "walk" + usr.m_int = "14,14" + if("face") + usr.m_intent = "face" + usr.m_int = "15,14" + if("run") + usr.m_intent = "run" + usr.m_int = "13,14" + if("Reset Machine") + usr.unset_machine() + if("internal") + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(CHECK_MOBILITY(C, MOBILITY_CAN_USE)) + if(C.internal) + C.internal = null + to_chat(C, "No longer running on internals.") + if(C.internals) + C.internals.icon_state = "internal0" + else + + var/no_mask + if(!(C.wear_mask && C.wear_mask.clothing_flags & ALLOWINTERNALS)) + var/mob/living/carbon/human/H = C + if(!(H.head && H.head.clothing_flags & ALLOWINTERNALS)) + no_mask = 1 + + if(no_mask) + to_chat(C, "You are not wearing a suitable mask or helmet.") + return 1 + else + // groan. lazy time. + // location name + var/list/locnames = list() + // tank ref, can include nulls! FIRST VALID TANK FROM THIS IS CHOSEN. + var/list/tanks = list() + // first, hand + locnames += "in your hand" + tanks += C.get_active_held_item() + // yes, the above can result in duplicates. + // snowflake rig handling, second highest priority + if(istype(C.back, /obj/item/hardsuit)) + var/obj/item/hardsuit/R = C.back + if(R.air_supply && R?.is_activated()) + locnames += "in your hardsuit" + tanks += R.air_supply + // now, slots + if(ishuman(C)) + var/mob/living/carbon/human/H = C + // suit storage + locnames += "on your suit" + tanks += H.s_store + // hands + for(var/obj/item/tank/tank as anything in H.get_held_items_of_type(/obj/item/tank)) + locnames += "in your [tank.held_index % 2? "right" : "left"] hand" + tanks += tank + // pockets + locnames += "in your left pocket" + tanks += H.l_store + locnames += "in your right pocket" + tanks += H.r_store + // belt + locnames += "on your belt" + tanks += H.belt + // back + locnames += "on your back" + tanks += H.back + else + // back + locnames += "on your back" + tanks += C.back + // no more hugbox and stupid "smart" checks. take the first one we can find and use it. they can use active hand to override if needed. + for(var/index = 1 to length(tanks)) + if(!istype(tanks[index], /obj/item/tank)) + continue + C.internal = tanks[index] + to_chat(C, "You are now running on internals from [tanks[index]] on your [locnames[index]]") + if(C.internals) + C.internals.icon_state = "internal1" + return + to_chat(C, "You don't have an internals tank.") + return + if("act_intent") + usr.a_intent_change(INTENT_HOTKEY_RIGHT) + if(INTENT_HELP) + usr.a_intent = INTENT_HELP + usr.hud_used.action_intent.icon_state = "intent_help" + if(INTENT_HARM) + usr.a_intent = INTENT_HARM + usr.hud_used.action_intent.icon_state = "intent_harm" + if(INTENT_GRAB) + usr.a_intent = INTENT_GRAB + usr.hud_used.action_intent.icon_state = "intent_grab" + if(INTENT_DISARM) + usr.a_intent = INTENT_DISARM + usr.hud_used.action_intent.icon_state = "intent_disarm" + + if("pull") + usr.stop_pulling() + if("drop") + if(usr.client) + usr.client.drop_item() + + if("module") + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr +// if(R.module) +// R.hud_used.toggle_show_robot_modules() +// return 1 + R.pick_module() + + if("inventory") + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + if(R.module) + R.hud_used.toggle_show_robot_modules() + return 1 + else + to_chat(R, "You haven't selected a module yet.") + + if("radio") + if(issilicon(usr)) + usr:radio_menu() + if("panel") + if(issilicon(usr)) + usr:installed_modules() + + if("store") + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + if(R.module) + R.uneq_active() + R.hud_used.update_robot_modules_display() + else + to_chat(R, "You haven't selected a module yet.") + + if("module1") + if(istype(usr, /mob/living/silicon/robot)) + usr:toggle_module(1) + + if("module2") + if(istype(usr, /mob/living/silicon/robot)) + usr:toggle_module(2) + + if("module3") + if(istype(usr, /mob/living/silicon/robot)) + usr:toggle_module(3) + + if("AI Core") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.view_core() + + if("Show Camera List") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + var/camera = input(AI) in AI.get_camera_list() + AI.ai_camera_list(camera) + + if("Track With Camera") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + var/target_name = input(AI) in AI.trackable_mobs() + AI.ai_camera_track(target_name) + + if("Toggle Camera Light") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.toggle_camera_light() + + if("Crew Monitoring") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.subsystem_crew_monitor() + + if("Show Crew Manifest") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.ai_roster() + + if("Show Alerts") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.subsystem_alarm_monitor() + + if("Announcement") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.ai_announcement() + + if("Call Emergency Shuttle") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.ai_call_shuttle() + + if("State Laws") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.ai_checklaws() + + if("PDA - Send Message") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.aiPDA.cmd_send_pdamesg(usr) + + if("PDA - Show Message Log") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.aiPDA.cmd_show_message_log(usr) + + if("Take Image") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.take_image() + + if("View Images") + if(isAI(usr)) + var/mob/living/silicon/ai/AI = usr + AI.view_images() + else + return attempt_vr(src,"Click_vr",list(location,control,params)) + return 1 + +//! ## VR FILE MERGE ## !// + +/atom/movable/screen/proc/Click_vr(location, control, params) + if(!usr) return 1 + switch(name) + + //Shadekin + if("darkness") + var/turf/T = get_turf(usr) + var/darkness = round(1 - T.get_lumcount(),0.1) + to_chat(usr,"Darkness: [darkness]") + if("energy") + var/mob/living/simple_mob/shadekin/SK = usr + if(istype(SK)) + to_chat(usr,"Energy: [SK.energy] ([SK.dark_gains])") + var/mob/living/carbon/human/H = usr + if(istype(H) && istype(H.species, /datum/species/shadekin)) + to_chat(usr,"Energy: [H.shadekin_get_energy(H)]") + + if("danger level") + var/mob/living/carbon/human/H = usr + if(istype(H) && istype(H.species, /datum/species/shapeshifter/xenochimera)) + if(H.feral > 50) + to_chat(usr, "You are currently completely feral.") + else if(H.feral > 10) + to_chat(usr, "You are currently crazed and confused.") + else if(H.feral > 0) + to_chat(usr, "You are currently acting on instinct.") + else + to_chat(usr, "You are currently calm and collected.") + if(H.feral > 0) + var/feral_passing = TRUE + if(H.traumatic_shock > min(60, H.nutrition/10)) + to_chat(usr, "Your pain prevents you from regaining focus.") + feral_passing = FALSE + if(H.feral + H.nutrition < 150) + to_chat(usr, "Your hunger prevents you from regaining focus.") + feral_passing = FALSE + if(H.jitteriness >= 100) + to_chat(usr, "Your jitterness prevents you from regaining focus.") + feral_passing = FALSE + if(feral_passing) + var/turf/T = get_turf(H) + if(T.get_lumcount() <= 0.1) + to_chat(usr, "You are slowly calming down in darkness' safety...") + else + to_chat(usr, "You are slowly calming down... But safety of darkness is much preferred.") + else + if(H.nutrition < 150) + to_chat(usr, "Your hunger is slowly making you unstable.") + + else + return 0 + + return 1 + + +// Character setup stuff +/atom/movable/screen/setup_preview + + var/datum/preferences/pref + +/atom/movable/screen/setup_preview/Destroy() + pref = null + return ..() + +// Background 'floor' +/atom/movable/screen/setup_preview/bg + mouse_over_pointer = MOUSE_HAND_POINTER + +/atom/movable/screen/setup_preview/bg/Click(params) + pref?.bgstate = next_list_item(pref.bgstate, pref.bgstate_options) + pref?.update_preview_icon() From 5574838690a4c6d7936b643a2a2101904f95ca12 Mon Sep 17 00:00:00 2001 From: silicons Date: Fri, 21 Jul 2023 20:51:05 -0700 Subject: [PATCH 031/140] licenses --- citadel.dme | 1 + code/modules/inventory/hands.dm | 3 ++ code/modules/inventory/inventory.dm | 3 ++ code/modules/inventory/item/hooks.dm | 3 ++ code/modules/inventory/item/public.dm | 3 ++ code/modules/inventory/item/rendering.dm | 3 ++ code/modules/inventory/mob/abstraction.dm | 3 ++ code/modules/inventory/mob/hands.dm | 3 ++ code/modules/inventory/mob/helpers.dm | 3 ++ code/modules/inventory/mob/internal.dm | 3 ++ code/modules/inventory/mob/public.dm | 3 ++ code/modules/inventory/mob/stripping.dm | 3 ++ code/modules/inventory/slot_meta.dm | 3 ++ code/modules/mob/living/carbon/inventory.dm | 3 ++ code/modules/mob/living/inventory.dm | 32 ++------------------- code/modules/mob/living/inventory_legacy.dm | 27 +++++++++++++++++ 16 files changed, 69 insertions(+), 30 deletions(-) create mode 100644 code/modules/mob/living/inventory_legacy.dm diff --git a/citadel.dme b/citadel.dme index d63ee68d8b36..2f86132a71d2 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3261,6 +3261,7 @@ #include "code\modules\mob\living\defense.dm" #include "code\modules\mob\living\health.dm" #include "code\modules\mob\living\inventory.dm" +#include "code\modules\mob\living\inventory_legacy.dm" #include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defines.dm" diff --git a/code/modules/inventory/hands.dm b/code/modules/inventory/hands.dm index 3282816bbd9f..7d437b7ba7b9 100644 --- a/code/modules/inventory/hands.dm +++ b/code/modules/inventory/hands.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + // todo: we need a set of 'core' procs subtypes need to override, and the rest are composites of those procs. /** diff --git a/code/modules/inventory/inventory.dm b/code/modules/inventory/inventory.dm index d5c2da8555dc..4b61966b5f47 100644 --- a/code/modules/inventory/inventory.dm +++ b/code/modules/inventory/inventory.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * mob inventory data goes in here. */ diff --git a/code/modules/inventory/item/hooks.dm b/code/modules/inventory/item/hooks.dm index bde4816c74ba..657325337c5b 100644 --- a/code/modules/inventory/item/hooks.dm +++ b/code/modules/inventory/item/hooks.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + // doMove hook to ensure proper functionality when inv procs aren't called /obj/item/doMove(atom/destination) if(worn_slot && !worn_hook_suppressed) diff --git a/code/modules/inventory/item/public.dm b/code/modules/inventory/item/public.dm index e4d05ced6cbb..3bc2c5eac313 100644 --- a/code/modules/inventory/item/public.dm +++ b/code/modules/inventory/item/public.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + //* Hooks *// /** diff --git a/code/modules/inventory/item/rendering.dm b/code/modules/inventory/item/rendering.dm index a66fd84afaf0..c242c248869d 100644 --- a/code/modules/inventory/item/rendering.dm +++ b/code/modules/inventory/item/rendering.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * Item rendering system * Procs in here can be called and overridden as needed, but you should know what you're doing diff --git a/code/modules/inventory/mob/abstraction.dm b/code/modules/inventory/mob/abstraction.dm index e14bc2ad69b0..c1d4eee74063 100644 --- a/code/modules/inventory/mob/abstraction.dm +++ b/code/modules/inventory/mob/abstraction.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * Abstraction procs * diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/inventory/mob/hands.dm index 871a41524d58..1e50b4550943 100644 --- a/code/modules/inventory/mob/hands.dm +++ b/code/modules/inventory/mob/hands.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * Hands are a bit of a special case * diff --git a/code/modules/inventory/mob/helpers.dm b/code/modules/inventory/mob/helpers.dm index bdc7db66efe5..d1a45b5bc62b 100644 --- a/code/modules/inventory/mob/helpers.dm +++ b/code/modules/inventory/mob/helpers.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + //* these have the primary function of calling other procs in public.dm *// /** diff --git a/code/modules/inventory/mob/internal.dm b/code/modules/inventory/mob/internal.dm index 317188a1aedc..bc9a419a3483 100644 --- a/code/modules/inventory/mob/internal.dm +++ b/code/modules/inventory/mob/internal.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * Internal inventory logic * You shouldn't be calling or modifying these without good reason. diff --git a/code/modules/inventory/mob/public.dm b/code/modules/inventory/mob/public.dm index e7257dbd6d57..bb9f03a4cf84 100644 --- a/code/modules/inventory/mob/public.dm +++ b/code/modules/inventory/mob/public.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + //* Checks / Enumerations *// /** diff --git a/code/modules/inventory/mob/stripping.dm b/code/modules/inventory/mob/stripping.dm index 2a247f060f87..8cce5ebd4ed3 100644 --- a/code/modules/inventory/mob/stripping.dm +++ b/code/modules/inventory/mob/stripping.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /** * Stripping system * Procs can be called and overridden as needed diff --git a/code/modules/inventory/slot_meta.dm b/code/modules/inventory/slot_meta.dm index db9702f534b3..3bb579c3277c 100644 --- a/code/modules/inventory/slot_meta.dm +++ b/code/modules/inventory/slot_meta.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + /// global slot meta cache - all ids must be string! /// initialized by SSearly_init GLOBAL_LIST_EMPTY(inventory_slot_meta) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 93ce6b99dfa7..33bd1b5ae8c2 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -1,3 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// + //* Abstraction *// /mob/living/carbon/_slot_by_item(obj/item/I) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index ffb5e5919b51..ef5a47569d59 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -1,3 +1,5 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2023 Citadel Station developers. *// /mob/living/get_number_of_hands() return 2 @@ -68,33 +70,3 @@ /mob/living/init_inventory() inventory = new(src) - -//* Misc - Legacy *// - -/mob/living/mode() - set name = "Activate Held Object" - set category = "Object" - set src = usr - - if(world.time <= next_click) // This isn't really a 'click' but it'll work for our purposes. - return - - next_click = world.time + 1 - - if(istype(loc,/obj/mecha)) - return - - get_active_held_item()?.attack_self(src) - -/mob/living/abiotic(full_body) - if(full_body) - if(item_considered_abiotic(wear_mask)) - return TRUE - if(item_considered_abiotic(back)) - return TRUE - - for(var/obj/item/I as anything in get_held_items()) - if(item_considered_abiotic(I)) - return TRUE - - return FALSE diff --git a/code/modules/mob/living/inventory_legacy.dm b/code/modules/mob/living/inventory_legacy.dm new file mode 100644 index 000000000000..45e800055cc5 --- /dev/null +++ b/code/modules/mob/living/inventory_legacy.dm @@ -0,0 +1,27 @@ +/mob/living/mode() + set name = "Activate Held Object" + set category = "Object" + set src = usr + + if(world.time <= next_click) // This isn't really a 'click' but it'll work for our purposes. + return + + next_click = world.time + 1 + + if(istype(loc,/obj/mecha)) + return + + get_active_held_item()?.attack_self(src) + +/mob/living/abiotic(full_body) + if(full_body) + if(item_considered_abiotic(wear_mask)) + return TRUE + if(item_considered_abiotic(back)) + return TRUE + + for(var/obj/item/I as anything in get_held_items()) + if(item_considered_abiotic(I)) + return TRUE + + return FALSE From f5156f37372a67b62aa7c393a62d2e6a799c124c Mon Sep 17 00:00:00 2001 From: silicons Date: Sat, 22 Jul 2023 15:10:19 -0700 Subject: [PATCH 032/140] merge --- code/game/rendering/screen_legacy.dm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index 7a5fdeab6bae..456a8e0768fb 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -280,10 +280,6 @@ // suit storage locnames += "on your suit" tanks += H.s_store - // hands - for(var/obj/item/tank/tank as anything in H.get_held_items_of_type(/obj/item/tank)) - locnames += "in your [tank.held_index % 2? "right" : "left"] hand" - tanks += tank // pockets locnames += "in your left pocket" tanks += H.l_store @@ -523,4 +519,4 @@ /atom/movable/screen/setup_preview/bg/Click(params) pref?.bgstate = next_list_item(pref.bgstate, pref.bgstate_options) - pref?.update_preview_icon() + pref?.update_character_previews() From a96d4307259e43f4ee74298319426859b49af1c9 Mon Sep 17 00:00:00 2001 From: silicons Date: Tue, 25 Jul 2023 20:33:21 -0700 Subject: [PATCH 033/140] Fix --- code/game/machinery/computer/guestpass.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 527c81ed7490..c9ab693d7690 100755 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -115,11 +115,6 @@ deltimer(print_timer) print_timer = null -<<<<<<< HEAD -/obj/machinery/computer/guestpass/attack_hand(mob/user, datum/event_args/clickchain/e_args) - if(..()) - return -======= /obj/machinery/computer/guestpass/ui_static_data(mob/user, datum/tgui/ui, datum/ui_state/state) . = ..() .["access"] = SSjob.tgui_access_data() @@ -128,7 +123,6 @@ .["durationMax"] = max_duration .["durationMin"] = min_duration .["auth"] = tgui_inserted_card() ->>>>>>> citrp/master /obj/machinery/computer/guestpass/ui_data(mob/user, datum/tgui/ui, datum/ui_state/state) . = ..() From bd2023bc424d3825a491ffd0b0405c6f6d357213 Mon Sep 17 00:00:00 2001 From: silicons Date: Tue, 25 Jul 2023 21:54:42 -0700 Subject: [PATCH 034/140] sigh --- code/game/rendering/mob_huds/inventory.dm | 4 +++- icons/screen/hud/hologram/inventory.dmi | Bin 862 -> 1117 bytes icons/screen/hud/hologram/inventory_wide.dmi | Bin 0 -> 437 bytes icons/screen/hud/midnight/inventory.dmi | Bin 1934 -> 2156 bytes icons/screen/hud/midnight/inventory_wide.dmi | Bin 0 -> 517 bytes icons/screen/hud/minimalist/inventory.dmi | Bin 930 -> 1167 bytes .../screen/hud/minimalist/inventory_wide.dmi | Bin 0 -> 446 bytes icons/screen/hud/old/inventory.dmi | Bin 1179 -> 1406 bytes icons/screen/hud/old/inventory_wide.dmi | Bin 0 -> 460 bytes icons/screen/hud/orange/inventory.dmi | Bin 2713 -> 2970 bytes icons/screen/hud/orange/inventory_wide.dmi | Bin 0 -> 658 bytes icons/screen/hud/white/inventory.dmi | Bin 1028 -> 1120 bytes icons/screen/hud/white/inventory_wide.dmi | Bin 0 -> 373 bytes 13 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 icons/screen/hud/hologram/inventory_wide.dmi create mode 100644 icons/screen/hud/midnight/inventory_wide.dmi create mode 100644 icons/screen/hud/minimalist/inventory_wide.dmi create mode 100644 icons/screen/hud/old/inventory_wide.dmi create mode 100644 icons/screen/hud/orange/inventory_wide.dmi create mode 100644 icons/screen/hud/white/inventory_wide.dmi diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index e4b6962611f9..c0f25ef7a182 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -64,6 +64,7 @@ icon_state = "hand-[index % 2? "left" : "right"]" /atom/movable/screen/inventory/swap_hand + icon_state = "swap" /atom/movable/screen/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) icon = style.inventory_icons_wide @@ -71,5 +72,6 @@ color = style_color /atom/movable/screen/inventory/equip_hand + icon_state = "equip" -/atom/movable/screen/inventory/use_self_hand +// /atom/movable/screen/inventory/use_self_hand diff --git a/icons/screen/hud/hologram/inventory.dmi b/icons/screen/hud/hologram/inventory.dmi index a499ba49e7690498cf7dff8f4879328755e35d33..3037a85319d9e994329ccab3d127cd24fc7f1286 100644 GIT binary patch literal 1117 zcmV-j1fu(iP)V=-0C=30%R3IjFc5^{+CIf7se^d6ZcrlRBDsTwH{O*XfW3t4Q>3Cm3f+wK z{WVVA*$-%YZ)eIy?h_o2o2@l(iOO&|?5$yv#JZfKK?x2OhbcB$5^H5mlw9Djvu4cU zM$7)DR~rA2O}MDcv@Xb!cy&R~mpp!{8r{&M?Y;c~000AsNklA7vLqX4ppd`NtHG&l(cEDh;>;M+4|#M zX_5V#VGv+@clAk@ZLPT3@Anuf#{>XQr_+yI2B*{MOV{rue0jWo$Y%5D_4y+H2`O(g z*k1*1SHhPf@lUMJe+7;Iirl`0FWGI{0sz1fz&oSiTL9k^_buT|R+}yX3>;3}G8_Xa z<4YEsT>`90dDGvQ?5xqx?=10u^ZdSPUTe>GwIUvWR}TO&e2qPT1M&FB9?*?={5}D$ zoi&s?4QDhyi)gfm1Fo4zkS!8qXz_uz+Cy7 z=oG;>2#2tAe7AEr0bGi(GS6ZnDnG%Y6}vKU4r?{0!hgzHf8H=U@sUwhql_ZV|-d4-tSGe{0HjmLsdvL{+}V{QRpX=4q(5{QN2i6+lydepPVJ2js}lua20@(9-$& zRT7&U>ib?QKfhXHb3@z40h6w6XDHKsTZ#RbEZ@IwT@xv}p{~VguGH`u;)t1r`x$v` zwe%T;CGzt_X5p%uO-m8rjL*}MeQHW={gk#@xGHDUQU#z$<>&t<V=-0C=30i#ra&Fc1Z6?o+k~>&<<6Q}YWUs>YDN<1Z-HbHT z;xb&rgnkUPa;f@U;BnsV$-Ok0z~gizC#+d)lWNfz9*x8$bw#sSLoR8l@Hmj0OMLLg zpXr_FKgurNOjrJGD4ONl(PEf-^kbkmgw;jqfb^YX0007!NklS-2u#Z`Jw8Hjul?tsSt7lrP z*+tt|o6QE7j2Qs*egCT!;e0-S&7E%@%Z#zc(f69=D1B>Y`@eUn(E008g~ z;GZGcHGrQ3e>-|CF#!k`#McJ*07i`EN9G4lY&%7$;?4;G0IRT_st85oUIE}U@zvOY zOofZ@0VM%W9mN`!dj(dB{Tfj9e#d@XU-x~#Ow9(vEN~sJr6F+W2%w6&MGv4PxCmdS zyT-|@Q7VEOJVcIlqMhvt70GM3s&I?|6wD(0-HG!@1(x8uW$haaz99n0#0fkg3e-vj zN?s-%i=&FOR)B{H;dcR#OD#f85#-6s?k*8~QpcinPl{=Qc&&&+D*z?G1F(&drh>7A zhHD$zY7sO7@Z{gZ{tXU=kO95Hwg`6No+%NwA*KbpP9=i22k_*n7myGV*2xn{1PMx< zKmD9o2hbEjN=Ehqur|=XI8qO!(Sby`W&6bkQBwp{$#>$KvB5dyt5Nmz0sSy2l}shy zS^%&Z_&h=V8rIAMQ;r@WuxOjiSe}}*?g_I~?djJ3c07*qoM6N<$f(qA-iU0rr diff --git a/icons/screen/hud/hologram/inventory_wide.dmi b/icons/screen/hud/hologram/inventory_wide.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8569002fa0b51e961cc4eaecc6fe007ee48facc8 GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQu$RO5hX6E#mPmP1tppJc?=8{ zb5xI6^ED_4upXFYd$jw@vG_OJ3y)s3pvKmH3N1x6=;tHW`St)%)tNX-MAD>Aj=j`n(;R8oVu-xh>k(Tv#nW%jB!) zrB8?SKkZwRscG}+dp46T&*28!;uQ9TWTqR8H)b%DF_@_}$TswHCSVoXT+PVGaIDZ~ zb92UpZErVkIp+H}){?t9+c!|;LjcdA2SL#%c6HJ)04X( zIN^QW_oe5L+cye7n{}xCi&L(B@9&vAzsU8599VS!WLPKDDt@78b*>dwZvU9`UrE_V UIvFRc0^@;M1& literal 0 HcmV?d00001 diff --git a/icons/screen/hud/midnight/inventory.dmi b/icons/screen/hud/midnight/inventory.dmi index 00f6bc7c377fd3afa25176788bfd70e83c6804e0..830322e5fbc338843af907d7e4caca2dc2d458e3 100644 GIT binary patch literal 2156 zcmV-y2$T1TP)V=-0C=30%sURkFc1XL+CIf7se|~nZjdA7BDsTw*YQdr0ecD8r$|MC6uKGd z&D6NGSJ%UKPA`-T&l3#JyS-L#4w7JSI%<`Oha_t$;)P&PB|n8`q$rhEfpdYuL93Yk zo!0yVLPWk-8E3FPxpKO000M?FL);{=n+!#PW=o9zSh{uTU(=;qmo`P5Edh!S z4U#5BQ=mxFpy(FZU5d1j1Hz6dk+OK#fuuw#q?|sZ{FLGHYV-IU;?Cpy!XeXGB7OQwC&f{uS~@L){R>|`@IQp zgFkiZbfVd?x%o_PG@i?YgOIj;cks7=xRa>;xeqVNwe>5qI|)7p%+4M&G)+s=zGLG> zV5X&QfBU=JiI<}7?`|7&pMKP{KQIBaV>ej4yiT`%x}kg9H0?#;xvu@%<#p<|4PHAA zgxSZeGHz3W@q6K$fF!c77NcMHyc&SVH^0^apnmlW>K-Q!tu^s}6K6nBzflYT?12Yt z28`RUNira+-;4o12M#F%yx9zhF(B-C9GEl%YF9t^#qUMp4A5d^uWR3XO`PlZjRY95 zb@Q8{{!fGfgAidr8uk;r2Mj?h1{_~rr8$)V0C{0mqkDX}Mel;Q%51 z_CiiZUMYer9Fkh6tjYGp2oVM>)Yqt_N>G(!ARr)KhX8;B<#HA5%|#lU2_Xz9E}ydp zpZo06`Ra$}MW*`soMXjLQJIwnSC63dXx&%tBt8vTX+WK>&b(F*Y^^^y7CL1mb7)mC*RT5PJ&J z?&&Aayib)m2?c4&XVf;lXLpt>pxN4ntju6~z5>qU)!`uf$Cp>>^n3-3bYZl2pel3d zS{>V-ROp}R49cF>L2G+=v?rku2AJAIT{`og6MxZe^u_P^lbb@b)o|jkg7ZacK6yBv zbwGRbi7u7T(7Zh7)Y*=mi2(A_6q@Y@WO)XvQbDuTK(VNX_8FG}7VE$?n^2Vsx~v1k z+<{uE_y!;^P1%oy<}TWsPloOvjq(&UYWz`ai&*Obg>l%ALV($M34?PKi)9pYQ&5#T zJNxAs6id@+HR5MspndJ0e&Xz9s#K=!!8dFc033T(2d4QFgb?IQZvf!njE}yekGKbL z#(QPXAAhko@ZR{NvLA@M66Op50p|eY4EobYI(w&1L1$1PeJ6?~6`WhKYjD{4oLc}G z48vvt0PJxS?e-2@e?Hdf;u&h+lL^4XYk!pe$dxc>jz3%|evy@REC!TX1YN~IPMU(X zYeCaAX!q~vCof*2pfkuJ55_q3|8_=N4}{u(bXQ-fuhIN;4vbr{&_!F{!9Vx!=l~$^ zTHqxHi*>+TBsm83;xEG5wE(S!*8N{}Ts-f@U+Bdzx*mwd0E=1B8#~~f!~FYcug-Q~ zcA+=zpxrzFC^dN4HEzG%+7bn92D;}PTYu=BFH%B?uRX5)sEi$q-#tGle$joUc)Ow6 z&%v`A)*cf=nX82`OB-?j$JfVj26VLF0&Rq~iy+$#^*M0BcSDm#+V&IskJu1o4DdOS zG6Oa@pUJbc#}d`XglTdPg8jJ}6UdR{* z-vp$gk3Z_@O+Z@u_@fRV1JcmPA9eU|fX+%VX?=c%KKv8l*$Z(sjkT+v(johP`1Sb^*5_voh(;s>ip%Hd^nBH$&#!p&`BVK9d-{A6t!*)7a0WpJ zSj>#A&(E@743P{lwTHTN_QHTZ-;s!0rbnND41lAd&uYIggcu;E&v$AN&uV`h2t5TE zkABrrUvc#L3>Nm#)^}`eJOFFg0xxk`%mi;8{eWjbe(P%s)%3sS@J&D(`gkwAZ^)ef;4}RG{Z~o4av;!~ zfUO(1jN1AYc@mz@cYBeq-Z${-EgdHSL9b>eOk&t^a_{ iip|Yuhw=st0RIE*HrRnhl*|JF0000(aj literal 1934 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 UXhOw9f&c&j07*qoM6N<$f?i{m^#A|> diff --git a/icons/screen/hud/midnight/inventory_wide.dmi b/icons/screen/hud/midnight/inventory_wide.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2d622a87801da004a10ae7eefbfb0b105fe63630 GIT binary patch literal 517 zcmV+g0{Z=lP)V=-0C=1w#ybvxAP@z>nmxsf^u}N8wlNSxp?4qwg~CsO==Cj}Y9uB-n-yv? z^!SwHb%HU}4T(3p62KS-62Zqk6fpXZal75Hz{OKyKZ4BVeFPAUk#SolM@3C`rEH$B%fFyam zdhZ7`d1%-7wKmNR(QV^Azbf+3 z9!v55EUxVsF!c0^h%8aFx#M9M?AJPdEhmDV=-0C=2@%)Ji6Fbo9XIerSOos0Nev!GNcL;DU9abru+LSoA6Gjw7=%62Dx zcP(D}s~^z~9#+almKiOccY81&iOOj4bOggBiFGSQgA!V7ILxujl2{usQF1|x2QX6( z58CoCz0*`Fvn19o+*DSo|E?X->n+cJs>ObE=mrm8>q}6pZ1AP7000BJNkls1oY`0r0!Jp43EIs}j?`$@khsoeg)9l#$ON}3x4C?u0 z%|DRmd5V7*Me%Dk9eVOSPgUv=)!#Ht+W!hQHk-{`E*}E0fmM@t1-}0Meoykgx7+RG zF`)pSckcK5SpdY`6gcI-k(HvX7cl<~*r6vuITyWP535XPT82)Av! zOOm9!Uscs^N@HxtYMLh9@AuLJ@6?<|3xKL8Ndi$6b&n@WqNOods3;b|w6kGsKA6Ll z`jrL1z*&|FpO2!5Tm(_`F&5@gmZcFPsOwh}pl#b-Utrs?Lg>5%Qr9p2S&sH$o(W?k11 zMG@ftQHh|teyKA6-;_^;eIB81ewXN<2%?yL-U@Tmhl2u#_tLD z(6@(6jTb)%ALXrtl`w@T-t!$l23W=mU>PGH#<}*zKT1ZMa{=VG;e5k~QMv@7OBrt}&a*g< zQ_3l>D@dOKbMxoBf|LMr^5?q-*(@l_GHupymm!~qdJ)th6+o9i-({4%p*H;at|NU0 z*!1VS%;-yyDSy7}Od11B`}18y`J)KD)+1;QXV(d;N58Bq;q`jK`FysziBFBP0M!0` zY`%;!z{O2`B>{B#^Rf9u#sF70@n_==#pd%r5##!&sk0G)#r3AM^a^0gA1`7_Kba;J zz@$H3#1a~hdka4W1Ta0#V=-0C=2@j5`X$Fc1Z6?I|91?T}xqCfEcO_8mmD)-EItNQ-m*6s}Um-8`5# zEpEd-Oz6izE0?P81s>PKk=#d<2|O-ma>AO$woxq_!=sV7q^@WdYse)n6&@#YbBQnB z_*Z@Mywfb2#k%+~U3q`|&!NRI_2|byUyL3_=@%3MIsgCy)Ja4^RCt{2T05?*Fc6)f z2#GDYV*xbCUCJk=idYLvVJ#?Cq${OKXVGK<>DYohbc>fkzF>?^j2(fGM8VHz=GY!= zW)5*2|G9R^#b4gM?6WA$;3m+MhGVvQG?i&9ztn>%u>k0JQ54eqgb?c@$ec$mw4<);MM4+}&~;rl<+yK%LYRo4y%73l=S37n z@h4EuK}!I1zHM7*+jhBiD+BE_5n)yU(Rs!g5JHqf;Bz*EU=&49#+Z_`ZCfCO06wQH zg4PH?r-nj^_Yt<8?+ty6Ambc5t`ck1t}Zd9^p6l|L|xY)8s-X&F{tahcT{xz{T0&c z2&3KL(D}7`TNlHrfg%{SVM2tMa^6LN9CFCwgGt92?*%Zh3<*rv=u7qjDvl|;=J<_Q zf>Q)8rhpuG;j24xG5D2kqVeQjVz4EdL?2t$3qa&xwU-3u@|1x)|p z*@i2AsQ|ivZ`XoL{*eH4|Lxa?YyMCl01)Z}c3mIv3slbEo$T&xCjbBd07*qoM6N<$ Ef++>3XaE2J diff --git a/icons/screen/hud/minimalist/inventory_wide.dmi b/icons/screen/hud/minimalist/inventory_wide.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e379d7444d4fb580e3ab27d2b48818e35b7388bc GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQu$RO5hX6E#mPmP1tppJc?=8{ zb5xI6^ED_4upXFYd$jw@vG_OJ3y)s3pvKmH3N1x6=&yS`-9a+j~W1oU8pezLh(+xIjW%SonQ{{_zEO4<+yfmd{*Z zf2>lpW5Ri67gHW)+nM543{rv(d<||a3z!!OGQMEQaACkL^z0+klxw@rTP+B(Z1-OD zdRKXt{L-!OR^RbigU_V^h4ENkv*4B5H6w@)f>u4SoPd+i?AvFO_M zZ?#swQQolb_-zZHI&Y_S#q+zLO6~cq>tJ%9<(%a|(-VKY?#*rL$e6V(hgs=Ai)9UC Y2SY`Vv|@PV=-0C=30%sURkFc1XL+CIf7se|~nZjdA7BDsTw*YQdr0ecD8r$|MC6uKGd z&D6NGSJ%UKPA`-T&l3#JyS-L#4w7JSI%<`Oha_t$;)P&PB|n8`q$rhEfpdYuL93Yk zo!0yVLPWk-6>G3(-c}h000E3Nkl6(3~8-d*AQfldL|Qz)tHosK!1v0RVuU zcA3Ac#Z(>8zB~Z{0Mcwh$r(9TJ_#nO=iwTTg6N>+`AyXd3=>*&e9~;G2~Qb5H2{mR^F!b?_N)V5vyf$ zDtwS<%bDZfe+KxCnFW^k0N(u58o_-RcygqlE!Zw)P|Y+8{<;OlhU9MJjmn!snkc+|Cq zR%Fusfpa&4uM=qkit0ClK90x`-`;OSn*4c8;NJnR33O1zA2@2ViE-l^8-~XSoI|hY ziY^&60TGpdYL%>^1-;&MB6MJ5Lrxj+i?6HH;9TPJ=eZ-AZJGK?6HY=njNQi)U)ZkW z#9x}yh9W; zM0N~7@xL%W+IiJxf79XukgcmGihoo#CqMM~0utN-ua8pOQn>k%kB>chJL5F;$A@xM zHuGS@!~k9W@uB2Ed;rbOxshP~UvMKz02%61zG^!cT)*g7i~G3aKNd&ez==hXV*mgE M07*qoM6N<$g1~a8a{vGU literal 1179 zcmV;M1Z4Y(P)V=-0C=30j5`X$Fc1Z6?I|91?T}xqCddR8_8mmDvKAa0q{X>@3RkI;bn{@| zw7B(mKf(>3HZE1x1s2!Ck<3e?W>{R#WHQT?bstrOGAx=Lme|dlv>_9vR9KwIq!OOI z^QT#4%0H?zC+)&RW#d2EUmh*`(ZLO#-hK#0>Hel7@c;k=%}GQ-RCt{2TDxi^F%-QT zTqJQ}Fr-N8Kq?o;0YiRZD>vJu$TzrfwOb|FRZ^w!H*Ar{&HTf%Qw%Or1(q%Cg@D0@ zldy%f#f--DkZfsuC5=fA7-DHg=boc0O+2~;E{4CrHrP!U0077+5Pr9aS|$M3upI{( z1+{#G6=IoC2mEUTIQiFaX2~b_5m(*>NBr3g;N%CdX2{=|ukVa*j2}J&>=3a+>f$Hu7s;D=MnYCIdo2F;Lj%28aWARQrXrI!gc}W3&Pn%uUxYP}(H@jzTfJSQ9 zn9e+)^Vk$yM#RE99o|4Q-3<@mtgUW>ngIgw01!EU8vPxH7L2GjyKCV^ENK+upT8dD zjgdk5DG&`RN2e3difEZ&V2gN;rJC*p=#N1oCdA^WGY_USdB_c~n5El*Y5)%q)r6FI zI;YS+r5lal*QqW=H3L?QfX?Yg(&;SPjrnz$CU8-CBhvjGI^qFzG9WfVM4A`A$t-Qe zyxxhIF@nbshOy|9C>Y2o%S6C z62bmpV)kLR2w=4cgefm;SAh0!0XnA;&Y>Vs){YL@_$7Ju3_vEY0;>B$#1cLYD73sE znPXEK+cJN4518CX@6AmHAv+Ur#J@Ix-E@JBf{g)UL3A|ch`%Q5Z~_PX8{rvZ3 zZy#g3g22U)*(PNVw-NbZDEw{{wR8ZkVLJ{o7-shXTQeXN>ViKpAW6r^7o+6l>KMpi zSTMmAe~GJ&9$$c59Sgf%@E89RL?$P_C%v%`&w=!wk`F2b{FVJJ!2A|4 zzlCo?4wXF{1_X};TH&(u1%Ya?U zFu`LH)dvv2uN;@M0mScvs6K!PV#^55x2--v)dVF2MB)Lm^#L}FAbuYzUmqY^CK%Wz zo}&`=0oW#R@q1MtfMr5jyiR?9>QYoPfc3^3kGy5|0azyJ)(7b9L&_PzO%RcqtPkM4 zds!cV{X`Je2kgqR(=_FmhN=1hQTB<%JE;#4?GGkqpY_JTdShYA%i2{?x;`K;P}YtO z+4yC7wG6-}uL3IjLc|t64Jfp{J)2`w8QU^{_GIYlIC?j4FbLV1fGhsQ0QPVTWH8(q tAQnVNW3KpXvJMw;!O!ahtP@uS{{gU2zp=V7g2n&<002ovPDHLkV1gLL8>avO diff --git a/icons/screen/hud/old/inventory_wide.dmi b/icons/screen/hud/old/inventory_wide.dmi new file mode 100644 index 0000000000000000000000000000000000000000..429ed45ed4e32395a0c5fc0da3bea6e6a4d82058 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQu$RO5hX6E#mPmP1tppJc?=8{ zb5xI6^ED_4upXFYd$jw@vG_OJ3y)s3pvKmH3N1x6=&ynhZqR;(2G!{wU#hjK%!@L)n-+s)AvM56N1%yGPEjX-h0V zwvg*qh)C2g{(bs}qRvn2?=wd!E?rWe*2LG)#=3xcK_cS|hKvXXD+VdC1_DAXYx~lV z|KDlwr>wB1xBtZDw7bv$G`!M~(LTd%x6V=J(W3WL5?&nP`*WXB%$H}@qwUt|m3t=TvufUyCoWB_c`Sc! zoUIJnCmYZ2{Yxt^mMK5U6aBE8=h;lD h*BUB<;V=-0C=30%sURkFc1XL+CIf7se|~nZjdA7BDsTw*YQdr0ecD8r$|MC6uKGd z&D6NGSJ%UKPA`-T&l3#JyS-L#4w7JSI%<`Oha_t$;)P&PB|n8`q$rhEfpdYuL93Yk zo!0yVLPWk-8E3FPxpKO000WbNklA^hWXoz*{c1z1ZbKzlEDW#__Hy1<-rW!eKSqLk%Oox3R_#Pi!7Pcn2q_o z@=yk$K;XgYzoyx>!70_MXc%;|UyP+D5`P$V2^dxN14LB_;vgbW*s<6y$VzT>AdKxT ziy-c!MBoR1F|bSU^6?Ch{K25$j*j&)66cRUt7eXPs0^BRVUm z6GZz8)HIDm+y?apN1P-7;amT{8 zVb=yPXkUTWmW5aJ@k?;}b%T-*uRNUL(Q^j7HkAIK7*GP+1{B!6ZlM727PpOc4Va6| zdHmH!v-mEYxRA#66)dZD1uiUT%tU>B8^nx8B!Hj&g=01?|_1 zNv;9&<@kU9czyg~^vnPuKy4AMUkNAyit8Eu!uF>)0F`N zIhZjO;-O%JP_V9FtGaN&im2^{V*y0tfat)0MU5cvtAhy;cdd>=K7A~!D{9#%z$?MC z9~dTp9o6s}GSDvrMiqax7wC5lPz4;A16+9OSXNgfWd;P`dvNvx!;AvaHUnhtG!H;K zw6d>hT6GX+RG5vzd=#G0GkP=z2R;o6ohmIo8_uX%{pFRk`Qe5|(W{@124=v3@pnT< z1_&XuuFb%cM>6{I-Js4;4K{DWGc#G;b>LMqZSJ^GaAj3g=&xz@20K+?D+bP$LJV-> z`^#B9Is>1%3zR4bwd_xMdQ??dz8g-JGWv_9w3&D77w>);P>DY|MEs5Ds}G1MKom~h zo|VSuZJ)p$O1Fwc| zEc+xBus3BQcD5|G963ewV!tH=+~MNyhK>w~Dxk$=F!m3ZFG(<8emK z>c3u1n^qBu9wZ|T^I{(iPzB6576I_&=d$|pJ>?2i0VU)|8)%vaEfUZx14a?Q?>EOE zMn?uj6=+(v!>Bl-)^;X$+yhUN(SQDqtb~nS>K4LY8Bn4Btp_x|wvR z!bu1K5B!o`jIZS^@{T-H>cxI52JAY+#orAb84wXLACtlOB^g{(8bs6#N+SYEZr>a`yOmulRKvc zO>63i`|Sf%0dqsdADz?4yX_0GYabv4%*@HT++UJL0Iq%n{)ceOL73O!&==tHdvais zH^cg>96ZaGdvU){1_)%+vvjM5>&R)~`W0CEiu56G!ukrlzL7S+rDyb@%!a^+#Dd1A z4Y|$cCT@^Ez;g$WAKIUULXT%bt^%nU863Wx&q_ADW~R+=*cts`Ae*5>$6)neprycd zAfC{0Vh{`M1p3(pDFTXli?bIE^J$UQqcPcN6|TbiNASY?hUt11b_zU4R%PHpe%m5i z{(FrWd(bck3T1_S*^Hl+=i+@X~79oR7kHoQy66luAHc10P;qOPifL(yKOA!1Qezz_=!XPdW#1;>DG;sfgNZKal(UmsZoJTE1TJ0)B9yW1>xi8%2|vDvKbQP-C_CA%cuQ={6QJuy6}tt z7@^Ebc9nqV|J{6DK*zbif}WoTD4`(LKt5cMr+cz7tqj6UAWuHqJ-+Ri0i(vC&jXYe zNp6fkp#AZD*nSvedm`2jgEC+e_Q$P=XoV&Q0Am}3O7NW+Firc#SZX5n!>CKZ%E|}& zD1}+AU|DOr5Us0l+V;=A^AG*xQDdz3!v{7Mq0h5PTnf12i- zrl7vwJSu(uUPfI4rlF7D>!>E6GWg&A@&jYl=Qrx(_d4nraPp{O#_Y-Jht$eL(>}I7vYK53@T4{p7^u;eV+m2L0tlh zvD8HL`TMA$E&(mIk&(gm`Igl=dHZO=fJx}{_fbPv2H3H|_4&?@)Wvku#_VNuWWccc z{JDgN)yD@U_9D76U{M=fpTC=z62U<~KeZRomI0&C=Ld1EuMf%XMRa6<>&kxz)#rP= z*8Uk%7qn%-DD?S-Xls4`K5FQ^2DnmUJ*Yl^*4gg^x}oDPND;sg`uyEUYjyHIYUthv zL$7v&t zf4E0f5-`!~mGAK0XXh(@4c3b^yNid>VjM5`rS+^B<4Jr)i@u z0n^aOhhbS3q9`l>??1}$)iVY;yWQP42C4~o==S@}H!i)UPeL@+P8HY4fK(Dv$aP>( zFksqp!A1sD)&T1UWV=-0C=30j5`X$Fc1Z6?I|91?T}xqCddR8_8mmDvKAa0q{X>@3RkI;bn{@| zw7B(mKf(>3HZE1x1s2!Ck<3e?W>{R#WHQT?bstrOGAx=Lme|dlv>_9vR9KwIq!OOI z^QT#4%0H?zC+)&RW#d2EUmh*`(ZLO#-hK#0>Hel7@c;k`%Sl8*RCt{2n@x-(M;V5n z>UP_n8PBwxpJjWO*$^g3tAzlGq81m9R&Gd9L_**|gf_6d;Xn|V1S!A)Z30npAwY-_ z8&FUrgaX_mAGt)nfbz3ify62^neAbAH{+h2vEAM7Y7S+O|GGW?8(RooX{52ouJ^02 z->Ukm>K#!i-1RmyMm~QEfJ$XO_Vu9ebYjrwheax>@p)j>I3|s|Qdw6C=y=1LsKp_X z&!2J<0-8DhK>{k3b!%m18Phx&8{9Y$Lj6RM`T=m=O{-E_w|bM%;xFV+I=$bM(X=A! z=TCM2Ip?^piPbQl#dqPH39O?ryxu@_CbmwB(hCO9&035H9?wNYw+s z(N@tU=;iN9z_gw|fT2T_1(AZ$WY0$zNyOccUXe=cI?A?;5u0kcs+3L+oS zpuX?oc~JErjFJ`L?z)6^iEO}yH*6XbUU{U%W0!2I9yI=&6rgLcm{sHW)yK-n0M5Qy zB#;`e8?S)nWs{5{ksgSQNh*S<0l5{ERF47#YNgOb`*mxI2&3frVr&Hn0eTFXY?Afz zX#)0B@YPE;no#543tS}03aC_E1d>NC*@Te`z?WaMX-JnaR9vl&>jDf7GP+8(Xa*HZ z@IvsLpYMxnR0W7;XVN-kJIJCAvOu=8-btv5b}f*Oz{mn(fC5%bqDUTe1|S=_i3tOE z`b^o<^kz&z*nsCQ+YW$dn1nqU7+C?jfMbh508gDMTY9RgfCyv=7cbk60T>AZI{W5MdyQUmwMPe97a-r5bCL$ z8F=zk$y&P~^h}#<&w*z%Wh?OERj26e2T%)?Dq8Y0&He-oS_OI&u-NEOKmgxaD_cee zK5-vt1_-?wPjh(cI;`Cf=Nl#K#YWND3%V!Ikra^900Yk7T~?i6RO>pZ1T3F|+)0oD zT=-kb3Ou;@zU^c>+MGlI0?-SldI(v#uv)V2c>uI@v*UWl2b(bo4ZIzdi2YrcU0)5+ zB>sU4Ff=gJsxfZ|mU47un@9zs>+ne%q_5=n^Nph8)}bCkKGicXjGzErK*o28fG0my zw$>hKDo_WsjyMuvnkK{~U}yyx8jv2q&Bc08dh~e*BJ7!giIeiD*~_w1(fE z$4tJxs)nDpqZGLCG1^(}OhN>NARB5jyjgMC^VOariGQF1QUaFJsxjG6jrV0fY6nxh zq1NrS`{5Z`wtluzbfPR>6Vb2=&;{huaNa6eYxjZo5mau%iF={8rQ+yIgoM3o;B3Hi zS8OMnGa+UY99jWFKvjq5_HF0;M%fZ6$gR>{2mrNzEAoXq;M%*84`J;-H4**bJ=@vy z+bS4V0lI+D09K)P9d;{l@?NNI!_IY;2tpM{?FK9yQ$^SICcJvB=;({!+;C%;!A=}n z2j~KHLp6FnU9y%=sQ%ZsRfiGnjw9j38Q6RmR{Un0D<*o-oq%B!pf!iU^H*%=*>u@D zzS`{kO*rux)%kq~Zft?3!|LsdUxu)KQ>`4!rrB2!j$8)_0hvWLmgTA<0l4uY$PeI- z_K*YKSD{mQ8j%sOeu(!1v(VI$XSBJK(ZY?LN{PwGzB7 zZ<5yGrH!JqWWYE5k|hK*8bHqSQs?bk9=>-fGFgvdth6sxWH>k%`pKFX{MhR0T{MGdmF)6hIQ@!QZC< z;K+h#kq=V9togeVu)coTn&!nw99(zP5+Ys&^WZ;7Kt6xUsZ`dj-CgHMucw62Vz0*L z#owiXq&vG=VIKS`n9eoxIC%5T*S-Mo&_iFJ`4xQ&;{X1DgvRHAx%&hDc=fL{xu1Xd z?k~oU^?C4%LgB8r^Z8Q;pUjmX8kea|Ba9AyVDE|chfT=1V2;isxv^x$=RdyS|PyW&WzJQT;aKr3I zy^h~Ii^0xvB}LyqLnUJ9^MFo&K+A;C>ko)Xw$C55GpYinjG3MXjEZ^i_bC95{(e3Q z^Wg7Fz@>NIvd*2hkMxE%=}ur?{0BEfF#D^i-pkQ>@OLF(*62;ZJox|T{Q>_0*LXE- T{{c_U00000NkvXXu0mjf=|~)! diff --git a/icons/screen/hud/orange/inventory_wide.dmi b/icons/screen/hud/orange/inventory_wide.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d8cf5f7c80543d5ebfaa34acc80214633aaeb644 GIT binary patch literal 658 zcmV;D0&V??P)V=-0C=1w#ybvxAP@z>nmxsf^u}N8wlNSxp?4qwg~CsO==Cj}Y9uB-n-yv? z^!SwHb%HU}4T(3p62KS-62Zqk6fpXZaZn@xo{j&~zjVA(M02G})7 zm(aRyGU^6zR$%K4iu0Jl^Gi|r6<}SItY*;%$8mNh>FwJ!`1-vKfaj{-bDga^x}0Fw zVAc!h4BFT=xcJu0`kzn52S}2K;$(6L?7DqW3HW8J&5y4pSpoo7QM^_4z>9vs?Sr~L z>#0N}XzRN z0})9?K~z|U)tGH}vM>yW1=2!AYE7n2w4iI0Gtu=%tRS~?9U$v7=Q>RA(#S@%nLvcVTAxU2+sHc z6G5KS+w5NmO#TXi#Lq~K1bF$xC^P{g3gi=L8vilsH7( zs}F~O&z}=KrT~hN@@f-^L{9go0?E}SaPpUXpz1LlQ5E12e-sLFyhW|R?IJdR-bG?q z!u_7N6d|s2f-7wiw%TU^xGu8um*)U(EqN)T#k@63oD-isC%{DQ8-S+q{FKF8{Z0_Zwq*t2MvZ%p6WTlL3&e_w!q zWRZ2Iz=l8eBJ{%RaOrro_+7WtR={@thWz_0&< z5orB?D1lG^2P4q>|40I_{{L^f$eQ7B8|CpK1ik)0gkY}!CtVYgV5a}W6FB<6IDo*? z|G^1>)&C(09Q_}jfYtv&_rTWw;k$^{|6#jGH8cG`5$u&1(=U{l{s%4ae`d4DQXTsU z_-ShCP^Mi3oIH-re;xIVO_S~@f-Vuy=Tqz`u&VE=KnhQd@b?0%`o1TiUpap+ur3_~ k5NzrHoqMpU|95uLFLRNpgS+WC5&!@I07*qoM6N<$g6LDk&;S4c delta 869 zcmV-r1DgEc2!seniBL{Q4GJ0x0000DNk~Le0000$0000$2m=5B0G+pi>;M1&T2M?> zMZmzoPEJlaIXQ80aY#r=V`F1&ZEe55zjk(ZSXfw*N;w$F$jFx|IZ6Nk00DGTPE!Ct z=GbNc004rKo_K#ihq8jJp9|Qd0DcHX=_ZuZ2mk;A%1J~)R9J<@mWz_=APk0WLmMfs z(u>Nj_5EM-gwh)jaGm3vlbP+T{%QDx0RLgkMNzoF`9rb(zs13QpN#R9ei)gmJOQs$ zfw6={l%p+>*KGkI$|wYVDTFH^EGv^V>9zn=QPhA?SKxmNz!4FTOcpEz3_yXB5L|&m zHVTkK$PgUy1RFuq(8u~M0*PORSPAg_g~huBh_Da<9*;N^)HV_X!p1rY#Y!N!Ux5iKfaoH1GXo}ES%>gj0P{GxZM6$ugxFPlg zx;G7#m{QCYm`;>(Ajw!Av6CX01KC-G=4R+IaD9J3>(J7>-*%9^a0RluEs*vHu0Yx!E!IVEutlu=fY<-tY(lf4~v! z{6R#(`-2@p;15(x5cq?b!1D*p9B}?%BLI2UANZ@_`-6}m@CQsEaQ{fyG2LZwA4~&*Ef$f6LA20-*KiGF-J^2H$36I2Hh~wQeG4coTZuH`F v1j+kKP)@0)`8;A_5c6?0d!JMQvg8b*k%9#0C0L# zSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1nN-u|SE7GbOXA7|1o`;!G<_%uR)|bMo^Gz$|42 zS3ei9`2aAw97bDs>_Pwl0ES6KK~y-6V_+BsqhQzpL0mupsz3=BP=qN^#BP8PT!F9) z2)L%D0zp`4T8Ik-7$OuH8=D&&SIn9L1f3l-+l?Urp+E$v-NhwrS=zE?%VtemF%4>h zBc=%}fMD@ToF=3#o3(1%s%6VUaGTKC*#UG$F@_0(5FKG5VPPR@sc>HiLKOf2goQ$4 T=r%;=00000NkvXXu0mjf3NMRd literal 0 HcmV?d00001 From f776324fbf94b5c49de4d01c827aec3631308b75 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 24 May 2024 18:14:40 +0000 Subject: [PATCH 035/140] merge --- .../signals_atom/signals_atom_attack.dm | 2 +- .../signals/signals_mob/signals_mob_main.dm | 2 +- code/datums/event_args/clickchain.dm | 2 +- code/game/atoms/buckling.dm | 2 +- code/game/click/mobs.dm | 2 +- code/game/click/other_mobs.dm | 2 +- code/game/click/telekinesis.dm | 2 +- code/game/dna/dna_modifier.dm | 2 +- .../game/gamemodes/changeling/powers/armor.dm | 2 +- code/game/gamemodes/cult/cult_structures.dm | 2 +- code/game/gamemodes/cult/ritual.dm | 6 +- code/game/gamemodes/cult/soulstone.dm | 2 +- code/game/gamemodes/cult/talisman.dm | 2 +- code/game/gamemodes/nuclear/pinpointer.dm | 8 +-- code/game/gamemodes/technomancer/catalog.dm | 2 +- .../devices/disposable_teleporter.dm | 2 +- .../technomancer/devices/shield_armor.dm | 2 +- .../technomancer/devices/tesla_armor.dm | 2 +- code/game/gamemodes/technomancer/equipment.dm | 2 +- .../game/gamemodes/technomancer/spell_objs.dm | 2 +- code/game/machinery/CableLayer.dm | 2 +- code/game/machinery/OpTable.dm | 2 +- code/game/machinery/Sleeper.dm | 2 +- code/game/machinery/_machinery.dm | 2 +- code/game/machinery/adv_med.dm | 2 +- code/game/machinery/ai_slipper.dm | 2 +- code/game/machinery/atm_ret_field.dm | 2 +- code/game/machinery/atmo_control.dm | 2 +- code/game/machinery/bioprinter.dm | 2 +- code/game/machinery/bomb_tester.dm | 2 +- code/game/machinery/camera/camera.dm | 2 +- code/game/machinery/camera/camera_assembly.dm | 2 +- code/game/machinery/cell_charger.dm | 4 +- code/game/machinery/cloning.dm | 4 +- code/game/machinery/computer/Operating.dm | 2 +- code/game/machinery/computer/RCON_Console.dm | 2 +- code/game/machinery/computer/aifixer.dm | 2 +- .../machinery/computer/arcade/claw_machine.dm | 2 +- code/game/machinery/computer/arcade/orion.dm | 2 +- code/game/machinery/computer/atmos_alert.dm | 2 +- code/game/machinery/computer/atmos_control.dm | 2 +- code/game/machinery/computer/camera.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/command/card.dm | 2 +- .../game/machinery/computer/communications.dm | 2 +- code/game/machinery/computer/crew.dm | 2 +- code/game/machinery/computer/law.dm | 4 +- code/game/machinery/computer/medical.dm | 2 +- code/game/machinery/computer/message.dm | 2 +- code/game/machinery/computer/pod.dm | 4 +- code/game/machinery/computer/prisoner.dm | 2 +- code/game/machinery/computer/prisonshuttle.dm | 2 +- code/game/machinery/computer/robot.dm | 2 +- code/game/machinery/computer/security.dm | 2 +- .../machinery/computer/shutoff_monitor.dm | 2 +- code/game/machinery/computer/skills.dm | 2 +- .../machinery/computer/specops_shuttle.dm | 2 +- code/game/machinery/computer/station_alert.dm | 2 +- .../computer/supermatter_monitor_tgui.dm | 2 +- code/game/machinery/computer/supply.dm | 2 +- .../computer/syndicate_specops_shuttle.dm | 2 +- code/game/machinery/computer/timeclock_vr.dm | 2 +- code/game/machinery/cryo.dm | 2 +- code/game/machinery/deployable_vr.dm | 2 +- code/game/machinery/door_control.dm | 2 +- code/game/machinery/doorbell_vr.dm | 2 +- code/game/machinery/doors/airlock/airlock.dm | 2 +- .../doors/airlock/airlock_control.dm | 4 +- code/game/machinery/doors/blast_door.dm | 2 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/door_timer.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- .../embedded_controller_base.dm | 2 +- code/game/machinery/event.dm | 4 +- code/game/machinery/exonet_node.dm | 2 +- code/game/machinery/fire_alarm.dm | 4 +- code/game/machinery/flasher.dm | 2 +- code/game/machinery/floodlight.dm | 2 +- code/game/machinery/floor_light.dm | 2 +- code/game/machinery/floorlayer.dm | 2 +- code/game/machinery/holosign.dm | 2 +- code/game/machinery/igniter.dm | 4 +- code/game/machinery/iv_drip.dm | 2 +- code/game/machinery/jukebox.dm | 2 +- code/game/machinery/lightswitch.dm | 2 +- code/game/machinery/magnet.dm | 2 +- code/game/machinery/misc/bioscan_antenna.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- code/game/machinery/newscaster.dm | 4 +- code/game/machinery/nuclear_bomb.dm | 2 +- code/game/machinery/oxygen_pump.dm | 2 +- code/game/machinery/pda_multicaster.dm | 2 +- code/game/machinery/pipe/construction.dm | 2 +- code/game/machinery/pipe/pipe_dispenser.dm | 2 +- code/game/machinery/pointdefense.dm | 2 +- code/game/machinery/portable_turret.dm | 4 +- code/game/machinery/recharger.dm | 2 +- code/game/machinery/records_scanner.dm | 2 +- code/game/machinery/requests_console.dm | 2 +- code/game/machinery/spaceheater.dm | 4 +- .../machinery/suit_storage/suit_cycler.dm | 2 +- .../suit_storage/suit_storage_massive.dm | 2 +- .../suit_storage/suit_storage_unit.dm | 2 +- code/game/machinery/supplybeacon.dm | 4 +- code/game/machinery/syndicatebeacon.dm | 6 +- code/game/machinery/telecomms/_telecomms.dm | 2 +- code/game/machinery/telecomms/logbrowser.dm | 2 +- .../machinery/telecomms/message_server.dm | 2 +- code/game/machinery/telecomms/telemonitor.dm | 2 +- code/game/machinery/teleporter/console.dm | 2 +- code/game/machinery/teleporter/projector.dm | 2 +- code/game/machinery/turret_control.dm | 2 +- code/game/machinery/wall_frames.dm | 2 +- code/game/machinery/washing_machine.dm | 2 +- code/game/machinery/wishgranter.dm | 2 +- code/game/mecha/mech_fabricator.dm | 2 +- code/game/mecha/mecha.dm | 2 +- code/game/mecha/mecha_control_console.dm | 2 +- code/game/mecha/mecha_parts.dm | 4 +- code/game/mecha/micro/mecha_parts_vr.dm | 2 +- .../objects/effects/debris/cleanable/misc.dm | 2 +- code/game/objects/effects/mines.dm | 2 +- code/game/objects/effects/portals.dm | 2 +- code/game/objects/items/antag_spawners.dm | 4 +- code/game/objects/items/balls.dm | 2 +- code/game/objects/items/bells.dm | 2 +- code/game/objects/items/blueprints.dm | 2 +- code/game/objects/items/contraband.dm | 4 +- code/game/objects/items/devices/PDA/PDA.dm | 4 +- code/game/objects/items/devices/aicard.dm | 2 +- code/game/objects/items/devices/binoculars.dm | 2 +- .../objects/items/devices/body_snatcher_vr.dm | 2 +- .../objects/items/devices/chameleonproj.dm | 4 +- .../devices/communicator/communicator.dm | 2 +- code/game/objects/items/devices/defib.dm | 2 +- .../objects/items/devices/floor_painter.dm | 2 +- code/game/objects/items/devices/geiger.dm | 2 +- code/game/objects/items/devices/gps.dm | 2 +- .../game/objects/items/devices/holowarrant.dm | 2 +- .../objects/items/devices/lightreplacer.dm | 2 +- code/game/objects/items/devices/megaphone.dm | 2 +- code/game/objects/items/devices/multitool.dm | 2 +- code/game/objects/items/devices/paicard.dm | 2 +- .../objects/items/devices/pipe_painter.dm | 2 +- code/game/objects/items/devices/powersink.dm | 2 +- .../objects/items/devices/radio/beacon.dm | 2 +- .../objects/items/devices/radio/intercom.dm | 2 +- .../objects/items/devices/radio/jammer.dm | 4 +- .../game/objects/items/devices/radio/radio.dm | 4 +- .../game/objects/items/devices/scanners_vr.dm | 2 +- code/game/objects/items/devices/spy_bug.dm | 4 +- .../objects/items/devices/suit_cooling.dm | 2 +- code/game/objects/items/devices/t_scanner.dm | 2 +- .../devices/tape_recorder/cassette_tape.dm | 2 +- .../devices/tape_recorder/tape_recorder.dm | 4 +- .../objects/items/devices/taperecorder.dm | 6 +- .../objects/items/devices/text_to_speech.dm | 2 +- .../objects/items/devices/transfer_valve.dm | 2 +- code/game/objects/items/devices/translator.dm | 2 +- code/game/objects/items/devices/tvcamera.dm | 2 +- code/game/objects/items/devices/uplink.dm | 4 +- code/game/objects/items/devices/whistle.dm | 2 +- code/game/objects/items/gifts.dm | 2 +- code/game/objects/items/glassjar.dm | 2 +- code/game/objects/items/godfigures.dm | 2 +- code/game/objects/items/gunbox.dm | 18 +++--- code/game/objects/items/holosign_creator.dm | 4 +- .../objects/items/id_cards/station_ids.dm | 2 +- .../objects/items/id_cards/syndicate_ids.dm | 2 +- code/game/objects/items/pizza_voucher.dm | 2 +- code/game/objects/items/robot/gripper.dm | 4 +- .../objects/items/robot/robot_upgrades.dm | 2 +- code/game/objects/items/shooting_range.dm | 2 +- code/game/objects/items/signs.dm | 2 +- code/game/objects/items/spritechanger.dm | 2 +- .../objects/items/stacks/marker_beacons.dm | 4 +- .../game/objects/items/stacks/sheets/glass.dm | 2 +- code/game/objects/items/stacks/telecrystal.dm | 2 +- code/game/objects/items/storage/boxes.dm | 2 +- code/game/objects/items/tools/crowbar.dm | 2 +- code/game/objects/items/tools/screwdriver.dm | 2 +- code/game/objects/items/tools/switchtool.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 4 +- code/game/objects/items/tools/wirecutters.dm | 2 +- code/game/objects/items/tools/wrench.dm | 2 +- code/game/objects/items/uav.dm | 2 +- code/game/objects/items/weapons/AI_modules.dm | 10 ++-- code/game/objects/items/weapons/RCD.dm | 4 +- code/game/objects/items/weapons/RPD.dm | 2 +- code/game/objects/items/weapons/RSF.dm | 2 +- .../objects/items/weapons/barrier_tape.dm | 6 +- code/game/objects/items/weapons/candle.dm | 2 +- .../objects/items/weapons/cigs_lighters.dm | 6 +- .../game/objects/items/weapons/clown_items.dm | 2 +- code/game/objects/items/weapons/cosmetics.dm | 6 +- code/game/objects/items/weapons/duct_tape.dm | 6 +- code/game/objects/items/weapons/explosives.dm | 2 +- .../objects/items/weapons/extinguisher.dm | 2 +- .../objects/items/weapons/flamethrower.dm | 2 +- .../objects/items/weapons/grenades/grenade.dm | 4 +- .../items/weapons/implants/implantchair.dm | 2 +- .../items/weapons/implants/implantcircuits.dm | 2 +- .../items/weapons/implants/implanter.dm | 2 +- .../items/weapons/implants/implantpad.dm | 4 +- .../items/weapons/material/chainsaw.dm | 2 +- .../items/weapons/material/gravemarker.dm | 2 +- .../objects/items/weapons/material/knives.dm | 2 +- .../objects/items/weapons/material/misc.dm | 2 +- code/game/objects/items/weapons/melee/misc.dm | 8 +-- code/game/objects/items/weapons/mop.dm | 2 +- code/game/objects/items/weapons/mop_deploy.dm | 2 +- code/game/objects/items/weapons/nullrod.dm | 4 +- code/game/objects/items/weapons/other.dm | 6 +- code/game/objects/items/weapons/scrolls.dm | 2 +- code/game/objects/items/weapons/shields.dm | 6 +- code/game/objects/items/weapons/stunbaton.dm | 4 +- .../objects/items/weapons/swords_axes_etc.dm | 4 +- code/game/objects/items/weapons/syndie.dm | 2 +- .../game/objects/items/weapons/tanks/tanks.dm | 2 +- .../objects/items/weapons/teleportation.dm | 4 +- code/game/objects/items/weapons/towels.dm | 2 +- code/game/objects/items/weapons/traps.dm | 4 +- .../objects/items/weapons/weldbackpack.dm | 2 +- code/game/objects/misc.dm | 2 +- code/game/objects/structures.dm | 2 +- code/game/objects/structures/ashlander.dm | 4 +- code/game/objects/structures/bedsheet_bin.dm | 4 +- code/game/objects/structures/bonfire.dm | 4 +- code/game/objects/structures/catwalk.dm | 2 +- code/game/objects/structures/charge_pylon.dm | 2 +- code/game/objects/structures/coathanger.dm | 2 +- .../structures/crates_lockers/__closet.dm | 2 +- .../crates_lockers/closets/coffin.dm | 2 +- .../crates_lockers/closets/fireaxe.dm | 2 +- .../crates_lockers/closets/statue.dm | 2 +- .../crates_lockers/closets/walllocker.dm | 2 +- .../structures/crates_lockers/crates.dm | 2 +- .../structures/crates_lockers/largecrate.dm | 2 +- .../structures/crates_lockers/vehiclecage.dm | 2 +- code/game/objects/structures/curtains.dm | 2 +- code/game/objects/structures/extinguisher.dm | 2 +- code/game/objects/structures/fence.dm | 2 +- code/game/objects/structures/fireaxe.dm | 2 +- code/game/objects/structures/fitness.dm | 4 +- code/game/objects/structures/flora.dm | 4 +- code/game/objects/structures/flora/trees.dm | 2 +- .../structures/ghost_pods/ghost_pods.dm | 2 +- code/game/objects/structures/holoplant.dm | 2 +- code/game/objects/structures/janicart.dm | 4 +- .../objects/structures/kitchen_foodcart.dm | 2 +- code/game/objects/structures/kitchen_spike.dm | 2 +- code/game/objects/structures/loot_piles.dm | 2 +- .../objects/structures/medical_stand_vr.dm | 2 +- code/game/objects/structures/mineral_bath.dm | 2 +- code/game/objects/structures/mirror.dm | 2 +- code/game/objects/structures/morgue.dm | 8 +-- code/game/objects/structures/noticeboard.dm | 2 +- code/game/objects/structures/poster.dm | 2 +- .../objects/structures/props/beam_prism.dm | 4 +- code/game/objects/structures/props/nest.dm | 2 +- code/game/objects/structures/props/prop.dm | 2 +- .../objects/structures/props/puzzledoor.dm | 2 +- code/game/objects/structures/safe.dm | 2 +- code/game/objects/structures/simple_doors.dm | 2 +- code/game/objects/structures/snowman.dm | 2 +- code/game/objects/structures/stasis_cage.dm | 2 +- .../structures/stool_bed_chair_nest/bed.dm | 4 +- .../stool_bed_chair_nest/wheelchair.dm | 4 +- .../game/objects/structures/tank_dispenser.dm | 2 +- code/game/objects/structures/target_stake.dm | 2 +- code/game/objects/structures/transit_tubes.dm | 2 +- code/game/objects/structures/trash_pile.dm | 2 +- .../game/objects/structures/under_wardrobe.dm | 2 +- code/game/objects/structures/watercloset.dm | 10 ++-- code/game/rendering/screen_legacy.dm | 55 ++++--------------- code/game/turfs/simulated/floor_types/snow.dm | 2 +- .../simulated/flooring/flooring_traps.dm | 2 +- code/game/turfs/turf.dm | 2 +- code/modules/artifice/deadringer.dm | 2 +- code/modules/assembly/assembly.dm | 2 +- code/modules/assembly/holder.dm | 4 +- code/modules/assembly/igniter.dm | 2 +- code/modules/assembly/mousetrap.dm | 4 +- code/modules/assembly/shock_kit.dm | 2 +- code/modules/assembly/voice.dm | 2 +- .../binary_devices/algae_generator_vr.dm | 2 +- .../components/binary_devices/heat_pump.dm | 2 +- .../binary_devices/massive_gas_pump.dm | 2 +- .../binary_devices/massive_heat_pump.dm | 2 +- .../components/binary_devices/passive_gate.dm | 2 +- .../components/binary_devices/pump.dm | 2 +- .../components/binary_devices/valve.dm | 4 +- .../components/omni_devices/omni_base.dm | 2 +- .../components/trinary_devices/mixer.dm | 2 +- .../components/trinary_devices/tvalve.dm | 4 +- .../machinery/components/unary/cold_sink.dm | 2 +- .../machinery/components/unary/heat_source.dm | 2 +- .../components/unary/outlet_injector.dm | 2 +- .../machinery/portable/area_atmos_computer.dm | 2 +- .../machinery/portable/canister.dm | 2 +- .../awaymissions/bluespaceartillery.dm | 2 +- code/modules/awaymissions/gateway.dm | 4 +- code/modules/catalogue/cataloguer.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 8 +-- code/modules/clothing/glasses/hud.dm | 6 +- code/modules/clothing/gloves/miscellaneous.dm | 2 +- code/modules/clothing/gloves/rings/rings.dm | 6 +- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/head/helmet.dm | 6 +- code/modules/clothing/head/misc.dm | 4 +- code/modules/clothing/head/misc_special.dm | 6 +- code/modules/clothing/head/pilot_helmet.dm | 2 +- code/modules/clothing/head/soft_caps.dm | 2 +- code/modules/clothing/masks/breath.dm | 2 +- code/modules/clothing/masks/gasmask.dm | 4 +- code/modules/clothing/shoes/_shoes.dm | 4 +- code/modules/clothing/shoes/boots.dm | 2 +- code/modules/clothing/shoes/colour.dm | 2 +- code/modules/clothing/shoes/magboots.dm | 4 +- code/modules/clothing/spacesuits/void/void.dm | 2 +- code/modules/clothing/suits/armor.dm | 4 +- code/modules/clothing/suits/medieval_armor.dm | 4 +- .../clothing/under/accessories/accessory.dm | 8 +-- .../clothing/under/accessories/armor.dm | 2 +- .../clothing/under/accessories/badges.dm | 6 +- .../clothing/under/accessories/clothing.dm | 2 +- .../clothing/under/accessories/holster.dm | 2 +- .../clothing/under/accessories/lockets.dm | 2 +- .../clothing/under/accessories/permits.dm | 2 +- .../detectivework/microscope/dnascanner.dm | 2 +- .../detectivework/microscope/microscope.dm | 2 +- .../detectivework/tools/evidencebag.dm | 2 +- code/modules/detectivework/tools/rag.dm | 2 +- .../detectivework/tools/sample_kits.dm | 2 +- code/modules/detectivework/tools/uvlight.dm | 2 +- code/modules/economy/items/EFTPOS.dm | 2 +- code/modules/economy/items/cash.dm | 4 +- code/modules/economy/items/coins.dm | 2 +- code/modules/economy/items/retail_scanner.dm | 2 +- code/modules/economy/machines/ATM.dm | 2 +- code/modules/economy/machines/Accounts_DB.dm | 2 +- .../modules/economy/machines/cash_register.dm | 2 +- code/modules/economy/machines/mint.dm | 4 +- code/modules/economy/money_bag.dm | 2 +- code/modules/fishing/aquarium/aquarium_kit.dm | 2 +- code/modules/food/drinkingglass/extras.dm | 2 +- code/modules/food/drinks/bottle.dm | 2 +- code/modules/food/food/condiment.dm | 2 +- code/modules/food/food/drinks.dm | 2 +- code/modules/food/glass/bottle.dm | 2 +- .../food/machinery/appliance/_appliance.dm | 2 +- code/modules/food/machinery/gibber.dm | 2 +- code/modules/food/machinery/microwave.dm | 2 +- code/modules/food/machinery/smartfridge.dm | 2 +- code/modules/games/cards.dm | 8 +-- code/modules/games/dice.dm | 4 +- code/modules/hardsuits/pieces.dm | 2 +- code/modules/hardsuits/rig_attackby.dm | 2 +- code/modules/hardsuits/rig_pieces.dm | 2 +- code/modules/hardsuits/suits/ert.dm | 2 +- code/modules/holodeck/HolodeckControl.dm | 2 +- code/modules/holodeck/HolodeckObjects.dm | 4 +- code/modules/holomap/station_holomap.dm | 2 +- .../modules/hydroponics/beekeeping/beehive.dm | 4 +- code/modules/hydroponics/grown.dm | 2 +- code/modules/hydroponics/seed_machines.dm | 4 +- code/modules/hydroponics/seed_storage.dm | 2 +- .../hydroponics/spreading/spreading.dm | 2 +- .../spreading/spreading_response.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 2 +- code/modules/instruments/instruments/item.dm | 2 +- .../instruments/instruments/stationary.dm | 2 +- .../integrated_electronics/core/assemblies.dm | 2 +- .../core/assemblies/clothing.dm | 2 +- .../core/assemblies/device.dm | 2 +- .../integrated_electronics/core/detailer.dm | 2 +- .../integrated_electronics/core/printer.dm | 2 +- .../subtypes/manipulation.dm | 6 +- .../integrated_electronics/subtypes/memory.dm | 2 +- .../subtypes/reagents.dm | 2 +- .../integrated_electronics/subtypes/smart.dm | 4 +- code/modules/library/book.dm | 2 +- code/modules/library/lib_items.dm | 4 +- code/modules/library/lib_machines.dm | 6 +- code/modules/lore_codex/codex.dm | 2 +- .../maps/away_missions/archive/wildwest.dm | 2 +- .../maps/misc_maps/lavaland/_lavaland.dm | 4 +- code/modules/materials/material_sheets.dm | 4 +- code/modules/mining/drilling/drill.dm | 2 +- code/modules/mining/drilling/scanner.dm | 2 +- code/modules/mining/fulton.dm | 4 +- code/modules/mining/machine_processing.dm | 2 +- code/modules/mining/machine_stacking.dm | 2 +- code/modules/mining/mine_items.dm | 6 +- .../equipment_vendor.dm | 2 +- code/modules/mining/resonator.dm | 2 +- code/modules/mining/resonator_vr.dm | 2 +- code/modules/mining/shelter_atoms.dm | 4 +- code/modules/mining/vertibore.dm | 2 +- code/modules/mob/grab.dm | 2 +- code/modules/mob/living/bot/cleanbot.dm | 2 +- code/modules/mob/living/bot/farmbot.dm | 4 +- code/modules/mob/living/bot/floorbot.dm | 2 +- code/modules/mob/living/bot/medibot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 2 +- .../mob/living/carbon/alien/alien_attacks.dm | 2 +- code/modules/mob/living/carbon/brain/MMI.dm | 4 +- .../mob/living/carbon/brain/posibrain.dm | 2 +- code/modules/mob/living/carbon/brain/robot.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- .../living/carbon/human/human_attackhand.dm | 2 +- .../living/carbon/human/traits/weaver_objs.dm | 4 +- code/modules/mob/living/defense.dm | 2 +- .../silicon/robot/dogborg/dog_modules_vr.dm | 12 ++-- .../silicon/robot/dogborg/dog_sleeper_vr.dm | 2 +- .../silicon/robot/drone/drone_console.dm | 2 +- .../silicon/robot/drone/drone_manufacturer.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../mob/living/silicon/robot/robot_items.dm | 10 ++-- code/modules/mob/living/simple_mob/defense.dm | 2 +- .../subtypes/animal/farm animals/cow.dm | 2 +- .../subtypes/animal/passive/fish.dm | 2 +- .../subtypes/animal/passive/mouse.dm | 4 +- .../simple_mob/subtypes/animal/pets/cat.dm | 2 +- .../simple_mob/subtypes/animal/pets/parrot.dm | 2 +- .../living/simple_mob/subtypes/horror/Eddy.dm | 2 +- .../simple_mob/subtypes/horror/Master.dm | 2 +- .../simple_mob/subtypes/horror/Rickey.dm | 2 +- .../simple_mob/subtypes/horror/Smiley.dm | 2 +- .../simple_mob/subtypes/horror/Steve.dm | 2 +- .../simple_mob/subtypes/horror/Willy.dm | 2 +- .../simple_mob/subtypes/horror/bradley.dm | 2 +- .../simple_mob/subtypes/horror/sally.dm | 2 +- .../simple_mob/subtypes/horror/shittytim.dm | 2 +- .../simple_mob/subtypes/horror/timling.dm | 2 +- .../simple_mob/subtypes/illusion/illusion.dm | 2 +- .../living/simple_mob/subtypes/slime/slime.dm | 2 +- .../subtypes/slime/xenobio/defense.dm | 2 +- .../living/simple_mob/subtypes/vore/c_pet.dm | 4 +- .../living/simple_mob/subtypes/vore/otie.dm | 2 +- .../subtypes/vore/shadekin/shadekin.dm | 2 +- .../modular_computers/NTNet/NTNet_relay.dm | 2 +- .../computers/modular_computer/interaction.dm | 4 +- .../modular_computers/laptop_vendor.dm | 2 +- code/modules/multiz/structures/hoist.dm | 6 +- .../multiz/structures/vorestation_portals.dm | 2 +- code/modules/nifsoft/nifsoft.dm | 2 +- .../organs/internal/species/adherent.dm | 2 +- code/modules/organs/organ.dm | 2 +- .../modules/overmap/legacy/overmap_shuttle.dm | 2 +- .../legacy/ships/computers/computer_shims.dm | 2 +- .../overmap/legacy/ships/panicbutton.dm | 2 +- code/modules/paperwork/clipboard.dm | 2 +- code/modules/paperwork/faxmachine.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 6 +- code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/handlabeler.dm | 2 +- code/modules/paperwork/paper/paper.dm | 2 +- code/modules/paperwork/paper_bundle.dm | 2 +- code/modules/paperwork/paperbin.dm | 4 +- code/modules/paperwork/paperplane.dm | 2 +- code/modules/paperwork/photocopier.dm | 2 +- code/modules/paperwork/stamps.dm | 2 +- code/modules/photography/camera.dm | 2 +- code/modules/photography/photo.dm | 2 +- code/modules/power/antimatter/computer.dm | 2 +- code/modules/power/antimatter/control.dm | 2 +- code/modules/power/apc.dm | 2 +- code/modules/power/breaker_box.dm | 2 +- code/modules/power/fission/computer.dm | 2 +- code/modules/power/fission/engine.dm | 2 +- code/modules/power/fusion/core/_core.dm | 2 +- .../modules/power/fusion/core/core_control.dm | 2 +- .../fusion/fuel_assembly/fuel_control.dm | 2 +- .../fusion/fuel_assembly/fuel_injector.dm | 2 +- .../power/fusion/gyrotron/gyrotron_control.dm | 2 +- code/modules/power/generator.dm | 2 +- code/modules/power/generator_type2.dm | 2 +- code/modules/power/gravitygenerator.dm | 4 +- code/modules/power/grid_checker.dm | 2 +- code/modules/power/lighting/lighting.dm | 6 +- code/modules/power/port_gen.dm | 6 +- .../power/sensors/sensor_monitoring.dm | 2 +- .../power/singularity/containment_field.dm | 2 +- code/modules/power/singularity/emitter.dm | 2 +- .../power/singularity/field_generator.dm | 2 +- .../particle_accelerator/particle_control.dm | 2 +- code/modules/power/singularity/singularity.dm | 2 +- code/modules/power/smes/smes.dm | 2 +- code/modules/power/solar.dm | 4 +- code/modules/power/supermatter/supermatter.dm | 2 +- code/modules/power/tesla/coil.dm | 4 +- code/modules/power/turbine.dm | 4 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/energy.dm | 2 +- code/modules/projectiles/guns/energy/pulse.dm | 2 +- .../projectiles/guns/energy/sizegun_vr.dm | 2 +- .../projectiles/guns/energy/special.dm | 2 +- .../projectiles/guns/launcher/crossbow.dm | 2 +- .../guns/launcher/grenade_launcher.dm | 6 +- .../projectiles/guns/launcher/pneumatic.dm | 4 +- .../projectiles/guns/launcher/syringe_gun.dm | 6 +- .../modules/projectiles/guns/magnetic/bore.dm | 2 +- .../projectiles/guns/magnetic/magnetic.dm | 2 +- .../projectiles/guns/projectile/automatic.dm | 6 +- .../projectiles/guns/projectile/bow.dm | 4 +- .../projectiles/guns/projectile/contender.dm | 2 +- .../projectiles/guns/projectile/dartgun.dm | 2 +- .../projectiles/guns/projectile/rocket.dm | 4 +- .../projectiles/guns/projectile/shotgun.dm | 2 +- .../projectiles/guns/projectile/sniper.dm | 2 +- .../projectile/sniper/collapsible_sniper.dm | 2 +- .../modules/projectiles/magazines/magazine.dm | 4 +- .../modules/projectiles/magazines/smartmag.dm | 2 +- code/modules/random_map/drop/droppod_doors.dm | 2 +- code/modules/reagents/chemistry/machinery.dm | 2 +- .../modules/reagents/distilling/distilling.dm | 2 +- code/modules/reagents/items/hypospray.dm | 4 +- .../modules/reagents/machinery/chem_master.dm | 2 +- .../reagents/machinery/dispenser/cartridge.dm | 2 +- code/modules/reagents/reagent_containers.dm | 2 +- .../reagent_containers/blood_pack_vr.dm | 2 +- .../reagents/reagent_containers/borghydro.dm | 2 +- .../reagents/reagent_containers/glass.dm | 4 +- .../reagents/reagent_containers/hard_candy.dm | 2 +- .../reagents/reagent_containers/hypospray.dm | 4 +- .../reagents/reagent_containers/organic.dm | 4 +- .../reagents/reagent_containers/spray.dm | 6 +- .../reagents/reagent_containers/syringes.dm | 4 +- .../reagent_containers/syringes_vr.dm | 2 +- code/modules/recycling/conveyor2.dm | 6 +- code/modules/recycling/disposal.dm | 2 +- code/modules/recycling/sortingmachinery.dm | 6 +- code/modules/research/machinery/rdconsole.dm | 2 +- code/modules/research/machinery/server.dm | 2 +- code/modules/resleeving/computers.dm | 4 +- code/modules/resleeving/implant.dm | 2 +- code/modules/resleeving/infomorph.dm | 2 +- code/modules/resleeving/machines.dm | 4 +- code/modules/resleeving/mirror.dm | 2 +- code/modules/resleeving/sleevecard.dm | 2 +- code/modules/rogueminer_vr/zone_console.dm | 2 +- .../security levels/keycard authentication.dm | 2 +- code/modules/shieldgen/directional_shield.dm | 4 +- code/modules/shieldgen/energy_field.dm | 2 +- code/modules/shieldgen/energy_shield.dm | 2 +- code/modules/shieldgen/handheld_defuser.dm | 4 +- code/modules/shieldgen/sheldwallgen.dm | 4 +- code/modules/shieldgen/shield_capacitor.dm | 2 +- code/modules/shieldgen/shield_diffuser.dm | 2 +- code/modules/shieldgen/shield_gen.dm | 2 +- code/modules/shieldgen/shield_generator.dm | 2 +- code/modules/shuttles/landmarks.dm | 2 +- code/modules/shuttles/shuttle_console.dm | 2 +- .../species/xenomorphs/alien_facehugger.dm | 4 +- code/modules/spells/artifacts.dm | 8 +-- code/modules/spells/spellbook.dm | 2 +- code/modules/stockmarket/computer.dm | 2 +- code/modules/telesci/hyper_pad.dm | 4 +- code/modules/telesci/quantum_pad.dm | 2 +- code/modules/telesci/telesci_computer.dm | 2 +- code/modules/turbolift/turbolift_console.dm | 2 +- code/modules/vehicles/ridden/wheelchair.dm | 2 +- code/modules/vehicles_legacy/bike.dm | 2 +- code/modules/vehicles_legacy/skateboard.dm | 6 +- code/modules/vehicles_legacy/train.dm | 2 +- code/modules/virus2/curer.dm | 2 +- code/modules/virus2/diseasesplicer.dm | 2 +- code/modules/virus2/dishincubator.dm | 2 +- code/modules/virus2/isolator.dm | 2 +- code/modules/vore/eating/leave_remains_vr.dm | 2 +- code/modules/vore/fluffstuff/custom_guns.dm | 2 +- .../vore/fluffstuff/custom_items_cit.dm | 2 +- .../modules/vore/fluffstuff/guns/bsharpoon.dm | 2 +- .../guns/cell_loaded/cell_loaded.dm | 2 +- code/modules/vore/fluffstuff/guns/gunsword.dm | 2 +- code/modules/vore/resizing/holder_micro_vr.dm | 2 +- .../vore/weight/fitness_machines_vr.dm | 6 +- .../xenoarcheaology/anomaly_container.dm | 2 +- .../xenoarcheaology/artifacts/artifact.dm | 2 +- .../xenoarcheaology/artifacts/gigadrill.dm | 2 +- .../xenoarcheaology/artifacts/replicator.dm | 2 +- code/modules/xenoarcheaology/sampling.dm | 2 +- .../tools/ano_device_battery.dm | 2 +- .../tools/artifact_analyser.dm | 2 +- .../tools/artifact_harvester.dm | 2 +- .../tools/geosample_scanner.dm | 2 +- .../tools/suspension_generator.dm | 2 +- code/modules/xenoarcheaology/tools/tools.dm | 8 +-- .../xenoarcheaology/tools/tools_pickaxe.dm | 2 +- code/modules/xenobio/items/slime_objects.dm | 4 +- code/modules/xenobio/machinery/processor.dm | 2 +- .../xenobio2/machinery/core_extractor.dm | 2 +- .../xenobio2/machinery/gene_manipulators.dm | 4 +- .../xenobio2/machinery/injector_computer.dm | 2 +- .../xenobio2/machinery/slime_replicator.dm | 2 +- .../xenobio2/mob/slime/slime_monkey.dm | 2 +- maps/generic/misc.dm | 2 +- 598 files changed, 810 insertions(+), 843 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm index 2f3dc3f751bb..da56dd7dce01 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -37,7 +37,7 @@ ////#define COMPONENT_SKIP_ATTACK (1<<1) /// From base of atom/attack_ghost(): (mob/observer/dead/ghost) #define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" -/// From base of atom/attack_hand(mob/user, datum/event_args/clickchain/e_args): (mob/user, list/modifiers) +/// From base of atom/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args): (mob/user, list/modifiers) ////#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" /// From base of atom/attack_paw(): (mob/user) ////#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index f88662a47fc9..c58f1f9c4ee2 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -129,7 +129,7 @@ ////#define COMSIG_MOB_CLUMSY_SHOOT_FOOT "mob_clumsy_shoot_foot" /// From /obj/item/hand_item/slapper/attack_atom(): (source=obj/structure/table/slammed_table, mob/living/slammer) ////#define COMSIG_TABLE_SLAMMED "table_slammed" -/// From base of atom/attack_hand(mob/user, datum/event_args/clickchain/e_args): (mob/user, modifiers) +/// From base of atom/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args): (mob/user, modifiers) ////#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" /// From base of /obj/item/attack(): (mob/M, mob/user) ////#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" diff --git a/code/datums/event_args/clickchain.dm b/code/datums/event_args/clickchain.dm index eec295f67b39..25ba7f175e9a 100644 --- a/code/datums/event_args/clickchain.dm +++ b/code/datums/event_args/clickchain.dm @@ -3,7 +3,7 @@ * * clickchain is attack_x with item procs, attack hand, unarmed/ranged, etc. */ -/datum/event_args/clickchain +/datum/event_args/actor/clickchain /// the mob that initiated the action - you usually don't care about this unless you're logging var/mob/initiator /// the mob that is doing the action diff --git a/code/game/atoms/buckling.dm b/code/game/atoms/buckling.dm index aa2d4a7bf830..eba6ef060e57 100644 --- a/code/game/atoms/buckling.dm +++ b/code/game/atoms/buckling.dm @@ -6,7 +6,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return ..() -/atom/movable/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/atom/movable/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/click/mobs.dm b/code/game/click/mobs.dm index 29e447d1156f..327bdf5a272d 100644 --- a/code/game/click/mobs.dm +++ b/code/game/click/mobs.dm @@ -127,7 +127,7 @@ * construct default event args for what we're doing to a target */ /mob/proc/default_clickchain_event_args(atom/target, unarmed = FALSE) - var/datum/event_args/clickchain/constructed = new + var/datum/event_args/actor/clickchain/constructed = new constructed.initiator = src constructed.actor = src constructed.target = target diff --git a/code/game/click/other_mobs.dm b/code/game/click/other_mobs.dm index b985127ecefe..8e4d4c59f0ad 100644 --- a/code/game/click/other_mobs.dm +++ b/code/game/click/other_mobs.dm @@ -28,7 +28,7 @@ A.attack_hand(src) /// Return TRUE to cancel other attack hand effects that respect it. -/atom/proc/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/atom/proc/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(isnull(e_args)) e_args = user.default_clickchain_event_args(src, TRUE) if(on_attack_hand(e_args)) diff --git a/code/game/click/telekinesis.dm b/code/game/click/telekinesis.dm index b2cdd71cfa29..9d5c39a795bd 100644 --- a/code/game/click/telekinesis.dm +++ b/code/game/click/telekinesis.dm @@ -80,7 +80,7 @@ var/const/tk_maxrange = 15 if(slot != SLOT_ID_HANDS) qdel(src) -/obj/item/tk_grab/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tk_grab/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 51b82879eb71..7fd8de7c9530 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -300,7 +300,7 @@ src.add_hiddenprint(user) nano_ui_interact(user) -/obj/machinery/computer/scan_consolenew/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/scan_consolenew/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!..()) nano_ui_interact(user) diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm index 1a61bccb4b46..7f27be51e12a 100644 --- a/code/game/gamemodes/changeling/powers/armor.dm +++ b/code/game/gamemodes/changeling/powers/armor.dm @@ -67,7 +67,7 @@ encumbrance = ITEM_ENCUMBRANCE_CHANGELING_MAGBOOTS encumbrance_on = ITEM_ENCUMBRANCE_CHANGELING_MAGBOOTS_PULSE -/obj/item/clothing/shoes/magboots/changeling/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/shoes/magboots/changeling/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 83c3e7d3acb2..e798a0726f63 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -37,7 +37,7 @@ . = ..() START_PROCESSING(SSobj, src) -/obj/structure/cult/pylon/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/cult/pylon/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) attackpylon(user, 5) /obj/structure/cult/pylon/attack_generic(var/mob/user, var/damage) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index dc7b17a28fb4..705a3df8913c 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -101,7 +101,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," return -/obj/effect/rune/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/rune/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!ishuman(user)) return var/mob/living/carbon/human/H = user @@ -308,7 +308,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," O.show_message("\The [user] beats \the [L] with \the [src]!", 1) to_chat(target, "You feel searing heat inside!") -/obj/item/book/tome/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/book/tome/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -426,7 +426,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," w_class = WEIGHT_CLASS_SMALL var/cultistsonly = 1 -/obj/item/book/tome/imbued/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/book/tome/imbued/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/cult/soulstone.dm b/code/game/gamemodes/cult/soulstone.dm index a68e45f76896..2b25f61a7338 100644 --- a/code/game/gamemodes/cult/soulstone.dm +++ b/code/game/gamemodes/cult/soulstone.dm @@ -36,7 +36,7 @@ ///////////////////Options for using captured souls/////////////////////////////////////// -/obj/item/soulstone/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/soulstone/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index fe31eff92bad..8e5278e1fe3c 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -5,7 +5,7 @@ var/uses = 0 info = "


" -/obj/item/paper/talisman/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/paper/talisman/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 9598a34f40a5..c07ca93a10f6 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -13,7 +13,7 @@ var/active = 0 -/obj/item/pinpointer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pinpointer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -64,7 +64,7 @@ var/turf/location = null var/obj/target = null -/obj/item/pinpointer/advpinpointer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pinpointer/advpinpointer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -189,7 +189,7 @@ var/mode = 0 //Mode 0 locates disk, mode 1 locates the shuttle var/obj/machinery/computer/shuttle_control/multi/syndicate/home = null -/obj/item/pinpointer/nukeop/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pinpointer/nukeop/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -278,7 +278,7 @@ var/shuttle_comp_id = null var/obj/machinery/computer/shuttle_control/our_shuttle = null -/obj/item/pinpointer/shuttle/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pinpointer/shuttle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm index bd991f235ae4..11c4b9edf802 100644 --- a/code/game/gamemodes/technomancer/catalog.dm +++ b/code/game/gamemodes/technomancer/catalog.dm @@ -97,7 +97,7 @@ // Proc: attack_self() // Parameters: 1 (user - the mob clicking on the catalog) // Description: Shows an HTML window, to buy equipment and spells, if the user is the legitimate owner. Otherwise it cannot be used. -/obj/item/technomancer_catalog/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/technomancer_catalog/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm index 67e6ebb3d334..a2b147ee3f42 100644 --- a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm +++ b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm @@ -26,7 +26,7 @@ . = ..() . += "There are [uses] uses remaining." -/obj/item/disposable_teleporter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/disposable_teleporter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm index d0e7b2b326ec..3745ef881996 100644 --- a/code/game/gamemodes/technomancer/devices/shield_armor.dm +++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm @@ -73,7 +73,7 @@ playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) return 0 // This shield does not block all damage, so returning 0 is needed to tell the game to apply the new damage. -/obj/item/clothing/suit/armor/shield/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/suit/armor/shield/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/devices/tesla_armor.dm b/code/game/gamemodes/technomancer/devices/tesla_armor.dm index ef4837c3ca8c..95a8f87c925d 100644 --- a/code/game/gamemodes/technomancer/devices/tesla_armor.dm +++ b/code/game/gamemodes/technomancer/devices/tesla_armor.dm @@ -52,7 +52,7 @@ return 1 return 0 -/obj/item/clothing/suit/armor/tesla/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/suit/armor/tesla/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm index e3a43da08b1b..c9bb7581fd22 100644 --- a/code/game/gamemodes/technomancer/equipment.dm +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -193,7 +193,7 @@ slot_flags = SLOT_BELT attack_verb = list("beaten", "smashed", "struck", "whacked") -/obj/item/scepter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/scepter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index dccfcd88f996..66a5f70f23ca 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -206,7 +206,7 @@ // Proc: attack_self() // Parameters: 1 (user - the Technomancer that invoked this proc) // Description: Tries to call on_use_cast() if it is allowed to do so. Don't override this, override on_use_cast() instead. -/obj/item/spell/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/spell/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 36193d4bc333..c70604f40cd3 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -17,7 +17,7 @@ . = ..() layCable(new_turf,M_Dir) -/obj/machinery/cablelayer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/cablelayer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!cable&&!on) to_chat(user, SPAN_WARNING("\The [src] doesn't have any cable loaded.")) return diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index c33a648cb842..839932093016 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -41,7 +41,7 @@ if(prob(25)) density = 0 -/obj/machinery/optable/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/optable/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(MUTATION_HULK in usr.mutations) visible_message(SPAN_DANGER("\The [usr] destroys \the [src]!")) density = FALSE diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index fadb74741044..88b51467ac46 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -37,7 +37,7 @@ /obj/machinery/sleep_console/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/sleep_console/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/sleep_console/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return 1 diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index d1d2093ac78e..ad0d94a14d50 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -302,7 +302,7 @@ else return attack_hand(user) -/obj/machinery/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.a_intent == INTENT_HARM) return ..() if(IsAdminGhost(user)) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 38503833d1e2..9b2763e0ebe1 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -240,7 +240,7 @@ . = ..() return attack_hand(user) -/obj/machinery/body_scanconsole/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/body_scanconsole/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 5d4c4ba3da99..d7b7a582f8dc 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -57,7 +57,7 @@ /obj/machinery/ai_slipper/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/ai_slipper/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/ai_slipper/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return if((get_dist(src, user) > 1)) diff --git a/code/game/machinery/atm_ret_field.dm b/code/game/machinery/atm_ret_field.dm index c1ef5dd93df2..0fc30a711ba1 100644 --- a/code/game/machinery/atm_ret_field.dm +++ b/code/game/machinery/atm_ret_field.dm @@ -221,7 +221,7 @@ update_nearby_tiles() //Force ZAS update . = ..() -/obj/structure/atmospheric_retention_field/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/atmospheric_retention_field/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(density) visible_message("You touch the retention field, and it crackles faintly. Tingly!") else diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 601c6f0ec750..5e548e8bb2ea 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -86,7 +86,7 @@ radio_controller.remove_object(src, frequency) ..() -/obj/machinery/computer/general_air_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/general_air_control/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..(user)) return diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index a662262d5e98..b9a8ce78f739 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -125,7 +125,7 @@ . = ..() -/obj/machinery/organ_printer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/organ_printer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/bomb_tester.dm b/code/game/machinery/bomb_tester.dm index 75c2ab12d85e..935abaed349e 100644 --- a/code/game/machinery/bomb_tester.dm +++ b/code/game/machinery/bomb_tester.dm @@ -107,7 +107,7 @@ return ..() -/obj/machinery/bomb_tester/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/bomb_tester/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) ui_interact(user) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index c387632168a2..673b3de996f2 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -110,7 +110,7 @@ CREATE_WALL_MOUNTING_TYPES(/obj/machinery/camera) src.view_range = num GLOB.cameranet.updateVisibility(src, 0) -/obj/machinery/camera/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/camera/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/carbon/human/L = user if(!istype(L)) return diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 36d97f731a4b..2da823206971 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -145,7 +145,7 @@ else icon_state = "cameracase" -/obj/item/camera_assembly/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/camera_assembly/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!anchored) ..() diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index fc7475163aa1..4354571ba259 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -81,7 +81,7 @@ else if(default_part_replacement(user, W)) return -/obj/machinery/cell_charger/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/cell_charger/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(charging) @@ -145,7 +145,7 @@ w_class = WEIGHT_CLASS_NORMAL materials_base = list(MAT_STEEL = 4000, MAT_GLASS = 1000) -/obj/item/cell_charger_kit/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/cell_charger_kit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 95aefd4b56f8..dedd04adeb76 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -60,7 +60,7 @@ add_hiddenprint(user) return attack_hand(user) -/obj/machinery/clonepod/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/clonepod/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((isnull(occupant)) || (machine_stat & NOPOWER)) return if((!isnull(occupant)) && (occupant.stat != 2)) @@ -525,7 +525,7 @@ var/diskcolor = pick(0,1,2) icon_state = "datadisk[diskcolor]" -/obj/item/disk/data/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/disk/data/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index ce9520e86d91..853f74f96f03 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -48,7 +48,7 @@ return ui_interact(user) -/obj/machinery/computer/operating/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/operating/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/game/machinery/computer/RCON_Console.dm b/code/game/machinery/computer/RCON_Console.dm index 4525781d224e..68d751075a29 100644 --- a/code/game/machinery/computer/RCON_Console.dm +++ b/code/game/machinery/computer/RCON_Console.dm @@ -26,7 +26,7 @@ // Proc: attack_hand() // Parameters: 1 (user - Person which clicked this computer) // Description: Opens UI of this machine. -/obj/machinery/computer/rcon/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/rcon/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() ui_interact(user) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 19344890be4b..43b425dfcfa8 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -48,7 +48,7 @@ to_chat(user, SPAN_NOTICE("There is no AI loaded onto this computer, and no AI loaded onto [I]. What exactly are you trying to do here?")) return ..() -/obj/machinery/computer/aifixer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/aifixer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return ui_interact(user) diff --git a/code/game/machinery/computer/arcade/claw_machine.dm b/code/game/machinery/computer/arcade/claw_machine.dm index cf21427c1b69..30b76f6a3f66 100644 --- a/code/game/machinery/computer/arcade/claw_machine.dm +++ b/code/game/machinery/computer/arcade/claw_machine.dm @@ -160,7 +160,7 @@ /obj/machinery/computer/arcade/clawmachine/Initialize(mapload) . = ..() -/obj/machinery/computer/arcade/clawmachine/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/arcade/clawmachine/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index 0c03e81d6a8d..0a7bcf06d36a 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -506,7 +506,7 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events()) else . += SPAN_NOTICE("There's a little switch on the bottom. It's flipped up.") -/obj/item/orion_ship/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/orion_ship/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 016a4d961fa2..d0b1000e0724 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -19,7 +19,7 @@ var/global/list/minor_air_alarms = list() atmosphere_alarm.unregister_alarm(src) return ..() -/obj/machinery/computer/atmos_alert/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/atmos_alert/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /obj/machinery/computer/atmos_alert/ui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index bc2cd89f9960..edf5ecf561a9 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -33,7 +33,7 @@ /obj/machinery/computer/atmoscontrol/attack_ai(mob/user) ui_interact(user) -/obj/machinery/computer/atmoscontrol/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/atmoscontrol/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index ec7b27c84e50..b7630fc39d64 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -28,7 +28,7 @@ /obj/machinery/computer/security/ui_interact(mob/user, datum/tgui/ui = null) camera.ui_interact(user, ui) -/obj/machinery/computer/security/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/security/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 3d1d5c390c39..906da036bf0f 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -94,7 +94,7 @@ /obj/machinery/computer/cloning/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/cloning/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/cloning/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) add_fingerprint(user) diff --git a/code/game/machinery/computer/command/card.dm b/code/game/machinery/computer/command/card.dm index 32452b202c2d..d306d3bd22d5 100644 --- a/code/game/machinery/computer/command/card.dm +++ b/code/game/machinery/computer/command/card.dm @@ -97,7 +97,7 @@ /obj/machinery/computer/card/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/card/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/card/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return if(machine_stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index c8f7cfcca4b0..afe0b69ef650 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -296,7 +296,7 @@ /obj/machinery/computer/communications/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/communications/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/communications/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return if ((LEGACY_MAP_DATUM) && !(src.z in (LEGACY_MAP_DATUM).contact_levels)) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 3a7b5b353464..8c1265ef08e6 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -23,7 +23,7 @@ /obj/machinery/computer/crew/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/crew/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/crew/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 7c3651c8dd8a..63601b4ab0e3 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -35,7 +35,7 @@ ..() -/obj/machinery/computer/aiupload/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/aiupload/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & NOPOWER) to_chat(user, "The upload computer has no power!") return @@ -71,7 +71,7 @@ return ..() -/obj/machinery/computer/borgupload/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/borgupload/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat& NOPOWER) to_chat(user, "The upload computer has no power!") return diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 94e37d7911ae..5705c2a9dd3a 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -101,7 +101,7 @@ /obj/machinery/computer/med_data/attack_ai(user as mob) return attack_hand(user) -/obj/machinery/computer/med_data/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/med_data/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 34a9a25b70ed..b14ff4229d32 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -78,7 +78,7 @@ linkedServer = message_servers[1] return ..() -/obj/machinery/computer/message_monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/message_monitor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return if(!istype(user)) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 60bdb0bf0fd8..ee3abe342b34 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -46,7 +46,7 @@ /obj/machinery/computer/pod/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/pod/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/pod/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return @@ -142,7 +142,7 @@ title = "External Airlock Controls" req_access = list(ACCESS_FACTION_SYNDICATE) -/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access Denied") return diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 31940090fa63..e1acca8293c5 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -16,7 +16,7 @@ /obj/machinery/computer/prisoner/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/prisoner/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/prisoner/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm index 6dbbceb577a5..04726d584174 100644 --- a/code/game/machinery/computer/prisonshuttle.dm +++ b/code/game/machinery/computer/prisonshuttle.dm @@ -27,7 +27,7 @@ var/prison_shuttle_timeleft = 0 /obj/machinery/computer/prison_shuttle/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/prison_shuttle/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/prison_shuttle/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!src.allowed(user) && (!hacked)) to_chat(user, "Access Denied.") return diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 1040c49c4c31..db382db147eb 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -11,7 +11,7 @@ /obj/machinery/computer/robotics/attack_ai(var/mob/user as mob) ui_interact(user) -/obj/machinery/computer/robotics/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/robotics/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return if(machine_stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 96ffd0e1a4ab..70c3c201074d 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -87,7 +87,7 @@ /obj/machinery/computer/secure_data/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/secure_data/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/secure_data/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return add_fingerprint(user) diff --git a/code/game/machinery/computer/shutoff_monitor.dm b/code/game/machinery/computer/shutoff_monitor.dm index b14ca4124b87..d362c764390e 100644 --- a/code/game/machinery/computer/shutoff_monitor.dm +++ b/code/game/machinery/computer/shutoff_monitor.dm @@ -15,7 +15,7 @@ QDEL_NULL(monitor) ..() -/obj/machinery/computer/shutoff_monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/shutoff_monitor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() monitor.ui_interact(user) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 8c7b7d976738..de865888aaab 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -65,7 +65,7 @@ return attack_hand(user) //Someone needs to break down the dat += into chunks instead of long ass lines. -/obj/machinery/computer/skills/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/skills/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return if ((LEGACY_MAP_DATUM) && !(src.z in (LEGACY_MAP_DATUM).contact_levels)) diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm index a2011ddd404d..a9d77be0d924 100644 --- a/code/game/machinery/computer/specops_shuttle.dm +++ b/code/game/machinery/computer/specops_shuttle.dm @@ -255,7 +255,7 @@ var/specops_shuttle_timeleft = 0 /obj/machinery/computer/specops_shuttle/emag_act(var/remaining_charges, var/mob/user) to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals.") -/obj/machinery/computer/specops_shuttle/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/specops_shuttle/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access Denied.") return diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index ccbc8e8ca414..4f0ad22ba130 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -34,7 +34,7 @@ ui_interact(user) return -/obj/machinery/computer/station_alert/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/station_alert/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/machinery/computer/supermatter_monitor_tgui.dm b/code/game/machinery/computer/supermatter_monitor_tgui.dm index 85d72ce850b8..6aaf789af6bc 100644 --- a/code/game/machinery/computer/supermatter_monitor_tgui.dm +++ b/code/game/machinery/computer/supermatter_monitor_tgui.dm @@ -17,7 +17,7 @@ /obj/machinery/computer/sm_monitor/attack_ai(mob/user) ui_interact(user) -/obj/machinery/computer/sm_monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/sm_monitor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/computer/supply.dm b/code/game/machinery/computer/supply.dm index 64b508265f17..d953b4490633 100644 --- a/code/game/machinery/computer/supply.dm +++ b/code/game/machinery/computer/supply.dm @@ -35,7 +35,7 @@ /obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob) return attack_hand(user) -/obj/machinery/computer/supplycomp/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/supplycomp/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return if(!allowed(user)) diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm index 1b180cf54eca..306a44b3afff 100644 --- a/code/game/machinery/computer/syndicate_specops_shuttle.dm +++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm @@ -191,7 +191,7 @@ var/syndicate_elite_shuttle_timeleft = 0 /obj/machinery/computer/syndicate_elite_shuttle/emag_act(var/remaining_charges, var/mob/user) to_chat(user, "The electronic systems in this console are far too advanced for your primitive hacking peripherals.") -/obj/machinery/computer/syndicate_elite_shuttle/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/syndicate_elite_shuttle/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access Denied.") return diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index 003c7986b8bf..55f5bf30f726 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -65,7 +65,7 @@ return . = ..() -/obj/machinery/computer/timeclock/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/timeclock/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return user.set_machine(src) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 199f2166aab8..6f4ef4ab70b5 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -82,7 +82,7 @@ if(occupant == user && !user.stat) go_out() -/obj/machinery/atmospherics/component/unary/cryo_cell/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/unary/cryo_cell/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) nano_ui_interact(user) /** diff --git a/code/game/machinery/deployable_vr.dm b/code/game/machinery/deployable_vr.dm index 30a8fc76252d..3b50fc26d7c7 100644 --- a/code/game/machinery/deployable_vr.dm +++ b/code/game/machinery/deployable_vr.dm @@ -63,7 +63,7 @@ . = ..() untopple() -/obj/structure/barricade/cutout/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/barricade/cutout/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((. = ..())) return diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 5fb461c1b194..7280a965dcc8 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -34,7 +34,7 @@ playsound(src.loc, /datum/soundbyte/grouped/sparks, 100, TRUE) return 1 -/obj/machinery/button/remote/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/button/remote/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/doorbell_vr.dm b/code/game/machinery/doorbell_vr.dm index 3d223d562b12..c2bd4e3c45ed 100644 --- a/code/game/machinery/doorbell_vr.dm +++ b/code/game/machinery/doorbell_vr.dm @@ -111,7 +111,7 @@ else icon_state = "doorbell-standby" -/obj/machinery/button/doorbell/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/button/doorbell/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(..()) return diff --git a/code/game/machinery/doors/airlock/airlock.dm b/code/game/machinery/doors/airlock/airlock.dm index d7852784b112..b22fe05d3703 100644 --- a/code/game/machinery/doors/airlock/airlock.dm +++ b/code/game/machinery/doors/airlock/airlock.dm @@ -645,7 +645,7 @@ About the new airlock wires panel: last_spark = world.time return ..() -/obj/machinery/door/airlock/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/door/airlock/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!istype(usr, /mob/living/silicon)) if(src.isElectrified()) if(src.shock(user, 100)) diff --git a/code/game/machinery/doors/airlock/airlock_control.dm b/code/game/machinery/doors/airlock/airlock_control.dm index da7fd33b4546..523b58be7a9a 100644 --- a/code/game/machinery/doors/airlock/airlock_control.dm +++ b/code/game/machinery/doors/airlock/airlock_control.dm @@ -176,7 +176,7 @@ else icon_state = "airlock_sensor_off" -/obj/machinery/airlock_sensor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/airlock_sensor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/datum/signal/signal = new signal.transmission_method = TRANSMISSION_RADIO //radio signal signal.data["tag"] = master_tag @@ -280,7 +280,7 @@ return ..() -/obj/machinery/access_button/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/access_button/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() if(!allowed(user)) to_chat(user, "Access Denied") diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index a87cac35ab16..0e7fa26bc677 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -116,7 +116,7 @@ //Proc: attack_hand //Description: Attacked with empty hand. Only to allow special attack_bys. -/obj/machinery/door/blast/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/door/blast/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/X = user if(istype(X.species, /datum/species/xenos)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 0ce5be52f677..5ae7ae0ddae8 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -163,7 +163,7 @@ /obj/machinery/door/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/door/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/door/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.a_intent == INTENT_HARM) return ..() return src.attackby(user, user) diff --git a/code/game/machinery/doors/door_timer.dm b/code/game/machinery/doors/door_timer.dm index 31f1c4ef1b9a..cd5690419e7b 100644 --- a/code/game/machinery/doors/door_timer.dm +++ b/code/game/machinery/doors/door_timer.dm @@ -160,7 +160,7 @@ /obj/machinery/door_timer/attack_ai(mob/user) return src.attack_hand(user) -/obj/machinery/door_timer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/door_timer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d50e5702c145..df47d457eccd 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -170,7 +170,7 @@ GLOBAL_LIST_INIT(firelock_align_types, typecacheof(list( attack_hand(M) return 0 -/obj/machinery/door/firedoor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/door/firedoor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(operating) return//Already doing something. diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 88d8183b4118..137e78cdbbbf 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -48,7 +48,7 @@ /obj/machinery/embedded_controller/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/embedded_controller/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/embedded_controller/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!user.IsAdvancedToolUser()) return 0 diff --git a/code/game/machinery/event.dm b/code/game/machinery/event.dm index 2b73eeea0451..8fc316d2498f 100644 --- a/code/game/machinery/event.dm +++ b/code/game/machinery/event.dm @@ -65,7 +65,7 @@ The goal here is to create esoteric or niche, specialized machines that follow t else return -/obj/machinery/magma_pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/magma_pump/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) interact(user) /obj/machinery/magma_pump/interact(mob/user) @@ -211,7 +211,7 @@ The goal here is to create esoteric or niche, specialized machines that follow t else return -/obj/machinery/magma_reservoir/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/magma_reservoir/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) interact(user) /obj/machinery/magma_reservoir/interact(mob/user) diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm index 829cdc1d26f4..ac1e50634956 100644 --- a/code/game/machinery/exonet_node.dm +++ b/code/game/machinery/exonet_node.dm @@ -103,7 +103,7 @@ GLOBAL_LIST_EMPTY(exonet_nodes) // Proc: attack_hand() // Parameters: 1 (user - the person clicking on the machine) // Description: Opens the TGUI interface with ui_interact() -/obj/machinery/exonet_node/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/exonet_node/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) // Proc: ui_interact() diff --git a/code/game/machinery/fire_alarm.dm b/code/game/machinery/fire_alarm.dm index 23de09089c56..eeab7198023d 100644 --- a/code/game/machinery/fire_alarm.dm +++ b/code/game/machinery/fire_alarm.dm @@ -182,7 +182,7 @@ CREATE_WALL_MOUNTING_TYPES_SHIFTED(/obj/machinery/fire_alarm/alarms_hidden, 21) spawn(rand(0,15)) update_icon() -/obj/machinery/fire_alarm/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/fire_alarm/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER | BROKEN)) return @@ -301,7 +301,7 @@ Just a object used in constructing fire alarms idle_power_usage = 2 active_power_usage = 6 -/obj/machinery/partyalarm/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/partyalarm/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 3913d36f5f88..5f789468ae0a 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -129,7 +129,7 @@ name = "flasher button" desc = "A remote control switch for a mounted flasher." -/obj/machinery/button/flasher/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/button/flasher/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index e69f40624802..24615b75e834 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -66,7 +66,7 @@ if(!turn_on(TRUE)) to_chat(user, "You try to turn on \the [src] but it does not work.") -/obj/machinery/floodlight/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/floodlight/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(open && cell) user.grab_item_from_interacted_with(cell, src) diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index 3fe97dc79069..6975c0a4f182 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -62,7 +62,7 @@ var/list/floor_light_cache = list() attack_hand(user) return -/obj/machinery/floor_light/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/floor_light/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.a_intent == INTENT_HARM && !issmall(user)) if(!isnull(damaged) && !(machine_stat & BROKEN)) diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index 0f204b0b2156..c52162902c1c 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -32,7 +32,7 @@ old_turf = isturf(loc)? loc : null -/obj/machinery/floorlayer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/floorlayer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) on=!on user.visible_message( \ SPAN_NOTICE("[user] has [!on?"de":""]activated \the [src]."), \ diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 8c5de02521e1..7b28e9b6766d 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -59,7 +59,7 @@ icon = 'icons/obj/power.dmi' icon_state = "crema_switch" -/obj/machinery/button/holosign/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/button/holosign/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index e852ad1a01ab..21b86283ba57 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -13,7 +13,7 @@ /obj/machinery/igniter/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/igniter/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/igniter/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return @@ -121,7 +121,7 @@ name = "ignition switch" desc = "A remote control switch for a mounted igniter." -/obj/machinery/button/ignition/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/button/ignition/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e957801bfff0..eff0cc92ec10 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -166,7 +166,7 @@ else return ..() -/obj/machinery/iv_drip/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/iv_drip/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(reagent_container) reagent_container.loc = get_turf(src) reagent_container = null diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index ece9f8339bd0..0d687a25a999 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -273,7 +273,7 @@ /obj/machinery/media/jukebox/attack_ai(mob/user) return src.attack_hand(user) -/obj/machinery/media/jukebox/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/media/jukebox/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) interact(user) /obj/machinery/media/jukebox/proc/explode() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 5fcaa7a6799c..4a44849248b9 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -52,7 +52,7 @@ /obj/machinery/light_switch/examine(mob/user, dist) . += SPAN_NOTICE("A light switch. It is [on? "on" : "off"].") -/obj/machinery/light_switch/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/light_switch/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) on = !on diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index db6d67a74fd5..368edb2eda25 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -251,7 +251,7 @@ /obj/machinery/magnetic_controller/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/magnetic_controller/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/magnetic_controller/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return user.set_machine(src) diff --git a/code/game/machinery/misc/bioscan_antenna.dm b/code/game/machinery/misc/bioscan_antenna.dm index b6bb6216aba2..6f6b1360e0fb 100644 --- a/code/game/machinery/misc/bioscan_antenna.dm +++ b/code/game/machinery/misc/bioscan_antenna.dm @@ -55,7 +55,7 @@ GLOBAL_LIST_EMPTY(bioscan_antenna_list) .[TOOL_MULTITOOL] = "change network" return merge_double_lazy_assoc_list(., ..()) -/obj/machinery/bioscan_antenna/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/bioscan_antenna/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // todo: better xenomorphs if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index e79a6cd38904..4cae517a38e7 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -100,7 +100,7 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w /obj/machinery/navbeacon/attack_ai(var/mob/user) interact(user, 1) -/obj/machinery/navbeacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/navbeacon/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!user.IsAdvancedToolUser()) return FALSE diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 7ce1c9cf1c39..726ab8db6ac6 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -250,7 +250,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/newscaster/attack_hand(mob/user, datum/event_args/clickchain/e_args) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ +/obj/machinery/newscaster/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ if(!ispowered || isbroken) return @@ -811,7 +811,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' -/obj/item/newspaper/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/newspaper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index bc35cd8d04cf..dd12cea99892 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -162,7 +162,7 @@ var/bomb_set return ..() -/obj/machinery/nuclearbomb/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/nuclearbomb/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(extended) if(!ishuman(user)) to_chat(user, "You don't have the dexterity to do this!") diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 1b6bfa5a2d38..ff3365d1385d 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -51,7 +51,7 @@ attach_mask(target) src.add_fingerprint(usr) -/obj/machinery/oxygen_pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/oxygen_pump/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((machine_stat & MAINT) && tank) user.visible_message( \ SPAN_NOTICE("\The [user] removes \the [tank] from \the [src]."), \ diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm index c4ea42b94f7b..7273710bbf41 100644 --- a/code/game/machinery/pda_multicaster.dm +++ b/code/game/machinery/pda_multicaster.dm @@ -46,7 +46,7 @@ /obj/machinery/pda_multicaster/attack_ai(mob/user) attack_hand(user) -/obj/machinery/pda_multicaster/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/pda_multicaster/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) toggle_power(user) /obj/machinery/pda_multicaster/proc/toggle_power(mob/user) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 66823929b2c6..d09f52eef37d 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -159,7 +159,7 @@ Buildable meters if(dir in GLOB.cornerdirs) setDir(turn(dir, 45)) -/obj/item/pipe/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pipe/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 2ede0ed0e4d5..d57a31842dc0 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -11,7 +11,7 @@ var/disposals = FALSE -/obj/machinery/pipedispenser/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/pipedispenser/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((. = ..())) return ui_interact(user) diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index 60db18cbaf90..862e003df3cc 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -39,7 +39,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) ui = new(user, src, "PointDefenseControl") // 400, 600 ui.open() -/obj/machinery/pointdefense_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/pointdefense_control/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 9f0bbe7fd0ce..05fdd752e41e 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -445,7 +445,7 @@ nano_ui_interact(user) -/obj/machinery/porta_turret/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/porta_turret/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(isLocked(user)) return @@ -1093,7 +1093,7 @@ ..() -/obj/machinery/porta_turret_construct/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/porta_turret_construct/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) switch(build_step) if(4) if(!installation) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 79ec89de3661..11cfb14ba122 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -100,7 +100,7 @@ else if(default_part_replacement(user, G)) return -/obj/machinery/recharger/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/recharger/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(istype(user,/mob/living/silicon)) return diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm index cde0100d7846..6c1ac78a9fe3 100644 --- a/code/game/machinery/records_scanner.dm +++ b/code/game/machinery/records_scanner.dm @@ -36,7 +36,7 @@ obj/machinery/scanner else icon_state = "scanner_idle" -obj/machinery/scanner/attack_hand(mob/user, datum/event_args/clickchain/e_args) +obj/machinery/scanner/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(stat & NOPOWER) return if(!ishuman(user) || lastuser == user.real_name) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 562282246392..3f7b01c32662 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -119,7 +119,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() req_console_information -= department return ..() -/obj/machinery/requests_console/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/requests_console/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..(user)) return nano_ui_interact(user) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 5f91f88f2006..db83fa729ff1 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -74,7 +74,7 @@ ..() return -/obj/machinery/space_heater/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/space_heater/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) interact(user) /obj/machinery/space_heater/interact(mob/user as mob) @@ -230,7 +230,7 @@ return ..() -/obj/machinery/power/thermoregulator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/thermoregulator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/game/machinery/suit_storage/suit_cycler.dm b/code/game/machinery/suit_storage/suit_cycler.dm index 8c63a5bd16b6..e17e8357b43f 100644 --- a/code/game/machinery/suit_storage/suit_cycler.dm +++ b/code/game/machinery/suit_storage/suit_cycler.dm @@ -260,7 +260,7 @@ updateUsrDialog() return 1 -/obj/machinery/suit_cycler/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/suit_cycler/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) diff --git a/code/game/machinery/suit_storage/suit_storage_massive.dm b/code/game/machinery/suit_storage/suit_storage_massive.dm index 66bc2f2d7b4a..773e6ab6e280 100644 --- a/code/game/machinery/suit_storage/suit_storage_massive.dm +++ b/code/game/machinery/suit_storage/suit_storage_massive.dm @@ -65,7 +65,7 @@ dump_everything() qdel(src) -/obj/machinery/suit_storage_closet/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/suit_storage_closet/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return if(machine_stat & NOPOWER) diff --git a/code/game/machinery/suit_storage/suit_storage_unit.dm b/code/game/machinery/suit_storage/suit_storage_unit.dm index 72abfa3e744e..cb80c6ff01f4 100644 --- a/code/game/machinery/suit_storage/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage/suit_storage_unit.dm @@ -78,7 +78,7 @@ dump_everything() qdel(src) -/obj/machinery/suit_storage_unit/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/suit_storage_unit/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return if(machine_stat & NOPOWER) diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index d0505f961a35..34f5e0825c8b 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -11,7 +11,7 @@ name = "inactive supermatter supply beacon" deploy_path = /obj/machinery/power/supply_beacon/supermatter -/obj/item/supply_beacon/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/supply_beacon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -57,7 +57,7 @@ return return ..() -/obj/machinery/power/supply_beacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/supply_beacon/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(expended) update_use_power(USE_POWER_OFF) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index cf4c3e21ac52..481d8d39008f 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -15,7 +15,7 @@ var/selfdestructing = FALSE var/charges = 1 -/obj/machinery/syndicate_beacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/syndicate_beacon/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) usr.set_machine(src) var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) @@ -108,7 +108,7 @@ /obj/machinery/power/singularity_beacon/attack_ai(mob/user) return -/obj/machinery/power/singularity_beacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/singularity_beacon/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(anchored) return active ? Deactivate(user) : Activate(user) else @@ -159,7 +159,7 @@ //! ## VR FILE MERGE ## !// // Virgo modified syndie beacon, does not give objectives -/obj/machinery/syndicate_beacon/virgo/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/syndicate_beacon/virgo/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) usr.set_machine(src) var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) diff --git a/code/game/machinery/telecomms/_telecomms.dm b/code/game/machinery/telecomms/_telecomms.dm index 76b3f04e9894..65a6994ea967 100644 --- a/code/game/machinery/telecomms/_telecomms.dm +++ b/code/game/machinery/telecomms/_telecomms.dm @@ -363,7 +363,7 @@ return UI_CLOSE . = ..() -/obj/machinery/telecomms/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/telecomms/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /obj/machinery/telecomms/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 5ff49231a15f..a6673e2ed6de 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -62,7 +62,7 @@ return data -/obj/machinery/computer/telecomms/server/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/telecomms/server/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/game/machinery/telecomms/message_server.dm b/code/game/machinery/telecomms/message_server.dm index 4f3a91aad945..3f5bcda9869d 100644 --- a/code/game/machinery/telecomms/message_server.dm +++ b/code/game/machinery/telecomms/message_server.dm @@ -140,7 +140,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() Console.set_light(2) -/obj/machinery/message_server/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/message_server/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // to_chat(user, "There seem to be some parts missing from this server. They should arrive on the station in a few days, give or take a few CentCom delays.") to_chat(user, "You toggle PDA message passing from [active ? "On" : "Off"] to [active ? "Off" : "On"]") active = !active diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index f5a0876794a5..ddf0bc204dd3 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -50,7 +50,7 @@ return data -/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/game/machinery/teleporter/console.dm b/code/game/machinery/teleporter/console.dm index 08101115adf2..71aa5f335f4c 100644 --- a/code/game/machinery/teleporter/console.dm +++ b/code/game/machinery/teleporter/console.dm @@ -86,7 +86,7 @@ return -/obj/machinery/computer/teleporter/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/teleporter/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /obj/machinery/computer/teleporter/ui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) diff --git a/code/game/machinery/teleporter/projector.dm b/code/game/machinery/teleporter/projector.dm index 8f716b6f7c0b..a0112bcb399c 100644 --- a/code/game/machinery/teleporter/projector.dm +++ b/code/game/machinery/teleporter/projector.dm @@ -182,7 +182,7 @@ /obj/machinery/tele_projector/attack_ai() attack_hand() -/obj/machinery/tele_projector/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/tele_projector/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(engaged) disengage() else diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index c9090a18b305..b163c6a66656 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -118,7 +118,7 @@ nano_ui_interact(user) -/obj/machinery/turretid/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/turretid/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(isLocked(user)) return diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 79d98b6d8a2c..4815c98be19d 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -23,7 +23,7 @@ return ..() -/obj/item/frame/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/frame/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index fac527401a76..7c0232aa5b14 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -120,7 +120,7 @@ ..() update_icon() -/obj/machinery/washing_machine/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/washing_machine/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) switch(state) if(1) state = 2 diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index c280619fabf2..c233bd51cdf3 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -9,7 +9,7 @@ var/charges = 1 var/insisting = 0 -/obj/machinery/wish_granter/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/wish_granter/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) usr.set_machine(src) if(charges <= 0) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 4d05d00b405f..7f60100af54c 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -483,7 +483,7 @@ get_asset_datum(/datum/asset/spritesheet/materials) ) -/obj/machinery/mecha_part_fabricator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/mecha_part_fabricator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return if(!allowed(user)) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index fbdeca13c4de..46b12cb35bae 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1003,7 +1003,7 @@ qdel(src) return -/obj/mecha/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/mecha/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user == occupant) show_radial_occupant(user) return diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 98d33a61956f..8160f9044e65 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -13,7 +13,7 @@ /obj/machinery/computer/mecha/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/computer/mecha/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/mecha/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index c11b1bad483d..22f7f2c7407c 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -22,7 +22,7 @@ ..() return -/obj/item/mecha_parts/chassis/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mecha_parts/chassis/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return //! Ripley @@ -467,7 +467,7 @@ ..() return -/obj/item/mecha_parts/fighter/chassis/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mecha_parts/fighter/chassis/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return diff --git a/code/game/mecha/micro/mecha_parts_vr.dm b/code/game/mecha/micro/mecha_parts_vr.dm index ba41574eb804..6b361fa23c4d 100644 --- a/code/game/mecha/micro/mecha_parts_vr.dm +++ b/code/game/mecha/micro/mecha_parts_vr.dm @@ -17,7 +17,7 @@ ..() return -/obj/item/mecha_parts/micro/chassis/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mecha_parts/micro/chassis/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return //Gopher diff --git a/code/game/objects/effects/debris/cleanable/misc.dm b/code/game/objects/effects/debris/cleanable/misc.dm index 593d63786911..41866828989a 100644 --- a/code/game/objects/effects/debris/cleanable/misc.dm +++ b/code/game/objects/effects/debris/cleanable/misc.dm @@ -15,7 +15,7 @@ icon_state = "ash" anchored = 1 -/obj/effect/debris/cleanable/ash/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/debris/cleanable/ash/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) to_chat(user, "[src] sifts through your fingers.") var/turf/simulated/floor/F = get_turf(src) if (istype(F)) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index fbc54ee3fbbc..f247e231f413 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -223,7 +223,7 @@ var/countdown = 10 var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime. -/obj/item/mine/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mine/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 1afa3360c20f..96bddcaee7fe 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -21,7 +21,7 @@ GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal) . = ..() teleport(AM) -/obj/effect/portal/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/portal/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(istype(user) && !(istype(user,/mob/living))) return //do not send ghosts, zshadows, ai eyes, etc spawn(0) diff --git a/code/game/objects/items/antag_spawners.dm b/code/game/objects/items/antag_spawners.dm index 13ba9f7cbf6e..239bb2749d7c 100644 --- a/code/game/objects/items/antag_spawners.dm +++ b/code/game/objects/items/antag_spawners.dm @@ -48,7 +48,7 @@ icon_state = "oldshieldoff" ghost_query_type = /datum/ghost_query/apprentice -/obj/item/antag_spawner/technomancer_apprentice/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/antag_spawner/technomancer_apprentice/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -97,7 +97,7 @@ ghost_query_type = /datum/ghost_query/syndicate_drone var/drone_type = null -/obj/item/antag_spawner/syndicate_drone/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/antag_spawner/syndicate_drone/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/balls.dm b/code/game/objects/items/balls.dm index c44cd4d108c7..16eee008ea05 100644 --- a/code/game/objects/items/balls.dm +++ b/code/game/objects/items/balls.dm @@ -27,7 +27,7 @@ 'sound/items/toysqueak3.ogg' ) -/obj/item/toy/tennis/rainbow/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/toy/tennis/rainbow/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/bells.dm b/code/game/objects/items/bells.dm index a9a3a1ba4e0a..8443e530eb05 100644 --- a/code/game/objects/items/bells.dm +++ b/code/game/objects/items/bells.dm @@ -18,7 +18,7 @@ if(broken) . += "It looks damaged, the ringer is stuck firmly inside." -/obj/item/deskbell/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/deskbell/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) //This defines the radials and what call we're assiging to them. var/list/options = list() diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index b72528ddcb87..e3f93fa99680 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -46,7 +46,7 @@ var/can_expand_areas_into = AREA_SPACE // Can expand station areas only into space. var/can_rename_areas_in = AREA_STATION // Only station areas can be reanamed -/obj/item/blueprints/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/blueprints/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm index d329ab9ab0e9..4b904e015e60 100644 --- a/code/game/objects/items/contraband.dm +++ b/code/game/objects/items/contraband.dm @@ -49,7 +49,7 @@ item_state = "table_parts" w_class = WEIGHT_CLASS_HUGE -/obj/item/stolenpackage/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/stolenpackage/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -177,7 +177,7 @@ item_state = "table_parts" w_class = WEIGHT_CLASS_HUGE -/obj/item/stolenpackageplus/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/stolenpackageplus/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 7589e4cc3366..dc4a5a78771c 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -322,7 +322,7 @@ GLOBAL_LIST_EMPTY(PDAs) return 1 -/obj/item/pda/ai/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pda/ai/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -674,7 +674,7 @@ GLOBAL_LIST_EMPTY(PDAs) ui.set_auto_update(auto_update) //NOTE: graphic resources are loaded on client login -/obj/item/pda/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pda/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 32e07876fa74..5ae1532eddd4 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -21,7 +21,7 @@ to_chat(user, "ERROR ERROR ERROR") return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/item/aicard/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/aicard/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index d7e352d145b5..60a03f9dc019 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -12,7 +12,7 @@ //materials_base = list("metal" = 50, MAT_GLASS = 50) -/obj/item/binoculars/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/binoculars/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/body_snatcher_vr.dm b/code/game/objects/items/devices/body_snatcher_vr.dm index da0876c06d95..69fc9f8be11b 100644 --- a/code/game/objects/items/devices/body_snatcher_vr.dm +++ b/code/game/objects/items/devices/body_snatcher_vr.dm @@ -67,7 +67,7 @@ else to_chat(user," A warning pops up on the LED display on the side of the device, informing you that the target is not able to have their mind swapped with!") -/obj/item/bodysnatcher/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/bodysnatcher/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index cd55ab913b66..adab5bdb35ef 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -24,7 +24,7 @@ . = ..() disrupt() -/obj/item/chameleon/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/chameleon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -110,7 +110,7 @@ to_chat(M, "Your chameleon-projector deactivates.") master.disrupt() -/obj/effect/dummy/chameleon/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/dummy/chameleon/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) for(var/mob/M in src) to_chat(M, "Your chameleon-projector deactivates.") master.disrupt() diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 1f1c1389fefc..abf8f0c3ec74 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -218,7 +218,7 @@ var/global/list/obj/item/communicator/all_communicators = list() // Parameters: 1 (user - the mob that clicked the device in their hand) // Description: Makes an exonet datum if one does not exist, allocates an address for it, maintains the lists of all devies, clears the alert icon, and // finally makes NanoUI appear. -/obj/item/communicator/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/communicator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 80f47af73382..9ae8cb8268bd 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -66,7 +66,7 @@ /obj/item/defib_kit/ui_action_click() toggle_paddles() -/obj/item/defib_kit/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/defib_kit/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(loc == user) toggle_paddles() else diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index cb6613536a77..381d0e7835a9 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -100,7 +100,7 @@ new painting_decal(F, painting_dir, painting_colour) -/obj/item/floor_painter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/floor_painter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index e25ecfb32496..4c014176aae8 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -131,7 +131,7 @@ current_tick_amount += amount update_appearance() -/obj/item/geiger_counter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/geiger_counter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 80083231e2a9..60aca305d912 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -161,7 +161,7 @@ update_icon() visible_message(SPAN_WARNING("[src] clicks, resetting itself from the electromagnetic interference.")) -/obj/item/gps/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gps/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm index fa00d77d43fb..8a7cdc9001d8 100644 --- a/code/game/objects/items/devices/holowarrant.dm +++ b/code/game/objects/items/devices/holowarrant.dm @@ -22,7 +22,7 @@ to_chat(user, "You have to go closer if you want to read it.") //hit yourself with it -/obj/item/holowarrant/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/holowarrant/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 2b01a1e0dfd8..c316938387c9 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -135,7 +135,7 @@ return -/obj/item/lightreplacer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/lightreplacer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 0a9c7517df6e..566ee03a6da9 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -41,7 +41,7 @@ spamcheck = 0 return -/obj/item/megaphone/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/megaphone/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 5b7743f03020..a406910eeaa1 100755 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -46,7 +46,7 @@ return update_icon() -/obj/item/multitool/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/multitool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 11f785df9a65..6a1706908cf5 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -41,7 +41,7 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/paicard) QDEL_NULL(radio) return ..() -/obj/item/paicard/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/paicard/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 39d0b66f6786..60fa2a364155 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -22,7 +22,7 @@ P.change_color(pipe_colors[mode]) -/obj/item/pipe_painter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pipe_painter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index a1d8fc98b66f..d2d971bd8b08 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -70,7 +70,7 @@ /obj/item/powersink/attack_ai() return -/obj/item/powersink/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/powersink/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) switch(mode) if(0) ..() diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index f0c0647fd75a..0c8c9edc0de4 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -88,7 +88,7 @@ GLOBAL_LIST_BOILERPLATE(all_beacons, /obj/item/radio/beacon) desc = "A label on it reads: Activate to have a singularity beacon teleported to your location." origin_tech = list(TECH_BLUESPACE = 1, TECH_ILLEGAL = 7) -/obj/item/radio/beacon/syndicate/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/radio/beacon/syndicate/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 2de683f504c2..198d2981da3b 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -151,7 +151,7 @@ CREATE_WALL_MOUNTING_TYPES_SHIFTED(/obj/item/radio/intercom, 28) spawn (0) attack_self(user) -/obj/item/radio/intercom/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/radio/intercom/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) src.add_fingerprint(user) spawn (0) attack_self(user) diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index 8af578b31ef8..53665803b241 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -69,7 +69,7 @@ var/global/list/active_radio_jammers = list() update_icon() -/obj/item/radio_jammer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/radio_jammer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src && power_source) to_chat(user,"You eject \the [power_source] from \the [src].") user.put_in_hands(power_source) @@ -78,7 +78,7 @@ var/global/list/active_radio_jammers = list() else return ..() -/obj/item/radio_jammer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/radio_jammer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 4ad30c015708..68c125f155fa 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list( radio_controller.remove_object(src, radiochannels[ch_name]) return ..() -/obj/item/radio/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/radio/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -813,7 +813,7 @@ GLOBAL_DATUM_INIT(virtual_announcer_ai, /mob/living/silicon/ai/announcer, new(nu /obj/item/bluespace_radio/ui_action_click() toggle_handset() -/obj/item/bluespace_radio/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/bluespace_radio/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(loc == user) toggle_handset() else diff --git a/code/game/objects/items/devices/scanners_vr.dm b/code/game/objects/items/devices/scanners_vr.dm index 7958767ddacb..d4b9b1cd28b1 100644 --- a/code/game/objects/items/devices/scanners_vr.dm +++ b/code/game/objects/items/devices/scanners_vr.dm @@ -23,7 +23,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob scan_mob(target, user) to_chat(user,"Not a compatible subject to work with!") -/obj/item/sleevemate/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/sleevemate/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index a329b4d4638a..f12de737f047 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -20,7 +20,7 @@ . = ..() camera = new camtype(src) -/obj/item/camerabug/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/camerabug/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -137,7 +137,7 @@ var/obj/machinery/camera/bug/selected_camera var/list/obj/machinery/camera/bug/cameras = new() -/obj/item/bug_monitor/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/bug_monitor/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index f7a359bbf07b..2cb03e3a969f 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -123,7 +123,7 @@ STOP_PROCESSING(SSobj, src) updateicon() -/obj/item/suit_cooling_unit/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/suit_cooling_unit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index 5285f61592b4..21d7f2031ffd 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -26,7 +26,7 @@ /obj/item/t_scanner/AltClick() set_active(!on) -/obj/item/t_scanner/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/t_scanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/tape_recorder/cassette_tape.dm b/code/game/objects/items/devices/tape_recorder/cassette_tape.dm index 9193a3cfff8d..2c77e9515064 100644 --- a/code/game/objects/items/devices/tape_recorder/cassette_tape.dm +++ b/code/game/objects/items/devices/tape_recorder/cassette_tape.dm @@ -97,7 +97,7 @@ /obj/item/cassette_tape/fire_act() ruin() -/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm index 59f024fabfb0..c1600c7747d9 100644 --- a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm +++ b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm @@ -62,7 +62,7 @@ tape.ruin() //Fires destroy the tape return ..() -/obj/item/tape_recorder/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tape_recorder/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) if(tape) eject() @@ -441,7 +441,7 @@ /obj/item/tape_recorder/proc/print_cooldown() TIMER_COOLDOWN_START(src, CD_INDEX_TAPE_PRINT, 30 SECONDS) -/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 10ba913cde6a..c994ce041f7e 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -57,7 +57,7 @@ return ..() -/obj/item/tape_recorder/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tape_recorder/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) if(mytape) eject() @@ -341,7 +341,7 @@ canprint = 1 -/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -389,7 +389,7 @@ /obj/item/cassette_tape/fire_act() ruin() -/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/text_to_speech.dm b/code/game/objects/items/devices/text_to_speech.dm index 7b515c22b04a..19fd879565b4 100644 --- a/code/game/objects/items/devices/text_to_speech.dm +++ b/code/game/objects/items/devices/text_to_speech.dm @@ -8,7 +8,7 @@ var/activated = FALSE var/mob/linked_user -/obj/item/text_to_speech/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/text_to_speech/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index b14cbe27fe1d..856e26fe049b 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -70,7 +70,7 @@ SStgui.update_uis(src) //Update all UIs attached to src return ..() -/obj/item/transfer_valve/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/transfer_valve/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm index 15849b9e721f..73db9dc69c47 100644 --- a/code/game/objects/items/devices/translator.dm +++ b/code/game/objects/items/devices/translator.dm @@ -88,7 +88,7 @@ var/datum/translation_context/variable/ours = context ours.copy_knowledge(theirs) -/obj/item/universal_translator/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/universal_translator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index f7b3e280635b..abb7163a60ce 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -43,7 +43,7 @@ radio.hear_talk(M,msg,verb,speaking) ..() -/obj/item/tvcamera/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tvcamera/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index b78106587f9a..689f8e3cd2b5 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -224,7 +224,7 @@ hidden_uplink = new(src, target_mind, telecrystals) icon_state = "radio" -/obj/item/radio/uplink/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/radio/uplink/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -235,7 +235,7 @@ . = ..() hidden_uplink = new(src) -/obj/item/multitool/uplink/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/multitool/uplink/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index c23b4d34e486..ff9bd73a0585 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -28,7 +28,7 @@ to_chat(usr, "You configure the hailer to shout \"[use_message]\".") -/obj/item/hailer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/hailer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/gifts.dm b/code/game/objects/items/gifts.dm index 51449b6da972..b4e8d0c1f790 100644 --- a/code/game/objects/items/gifts.dm +++ b/code/game/objects/items/gifts.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(possible_gifts) . = ..() . += SPAN_NOTICE("It contains \a [initial(contains_type.name)].") -/obj/item/a_gift/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/a_gift/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index 418d5565a908..c10f3bf556df 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -41,7 +41,7 @@ update_icon() return -/obj/item/glass_jar/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/glass_jar/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/godfigures.dm b/code/game/objects/items/godfigures.dm index 4886c2f283c3..9fc0dd46e3b0 100644 --- a/code/game/objects/items/godfigures.dm +++ b/code/game/objects/items/godfigures.dm @@ -10,7 +10,7 @@ throw_force = 10 w_class = WEIGHT_CLASS_SMALL -/obj/item/godfig/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/godfig/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/gunbox.dm b/code/game/objects/items/gunbox.dm index 1d5be788968d..6dc07f3e0dba 100644 --- a/code/game/objects/items/gunbox.dm +++ b/code/game/objects/items/gunbox.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" -/obj/item/gunbox/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gunbox/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) var/list/options = list() options["NT Mk58 (.45)"] = list(/obj/item/gun/ballistic/sec, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/flash) options["SW 625 Revolver (.45)"] = list(/obj/item/gun/ballistic/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber) @@ -24,7 +24,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" -/obj/item/gunbox/lethal/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gunbox/lethal/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) var/list/options = list() options["M1911 Dynamic (.45)"] = list(/obj/item/gun/ballistic/colt, /obj/item/ammo_magazine/m45, /obj/item/ammo_magazine/m45) options["SW 625 Revolver (.45)"] = list(/obj/item/gun/ballistic/revolver/detective45, /obj/item/ammo_magazine/s45, /obj/item/ammo_magazine/s45) @@ -46,7 +46,7 @@ icon_state = "gunbox" w_class = WEIGHT_CLASS_HUGE -/obj/item/gunbox/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gunbox/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) var/list/options = list() options[".45 Pistol"] = list(/obj/item/gun/ballistic/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber) options[".45 Revolver"] = list(/obj/item/gun/ballistic/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber) @@ -67,7 +67,7 @@ icon_state = "gunbox" w_class = WEIGHT_CLASS_HUGE -/obj/item/gunbox/marksman/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gunbox/marksman/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) var/list/options = list() options["Marksman Energy Rifle"] = list(/obj/item/gun/energy/sniperrifle/locked) options["M1A Garand"] = list(/obj/item/gun/ballistic/garand/sniper, /obj/item/storage/belt/security/tactical/bandolier, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter) // 7 clips, 56 rounds @@ -87,7 +87,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "donkbox" -/obj/item/gunbox/donksoft/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gunbox/donksoft/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) var/list/options = list() options["Classic DONKsoft Pistol"] = list(/obj/item/gun/ballistic/pistol/foam, /obj/item/ammo_magazine/mfoam/pistol, /obj/item/ammo_magazine/mfoam/pistol) options["Blue DONKsoft Pistol"] = list(/obj/item/gun/ballistic/pistol/foam/blue, /obj/item/ammo_magazine/mfoam/pistol, /obj/item/ammo_magazine/mfoam/pistol) @@ -107,7 +107,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "donkbox2" -/obj/item/gunbox/donksoft/shotgun/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gunbox/donksoft/shotgun/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) var/list/options = list() options["Classic DONKsoft Shotgun"] = list(/obj/item/gun/ballistic/shotgun/pump/foam, /obj/item/storage/box/foamdart, /obj/item/storage/box/foamdart) options["Blue DONKsoft Shotgun"] = list(/obj/item/gun/ballistic/shotgun/pump/foam/blue, /obj/item/storage/box/foamdart, /obj/item/storage/box/foamdart) @@ -126,7 +126,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "donkbox3" -/obj/item/gunbox/donksoft/smg/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gunbox/donksoft/smg/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) var/list/options = list() options["Classic DONKsoft SMG"] = list(/obj/item/gun/ballistic/automatic/advanced_smg/foam, /obj/item/ammo_magazine/mfoam/smg, /obj/item/ammo_magazine/mfoam/smg) options["Blue DONKsoft SMG"] = list(/obj/item/gun/ballistic/automatic/advanced_smg/foam/blue, /obj/item/ammo_magazine/mfoam/smg, /obj/item/ammo_magazine/mfoam/smg) @@ -145,7 +145,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" -/obj/item/gunbox/carrier/blueshield/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gunbox/carrier/blueshield/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) var/list/options = list() options["\improper Black Carrier"] = list(/obj/item/clothing/suit/storage/hooded/covertcarrier/blueshield) options["\improper Black-Short Carrier"] = list(/obj/item/clothing/suit/storage/hooded/covertcarrier/blueshield/alt) @@ -165,7 +165,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" -/obj/item/gunbox/armor/security/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gunbox/armor/security/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) var/list/options = list() options["\improper Flat Vest"] = list(/obj/item/clothing/suit/armor/vest) options["\improper Security Vest"] = list(/obj/item/clothing/suit/armor/vest/alt) diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index d4138e518247..6d1c11e914c2 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -48,7 +48,7 @@ else to_chat(user, "[src] is projecting at max capacity!") -/obj/item/holosign_creator/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/holosign_creator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -114,7 +114,7 @@ holosign_type = /obj/structure/holosign/barrier/cyborg var/shock = 0 -/obj/item/holosign_creator/cyborg/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/holosign_creator/cyborg/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/id_cards/station_ids.dm b/code/game/objects/items/id_cards/station_ids.dm index e791fbaab6ca..fb23045213c3 100644 --- a/code/game/objects/items/id_cards/station_ids.dm +++ b/code/game/objects/items/id_cards/station_ids.dm @@ -144,7 +144,7 @@ //dat += "" return dat -/obj/item/card/id/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/card/id/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/id_cards/syndicate_ids.dm b/code/game/objects/items/id_cards/syndicate_ids.dm index 1b680260769c..ef5c79e2540b 100644 --- a/code/game/objects/items/id_cards/syndicate_ids.dm +++ b/code/game/objects/items/id_cards/syndicate_ids.dm @@ -29,7 +29,7 @@ if(player_is_antag(user.mind)) to_chat(user, "The microscanner activates as you pass it over the ID, copying its access.") -/obj/item/card/id/syndicate/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/card/id/syndicate/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/pizza_voucher.dm b/code/game/objects/items/pizza_voucher.dm index 271040db4411..306d3b6df0aa 100644 --- a/code/game/objects/items/pizza_voucher.dm +++ b/code/game/objects/items/pizza_voucher.dm @@ -20,7 +20,7 @@ "WE ALWAYS DELIVER! WE ALWAYS DELIVER! WE ALWAYS DELIVER!") desc = "A pocket-sized plastic slip with a button in the middle. \"[pick(descstrings)]\" is written on the back." -/obj/item/pizzavoucher/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pizzavoucher/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/robot/gripper.dm b/code/game/objects/items/robot/gripper.dm index 63af54b5f145..155570eb196a 100644 --- a/code/game/objects/items/robot/gripper.dm +++ b/code/game/objects/items/robot/gripper.dm @@ -74,7 +74,7 @@ /obj/item/gripper/CtrlClick(mob/user) drop_item() -/obj/item/gripper/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gripper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -313,7 +313,7 @@ /obj/item/gripper/no_use //Used when you want to hold and put items in other things, but not able to 'use' the item -/obj/item/gripper/no_use/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gripper/no_use/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) return /obj/item/gripper/no_use/organ/robotics diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 959452a651dd..0ab0d1dc8da3 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -39,7 +39,7 @@ item_state = "cyborg_upgrade" var/heldname = "default name" -/obj/item/borg/upgrade/rename/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/borg/upgrade/rename/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index ec6830e8ff4d..d9a5cc303d74 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -29,7 +29,7 @@ return ..() -/obj/item/target/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/target/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // taking pinned targets off! var/obj/structure/target_stake/stake for(var/obj/structure/target_stake/T in view(3,src)) diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index 4881d274069c..23554f33b55b 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -27,7 +27,7 @@ else return ..() -/obj/item/picket_sign/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/picket_sign/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/spritechanger.dm b/code/game/objects/items/spritechanger.dm index 521c39c27001..17a554376612 100644 --- a/code/game/objects/items/spritechanger.dm +++ b/code/game/objects/items/spritechanger.dm @@ -13,7 +13,7 @@ after the sprite has been set you can use it again to remove overlays that may h var/path var/state -/obj/item/spritechanger/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/spritechanger/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm index 76c917212c98..fcd58d93d772 100644 --- a/code/game/objects/items/stacks/marker_beacons.dm +++ b/code/game/objects/items/stacks/marker_beacons.dm @@ -50,7 +50,7 @@ var/list/marker_beacon_colors = list( /obj/item/stack/marker_beacon/update_icon() icon_state = "[initial(icon_state)][lowertext(picked_color)]" -/obj/item/stack/marker_beacon/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/stack/marker_beacon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -106,7 +106,7 @@ var/list/marker_beacon_colors = list( icon_state = "[initial(icon_state)][lowertext(picked_color)]-on" set_light(light_range, light_power, marker_beacon_colors[picked_color]) -/obj/structure/marker_beacon/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/marker_beacon/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) to_chat(user, "You start picking [src] up...") if(do_after(user, remove_speed, target = src)) var/obj/item/stack/marker_beacon/M = new(loc) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 262adf22278e..34a3d37b8e00 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -19,7 +19,7 @@ pickup_sound = 'sound/items/pickup/glass.ogg' var/is_reinforced = 0 -/obj/item/stack/material/glass/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/stack/material/glass/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 38d1a60df15d..2cd2d4669671 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -23,7 +23,7 @@ to_chat(user, "There are not enough telecrystals to do that.") return NONE -/obj/item/stack/telecrystal/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/stack/telecrystal/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index c64e29b89551..946fecbe3456 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -42,7 +42,7 @@ // todo: implement dynamic state, like how /tg/ boxes work // BubbleWrap - A box can be folded up to make card -/obj/item/storage/box/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/storage/box/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index c54d382717d4..5dfea498b34c 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -124,7 +124,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/crowbar/power/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tool/crowbar/power/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 7da6f197dd5e..e17bc6d607fa 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -178,7 +178,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/screwdriver/power/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tool/screwdriver/power/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/switchtool.dm b/code/game/objects/items/tools/switchtool.dm index 4cb677808830..5a319ae51191 100644 --- a/code/game/objects/items/tools/switchtool.dm +++ b/code/game/objects/items/tools/switchtool.dm @@ -104,7 +104,7 @@ module_string += "\a [module.name], " return module_string -/obj/item/switchtool/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/switchtool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 945d21ae333d..e55e9f2b7b21 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -149,7 +149,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 50, 1) -/obj/item/weldingtool/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/weldingtool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -643,7 +643,7 @@ update_icon() return 0 -/obj/item/weldingtool/electric/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/weldingtool/electric/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) if(power_supply) power_supply.update_icon() diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index e89fab258c17..af5cd15cc072 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -152,7 +152,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/wirecutters/power/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tool/wirecutters/power/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 14d13d5bbb4c..3f11598f9039 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -156,7 +156,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/wrench/power/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tool/wrench/power/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/uav.dm b/code/game/objects/items/uav.dm index a98ca597af04..27ef0ae3ee6f 100644 --- a/code/game/objects/items/uav.dm +++ b/code/game/objects/items/uav.dm @@ -64,7 +64,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/uav/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/uav/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) //Has to be on the ground to work with it properly if(!isturf(loc)) return ..() diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 664fb03442ca..d2d2dc7848e6 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -130,7 +130,7 @@ AI MODULES desc = "A 'safeguard' AI module: 'Safeguard . Anyone threatening or attempting to harm is no longer to be considered a crew member, and is a threat which must be neutralized.'" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) -/obj/item/aiModule/safeguard/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/aiModule/safeguard/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -159,7 +159,7 @@ AI MODULES desc = "A 'one crew member' AI module: 'Only is a crew member.'" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) //made with diamonds! -/obj/item/aiModule/oneHuman/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/aiModule/oneHuman/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -243,7 +243,7 @@ AI MODULES desc = "A 'freeform' AI module: ''" origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) -/obj/item/aiModule/freeform/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/aiModule/freeform/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -362,7 +362,7 @@ AI MODULES desc = "A 'freeform' Core AI module: ''" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) -/obj/item/aiModule/freeformcore/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/aiModule/freeformcore/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -389,7 +389,7 @@ AI MODULES desc = "A hacked AI law module: ''" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6, TECH_ILLEGAL = 7) -/obj/item/aiModule/syndicate/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/aiModule/syndicate/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index af1e2302073d..93a57994b15b 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -103,7 +103,7 @@ return TRUE // Changes which mode it is on. -/obj/item/rcd/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/rcd/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -363,7 +363,7 @@ /obj/item/rcd/electric/mounted/hardsuit // Old method for swapping modes as there is no way to bring up the radial. -/obj/item/rcd/electric/mounted/hardsuit/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/rcd/electric/mounted/hardsuit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index 82b686f87e36..62f5561cd6ed 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -106,7 +106,7 @@ // UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) // return ..() -/obj/item/pipe_dispenser/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pipe_dispenser/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 2c1c89edb297..5d8c3863d46d 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -62,7 +62,7 @@ RSF else glasstype = /obj/item/reagent_containers/food/drinks/metaglass -/obj/item/rsf/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/rsf/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/barrier_tape.dm b/code/game/objects/items/weapons/barrier_tape.dm index bd9a5ac7d30e..61b52362bada 100644 --- a/code/game/objects/items/weapons/barrier_tape.dm +++ b/code/game/objects/items/weapons/barrier_tape.dm @@ -133,11 +133,11 @@ var/list/tape_roll_applications = list() update_icon() return ..() -/obj/item/barrier_tape_roll/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/barrier_tape_roll/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) update_icon() return ..() -/obj/item/barrier_tape_roll/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/barrier_tape_roll/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -334,7 +334,7 @@ var/list/tape_roll_applications = list() /obj/item/barrier_tape_segment/attackby(obj/item/W as obj, mob/user as mob) breaktape(user) -/obj/item/barrier_tape_segment/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/barrier_tape_segment/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (user.a_intent == INTENT_HELP && src.allowed(user)) user.show_viewers("\The [user] lifts \the [src], allowing passage.") for(var/obj/item/barrier_tape_segment/T in gettapeline()) diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index 322314eaa718..75c983683d3b 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -61,7 +61,7 @@ var/turf/T = loc T.hotspot_expose(700, 5) -/obj/item/flame/candle/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/flame/candle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index d6499b3ca2b6..78c649b7ae71 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -305,7 +305,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM else to_chat(user, "[src] is full.") -/obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(lit == 1) if(user.a_intent == INTENT_HARM) user.visible_message("[user] drops and treads on the lit [src], putting it out instantly.") @@ -435,7 +435,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM . = ..() name = "empty [initial(name)]" -/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(lit == 1) if(user.a_intent == INTENT_HARM) user.visible_message("[user] empties the lit [src] on the floor!.") @@ -590,7 +590,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM item_state = icon_state base_state = icon_state -/obj/item/flame/lighter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/flame/lighter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(!base_state) base_state = icon_state if(!lit) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 0da5f599fbb8..261c8cc0e768 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -69,7 +69,7 @@ /* * Bike Horns */ -/obj/item/bikehorn/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/bikehorn/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index eed02da5be3f..92a46b57c807 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -56,7 +56,7 @@ colour = pick("red","orange","yellow","jade","cyan","purple","pink","maroon","black","white") name = "[colour] lipstick" -/obj/item/lipstick/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/lipstick/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -102,7 +102,7 @@ icon = 'icons/obj/items.dmi' icon_state = "purplecomb" -/obj/item/haircomb/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/haircomb/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -130,7 +130,7 @@ icon_state = "trinketbox" var/list/ui_users = list() -/obj/item/makeover/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/makeover/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/duct_tape.dm b/code/game/objects/items/weapons/duct_tape.dm index 45fe4d8b249d..49404eaee580 100644 --- a/code/game/objects/items/weapons/duct_tape.dm +++ b/code/game/objects/items/weapons/duct_tape.dm @@ -129,7 +129,7 @@ return return ..() -/obj/item/duct_tape_roll/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/duct_tape_roll/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -180,7 +180,7 @@ name = W.name + " (taped)" copy_overlays(W) -/obj/item/duct_tape_piece/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/duct_tape_piece/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -202,7 +202,7 @@ qdel(I) to_chat(user, "You place \the [I] back into \the [src].") -/obj/item/duct_tape_piece/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/duct_tape_piece/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) anchored = FALSE return ..() // Pick it up now that it's unanchored. diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index d3c52560cbce..ea45f1292c6e 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -38,7 +38,7 @@ else ..() -/obj/item/plastique/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/plastique/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 8f2d2680d86b..fe9e73d03431 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -49,7 +49,7 @@ . = ..() . += "[icon2html(thing = src, target = user)] [src.name] contains [src.reagents.total_volume] units of water left!" -/obj/item/extinguisher/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/extinguisher/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 0d2c2d2b105c..9609d1566f2d 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -123,7 +123,7 @@ return -/obj/item/flamethrower/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/flamethrower/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 79f0147a4313..cfc1e486eb82 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -53,7 +53,7 @@ . += "The [src] is set for instant detonation." -/obj/item/grenade/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/grenade/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -111,7 +111,7 @@ ..() return -/obj/item/grenade/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/grenade/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) walk(src, null, null) ..() return diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 8667abd3f755..e997a571d9be 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -24,7 +24,7 @@ ..() add_implants() -/obj/machinery/implantchair/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/implantchair/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) var/health_text = "" if(src.occupant) diff --git a/code/game/objects/items/weapons/implants/implantcircuits.dm b/code/game/objects/items/weapons/implants/implantcircuits.dm index 7645e690e169..b4fd6b36b5f8 100644 --- a/code/game/objects/items/weapons/implants/implantcircuits.dm +++ b/code/game/objects/items/weapons/implants/implantcircuits.dm @@ -45,7 +45,7 @@ else ..() -/obj/item/implant/integrated_circuit/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/implant/integrated_circuit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index f6664e79f737..2ee0cdd3a220 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -10,7 +10,7 @@ var/obj/item/implant/imp = null var/active = 1 -/obj/item/implanter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/implanter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index 479b3ba7b15d..e3602dc2cda4 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -21,7 +21,7 @@ return -/obj/item/implantpad/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/implantpad/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if ((src.case && user.is_holding(src))) user.put_in_active_hand(case) @@ -48,7 +48,7 @@ return -/obj/item/implantpad/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/implantpad/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/chainsaw.dm b/code/game/objects/items/weapons/material/chainsaw.dm index 221fd51fabc3..07a38b9905cb 100644 --- a/code/game/objects/items/weapons/material/chainsaw.dm +++ b/code/game/objects/items/weapons/material/chainsaw.dm @@ -58,7 +58,7 @@ on = 0 update_icon() -/obj/item/chainsaw/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/chainsaw/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/gravemarker.dm b/code/game/objects/items/weapons/material/gravemarker.dm index 43dfd6b86e6a..2de1f1ef5ca9 100644 --- a/code/game/objects/items/weapons/material/gravemarker.dm +++ b/code/game/objects/items/weapons/material/gravemarker.dm @@ -59,7 +59,7 @@ ..() -/obj/item/material/gravemarker/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/material/gravemarker/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 2b2cca313a33..5dab8a5456fa 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -52,7 +52,7 @@ icon_state = "boxcutter" material_significance = MATERIAL_SIGNIFICANCE_WEAPON_ULTRALIGHT -/obj/item/material/butterfly/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/material/butterfly/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 3fc929c3a7d3..8c09b7d61d76 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -95,7 +95,7 @@ w_class = WEIGHT_CLASS_SMALL attack_verb = list("mushed", "splatted", "splooshed", "splushed") // Words that totally exist. -/obj/item/material/snow/snowball/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/material/snow/snowball/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index b4e86b4469b5..336b03689f6c 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -48,7 +48,7 @@ . = ..() update_icon() -/obj/item/melee/umbrella/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/melee/umbrella/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -267,7 +267,7 @@ if(SA_vulnerability & tm.mob_class) tm.apply_damage(SA_bonus_damage) // fuck em -/obj/item/melee/ashlander/elder/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/melee/ashlander/elder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -348,7 +348,7 @@ return 1 return 0 -/obj/item/melee/twohanded/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/melee/twohanded/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -484,7 +484,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 50, 1) -/obj/item/melee/thermalcutter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/melee/thermalcutter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index b2cd5fa6096a..b21777d4894a 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/mop) create_reagents(30) -/obj/item/mop/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mop/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/mop_deploy.dm b/code/game/objects/items/weapons/mop_deploy.dm index f071f0a35d16..ebcff139d6ce 100644 --- a/code/game/objects/items/weapons/mop_deploy.dm +++ b/code/game/objects/items/weapons/mop_deploy.dm @@ -52,7 +52,7 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/mop_deploy/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mop_deploy/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/nullrod.dm b/code/game/objects/items/weapons/nullrod.dm index 20ceb2264cb8..f3adcc663415 100644 --- a/code/game/objects/items/weapons/nullrod.dm +++ b/code/game/objects/items/weapons/nullrod.dm @@ -40,7 +40,7 @@ if(SA_vulnerability & tm.mob_class) tm.apply_damage(SA_bonus_damage) // fuck em -/obj/item/nullrod/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/nullrod/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -352,7 +352,7 @@ attack_sound = 'sound/weapons/bite.ogg' var/used_blessing = FALSE -/obj/item/nullrod/carp/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/nullrod/carp/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/other.dm b/code/game/objects/items/weapons/other.dm index d1145b824225..999435bc4ceb 100644 --- a/code/game/objects/items/weapons/other.dm +++ b/code/game/objects/items/weapons/other.dm @@ -84,7 +84,7 @@ flip_mobs() return ..() -/obj/item/bikehorn/golden/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/bikehorn/golden/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -138,7 +138,7 @@ temp_blade.set_active(TRUE) concealed_blade = temp_blade -/obj/item/cane/concealed/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/cane/concealed/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -208,7 +208,7 @@ damage_force = 3 var/on = 0 -/obj/item/cane/whitecane/collapsible/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/cane/whitecane/collapsible/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index d00abfd0e492..f212b6ea39a1 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -10,7 +10,7 @@ throw_range = 20 origin_tech = list(TECH_BLUESPACE = 4) -/obj/item/teleportation_scroll/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/teleportation_scroll/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 258e2d5335a1..e6c8f956c1ad 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -124,7 +124,7 @@ return ..() return embedded_flash.attack_mob(arglist(args)) -/obj/item/shield/riot/flash/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/shield/riot/flash/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -324,7 +324,7 @@ return (base_block_chance - round(damage / 3)) //block bullets and beams using the old block chance return base_block_chance -/obj/item/shield/energy/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/shield/energy/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -400,7 +400,7 @@ else return 0 */ -/obj/item/shield/riot/tele/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/shield/riot/tele/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 2405222383a7..f9299a73cbb3 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -94,7 +94,7 @@ else to_chat(user, "This cell is not fitted for [src].") -/obj/item/melee/baton/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/melee/baton/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) if(bcell && !integrated_cell) bcell.update_icon() @@ -108,7 +108,7 @@ else return ..() -/obj/item/melee/baton/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/melee/baton/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 240530cd9bf7..f44384825d69 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -57,7 +57,7 @@ drop_sound = 'sound/items/drop/crowbar.ogg' pickup_sound = 'sound/items/pickup/crowbar.ogg' -/obj/item/melee/telebaton/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/melee/telebaton/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -190,7 +190,7 @@ damage_force = 0 attack_sound = "sound/items/bikehorn.ogg" -/obj/item/melee/stool/faiza/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/melee/stool/faiza/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index 680e323ff93c..6aa663a9b9b3 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -78,7 +78,7 @@ var/detonator_mode = 0 var/obj/item/syndie/c4explosive/bomb -/obj/item/flame/lighter/zippo/c4detonator/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/flame/lighter/zippo/c4detonator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(!detonator_mode) ..() diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 4a47e548cc65..bd2c716488c3 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -211,7 +211,7 @@ var/list/global/tank_gauge_cache = list() -/obj/item/tank/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/tank/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 0bb94a5e1e3d..1e5886b52e2e 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -23,7 +23,7 @@ origin_tech = list(TECH_MAGNET = 1) materials_base = list(MAT_STEEL = 400) -/obj/item/locator/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/locator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -133,7 +133,7 @@ Frequency: materials_base = list(MAT_STEEL = 10000) preserve_item = 1 -/obj/item/hand_tele/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/hand_tele/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index 1bf0ccf08ef3..783b09f1e110 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -23,7 +23,7 @@ if(SLOT_ID_BELT) sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/clothing/species/teshari/belt.dmi') -/obj/item/towel/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/towel/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index e4e3e59b438b..ee487e466ec9 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -39,7 +39,7 @@ user.visible_message("[user] is putting the [src.name] on [T.his] head! It looks like [T.hes] trying to commit suicide.") return (BRUTELOSS) -/obj/item/beartrap/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/beartrap/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -85,7 +85,7 @@ if(!has_buckled_mobs()) anchored = FALSE -/obj/item/beartrap/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/beartrap/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // check unbuckle first if(click_unbuckle_interaction(user)) return CLICKCHAIN_DO_NOT_PROPAGATE diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index 4b65a08fd502..38a495269b72 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -84,7 +84,7 @@ to_chat(user,"The tank scoffs at your insolence. It only provides services to welders.") return -/obj/item/weldpack/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/weldpack/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/wearer = user if(wearer.back == src) diff --git a/code/game/objects/misc.dm b/code/game/objects/misc.dm index 80d91a156185..04856ddf13ac 100644 --- a/code/game/objects/misc.dm +++ b/code/game/objects/misc.dm @@ -7,7 +7,7 @@ /obj/structure/signpost/attackby(obj/item/W, mob/user) return attack_hand(user) -/obj/structure/signpost/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/signpost/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) switch(tgui_alert(user, "Do you want to go to SS13?", "Travel", list("Yes", "No"))) if("Yes") user.forceMove(SSjob.get_latejoin_spawnpoint(faction = JOB_FACTION_STATION)) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index c87f9fec9a9e..08af691efc11 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -31,7 +31,7 @@ return ..() -/obj/structure/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(breakable) if(MUTATION_HULK in user.mutations) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) diff --git a/code/game/objects/structures/ashlander.dm b/code/game/objects/structures/ashlander.dm index 68ddc38e8d26..c1f32769d846 100644 --- a/code/game/objects/structures/ashlander.dm +++ b/code/game/objects/structures/ashlander.dm @@ -298,7 +298,7 @@ src.updateUsrDialog() return 0 -/obj/structure/ashlander/calcinator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/ashlander/calcinator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) interact(user) /obj/structure/ashlander/calcinator/AltClick(mob/user) @@ -386,7 +386,7 @@ . = ..() set_light(3, 2, "#9463bb") -/obj/structure/ashlander/statue/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/ashlander/statue/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/choice = tgui_alert(user, "Do you wish to pray to the statue?", "Interact With the Statue", list("Yes", "No")) if(choice != "Yes") return diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index e5ef1d2e8287..d7729c63a71d 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -19,7 +19,7 @@ LINEN BINS drop_sound = 'sound/items/drop/backpack.ogg' pickup_sound = 'sound/items/pickup/backpack.ogg' -/obj/item/bedsheet/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/bedsheet/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -216,7 +216,7 @@ LINEN BINS hidden = I to_chat(user, "You hide [I] among the sheets.") -/obj/structure/bedsheetbin/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/bedsheetbin/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(amount >= 1) amount-- diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 01496cd860e1..f43c1aebf1ba 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -81,7 +81,7 @@ else return ..() -/obj/structure/bonfire/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/bonfire/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(has_buckled_mobs()) return ..() @@ -288,7 +288,7 @@ else return ..() -/obj/structure/fireplace/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/fireplace/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(get_fuel_amount()) remove_fuel(user) diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 788fc68e0774..efca28e78599 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -135,7 +135,7 @@ . = ..() activate() -/obj/effect/catwalk_plated/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/catwalk_plated/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) attack_generic() /obj/effect/catwalk_plated/attack_ghost() diff --git a/code/game/objects/structures/charge_pylon.dm b/code/game/objects/structures/charge_pylon.dm index a08b901a7ad9..0225508a2b7e 100644 --- a/code/game/objects/structures/charge_pylon.dm +++ b/code/game/objects/structures/charge_pylon.dm @@ -12,7 +12,7 @@ if(Adjacent(user)) attack_hand(user) -/obj/structure/adherent_pylon/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/adherent_pylon/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) charge_user(user) /obj/structure/adherent_pylon/proc/charge_user(var/mob/living/user) diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index c144af7dc09b..3c7e21c9f3a4 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -6,7 +6,7 @@ var/obj/item/clothing/suit/coat var/list/allowed = list(/obj/item/clothing/suit/storage/toggle/labcoat, /obj/item/clothing/suit/storage/det_trench) -/obj/structure/coatrack/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/coatrack/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.visible_message("[user] takes [coat] off \the [src].", "You take [coat] off the \the [src]") if(!user.put_in_active_hand(coat)) coat.loc = get_turf(user) diff --git a/code/game/objects/structures/crates_lockers/__closet.dm b/code/game/objects/structures/crates_lockers/__closet.dm index f22ef936390b..5497c1cce3f2 100644 --- a/code/game/objects/structures/crates_lockers/__closet.dm +++ b/code/game/objects/structures/crates_lockers/__closet.dm @@ -407,7 +407,7 @@ if(!open()) to_chat(user, "It won't budge!") -/obj/structure/closet/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/closet/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(locked && secure) togglelock(user) diff --git a/code/game/objects/structures/crates_lockers/closets/coffin.dm b/code/game/objects/structures/crates_lockers/closets/coffin.dm index c9f0d9285108..7a928b1ba8fb 100644 --- a/code/game/objects/structures/crates_lockers/closets/coffin.dm +++ b/code/game/objects/structures/crates_lockers/closets/coffin.dm @@ -33,7 +33,7 @@ color = "#c2b29f" use_old_icon_update = TRUE -/obj/structure/closet/grave/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/closet/grave/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(opened) visible_message("[user] starts to climb into \the [src.name].", \ "You start to lower yourself into \the [src.name].") diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index c863e7282b98..b58927665393 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -109,7 +109,7 @@ update_icon() -/obj/structure/closet/fireaxecabinet/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/closet/fireaxecabinet/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/hasaxe = 0 if(fireaxe) hasaxe = 1 diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index cfc7fc663188..6de122885a82 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -90,7 +90,7 @@ /obj/structure/closet/statue/relaymove() return -/obj/structure/closet/statue/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/closet/statue/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return /obj/structure/closet/statue/verb_toggleopen() diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm index 55470f57d2aa..b4532a956367 100644 --- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm @@ -27,7 +27,7 @@ /obj/structure/closet/walllocker/emerglocker/attackby(obj/item/W as obj, mob/user as mob) return -/obj/structure/closet/walllocker/emerglocker/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/closet/walllocker/emerglocker/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc) if(!amount) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 89d9719e60f3..c5a396393fc4 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -203,7 +203,7 @@ else to_chat(usr, "This mob type can't use this verb.") -/obj/structure/closet/crate/secure/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/closet/crate/secure/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) src.add_fingerprint(user) if(locked) src.togglelock(user) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 28c428aced98..d37bf3605fff 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -61,7 +61,7 @@ */ -/obj/structure/largecrate/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/largecrate/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) to_chat(user, "You need a crowbar to pry this open!") return diff --git a/code/game/objects/structures/crates_lockers/vehiclecage.dm b/code/game/objects/structures/crates_lockers/vehiclecage.dm index ef74b57a8224..f255d50a6274 100644 --- a/code/game/objects/structures/crates_lockers/vehiclecage.dm +++ b/code/game/objects/structures/crates_lockers/vehiclecage.dm @@ -23,7 +23,7 @@ load_vehicle(I) update_icon() -/obj/structure/vehiclecage/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/vehiclecage/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) to_chat(user, "You need a wrench to take this apart!") return diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index 364c36d7737f..99d2418d68e6 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -20,7 +20,7 @@ else ..(P, def_zone) -/obj/structure/curtain/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/curtain/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(get_turf(loc), "rustle", 15, 1, -5) toggle() ..() diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 56c02215312d..6e80937fc473 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -45,7 +45,7 @@ update_icon() -/obj/structure/extinguisher_cabinet/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/extinguisher_cabinet/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(isrobot(user)) return if(!user.standard_hand_usability_check(src, e_args.hand_index, HAND_MANIPULATION_GENERAL)) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index c88030d1d33d..116ae8fe6959 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -142,7 +142,7 @@ desc = "It looks like it has a strong padlock attached." locked = TRUE -/obj/structure/fence/door/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/fence/door/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(can_open(user)) toggle(user) else diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 4bb86a5ae34e..994b2e183976 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -92,7 +92,7 @@ toggle_close_open() -/obj/structure/fireaxecabinet/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/fireaxecabinet/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) //var/hasaxe = 0 //Fuck this. Fuck everything about this. Who wrote this. Why. //if(fireaxe) // hasaxe = 1 diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm index d045852b8948..ea926dc26e1c 100644 --- a/code/game/objects/structures/fitness.dm +++ b/code/game/objects/structures/fitness.dm @@ -10,7 +10,7 @@ density = 1 var/list/hit_message = list("hit", "punch", "kick", "robust") -/obj/structure/fitness/punchingbag/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/fitness/punchingbag/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!istype(user)) ..() return @@ -38,7 +38,7 @@ weight = ((weight) % qualifiers.len) + 1 to_chat(user, "You set the machine's weight level to [weight].") -/obj/structure/fitness/weightlifter/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/fitness/weightlifter/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!istype(user)) return if(user.loc != src.loc) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 9167d2c69842..0147d5fbd01f 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -395,7 +395,7 @@ /obj/structure/flora/sif icon = 'icons/obj/flora/sifflora.dmi' -/obj/structure/flora/sif/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/flora/sif/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (user.a_intent == INTENT_HARM) if(do_after(user, 5 SECONDS)) user.visible_message("\The [user] digs up \the [src.name].", "You dig up \the [src.name].") @@ -516,7 +516,7 @@ var/gift_type = /obj/item/b_gift var/list/ckeys_that_took = list() -/obj/structure/flora/pumpkin/pumpkin_patch/presents/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/flora/pumpkin/pumpkin_patch/presents/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index 74d76f026dd2..91f2bd606892 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -133,7 +133,7 @@ /obj/structure/flora/tree/pine/xmas/presents/choose_icon_state() return "pinepresents" -/obj/structure/flora/tree/pine/xmas/presents/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/flora/tree/pine/xmas/presents/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm index 7b11898ee8a6..c8ae98d84a06 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm @@ -43,7 +43,7 @@ /obj/structure/ghost_pod/manual var/confirm_before_open = FALSE // Recommended to be TRUE if the pod contains a surprise. -/obj/structure/ghost_pod/manual/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/ghost_pod/manual/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!used) if(confirm_before_open) if(alert(user, "Are you sure you want to touch \the [src]?", "Confirm", "No", "Yes") == "No") diff --git a/code/game/objects/structures/holoplant.dm b/code/game/objects/structures/holoplant.dm index 72e061502521..714980a4d26d 100644 --- a/code/game/objects/structures/holoplant.dm +++ b/code/game/objects/structures/holoplant.dm @@ -21,7 +21,7 @@ . = ..() activate() -/obj/machinery/holoplant/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/holoplant/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!istype(user) || interference) return diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index bbcd88e67686..b79f03fa37d8 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -89,7 +89,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) mybag.attackby(I, user) -/obj/structure/janitorialcart/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/janitorialcart/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) nano_ui_interact(user) return @@ -210,7 +210,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) to_chat(user, "You hook the trashbag onto the [callme].") mybag = I -/obj/structure/bed/chair/janicart/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/bed/chair/janicart/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(mybag) user.grab_item_from_interacted_with(mybag, src) mybag = null diff --git a/code/game/objects/structures/kitchen_foodcart.dm b/code/game/objects/structures/kitchen_foodcart.dm index ac70e805479b..963becea89b1 100644 --- a/code/game/objects/structures/kitchen_foodcart.dm +++ b/code/game/objects/structures/kitchen_foodcart.dm @@ -22,7 +22,7 @@ return return ..() -/obj/structure/foodcart/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/foodcart/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(contents.len) var/obj/item/reagent_containers/food/choice = input("What would you like to grab from the cart?") as null|obj in contents if(choice) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index f7a359b6621d..eb239b4e9623 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -50,7 +50,7 @@ meat = 5 return 1 -/obj/structure/kitchenspike/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/kitchenspike/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..() || !occupied) return meat-- diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index f1a02501f39b..811bade0f729 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -42,7 +42,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh var/list/rare_loot = list() // Rare is powerful, or somewhat unique items. var/list/very_rare_loot = list()// Very Rare really powerful, or at least unique items. -/obj/structure/loot_pile/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/loot_pile/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) //Human mob if(isliving(user)) var/mob/living/L = user diff --git a/code/game/objects/structures/medical_stand_vr.dm b/code/game/objects/structures/medical_stand_vr.dm index d75cca4497b0..ee4ca93c4d39 100644 --- a/code/game/objects/structures/medical_stand_vr.dm +++ b/code/game/objects/structures/medical_stand_vr.dm @@ -164,7 +164,7 @@ update_icon() -/obj/structure/medical_stand/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/medical_stand/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/list/available_options = list() if (tank) available_options += "Toggle valve" diff --git a/code/game/objects/structures/mineral_bath.dm b/code/game/objects/structures/mineral_bath.dm index 20be8799ba9c..f729e46cd33f 100644 --- a/code/game/objects/structures/mineral_bath.dm +++ b/code/game/objects/structures/mineral_bath.dm @@ -66,7 +66,7 @@ START_PROCESSING(SSobj, src) return TRUE -/obj/structure/adherent_bath/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/adherent_bath/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) eject_occupant() /obj/structure/adherent_bath/proc/eject_occupant() diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 9863886324cf..d5a750efd32e 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -18,7 +18,7 @@ pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28) pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0 -/obj/structure/mirror/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/mirror/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!glass) return if(shattered) return diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index cedd2d94ca1d..05976db4f81d 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -82,7 +82,7 @@ if(Adjacent(user)) attack_hand(user) -/obj/structure/morgue/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/morgue/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (src.connected) close() else @@ -173,7 +173,7 @@ if(Adjacent(user)) attack_hand(user) -/obj/structure/m_tray/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/m_tray/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (src.connected) for(var/atom/movable/A as mob|obj in src.loc) if (!( A.anchored )) @@ -227,7 +227,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium) src.icon_state = "crema1" return -/obj/structure/morgue/crematorium/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/morgue/crematorium/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (cremating) to_chat(usr, "It's locked.") return @@ -350,7 +350,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium) req_access = list(ACCESS_GENERAL_CREMATOR) id = 1 -/obj/machinery/button/crematorium/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/button/crematorium/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return if(src.allowed(user)) diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index df4b3e64a557..9a710c58a5f2 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -43,7 +43,7 @@ new /obj/item/frame/noticeboard( src.loc ) qdel(src) -/obj/structure/noticeboard/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/noticeboard/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.do_examinate(src) // Since Topic() never seems to interact with usr on more than a superficial diff --git a/code/game/objects/structures/poster.dm b/code/game/objects/structures/poster.dm index 5588d702a59a..4c7978e4a6da 100644 --- a/code/game/objects/structures/poster.dm +++ b/code/game/objects/structures/poster.dm @@ -158,7 +158,7 @@ roll_and_drop(user.loc) return -/obj/structure/sign/poster/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/sign/poster/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(ruined) return diff --git a/code/game/objects/structures/props/beam_prism.dm b/code/game/objects/structures/props/beam_prism.dm index a4dda5f9fd64..776c402fe553 100644 --- a/code/game/objects/structures/props/beam_prism.dm +++ b/code/game/objects/structures/props/beam_prism.dm @@ -43,7 +43,7 @@ var/degrees_to_rotate = -1 * degrees_from_north animate(src, transform = turn(src.transform, degrees_to_rotate), time = 2) -/obj/structure/prop/prism/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/prop/prism/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() if(rotation_lock) @@ -157,7 +157,7 @@ var/list/my_turrets = list() var/dialID = null -/obj/structure/prop/prismcontrol/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/prop/prismcontrol/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() var/confirm = input("Do you want to try to rotate \the [src]?", "[name]") in list("Yes", "No") diff --git a/code/game/objects/structures/props/nest.dm b/code/game/objects/structures/props/nest.dm index 6be58cfc5d36..6a24f15cf45e 100644 --- a/code/game/objects/structures/props/nest.dm +++ b/code/game/objects/structures/props/nest.dm @@ -34,7 +34,7 @@ STOP_PROCESSING(SSobj, src) ..() -/obj/structure/prop/nest/attack_hand(mob/user, datum/event_args/clickchain/e_args) // Used to tell the player that this isn't useful for anything. +/obj/structure/prop/nest/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // Used to tell the player that this isn't useful for anything. ..() if(user && prob(disturbance_spawn_chance)) spawn_creature(get_turf(src)) diff --git a/code/game/objects/structures/props/prop.dm b/code/game/objects/structures/props/prop.dm index f62c7ebb1707..b45e65323557 100644 --- a/code/game/objects/structures/props/prop.dm +++ b/code/game/objects/structures/props/prop.dm @@ -9,7 +9,7 @@ anchored = TRUE var/interaction_message = null -/obj/structure/prop/attack_hand(mob/user, datum/event_args/clickchain/e_args) // Used to tell the player that this isn't useful for anything. +/obj/structure/prop/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // Used to tell the player that this isn't useful for anything. if(!istype(user)) return FALSE if(!interaction_message) diff --git a/code/game/objects/structures/props/puzzledoor.dm b/code/game/objects/structures/props/puzzledoor.dm index 881c71b83f24..f04bdb358414 100644 --- a/code/game/objects/structures/props/puzzledoor.dm +++ b/code/game/objects/structures/props/puzzledoor.dm @@ -53,7 +53,7 @@ locks -= L ..() -/obj/machinery/door/blast/puzzle/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/door/blast/puzzle/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(check_locks()) force_toggle(1, user) else diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 1b1910cce833..6adfffd2de4b 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -70,7 +70,7 @@ FLOOR SAFES icon_state = initial(icon_state) -/obj/structure/safe/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/safe/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) var/dat = "
" dat += "[open ? "Close" : "Open"] [src] | - [dial * 5] +" diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index 4123ffda3172..daceabf2554a 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -49,7 +49,7 @@ if(get_dist(user,src) <= 1) //not remotely though return TryToSwitchState(user) -/obj/structure/simple_door/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/simple_door/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return TryToSwitchState(user) /obj/structure/simple_door/CanAllowThrough(atom/movable/mover, turf/target) diff --git a/code/game/objects/structures/snowman.dm b/code/game/objects/structures/snowman.dm index 378c0eb103de..d3e5539eda5e 100644 --- a/code/game/objects/structures/snowman.dm +++ b/code/game/objects/structures/snowman.dm @@ -5,7 +5,7 @@ desc = "A happy little snowman smiles back at you!" anchored = 1 -/obj/structure/snowman/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/snowman/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.a_intent == INTENT_HARM) to_chat(user, "In one hit, [src] easily crumples into a pile of snow. You monster.") var/turf/simulated/floor/F = get_turf(src) diff --git a/code/game/objects/structures/stasis_cage.dm b/code/game/objects/structures/stasis_cage.dm index 86770411625b..a4e3b3988a8b 100644 --- a/code/game/objects/structures/stasis_cage.dm +++ b/code/game/objects/structures/stasis_cage.dm @@ -14,7 +14,7 @@ if(A) contain(A) -/obj/structure/stasis_cage/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/stasis_cage/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) release() /obj/structure/stasis_cage/attack_robot(var/mob/user) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index fe487d74693c..b529b7a89435 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -262,7 +262,7 @@ drop_sound = 'sound/items/drop/axe.ogg' pickup_sound = 'sound/items/pickup/axe.ogg' -/obj/item/roller/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/roller/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -301,7 +301,7 @@ . = ..() held = new /obj/item/roller(src) -/obj/item/roller_holder/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/roller_holder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index f6b06e16f929..164047ea0b03 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -97,7 +97,7 @@ create_track() driving = 0 -/obj/structure/bed/chair/wheelchair/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/bed/chair/wheelchair/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (pulling_along) MouseDrop(usr) return ..() @@ -195,7 +195,7 @@ /// What we unfold to var/unfolded_type = /obj/structure/bed/chair/wheelchair -/obj/item/wheelchair/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/wheelchair/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 37768da65d25..4fadf95503c6 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -44,7 +44,7 @@ return attack_hand(user) ..() -/obj/structure/dispenser/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/dispenser/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) var/dat = "[src]

" dat += "Oxygen tanks: [oxygentanks] - [oxygentanks ? "Dispense" : "empty"]
" diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 6168b575f5b0..4d2226d2af0e 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -29,7 +29,7 @@ else return ..() -/obj/structure/target_stake/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/target_stake/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // taking pinned targets off! if(pinned_target) pinned_target.layer = OBJ_LAYER diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm index f1b35f87c65c..7b09f824161b 100644 --- a/code/game/objects/structures/transit_tubes.dm +++ b/code/game/objects/structures/transit_tubes.dm @@ -107,7 +107,7 @@ return -/obj/structure/transit_tube/station/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/transit_tube/station/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!pod_moving) for(var/obj/structure/transit_tube_pod/pod in loc) if(!pod.moving && (pod.dir in directions())) diff --git a/code/game/objects/structures/trash_pile.dm b/code/game/objects/structures/trash_pile.dm index 6b47621c41b8..ce0607b10237 100644 --- a/code/game/objects/structures/trash_pile.dm +++ b/code/game/objects/structures/trash_pile.dm @@ -79,7 +79,7 @@ else return ..() -/obj/structure/trash_pile/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/trash_pile/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) //Human mob if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index 7cdb51ddc53d..65fe0be1a86a 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -5,7 +5,7 @@ icon_state = "cabinet_closed" density = 1 -/obj/structure/undies_wardrobe/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/undies_wardrobe/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!human_who_can_use_underwear(user)) to_chat(user, "Sadly there's nothing in here for you to wear.") return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index ddd0b2199379..0218e737908d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -17,7 +17,7 @@ open = round(rand(0, 1)) update_icon() -/obj/structure/toilet/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/toilet/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(swirlie) usr.setClickCooldown(user.get_attack_speed()) usr.visible_message("[user] slams the toilet seat onto [swirlie.name]'s head!", "You slam the toilet seat onto [swirlie.name]'s head!", "You hear reverberating porcelain.") @@ -172,7 +172,7 @@ anchored = 1 mouse_opacity = 0 -/obj/machinery/shower/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/shower/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/M = user if(!istype(M)) return @@ -386,7 +386,7 @@ thing.reagents.clear_reagents() thing.update_icon() -/obj/structure/sink/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/sink/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!user.standard_hand_usability_check(src, e_args.hand_index, HAND_MANIPULATION_GENERAL)) return @@ -489,7 +489,7 @@ icon_state = "puddle" desc = "A small pool of some liquid, ostensibly water." -/obj/structure/sink/puddle/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/sink/puddle/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) icon_state = "puddle-splash" ..() icon_state = "puddle" @@ -513,7 +513,7 @@ reagents.add_reagent(dispensedreagent, 20) /* Okay, just straight up, I tried to code this like blood overlays, but I just do NOT understand the system. If someone wants to sort it, enable this too. -/obj/structure/sink/oil_well/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/sink/oil_well/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) flick("puddle-oil-splash",src) reagents.reaction(M, 20) //Covers target in 20u of oil. to_chat(M, "You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water.") diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index 456a8e0768fb..b5e3ffe263c8 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -1,18 +1,3 @@ -/* - Screen objects - Todo: improve/re-implement - - Screen objects are only used for the hud and should not appear anywhere "in-game". - They are used with the client/screen list and the screen_loc var. - For more information, see the byond documentation on the screen_loc and screen vars. -*/ -/atom/movable/screen - icon = 'icons/mob/screen1.dmi' - layer = HUD_LAYER_BASE - plane = HUD_PLANE - var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - var/datum/hud/hud = null // A reference to the owner HUD, if any. - /atom/movable/screen/Destroy() master = null return ..() @@ -25,17 +10,6 @@ maptext_height = 480 maptext_width = 480 -/atom/movable/screen/close - name = "close" - -/atom/movable/screen/close/Click() - if(master) - if(istype(master, /obj/item/storage)) - var/obj/item/storage/S = master - S.close(usr) - return 1 - - /atom/movable/screen/item_action var/obj/item/owner @@ -66,29 +40,12 @@ G.s_click(src) return 1 -/atom/movable/screen/grab/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/atom/movable/screen/grab/attack_hand(mob/user, list/params) return /atom/movable/screen/grab/attackby() return - -/atom/movable/screen/storage - name = "storage" - -/atom/movable/screen/storage/Click() - if(!usr.canClick()) - return 1 - if(!CHECK_MOBILITY(usr, MOBILITY_CAN_STORAGE)) - return 1 - if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech - return 1 - if(master) - var/obj/item/I = usr.get_active_held_item() - if(I) - usr.ClickOn(master) - return 1 - /atom/movable/screen/zone_sel name = "damage zone" icon_state = "zone_sel" @@ -280,6 +237,11 @@ // suit storage locnames += "on your suit" tanks += H.s_store + // right/left hands + locnames += "in your right hand" + tanks += H.r_hand + locnames += "in your left hand" + tanks += H.l_hand // pockets locnames += "in your left pocket" tanks += H.l_store @@ -292,6 +254,11 @@ locnames += "on your back" tanks += H.back else + // right/left hands + locnames += "in your right hand" + tanks += C.r_hand + locnames += "in your left hand" + tanks += C.l_hand // back locnames += "on your back" tanks += C.back diff --git a/code/game/turfs/simulated/floor_types/snow.dm b/code/game/turfs/simulated/floor_types/snow.dm index cb7fcdd14d7c..331a52824c9d 100644 --- a/code/game/turfs/simulated/floor_types/snow.dm +++ b/code/game/turfs/simulated/floor_types/snow.dm @@ -39,7 +39,7 @@ else ..() -/turf/simulated/floor/outdoors/snow/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/turf/simulated/floor/outdoors/snow/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) visible_message("[user] starts scooping up some snow.", "You start scooping up some snow.") if(do_after(user, 1 SECOND)) user.put_in_hands_or_drop(new /obj/item/stack/material/snow) diff --git a/code/game/turfs/simulated/flooring/flooring_traps.dm b/code/game/turfs/simulated/flooring/flooring_traps.dm index af68f1cb4441..944abc1e4cb7 100644 --- a/code/game/turfs/simulated/flooring/flooring_traps.dm +++ b/code/game/turfs/simulated/flooring/flooring_traps.dm @@ -31,7 +31,7 @@ else if (tripped) icon_state = "[initial(icon_state)]_tripped" -/turf/simulated/floor/trap/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/turf/simulated/floor/trap/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(tripped) to_chat(usr, "You reset the triggered mechanism.") tripped = 0 diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 10f1a24b1664..e3496ebf8d45 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -255,7 +255,7 @@ /turf/proc/is_solid_structure() return TRUE -/turf/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/turf/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() //QOL feature, clicking on turf can toggle doors, unless pulling something if(!user.pulling) diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm index dda4dac68c6e..59d0d5d71c9c 100644 --- a/code/modules/artifice/deadringer.dm +++ b/code/modules/artifice/deadringer.dm @@ -28,7 +28,7 @@ reveal() watchowner = null -/obj/item/deadringer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/deadringer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index fb0bb2fa0736..00424735c299 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -97,7 +97,7 @@ return -/obj/item/assembly/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/assembly/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index cef598dc4c9c..6534dafe8383 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -85,7 +85,7 @@ a_right.holder_movement() -/obj/item/assembly_holder/attack_hand(mob/user, datum/event_args/clickchain/e_args)//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess +/obj/item/assembly_holder/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args)//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() @@ -108,7 +108,7 @@ else ..() -/obj/item/assembly_holder/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/assembly_holder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index bffbce1857bc..be6d75fc8860 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -32,7 +32,7 @@ return TRUE -/obj/item/assembly/igniter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/assembly/igniter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index f81b9fb43177..406aeed44cad 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -48,7 +48,7 @@ update_icon() pulse(0) -/obj/item/assembly/mousetrap/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/assembly/mousetrap/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(!armed) to_chat(user, "You arm [src].") else @@ -68,7 +68,7 @@ playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) -/obj/item/assembly/mousetrap/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/assembly/mousetrap/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 184dac8fe397..1ba8083ce21f 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -33,7 +33,7 @@ add_fingerprint(user) return -/obj/item/assembly/shock_kit/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/assembly/shock_kit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index c68b7729e5ce..9ce11f99f074 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -25,7 +25,7 @@ T.visible_message("[icon2html(thing = src, target = world)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") -/obj/item/assembly/voice/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/assembly/voice/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm b/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm index 55e49daf9499..fb6a8bf7103e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm @@ -137,7 +137,7 @@ to_chat(user, SPAN_NOTICE("You cannot insert this item into \the [src]!")) return -/obj/machinery/atmospherics/component/binary/algae_farm/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/algae_farm/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm index 0e7ac8a1e6c9..f1afd403638e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/heat_pump.dm @@ -116,7 +116,7 @@ "You hear ratchet.") deconstruct() -/obj/machinery/atmospherics/component/binary/heat_pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/heat_pump/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return src.add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm index 88dc5f0ae67d..02f90da33167 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm @@ -147,7 +147,7 @@ return data -/obj/machinery/atmospherics/component/binary/massive_gas_pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/massive_gas_pump/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm index d48bf12a6323..b7737ec78a2b 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm @@ -183,7 +183,7 @@ return data -/obj/machinery/atmospherics/component/binary/massive_heat_pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/massive_heat_pump/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 666f5b105e7f..6e8ee8a6c660 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -168,7 +168,7 @@ update_icon() return -/obj/machinery/atmospherics/component/binary/passive_gate/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/passive_gate/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 16cfe2cf9436..1523f3c50882 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -231,7 +231,7 @@ Thus, the two variables affect pump operation are set in New(): . = ..() ui_interact(user) -/obj/machinery/atmospherics/component/binary/pump/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/binary/pump/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return add_fingerprint(usr) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index 192ad5373df5..b593961266f0 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -130,7 +130,7 @@ /obj/machinery/atmospherics/valve/attack_ai(mob/user as mob) return -/obj/machinery/atmospherics/valve/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/valve/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) src.add_fingerprint(usr) update_icon() sleep(10) @@ -234,7 +234,7 @@ /obj/machinery/atmospherics/valve/digital/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/atmospherics/valve/digital/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/valve/digital/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!powered()) return if(!src.allowed(user)) diff --git a/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm b/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm index 42d3f1627412..242ce0d43334 100644 --- a/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm +++ b/code/modules/atmospherics/machinery/components/omni_devices/omni_base.dm @@ -102,7 +102,7 @@ return TRUE return FALSE -/obj/machinery/atmospherics/component/quaternary/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/quaternary/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index a495f614bf35..a427b56309f9 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -95,7 +95,7 @@ data["node2_dir"] = dir_name(node_connects[2],TRUE) return data -/obj/machinery/atmospherics/component/trinary/mixer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/trinary/mixer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return ui_interact(user) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm b/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm index fe00ea4c413f..218c9bff8ca0 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm @@ -160,7 +160,7 @@ /obj/machinery/atmospherics/tvalve/attack_ai(mob/user as mob) return -/obj/machinery/atmospherics/tvalve/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/tvalve/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) src.add_fingerprint(usr) animation() sleep(10) @@ -284,7 +284,7 @@ /obj/machinery/atmospherics/tvalve/digital/attack_ai(mob/user as mob) return src.attack_hand(user) -/obj/machinery/atmospherics/tvalve/digital/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/tvalve/digital/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!powered()) return if(!src.allowed(user)) diff --git a/code/modules/atmospherics/machinery/components/unary/cold_sink.dm b/code/modules/atmospherics/machinery/components/unary/cold_sink.dm index 906822f9a1c7..e7c576661f2c 100644 --- a/code/modules/atmospherics/machinery/components/unary/cold_sink.dm +++ b/code/modules/atmospherics/machinery/components/unary/cold_sink.dm @@ -59,7 +59,7 @@ /obj/machinery/atmospherics/component/unary/freezer/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/atmospherics/component/unary/freezer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/unary/freezer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /obj/machinery/atmospherics/component/unary/freezer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/atmospherics/machinery/components/unary/heat_source.dm b/code/modules/atmospherics/machinery/components/unary/heat_source.dm index ce6e6305675c..022f5157f20b 100644 --- a/code/modules/atmospherics/machinery/components/unary/heat_source.dm +++ b/code/modules/atmospherics/machinery/components/unary/heat_source.dm @@ -73,7 +73,7 @@ /obj/machinery/atmospherics/component/unary/heater/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/atmospherics/component/unary/heater/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/unary/heater/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /obj/machinery/atmospherics/component/unary/heater/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm index 9b3f6b417c30..bb0ed4a3cbaf 100644 --- a/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary/outlet_injector.dm @@ -197,7 +197,7 @@ /obj/machinery/atmospherics/component/unary/outlet_injector/hide(var/i) update_underlays() -/obj/machinery/atmospherics/component/unary/outlet_injector/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atmospherics/component/unary/outlet_injector/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /obj/machinery/atmospherics/component/unary/outlet_injector/proc/toggle_injecting() diff --git a/code/modules/atmospherics/machinery/portable/area_atmos_computer.dm b/code/modules/atmospherics/machinery/portable/area_atmos_computer.dm index 010a4bb79e0a..6b799e21fdce 100644 --- a/code/modules/atmospherics/machinery/portable/area_atmos_computer.dm +++ b/code/modules/atmospherics/machinery/portable/area_atmos_computer.dm @@ -23,7 +23,7 @@ /obj/machinery/computer/area_atmos/attack_ai(mob/user) return src.attack_hand(user) -/obj/machinery/computer/area_atmos/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/area_atmos/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..(user)) return ui_interact(user) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index a07633218d1c..0d4d50dec045 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -296,7 +296,7 @@ update_flag /obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/portable_atmospherics/canister/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/portable_atmospherics/canister/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return src.ui_interact(user) /obj/machinery/portable_atmospherics/canister/ui_state() diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm index 519137c15b43..466351a52353 100644 --- a/code/modules/awaymissions/bluespaceartillery.dm +++ b/code/modules/awaymissions/bluespaceartillery.dm @@ -20,7 +20,7 @@ /obj/structure/artilleryplaceholder/decorative density = 0 -/obj/machinery/artillerycontrol/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/artillerycontrol/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) var/dat = "Bluespace Artillery Control:
" dat += "Locked on
" diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index a1d81b688b09..1e4d2764b153 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -107,7 +107,7 @@ update_icon() -/obj/machinery/gateway/centerstation/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/gateway/centerstation/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!ready) detect() return @@ -217,7 +217,7 @@ update_icon() -/obj/machinery/gateway/centeraway/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/gateway/centeraway/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!ready) detect() return diff --git a/code/modules/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm index 289aa45e3259..4fe1a670dc65 100644 --- a/code/modules/catalogue/cataloguer.dm +++ b/code/modules/catalogue/cataloguer.dm @@ -246,7 +246,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers) /obj/item/cataloguer/proc/adjust_points(amount) points_stored = max(0, points_stored += amount) -/obj/item/cataloguer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/cataloguer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index f601272ab8ef..e5d592b69db5 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -48,7 +48,7 @@ BLIND // can't see anything if(!isnull(vision_modifier)) user.remove_vision_modifier(vision_modifier) -/obj/item/clothing/glasses/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/glasses/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -421,7 +421,7 @@ BLIND // can't see anything flash_protection = FLASH_PROTECTION_MAJOR tint = TINT_HEAVY -/obj/item/clothing/glasses/welding/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/glasses/welding/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -542,7 +542,7 @@ BLIND // can't see anything toggleable = 1 activation_sound = 'sound/effects/pop.ogg' -/obj/item/clothing/glasses/sunglasses/sechud/aviator/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/glasses/sunglasses/sechud/aviator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -661,7 +661,7 @@ BLIND // can't see anything body_cover_flags = EYES species_restricted = list(SPECIES_TESHARI) -/obj/item/clothing/glasses/aerogelgoggles/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/glasses/aerogelgoggles/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index a7ecf7fa6b9f..0be6917ef440 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -111,7 +111,7 @@ name = "[initial(name)]" user.visible_message("[user] deletes the prescription data on the [src.name].") -/obj/item/clothing/glasses/omnihud/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/glasses/omnihud/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -209,7 +209,7 @@ vision_flags = SEE_TURFS //but they can spot breaches. Due to the way HUDs work, they don't provide darkvision up-close the way mesons do. -/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -296,7 +296,7 @@ toggleable = 1 vision_flags = SEE_TURFS //but they can spot breaches. Due to the way HUDs work, they don't provide darkvision up-close the way mesons do. -/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 24cee7fd50cd..5d0ec650353d 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -183,7 +183,7 @@ var/blessed = FALSE -/obj/item/clothing/gloves/swat/para/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/gloves/swat/para/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/gloves/rings/rings.dm b/code/modules/clothing/gloves/rings/rings.dm index f171cb9cefd7..2aa29da30917 100644 --- a/code/modules/clothing/gloves/rings/rings.dm +++ b/code/modules/clothing/gloves/rings/rings.dm @@ -6,7 +6,7 @@ icon_state = "diamond" item_state = "diamond_s" -/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -100,7 +100,7 @@ icon_state = "seal-signet" var/nameset = FALSE -/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -124,7 +124,7 @@ item_state = "wedring_g" var/partnername = "" -/obj/item/clothing/gloves/ring/wedding/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/gloves/ring/wedding/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 5082be19e261..2d1b9f6c73de 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -22,7 +22,7 @@ unequip_sound = 'sound/items/drop/hat.ogg' pickup_sound = 'sound/items/pickup/hat.ogg' -/obj/item/clothing/head/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index d186688ed022..b976212f8a54 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -67,7 +67,7 @@ valid_accessory_slots = ACCESSORY_SLOT_HELM_R action_button_name = "Toggle Visor" -/obj/item/clothing/head/helmet/riot/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/helmet/riot/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -283,7 +283,7 @@ var/blessed = TRUE -/obj/item/clothing/head/helmet/para/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/helmet/para/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -312,7 +312,7 @@ armor_type = /datum/armor/centcom/ert/paracausal action_button_name = "Enable Wards" -/obj/item/clothing/head/helmet/para/inquisitor/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/helmet/para/inquisitor/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index f55b624e0657..f1b2ae9941e4 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -552,7 +552,7 @@ icon_state = "reindeer0" action_button_name = "Toggle Nose" -/obj/item/clothing/head/reindeer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/reindeer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -694,7 +694,7 @@ worn_render_flags = WORN_RENDER_SLOT_ONE_FOR_ALL action_button_name = "Toggle Hood" -/obj/item/clothing/head/cowl/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/cowl/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index e18d9d8a6a29..231dab959ee2 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -31,7 +31,7 @@ drop_sound = 'sound/items/drop/helm.ogg' pickup_sound = 'sound/items/pickup/helm.ogg' -/obj/item/clothing/head/welding/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/welding/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -138,7 +138,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 1) -/obj/item/clothing/head/cakehat/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/cakehat/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -166,7 +166,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE cold_protection_cover = HEAD -/obj/item/clothing/head/ushanka/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/ushanka/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/pilot_helmet.dm b/code/modules/clothing/head/pilot_helmet.dm index 070cdae4827a..9db8031b2339 100644 --- a/code/modules/clothing/head/pilot_helmet.dm +++ b/code/modules/clothing/head/pilot_helmet.dm @@ -188,7 +188,7 @@ icon_state = "pilot_helmet2" action_button_name = "Toggle Visor" -/obj/item/clothing/head/pilot/alt/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/pilot/alt/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index aafeaf6f7431..a7dd1cbf0819 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -12,7 +12,7 @@ flipped=0 ..() -/obj/item/clothing/head/soft/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/soft/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 8e8a31b86c22..39e6b9a38ed1 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -29,7 +29,7 @@ to_chat(user, "You pull the mask up to cover your face.") update_worn_icon() -/obj/item/clothing/mask/breath/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/mask/breath/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index a4f43506ff10..591cf03aad44 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -79,7 +79,7 @@ set src in usr adjust_mask(usr) -/obj/item/clothing/mask/gas/half/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/mask/gas/half/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -122,7 +122,7 @@ to_chat(user, "Your mask moves to cover your mouth.") return -/obj/item/clothing/mask/gas/swat/vox/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/mask/gas/swat/vox/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 55d588cca86e..74d9a90ea86c 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -66,7 +66,7 @@ update_icon() -/obj/item/clothing/shoes/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/shoes/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(can_hold_knife == 1 && holding && src.loc == user) draw_knife() return @@ -104,7 +104,7 @@ else return ..() -/obj/item/clothing/shoes/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/shoes/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return //gtfo my shoe diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index 875f8982bdcb..b9823f66b2fe 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -207,7 +207,7 @@ var/blessed = FALSE -/obj/item/clothing/shoes/boots/swat/para/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/shoes/boots/swat/para/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 4d551fb1855b..3480ec094939 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -113,7 +113,7 @@ icon_state = "orange" chained = null -/obj/item/clothing/shoes/orange/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/shoes/orange/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index f4ca54a7d4b2..6849442ff216 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -22,7 +22,7 @@ /obj/item/clothing/shoes/magboots/proc/update_magboot_encumbrance() set_encumbrance(initial(encumbrance) + (magpulse? encumbrance_on : 0)) -/obj/item/clothing/shoes/magboots/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/shoes/magboots/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -79,7 +79,7 @@ action_button_name = "Toggle the magclaws" -/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(src.magpulse) clothing_flags &= ~NOSLIP magpulse = 0 diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index efd7bda3ad4e..3f301654e4e0 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -238,7 +238,7 @@ to_chat(H, "You deploy your magboots.") // below is code for the action button method. im dumb. but it works? if you figure out a way to make it better tell me // hey peesh i made it better -hatter -/obj/item/clothing/suit/space/void/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/suit/space/void/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 0014e26af613..6878c40c0af2 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -216,7 +216,7 @@ return PROJECTILE_FORCE_MISS return 0 -/obj/item/clothing/suit/armor/reactive/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/suit/armor/reactive/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -773,7 +773,7 @@ var/anti_magic = FALSE var/blessed = FALSE -/obj/item/clothing/suit/armor/vest/para/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/suit/armor/vest/para/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/suits/medieval_armor.dm b/code/modules/clothing/suits/medieval_armor.dm index 2f2c573ca172..0c35a5b87738 100644 --- a/code/modules/clothing/suits/medieval_armor.dm +++ b/code/modules/clothing/suits/medieval_armor.dm @@ -31,7 +31,7 @@ icon_state = "paladinhelm" action_button_name = "Toggle Visor" -/obj/item/clothing/head/helmet/medieval/paladin/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/helmet/medieval/paladin/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -176,7 +176,7 @@ icon_state = "paladinhelm" action_button_name = "Toggle Visor" -/obj/item/clothing/head/medievalfake/paladin/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/head/medievalfake/paladin/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 9d89aa8ab53f..86d3bbcb7c72 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -133,7 +133,7 @@ ..() //default attack_hand behaviour -/obj/item/clothing/accessory/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(accessory_host) return //we aren't an object on the ground so don't call parent ..() @@ -386,7 +386,7 @@ slot = ACCESSORY_SLOT_DECOR action_button_name = "Adjust Gaiter" -/obj/item/clothing/accessory/gaiter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/gaiter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -497,7 +497,7 @@ overlay_state = "choker_cst_overlay" var/customized = 0 -/obj/item/clothing/accessory/choker/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/choker/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -767,7 +767,7 @@ /obj/item/clothing/accessory/collar/holo/indigestible/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/clothing/accessory/collar/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/collar/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm index 6554fe0dda1d..4d0f5c1ed520 100644 --- a/code/modules/clothing/under/accessories/armor.dm +++ b/code/modules/clothing/under/accessories/armor.dm @@ -480,7 +480,7 @@ camera_networks = list(NETWORK_CIV_HELMETS) -/obj/item/clothing/accessory/armor/helmetcamera/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/armor/helmetcamera/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 26f8eb4aab19..db791fad1afa 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -28,7 +28,7 @@ /obj/item/clothing/accessory/badge/proc/set_desc(var/mob/living/carbon/human/H) -/obj/item/clothing/accessory/badge/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/badge/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -56,7 +56,7 @@ icon_state = "sheriff" item_state = "goldbadge" -/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -79,7 +79,7 @@ icon_state = "holobadge-cord" slot_flags = SLOT_MASK | SLOT_TIE | SLOT_BELT -/obj/item/clothing/accessory/badge/holo/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/badge/holo/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 2accc10ccb1a..4bce00a4c8de 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -135,7 +135,7 @@ /obj/item/gun/ballistic, /obj/item/ammo_magazine, /obj/item/melee/baton) action_button_name = "Adjust Cloak" -/obj/item/clothing/accessory/poncho/rough_cloak/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/poncho/rough_cloak/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index c94e3d3a265b..00343999a8fd 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -66,7 +66,7 @@ set_weight_class(initial(w_class)) clear_holster() -/obj/item/clothing/accessory/holster/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/holster/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (accessory_host && (slot & ACCESSORY_SLOT_UTILITY)) if(holstered) unholster(user) diff --git a/code/modules/clothing/under/accessories/lockets.dm b/code/modules/clothing/under/accessories/lockets.dm index a2852f9ac30d..e12238fa8292 100644 --- a/code/modules/clothing/under/accessories/lockets.dm +++ b/code/modules/clothing/under/accessories/lockets.dm @@ -11,7 +11,7 @@ var/open var/obj/item/held //Item inside locket. -/obj/item/clothing/accessory/locket/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/locket/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/permits.dm b/code/modules/clothing/under/accessories/permits.dm index 0c639691c5df..a3243a877332 100755 --- a/code/modules/clothing/under/accessories/permits.dm +++ b/code/modules/clothing/under/accessories/permits.dm @@ -9,7 +9,7 @@ slot = ACCESSORY_SLOT_MEDAL var/owner = 0 //To prevent people from just renaming the thing if they steal it -/obj/item/clothing/accessory/permit/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/permit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm index d7ed971f7a10..281fdbb77ee9 100644 --- a/code/modules/detectivework/microscope/dnascanner.dm +++ b/code/modules/detectivework/microscope/dnascanner.dm @@ -142,7 +142,7 @@ /obj/machinery/dnaforensics/attack_ai(mob/user) ui_interact(user) -/obj/machinery/dnaforensics/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/dnaforensics/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /obj/machinery/dnaforensics/update_icon() diff --git a/code/modules/detectivework/microscope/microscope.dm b/code/modules/detectivework/microscope/microscope.dm index cef5c5c207d2..696f0910d0c5 100644 --- a/code/modules/detectivework/microscope/microscope.dm +++ b/code/modules/detectivework/microscope/microscope.dm @@ -25,7 +25,7 @@ return return ..() -/obj/machinery/microscope/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/microscope/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!sample) to_chat(user, "The microscope has no sample to examine.") diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index 00ca073aa54a..15904d6a8caf 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -72,7 +72,7 @@ stored_item = I set_weight_class(I.w_class) -/obj/item/evidencebag/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/evidencebag/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 945a4b62a494..2422288026d4 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -57,7 +57,7 @@ STOP_PROCESSING(SSobj, src) //so we don't continue turning to ash while gc'd return ..() -/obj/item/reagent_containers/glass/rag/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/glass/rag/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/sample_kits.dm b/code/modules/detectivework/tools/sample_kits.dm index 82cf7a728202..8c3efd883538 100644 --- a/code/modules/detectivework/tools/sample_kits.dm +++ b/code/modules/detectivework/tools/sample_kits.dm @@ -60,7 +60,7 @@ icon_state = "fingerprint0" item_state = "paper" -/obj/item/sample/print/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/sample/print/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm index 9c4e310022e1..bcadd2dda136 100644 --- a/code/modules/detectivework/tools/uvlight.dm +++ b/code/modules/detectivework/tools/uvlight.dm @@ -18,7 +18,7 @@ var/on = 0 var/step_alpha = 50 -/obj/item/uv_light/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/uv_light/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/EFTPOS.dm b/code/modules/economy/items/EFTPOS.dm index 9b952921682e..191751a811e8 100644 --- a/code/modules/economy/items/EFTPOS.dm +++ b/code/modules/economy/items/EFTPOS.dm @@ -84,7 +84,7 @@ D.wrapped = R D.name = "small parcel - 'EFTPOS access code'" -/obj/item/eftpos/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/eftpos/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/cash.dm b/code/modules/economy/items/cash.dm index 7b01e0837295..bc98cd10153e 100644 --- a/code/modules/economy/items/cash.dm +++ b/code/modules/economy/items/cash.dm @@ -85,7 +85,7 @@ update_icon() return worth -/obj/item/spacecash/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/spacecash/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -187,7 +187,7 @@ pickup_sound = 'sound/items/pickup/card.ogg' var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions. -/obj/item/spacecash/ewallet/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/spacecash/ewallet/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/coins.dm b/code/modules/economy/items/coins.dm index 2c8e33cb4d94..a485d2d0c628 100644 --- a/code/modules/economy/items/coins.dm +++ b/code/modules/economy/items/coins.dm @@ -103,7 +103,7 @@ to_chat(user, "You detach the string from the coin.") else ..() -/obj/item/coin/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/coin/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/retail_scanner.dm b/code/modules/economy/items/retail_scanner.dm index d5def65cafba..6b488109d2cf 100644 --- a/code/modules/economy/items/retail_scanner.dm +++ b/code/modules/economy/items/retail_scanner.dm @@ -46,7 +46,7 @@ setDir(SOUTH) pixel_y = 0 -/obj/item/retail_scanner/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/retail_scanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/economy/machines/ATM.dm b/code/modules/economy/machines/ATM.dm index 2d3be81532d5..3fdd838f12de 100644 --- a/code/modules/economy/machines/ATM.dm +++ b/code/modules/economy/machines/ATM.dm @@ -308,7 +308,7 @@ GLOBAL_LIST_INIT(atm_sounds, list('sound/items/polaroid1.ogg', 'sound/items/pola authenticated_account = null account_security_level = 0 -/obj/machinery/atm/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/atm/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(istype(user, /mob/living/silicon)) to_chat (user, SPAN_WARNING("A firewall prevents you from interfacing with this device!")) return diff --git a/code/modules/economy/machines/Accounts_DB.dm b/code/modules/economy/machines/Accounts_DB.dm index 1659b10f635b..7eef108386f4 100644 --- a/code/modules/economy/machines/Accounts_DB.dm +++ b/code/modules/economy/machines/Accounts_DB.dm @@ -57,7 +57,7 @@ attack_hand(user) -/obj/machinery/account_database/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/account_database/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return nano_ui_interact(user) diff --git a/code/modules/economy/machines/cash_register.dm b/code/modules/economy/machines/cash_register.dm index 3f5e37d38637..b2f871d942bb 100644 --- a/code/modules/economy/machines/cash_register.dm +++ b/code/modules/economy/machines/cash_register.dm @@ -39,7 +39,7 @@ . += "It's completely empty." -/obj/machinery/cash_register/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/cash_register/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // Don't be accessible from the wrong side of the machine if(get_dir(src, user) & global.reverse_dir[src.dir]) return diff --git a/code/modules/economy/machines/mint.dm b/code/modules/economy/machines/mint.dm index c5bd9a9636ef..daacc66ee439 100644 --- a/code/modules/economy/machines/mint.dm +++ b/code/modules/economy/machines/mint.dm @@ -81,7 +81,7 @@ if(processed) qdel(O) -/obj/machinery/mineral/mint/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/mineral/mint/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/dat = "Coin Press
" @@ -474,7 +474,7 @@ /obj/machinery/coinbank/attack_ai(mob/user as mob) attack_hand(user) -/obj/machinery/coinbank/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/coinbank/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return wires.Interact(user) diff --git a/code/modules/economy/money_bag.dm b/code/modules/economy/money_bag.dm index 695c90b3b256..334bf4051b5f 100644 --- a/code/modules/economy/money_bag.dm +++ b/code/modules/economy/money_bag.dm @@ -8,7 +8,7 @@ throw_force = 2.0 w_class = WEIGHT_CLASS_BULKY -/obj/item/moneybag/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/moneybag/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/amt_supermatter = 0 var/amt_bananium = 0 var/amt_mhydrogen = 0 diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index 7531db693f60..06d79e6aadd1 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -18,6 +18,6 @@ icon_state = "construction_kit" w_class = WEIGHT_CLASS_TINY -/obj/item/aquarium_kit/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/aquarium_kit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() to_chat(user, SPAN_NOTICE("There's instruction and tools necessary to build aquarium inside. All you need is to start crafting.")) diff --git a/code/modules/food/drinkingglass/extras.dm b/code/modules/food/drinkingglass/extras.dm index bb6cdb02baad..94b0d7690eb9 100644 --- a/code/modules/food/drinkingglass/extras.dm +++ b/code/modules/food/drinkingglass/extras.dm @@ -26,7 +26,7 @@ else return ..() -/obj/item/reagent_containers/food/drinks/glass2/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/food/drinks/glass2/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(src != user.get_inactive_held_item()) return ..() diff --git a/code/modules/food/drinks/bottle.dm b/code/modules/food/drinks/bottle.dm index 330c2c9ba111..78d7dd038c8c 100644 --- a/code/modules/food/drinks/bottle.dm +++ b/code/modules/food/drinks/bottle.dm @@ -107,7 +107,7 @@ return ..() -/obj/item/reagent_containers/food/drinks/bottle/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/food/drinks/bottle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm index 08072080a88c..fce40d6280bd 100644 --- a/code/modules/food/food/condiment.dm +++ b/code/modules/food/food/condiment.dm @@ -18,7 +18,7 @@ /obj/item/reagent_containers/food/condiment/attackby(var/obj/item/W as obj, var/mob/user as mob) return -/obj/item/reagent_containers/food/condiment/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/food/condiment/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm index baadaef982c1..d430d998e622 100644 --- a/code/modules/food/food/drinks.dm +++ b/code/modules/food/food/drinks.dm @@ -25,7 +25,7 @@ price_tag = null return -/obj/item/reagent_containers/food/drinks/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/food/drinks/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/food/glass/bottle.dm b/code/modules/food/glass/bottle.dm index cfefbdefce2e..7e47c25b1cee 100644 --- a/code/modules/food/glass/bottle.dm +++ b/code/modules/food/glass/bottle.dm @@ -26,7 +26,7 @@ ..() update_icon() -/obj/item/reagent_containers/glass/bottle/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/glass/bottle/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() update_icon() diff --git a/code/modules/food/machinery/appliance/_appliance.dm b/code/modules/food/machinery/appliance/_appliance.dm index e52f72897d2d..641141ac8286 100644 --- a/code/modules/food/machinery/appliance/_appliance.dm +++ b/code/modules/food/machinery/appliance/_appliance.dm @@ -541,7 +541,7 @@ smoke.set_up(10, 0, get_turf(src), 300) smoke.start() -/obj/machinery/appliance/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/appliance/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (cooking_objs.len) if (removal_menu(user)) return diff --git a/code/modules/food/machinery/gibber.dm b/code/modules/food/machinery/gibber.dm index b15f06b96333..c5090d677078 100644 --- a/code/modules/food/machinery/gibber.dm +++ b/code/modules/food/machinery/gibber.dm @@ -76,7 +76,7 @@ src.go_out() return -/obj/machinery/gibber/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/gibber/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return if(operating) diff --git a/code/modules/food/machinery/microwave.dm b/code/modules/food/machinery/microwave.dm index 59f8f3dfbda6..d31dbd2e4ae9 100644 --- a/code/modules/food/machinery/microwave.dm +++ b/code/modules/food/machinery/microwave.dm @@ -162,7 +162,7 @@ if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) attack_hand(user) -/obj/machinery/microwave/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/microwave/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/code/modules/food/machinery/smartfridge.dm b/code/modules/food/machinery/smartfridge.dm index 497d4ac0866c..d75dd5222df9 100644 --- a/code/modules/food/machinery/smartfridge.dm +++ b/code/modules/food/machinery/smartfridge.dm @@ -202,7 +202,7 @@ /obj/machinery/smartfridge/attack_ai(mob/user as mob) attack_hand(user) -/obj/machinery/smartfridge/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/smartfridge/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return wires.Interact(user) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index f286c73ab877..3b96a63c096f 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -67,7 +67,7 @@ return ..() -/obj/item/deck/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/deck/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/carbon/human/H = user if(istype(src.loc, /obj/item/storage) || src == H.r_store || src == H.l_store || src.loc == user) // so objects can be removed from storage containers or pockets. also added a catch-all, so if it's in the mob you'll pick it up. ..() @@ -212,7 +212,7 @@ ..() -/obj/item/deck/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/deck/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -275,7 +275,7 @@ pickup_sound = 'sound/items/pickup/paper.ogg' -/obj/item/pack/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pack/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -337,7 +337,7 @@ if(!cards.len) qdel(src) -/obj/item/hand/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/hand/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/games/dice.dm b/code/modules/games/dice.dm index 8c222e7abf10..f0e15edc3335 100644 --- a/code/modules/games/dice.dm +++ b/code/modules/games/dice.dm @@ -55,7 +55,7 @@ sides = 10 result = 10 -/obj/item/dice/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/dice/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -148,7 +148,7 @@ /obj/item/dice, ) -/obj/item/storage/dicecup/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/storage/dicecup/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/hardsuits/pieces.dm b/code/modules/hardsuits/pieces.dm index f1ddbe6630b5..84688d96acc5 100644 --- a/code/modules/hardsuits/pieces.dm +++ b/code/modules/hardsuits/pieces.dm @@ -85,7 +85,7 @@ hardsuit = null return ..() -/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(tacknife) tacknife.loc = get_turf(src) if(user.put_in_active_hand(tacknife)) diff --git a/code/modules/hardsuits/rig_attackby.dm b/code/modules/hardsuits/rig_attackby.dm index f1f75469a0c2..6757309b2f86 100644 --- a/code/modules/hardsuits/rig_attackby.dm +++ b/code/modules/hardsuits/rig_attackby.dm @@ -169,7 +169,7 @@ ..() -/obj/item/hardsuit/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/hardsuit/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(electrified != 0) if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here. diff --git a/code/modules/hardsuits/rig_pieces.dm b/code/modules/hardsuits/rig_pieces.dm index bf580778df5f..471a9793cdc9 100644 --- a/code/modules/hardsuits/rig_pieces.dm +++ b/code/modules/hardsuits/rig_pieces.dm @@ -178,7 +178,7 @@ SPECIES_ZORREN_HIGH, ) -/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/suit/space/hardsuit/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(tacknife) tacknife.loc = get_turf(src) if(user.put_in_active_hand(tacknife)) diff --git a/code/modules/hardsuits/suits/ert.dm b/code/modules/hardsuits/suits/ert.dm index bbe3cd8bd36a..c7db851bb816 100644 --- a/code/modules/hardsuits/suits/ert.dm +++ b/code/modules/hardsuits/suits/ert.dm @@ -153,7 +153,7 @@ /obj/item/hardsuit_module/self_destruct ) -/obj/item/hardsuit/ert/para/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/hardsuit/ert/para/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index c5ee415c3988..95b91e324001 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -75,7 +75,7 @@ /obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/HolodeckControl/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/HolodeckControl/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return user.set_machine(src) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 01cca386a854..e190d7d0ce87 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -250,7 +250,7 @@ return TRUE return FALSE -/obj/item/holo/esword/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/holo/esword/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -365,7 +365,7 @@ /obj/machinery/readybutton/attackby(obj/item/W as obj, mob/user as mob) to_chat(user, "The device is a solid button, there's nothing you can do with it!") -/obj/machinery/readybutton/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/readybutton/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") diff --git a/code/modules/holomap/station_holomap.dm b/code/modules/holomap/station_holomap.dm index 7a3c644576a9..1a68c7e39f6f 100644 --- a/code/modules/holomap/station_holomap.dm +++ b/code/modules/holomap/station_holomap.dm @@ -70,7 +70,7 @@ // floor_markings.layer = FLOOR_DECAL_LAYER update_icon() -/obj/machinery/station_map/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/station_map/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(watching_mob && (watching_mob != user)) to_chat(user, "Someone else is currently watching the holomap.") return diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index a4d9572a465d..4a06f6293b10 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -122,7 +122,7 @@ qdel(src) return -/obj/machinery/beehive/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/beehive/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!closed) if(honeycombs < 100) to_chat(user, "There are no filled honeycombs.") @@ -228,7 +228,7 @@ icon = 'icons/obj/apiary_bees_etc.dmi' icon_state = "apiary" -/obj/item/beehive_assembly/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/beehive_assembly/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index b09a3de074f7..2b6670063b7e 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -258,7 +258,7 @@ to_chat(user, "\The [src] has fallen to bits.") qdel(src) -/obj/item/reagent_containers/food/snacks/grown/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/food/snacks/grown/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index be56fb0c93a4..994c176dd90e 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -13,7 +13,7 @@ pixel_x = rand(-5,5) pixel_y = rand(-5,5) -/obj/item/disk/botany/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/disk/botany/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -63,7 +63,7 @@ /obj/machinery/botany/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/botany/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/botany/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /obj/machinery/botany/proc/finished_task() diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 05f40a995b52..1c05181dcd54 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -206,7 +206,7 @@ /obj/item/seeds/whitebeetseed = 3 ) -/obj/machinery/seed_storage/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/seed_storage/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index dc956bd03f5c..49a80bab7d2c 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -36,7 +36,7 @@ integrity_enabled = TRUE obj_flags = OBJ_MELEE_TARGETABLE | OBJ_RANGE_TARGETABLE -/obj/effect/dead_plant/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/dead_plant/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) qdel(src) /obj/effect/dead_plant/attackby() diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index db04303fe9a5..016ae848fa3a 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -34,7 +34,7 @@ if(!M.apply_damage(base_damage, BRUTE, target_zone, blocked, soaked, used_weapon=src)) return 0 -/obj/effect/plant/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/plant/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) manual_unbuckle(user) /obj/effect/plant/attack_generic(var/mob/user) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 5263fe4c0137..e2908def2665 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -580,7 +580,7 @@ else if(harvest) harvest(user) -/obj/machinery/portable_atmospherics/hydroponics/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/portable_atmospherics/hydroponics/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(istype(usr,/mob/living/silicon)) return diff --git a/code/modules/instruments/instruments/item.dm b/code/modules/instruments/instruments/item.dm index 169f8aba334f..84126108ae50 100644 --- a/code/modules/instruments/instruments/item.dm +++ b/code/modules/instruments/instruments/item.dm @@ -50,7 +50,7 @@ user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like they're trying to commit suicide!") return (BRUTELOSS) -/obj/item/instrument/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/instrument/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/instruments/instruments/stationary.dm b/code/modules/instruments/instruments/stationary.dm index 3816f079ed9b..1adf54e84ac3 100644 --- a/code/modules/instruments/instruments/stationary.dm +++ b/code/modules/instruments/instruments/stationary.dm @@ -23,7 +23,7 @@ return (usr.default_can_use_topic(src) < UI_UPDATE) //can play with MUTATION_TELEKINESIS and while resting because fun. /// CITRP EDIT UNTIL INTERACTION REFACTOR PORT! -/obj/structure/musician/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/musician/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index f4fbeaa20e56..ad4a52afe86b 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -512,7 +512,7 @@ return TRUE return ..() -/obj/item/electronic_assembly/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/electronic_assembly/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/assemblies/clothing.dm b/code/modules/integrated_electronics/core/assemblies/clothing.dm index 6676fc3d29f8..a5dcee4b1355 100644 --- a/code/modules/integrated_electronics/core/assemblies/clothing.dm +++ b/code/modules/integrated_electronics/core/assemblies/clothing.dm @@ -68,7 +68,7 @@ else ..() -/obj/item/clothing/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/assemblies/device.dm b/code/modules/integrated_electronics/core/assemblies/device.dm index abc7776d0335..2685ddfa3852 100644 --- a/code/modules/integrated_electronics/core/assemblies/device.dm +++ b/code/modules/integrated_electronics/core/assemblies/device.dm @@ -39,7 +39,7 @@ if(opened) icon_state = icon_state + "-open" -/obj/item/assembly/electronic_assembly/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/assembly/electronic_assembly/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm index 35578a5c01ab..d005b01c5eee 100644 --- a/code/modules/integrated_electronics/core/detailer.dm +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -62,7 +62,7 @@ update_icon() return TRUE -/obj/item/integrated_electronics/detailer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/integrated_electronics/detailer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 825755027820..d6c6cfb411b5 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -171,7 +171,7 @@ dirty_items = TRUE return ..() -/obj/item/integrated_circuit_printer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/integrated_circuit_printer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 4f07df6af05c..aa8b81bf3f5d 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -291,7 +291,7 @@ set_pin_data(IC_OUTPUT, 4, contents) push_data() -/obj/item/integrated_circuit/manipulation/grabber/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/integrated_circuit/manipulation/grabber/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -855,7 +855,7 @@ else ..() -/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -965,7 +965,7 @@ else return ..() -/obj/item/integrated_circuit/manipulation/grenade/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/integrated_circuit/manipulation/grenade/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index f1acceb124c5..a0f5c8e498ae 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -86,7 +86,7 @@ var/datum/integrated_io/O = outputs[1] O.push_data() -/obj/item/integrated_circuit/memory/constant/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/integrated_circuit/memory/constant/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index bf5cd15d0a0f..850c82ab5e63 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -347,7 +347,7 @@ attack_self(user) -/obj/item/integrated_circuit/input/beaker_connector/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/integrated_circuit/input/beaker_connector/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index 3d3217fefd4a..85f63de84ad0 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -192,7 +192,7 @@ O.brainmob.remote_control=src set_pin_data(IC_OUTPUT, 1, O) -/obj/item/integrated_circuit/input/mmi_tank/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/integrated_circuit/input/mmi_tank/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -319,7 +319,7 @@ O.pai.remote_control=src set_pin_data(IC_OUTPUT, 1, O) -/obj/item/integrated_circuit/input/pAI_connector/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/integrated_circuit/input/pAI_connector/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/library/book.dm b/code/modules/library/book.dm index b9037230f032..e3d1ff6e231b 100644 --- a/code/modules/library/book.dm +++ b/code/modules/library/book.dm @@ -19,7 +19,7 @@ drop_sound = 'sound/items/drop/book.ogg' pickup_sound = 'sound/items/pickup/book.ogg' -/obj/item/book/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/book/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 34fd0084dfbe..14ba0c7cda95 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -54,7 +54,7 @@ else ..() -/obj/structure/bookcase/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/bookcase/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(contents.len) var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents if(choice) @@ -223,7 +223,7 @@ var/obj/item/book/book // Currently scanned book var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory -/obj/item/barcodescanner/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/barcodescanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index db4d731db3d2..3980cecb08d0 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -31,7 +31,7 @@ var/category = "Any" var/author -/obj/machinery/librarypubliccomp/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/librarypubliccomp/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) usr.set_machine(src) var/dat = "Library Visitor\n" // switch(screenstate) @@ -160,7 +160,7 @@ var/obj/item/book/M = new path(null) all_books[M.title] = M -/obj/machinery/librarycomp/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/librarycomp/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) usr.set_machine(src) var/dat = "Book Inventory Management\n" // switch(screenstate) @@ -476,7 +476,7 @@ if(!user.attempt_insert_item_for_installation(I, src)) return -/obj/machinery/libraryscanner/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/libraryscanner/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) usr.set_machine(src) var/dat = "Scanner Control Interface\n" // if(cache) diff --git a/code/modules/lore_codex/codex.dm b/code/modules/lore_codex/codex.dm index 74bda8ee5355..a10e7cf915f7 100644 --- a/code/modules/lore_codex/codex.dm +++ b/code/modules/lore_codex/codex.dm @@ -12,7 +12,7 @@ tree = new(src, root_type) . = ..() -/obj/item/book/codex/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/book/codex/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/maps/away_missions/archive/wildwest.dm b/code/modules/maps/away_missions/archive/wildwest.dm index f70a41d6eab6..bb760ae21012 100644 --- a/code/modules/maps/away_missions/archive/wildwest.dm +++ b/code/modules/maps/away_missions/archive/wildwest.dm @@ -20,7 +20,7 @@ var/chargesa = 1 var/insistinga = 0 -/obj/machinery/wish_granter_dark/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/wish_granter_dark/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) usr.set_machine(src) if(chargesa <= 0) diff --git a/code/modules/maps/misc_maps/lavaland/_lavaland.dm b/code/modules/maps/misc_maps/lavaland/_lavaland.dm index aaa79f82be1a..70d184bb84e9 100644 --- a/code/modules/maps/misc_maps/lavaland/_lavaland.dm +++ b/code/modules/maps/misc_maps/lavaland/_lavaland.dm @@ -22,7 +22,7 @@ use_power = USE_POWER_IDLE interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE_SILICON -/obj/machinery/lavaland_entryportal/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/lavaland_entryportal/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(istype(user, /mob/living/silicon/ai)) // lets not teleport AI cores return if(inoperable(MAINT)) @@ -58,7 +58,7 @@ anchored = 1 -/obj/effect/lavaland_exitportal/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/lavaland_exitportal/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(istype(usr, /mob/living/silicon/ai)) return if(do_after(user, 10)) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 2dfc1543fbbe..0364b17ad4c0 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -91,7 +91,7 @@ if(M) M.update_strings() return transfer -/obj/item/stack/material/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/stack/material/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(!allow_window_autobuild || !material.build_windows(user, src)) return ..() @@ -299,7 +299,7 @@ update_mass() return -/obj/item/stack/material/supermatter/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/stack/material/supermatter/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() update_mass() diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 433f19827480..2890e3a837bf 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -189,7 +189,7 @@ return ..() -/obj/machinery/mining/drill/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/mining/drill/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) check_supports() if (panel_open && cell && user.Adjacent(src)) diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 3276086c4fcb..3acbd375d1d3 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -27,7 +27,7 @@ to_chat(usr, "New scan range set to [scanrange] step(s) around user, including current location.") . = ..() -/obj/item/mining_scanner/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mining_scanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 06c38546e267..2e935bcdbe7a 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -29,7 +29,7 @@ var/global/list/total_extraction_beacons = list() . = ..() . +="It has [uses_left] use\s remaining." -/obj/item/extraction_pack/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/extraction_pack/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -165,7 +165,7 @@ var/global/list/total_extraction_beacons = list() icon = 'icons/obj/stock_parts.dmi' icon_state = "subspace_amplifier" -/obj/item/fulton_core/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/fulton_core/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 54f975731614..96984a10358c 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -30,7 +30,7 @@ inserted_id.forceMove(loc) //Prevents deconstructing from deleting whatever ID was inside it. . = ..() -/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return interact(user) diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index bdb66598be3a..ec39ab65a50a 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -24,7 +24,7 @@ stack_trace("Stacking machine console at [COORD(src)] could not find its machine!") qdel(src) -/obj/machinery/mineral/stacking_unit_console/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/mineral/stacking_unit_console/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 8e9660f29a4b..cf5f223c9dcd 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -197,7 +197,7 @@ active = FALSE update_icon() -/obj/item/pickaxe/tyrmalin/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pickaxe/tyrmalin/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -362,7 +362,7 @@ else ..() -/obj/item/stack/flag/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/stack/flag/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(upright) upright = 0 icon_state = base_state @@ -371,7 +371,7 @@ else ..() -/obj/item/stack/flag/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/stack/flag/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index 8ecc1fbd4b88..1fc5b05a484c 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -116,7 +116,7 @@ else icon_state = "[initial(icon_state)]-off" -/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return interact(user) diff --git a/code/modules/mining/resonator.dm b/code/modules/mining/resonator.dm index 90907628e1bc..0cc39817b035 100644 --- a/code/modules/mining/resonator.dm +++ b/code/modules/mining/resonator.dm @@ -33,7 +33,7 @@ spawn(burst_time) fieldsactive-- -/obj/item/resonator/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/resonator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/resonator_vr.dm b/code/modules/mining/resonator_vr.dm index c342a07bdc2b..057db5a9351c 100644 --- a/code/modules/mining/resonator_vr.dm +++ b/code/modules/mining/resonator_vr.dm @@ -37,7 +37,7 @@ spawn(burst_time) fieldsactive-- -/obj/item/resonator/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/resonator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mining/shelter_atoms.dm b/code/modules/mining/shelter_atoms.dm index 274da4726a13..b55fec8738e3 100644 --- a/code/modules/mining/shelter_atoms.dm +++ b/code/modules/mining/shelter_atoms.dm @@ -35,7 +35,7 @@ . += "This capsule has the [template.name] stored." . += template.description -/obj/item/survivalcapsule/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/survivalcapsule/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -209,7 +209,7 @@ return FALSE -/obj/item/gps/computer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gps/computer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) attack_self(user) //Bed diff --git a/code/modules/mining/vertibore.dm b/code/modules/mining/vertibore.dm index d31c5bb07248..3de2dec78de9 100644 --- a/code/modules/mining/vertibore.dm +++ b/code/modules/mining/vertibore.dm @@ -71,7 +71,7 @@ return . = ..() -/obj/item/vertibore/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/vertibore/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/grab.dm b/code/modules/mob/grab.dm index 40c08748c36f..a4fa0ab2c243 100644 --- a/code/modules/mob/grab.dm +++ b/code/modules/mob/grab.dm @@ -234,7 +234,7 @@ if(affecting.eye_blind < 3) affecting.Blind(3) -/obj/item/grab/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/grab/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 848848adaec3..7e1da92fc895 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -140,7 +140,7 @@ else icon_state = "cleanbot[on]" -/mob/living/bot/cleanbot/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/bot/cleanbot/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /mob/living/bot/cleanbot/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 6889e5f81cc4..be45888d51a6 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -69,7 +69,7 @@ return data -/mob/living/bot/farmbot/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/bot/farmbot/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -403,5 +403,5 @@ created_name = t -/obj/item/farmbot_arm_assembly/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/farmbot_arm_assembly/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return //it's a converted watertank, no you cannot pick it up and put it in your backpack diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 247723e41bf3..a2bd72cba7eb 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -89,7 +89,7 @@ return data -/mob/living/bot/floorbot/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/bot/floorbot/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /mob/living/bot/floorbot/emag_act(var/remaining_charges, var/mob/user) diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index 4f758eecb624..895abfebedcc 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -221,7 +221,7 @@ busy = FALSE update_appearance() -/mob/living/bot/medibot/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/bot/medibot/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 7208be252dde..14849beff384 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -163,7 +163,7 @@ return data -/mob/living/bot/secbot/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/bot/secbot/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /mob/living/bot/secbot/ui_act(action, list/params, datum/tgui/ui) diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index e73e816f1e14..d8f412e7db30 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -3,7 +3,7 @@ /mob/living/carbon/alien/attack_ui(slot_id) return -/mob/living/carbon/alien/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/carbon/alien/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index aa67b4f892ba..098612461d9f 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -109,7 +109,7 @@ ..() //TODO: ORGAN REMOVAL UPDATE. Make the brain remain in the MMI so it doesn't lose organ data. -/obj/item/mmi/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mmi/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -249,7 +249,7 @@ H.mind.transfer(brainmob) return -/obj/item/mmi/digital/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mmi/digital/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. to_chat(user, "You carefully locate the manual activation switch and start the [src]'s boot process.") diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 1824cc3d9221..2927a90f5620 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -33,7 +33,7 @@ if(istype(ghost)) question(ghost) -/obj/item/mmi/digital/posibrain/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mmi/digital/posibrain/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm index 5ddd341324e6..93533b03ec99 100644 --- a/code/modules/mob/living/carbon/brain/robot.dm +++ b/code/modules/mob/living/carbon/brain/robot.dm @@ -29,7 +29,7 @@ to_chat(brainmob, "You feel slightly disoriented. That's normal when you're little more than a complex circuit.") return -/obj/item/mmi/digital/robot/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mmi/digital/robot/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 3767be1d1fad..408b1cb6744d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -38,7 +38,7 @@ N.show_message("[M] bursts out of [src]!", 2) ..() -/mob/living/carbon/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/carbon/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/carbon/M = user if(!istype(M)) return ..() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index d9d9e90f8236..977305cf1b4e 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -25,7 +25,7 @@ return u_attack return null -/mob/living/carbon/human/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/carbon/human/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/datum/gender/TT = GLOB.gender_datums[user.get_visible_gender()] var/mob/living/carbon/human/H = user if(istype(H)) diff --git a/code/modules/mob/living/carbon/human/traits/weaver_objs.dm b/code/modules/mob/living/carbon/human/traits/weaver_objs.dm index 0a96e9592c9f..cec065ef264f 100644 --- a/code/modules/mob/living/carbon/human/traits/weaver_objs.dm +++ b/code/modules/mob/living/carbon/human/traits/weaver_objs.dm @@ -34,7 +34,7 @@ var/global/list/weavable_items = list() if(damage) qdel(src) -/obj/effect/weaversilk/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/weaversilk/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() if(user.a_intent == INTENT_HARM) to_chat(user,"You easily tear down [name].") @@ -81,7 +81,7 @@ var/global/list/weavable_items = list() return ..() -/obj/structure/bed/double/weaversilk_nest/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/bed/double/weaversilk_nest/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() if(user.a_intent == INTENT_HARM && !has_buckled_mobs()) to_chat(user,"You easily tear down [name].") diff --git a/code/modules/mob/living/defense.dm b/code/modules/mob/living/defense.dm index dcbc81ff82ca..ab5f7989f85d 100644 --- a/code/modules/mob/living/defense.dm +++ b/code/modules/mob/living/defense.dm @@ -92,7 +92,7 @@ return 0 // Clicking with an empty hand -/mob/living/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index 72226a7ab7c2..c61fd64d8483 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -21,7 +21,7 @@ w_class = WEIGHT_CLASS_NORMAL var/emagged = 0 -/obj/item/dogborg/jaws/small/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/dogborg/jaws/small/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -60,7 +60,7 @@ attack_verb = list("nuzzled", "nosed", "booped") w_class = WEIGHT_CLASS_TINY -/obj/item/dogborg/boop_module/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/dogborg/boop_module/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -190,7 +190,7 @@ if(water.energy < 5) . += "[src] is dry." -/obj/item/dogborg/tongue/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/dogborg/tongue/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -304,7 +304,7 @@ item_flags = ITEM_NOBLUDGEON | ITEM_ENCUMBERS_WHILE_HELD var/enabled = FALSE -/obj/item/pupscrubber/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pupscrubber/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -350,7 +350,7 @@ var/cooldown = 0 var/datum/matter_synth/glass = null -/obj/item/lightreplacer/dogborg/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/lightreplacer/dogborg/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return//Recharger refill is so last season. Now we recycle without magic! @@ -383,7 +383,7 @@ item_flags = ITEM_NOBLUDGEON | ITEM_ENCUMBERS_WHILE_HELD throw_force = 0 -/obj/item/dogborg/pounce/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/dogborg/pounce/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 1aa0bec6f528..92a474e23328 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -178,7 +178,7 @@ hound = hound.loc hound.cell.charge = hound.cell.charge - amt -/obj/item/dogborg/sleeper/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/dogborg/sleeper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index ae87801016ab..5687625be2ef 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -19,7 +19,7 @@ return UI_CLOSE return ..() -/obj/machinery/computer/drone_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/drone_control/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index d3191e7e0615..0f453fe6feac 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -184,7 +184,7 @@ var/obj/machinery/drone_fabricator/chosen_fabricator = all_fabricators[choice] chosen_fabricator.create_drone(src.client) -/obj/machinery/drone_fabricator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/drone_fabricator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!is_spawn_safe) is_spawn_safe = TRUE to_chat(user, "You inform the fabricator that it is safe for drones to roam around.") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 2c68684182f3..33e820eca6ee 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -830,7 +830,7 @@ module = null updatename("Default") -/mob/living/silicon/robot/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/silicon/robot/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(. & CLICKCHAIN_DO_NOT_PROPAGATE) return diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index d3cd7d4c589a..5fe6ff843c47 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -16,7 +16,7 @@ . = ..() files = new /datum/research/techonly(src) //Setup the research data holder. -/obj/item/portable_destructive_analyzer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/portable_destructive_analyzer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -274,7 +274,7 @@ name = "Printing Pen" var/mode = 1 -/obj/item/pen/robopen/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pen/robopen/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -335,7 +335,7 @@ if(istype(target,/obj/structure/table)) deploy_paper(get_turf(target)) -/obj/item/form_printer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/form_printer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -368,7 +368,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/borg/combat/shield/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/borg/combat/shield/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -443,7 +443,7 @@ . += "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored." . += "It is set to deploy [mode ? "doors" : "walls"]" -/obj/item/inflatable_dispenser/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/inflatable_dispenser/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index c14937fe7d6c..291a40216bae 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -1,5 +1,5 @@ // When someone clicks us with an empty hand -/mob/living/simple_mob/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm index 7290939e558f..4c253e499ba0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm @@ -62,7 +62,7 @@ if(udder && prob(5)) udder.add_reagent("milk", rand(5, 10)) -/mob/living/simple_mob/animal/passive/cow/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/cow/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/M = user if(!istype(M)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm index b8a415f8ec3b..96d69d7ed51c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm @@ -110,7 +110,7 @@ var/obj/belly/B = loc sting(B.owner) -/mob/living/simple_mob/animal/passive/fish/koi/poisonous/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/fish/koi/poisonous/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index c5af744c4bc2..55652ab4c033 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -145,7 +145,7 @@ emote_hear = list("squeeks","squeaks","squiks") emote_see = list("runs in a circle", "shakes", "scritches at something") -/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/hander = user if(!istype(hander)) return @@ -154,7 +154,7 @@ else ..() -/obj/item/holder/mouse/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/holder/mouse/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index eb4a92bc682d..f102dd303105 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -189,7 +189,7 @@ icon_state = "box" var/cattype = /mob/living/simple_mob/animal/passive/cat -/obj/item/cat_box/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/cat_box/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm index 68b14992e3d5..37cf2531ef2a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm @@ -72,7 +72,7 @@ return ..() // Clicked on by empty hand. -/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm index 4d8b1cbc98df..ca6c2d5ef0a0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Eddy/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Eddy/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm index caab2251e61a..803e2975d15a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm @@ -53,7 +53,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Master/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Master/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm index 932e3408f69c..507b00554f0a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm @@ -54,7 +54,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Rickey/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Rickey/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm index e2830a4357c7..88c7a985fedc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm @@ -53,7 +53,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Helix/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Helix/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm index b2634fdbed33..a3da114c0e14 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm @@ -58,7 +58,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Steve/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Steve/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm index feeb02f64e5b..68e951912e91 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm @@ -54,7 +54,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Willy/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Willy/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm index 80e983c91c5b..e077f03cd274 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/bradley/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/bradley/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm b/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm index 0a815eea5d3e..1246d03716f3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm @@ -51,7 +51,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/Sally/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/Sally/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm index 21389df42d7a..99063a8cc7e1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/BigTim/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/BigTim/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm b/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm index 155f97d9ced4..5a0cb6e3333b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm @@ -52,7 +52,7 @@ playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() -/mob/living/simple_mob/horror/TinyTim/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/horror/TinyTim/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm index 18e87ed82e6c..e229c8e43af3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm +++ b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm @@ -54,7 +54,7 @@ return PROJECTILE_FORCE_MISS -/mob/living/simple_mob/illusion/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/illusion/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/M = user if(!istype(M)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm index e031ffab83f4..b112c622f9f4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm @@ -159,7 +159,7 @@ adjustBruteLoss(-1) // Clicked on by empty hand. -/mob/living/simple_mob/slime/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/slime/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm index 40b9428b8646..dcf8e437aa8c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/defense.dm @@ -2,7 +2,7 @@ // Clicked on by empty hand. // Handles trying to wrestle a slime off of someone being eatten. -/mob/living/simple_mob/slime/xenobio/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/slime/xenobio/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/L = user if(!istype(L)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm index 644847e5c0d9..666d3f0f6fd8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm @@ -40,7 +40,7 @@ has_langs = list("Coulrian") -/mob/living/simple_mob/animal/passive/honkpet/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/honkpet/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.a_intent == INTENT_DISARM) return icon_state = pick("c_pet", "m_pet") .=..() @@ -78,7 +78,7 @@ "rad" = 0 ) -/mob/living/simple_mob/animal/passive/mimepet/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/passive/mimepet/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.a_intent == INTENT_DISARM) icon_state = pick("dave1", "dave2", "dave3", "dave5" , "dave6" , "dave7" , "dave8" , "dave9" , "dave10") .=..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index ce6d8ce8bbac..b5279e9213b9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -219,7 +219,7 @@ //Pet 4 friendly -/mob/living/simple_mob/otie/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/otie/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/mob/living/M = user if(!istype(M)) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm index 73aae2c07162..896f19222dbc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm @@ -374,7 +374,7 @@ hud_elements |= energyhud // When someone clicks us with an empty hand -/mob/living/simple_mob/shadekin/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/shadekin/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(user.a_intent == INTENT_HELP) shy_approach = FALSE //ACCLIMATED diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 181ec37992d6..0e6a94718880 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -70,7 +70,7 @@ ui.open() ui.set_auto_update(1) -/obj/machinery/ntnet_relay/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/ntnet_relay/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) nano_ui_interact(user) /obj/machinery/ntnet_relay/Topic(href, href_list) diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index f5dc0a92e55a..9119153a3000 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -109,13 +109,13 @@ /obj/item/modular_computer/attack_ai(mob/user) return attack_self(user) -/obj/item/modular_computer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/modular_computer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(anchored) return attack_self(user) return ..() /// On-click handling. Turns on the computer if it's off and opens the GUI. -/obj/item/modular_computer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/modular_computer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index a9d5c376da38..ddc02dbf3030 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -214,7 +214,7 @@ return 1 return 0 -/obj/machinery/lapvend/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/lapvend/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) nano_ui_interact(user) /obj/machinery/lapvend/nano_ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) diff --git a/code/modules/multiz/structures/hoist.dm b/code/modules/multiz/structures/hoist.dm index 31a3d763c748..f019b71bbcd2 100644 --- a/code/modules/multiz/structures/hoist.dm +++ b/code/modules/multiz/structures/hoist.dm @@ -10,7 +10,7 @@ icon = 'icons/obj/hoists.dmi' icon_state = "hoist_case" -/obj/item/hoist_kit/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/hoist_kit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -28,7 +28,7 @@ var/obj/structure/hoist/source_hoist description_info = "Click and drag someone (or any object) to this to attach them to the clamp. If you are within reach, when you click and drag this to a turf adjacent to you, it will move the attached object there and release it." -/obj/effect/hoist_hook/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/hoist_hook/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return // This has to be overridden so that it works properly. /obj/effect/hoist_hook/MouseDroppedOnLegacy(atom/movable/AM,mob/user) @@ -175,7 +175,7 @@ return -/obj/structure/hoist/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/hoist/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (!ishuman(user)) return diff --git a/code/modules/multiz/structures/vorestation_portals.dm b/code/modules/multiz/structures/vorestation_portals.dm index 86784fb9fda7..de53c3640274 100644 --- a/code/modules/multiz/structures/vorestation_portals.dm +++ b/code/modules/multiz/structures/vorestation_portals.dm @@ -27,7 +27,7 @@ return //do not send ghosts, zshadows, ai eyes, etc teleport(AM) -/obj/structure/portal_subtle/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/portal_subtle/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(istype(user) && !(istype(user,/mob/living))) return //do not send ghosts, zshadows, ai eyes, etc spawn(0) diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm index 1e363ff3ffbb..ec56c8f52c89 100644 --- a/code/modules/nifsoft/nifsoft.dm +++ b/code/modules/nifsoft/nifsoft.dm @@ -277,7 +277,7 @@ return return ..() -/obj/item/disk/nifsoft/compliance/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/disk/nifsoft/compliance/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/organs/internal/species/adherent.dm b/code/modules/organs/internal/species/adherent.dm index e01b2dcec9a7..4493c7cebb8b 100644 --- a/code/modules/organs/internal/species/adherent.dm +++ b/code/modules/organs/internal/species/adherent.dm @@ -35,7 +35,7 @@ action.button_icon_state = "[base_action_state]-[active ? "on" : "off"]" if(action.button) action.button.UpdateIcon() -/obj/item/organ/internal/powered/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/organ/internal/powered/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 19f135646f22..e2e728656f9b 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -656,7 +656,7 @@ user.put_in_active_hand(O) qdel(src) -/obj/item/organ/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/organ/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/overmap/legacy/overmap_shuttle.dm b/code/modules/overmap/legacy/overmap_shuttle.dm index 7e5f4dca8c7f..aaad2ab533fe 100644 --- a/code/modules/overmap/legacy/overmap_shuttle.dm +++ b/code/modules/overmap/legacy/overmap_shuttle.dm @@ -134,7 +134,7 @@ opened = 1 //shows open so you can diagnose 'oops, no gas' easily icon_state = "fuel_port_empty" //set the default state just to be safe -/obj/structure/fuel_port/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/fuel_port/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!opened) to_chat(user, "The door is secured tightly. You'll need a crowbar to open it.") return diff --git a/code/modules/overmap/legacy/ships/computers/computer_shims.dm b/code/modules/overmap/legacy/ships/computers/computer_shims.dm index 27cebb726b04..0c25c5edf1b6 100644 --- a/code/modules/overmap/legacy/ships/computers/computer_shims.dm +++ b/code/modules/overmap/legacy/ships/computers/computer_shims.dm @@ -80,7 +80,7 @@ // If you don't call parent in this proc, you must make all appropriate checks yourself. // If you do, you must respect the return value. -/obj/machinery/computer/ship/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/ship/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((. = ..())) return if(!allowed(user)) diff --git a/code/modules/overmap/legacy/ships/panicbutton.dm b/code/modules/overmap/legacy/ships/panicbutton.dm index 53beab421bb2..33d0cdb90642 100644 --- a/code/modules/overmap/legacy/ships/panicbutton.dm +++ b/code/modules/overmap/legacy/ships/panicbutton.dm @@ -23,7 +23,7 @@ else icon_state = "[initial(icon_state)]" -/obj/structure/panic_button/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/panic_button/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!istype(user)) return ..() diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 49a1bfed9047..c933aecafb33 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -45,7 +45,7 @@ return ..() -/obj/item/clipboard/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clipboard/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 76a869fd071b..0e2e66eff904 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -32,7 +32,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins if(!(("[department]" in alldepartments) || ("[department]" in admin_departments())) ) alldepartments |= department -/obj/machinery/photocopier/faxmachine/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/photocopier/faxmachine/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) nano_ui_interact(user) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 0a548f7a3b7c..d6361a68ddce 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -61,7 +61,7 @@ else to_chat(user, SPAN_NOTICE("You can't put [P] in [src]!")) -/obj/structure/filingcabinet/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/filingcabinet/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(contents.len <= 0) to_chat(user, SPAN_NOTICE("\The [src] is empty.")) return @@ -150,7 +150,7 @@ virgin = 0 //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. -/obj/structure/filingcabinet/security/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/filingcabinet/security/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) populate() ..() @@ -187,7 +187,7 @@ virgin = 0 //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. -/obj/structure/filingcabinet/medical/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/filingcabinet/medical/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) populate() ..() diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 40a0fdb13347..41beb2bc9384 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -75,7 +75,7 @@ else return ..() -/obj/item/folder/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/folder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 64f4935a08ef..62a47f2a5916 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -56,7 +56,7 @@ "You label [target] as [label].") target.name = "[target.name] ([label])" -/obj/item/hand_labeler/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/hand_labeler/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/paper/paper.dm b/code/modules/paperwork/paper/paper.dm index accf2021ff0a..88365063a739 100644 --- a/code/modules/paperwork/paper/paper.dm +++ b/code/modules/paperwork/paper/paper.dm @@ -130,7 +130,7 @@ add_fingerprint(usr) return -/obj/item/paper/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/paper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 49b11b6acc85..f6f8f77e09b7 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -133,7 +133,7 @@ dat += P.html(user) user << browse(dat, "window=[name]") -/obj/item/paper_bundle/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/paper_bundle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 9bdad97f1634..3f06f9f874ab 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -24,7 +24,7 @@ return to_chat(user, "You pick up the [src].") -/obj/item/paper_bin/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/paper_bin/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!user.standard_hand_usability_check(src, e_args.hand_index, HAND_MANIPULATION_GENERAL)) return @@ -97,7 +97,7 @@ icon_state = "paper_bundle" papers = /obj/item/paper/natural -/obj/item/paper_bin/bundlenatural/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/paper_bin/bundlenatural/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(amount < 1) qdel(src) return ..() diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 01b9973fa389..915bd1c6e604 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -45,7 +45,7 @@ add_overlay(overlays_to_add) -/obj/item/paperplane/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/paperplane/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 1b637d3852b5..d009848ec307 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -27,7 +27,7 @@ /obj/machinery/photocopier/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/photocopier/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/photocopier/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) nano_ui_interact(user) diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 59941e314b81..f581abe1b3ec 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -81,7 +81,7 @@ // Syndicate stamp to forge documents. -/obj/item/stamp/chameleon/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/stamp/chameleon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/photography/camera.dm b/code/modules/photography/camera.dm index a08ea5e1d4f4..dd23dffc31a7 100644 --- a/code/modules/photography/camera.dm +++ b/code/modules/photography/camera.dm @@ -27,7 +27,7 @@ size = nsize to_chat(usr, "Camera will now take [size]x[size] photos.") -/obj/item/camera/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/camera/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/photography/photo.dm b/code/modules/photography/photo.dm index a56f68e4a428..dc5ce4302c35 100644 --- a/code/modules/photography/photo.dm +++ b/code/modules/photography/photo.dm @@ -85,7 +85,7 @@ scribble_spans = data["spans"] photograph_id = data["photo"] -/obj/item/photo/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/photo/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) user.examinate(src) return ..() diff --git a/code/modules/power/antimatter/computer.dm b/code/modules/power/antimatter/computer.dm index 4811f206c7e6..5996d5abc212 100644 --- a/code/modules/power/antimatter/computer.dm +++ b/code/modules/power/antimatter/computer.dm @@ -64,7 +64,7 @@ /obj/machinery/computer/am_engine/attack_paw(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/am_engine/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/am_engine/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return user.machine = src diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index f6e3f295afea..87a12d97afac 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -177,7 +177,7 @@ return -/obj/machinery/power/am_control_unit/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/am_control_unit/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(anchored) interact(user) return diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index c2063625ddcb..bbf7b6024ca6 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -787,7 +787,7 @@ CREATE_WALL_MOUNTING_TYPES_SHIFTED(/obj/machinery/power/apc, 22) wires.cut_all() update_icon() -/obj/machinery/power/apc/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/apc/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // if (!can_use(user)) This already gets called in interact() and in topic() // return if(!user) diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 7b2bce95b972..8314a7a6f63a 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -72,7 +72,7 @@ busy = 0 -/obj/machinery/power/breakerbox/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/breakerbox/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(update_locked) to_chat(user, "System locked. Please try again later.") return diff --git a/code/modules/power/fission/computer.dm b/code/modules/power/fission/computer.dm index fa86327e92f2..4916174d0246 100644 --- a/code/modules/power/fission/computer.dm +++ b/code/modules/power/fission/computer.dm @@ -37,7 +37,7 @@ /obj/machinery/computer/fission_monitor/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/fission_monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/fission_monitor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/power/fission/engine.dm b/code/modules/power/fission/engine.dm index b1db1220187f..7135e3d30638 100644 --- a/code/modules/power/fission/engine.dm +++ b/code/modules/power/fission/engine.dm @@ -108,7 +108,7 @@ var/power = (decay_heat / REACTOR_RADS_TO_MJ) * max(healthmul, 0.1) radiation_pulse(src, max(power * REACTOR_RADIATION_MULTIPLIER, 0), RAD_FALLOFF_ENGINE_FISSION) -/obj/machinery/power/fission/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/fission/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) nano_ui_interact(user) /obj/machinery/power/fission/attack_robot(mob/user) diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm index 0905c9d9f32d..204f3d44766e 100644 --- a/code/modules/power/fusion/core/_core.dm +++ b/code/modules/power/fusion/core/_core.dm @@ -98,7 +98,7 @@ var/list/fusion_cores = list() if(owned_field) owned_field.ChangeFieldStrength(value) -/obj/machinery/power/fusion_core/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/fusion_core/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!Adjacent(user)) // As funny as it was for the AI to hug-kill the tokamak field from a distance... return visible_message("\The [user] hugs \the [src] to make it feel better!") diff --git a/code/modules/power/fusion/core/core_control.dm b/code/modules/power/fusion/core/core_control.dm index 15ee7e3a814c..73dc6af2e257 100644 --- a/code/modules/power/fusion/core/core_control.dm +++ b/code/modules/power/fusion/core/core_control.dm @@ -21,7 +21,7 @@ /obj/machinery/computer/fusion_core_control/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/fusion_core_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/fusion_core_control/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_control.dm b/code/modules/power/fusion/fuel_assembly/fuel_control.dm index caa6a8a8135b..dc3b35787ad8 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_control.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_control.dm @@ -10,7 +10,7 @@ /obj/machinery/computer/fusion_fuel_control/attack_ai(mob/user) attack_hand(user) -/obj/machinery/computer/fusion_fuel_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/fusion_fuel_control/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm index 9a93f13eed66..53951245d996 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm @@ -79,7 +79,7 @@ var/list/fuel_injectors = list() return ..() -/obj/machinery/fusion_fuel_injector/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/fusion_fuel_injector/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(injecting) to_chat(user, "Shut \the [src] off before playing with the fuel rod!") diff --git a/code/modules/power/fusion/gyrotron/gyrotron_control.dm b/code/modules/power/fusion/gyrotron/gyrotron_control.dm index fd4283085490..d51841206cdb 100644 --- a/code/modules/power/fusion/gyrotron/gyrotron_control.dm +++ b/code/modules/power/fusion/gyrotron/gyrotron_control.dm @@ -11,7 +11,7 @@ /obj/machinery/computer/gyrotron_control/attack_ai(var/mob/user) attack_hand(user) -/obj/machinery/computer/gyrotron_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/gyrotron_control/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) interact(user) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 5cdd759e2b8f..30b91be24149 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -188,7 +188,7 @@ GLOBAL_LIST_EMPTY(all_turbines) else ..() -/obj/machinery/power/generator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/generator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER) || !anchored) return diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm index 2c4ae6a8a4d3..bbfb70e642f0 100644 --- a/code/modules/power/generator_type2.dm +++ b/code/modules/power/generator_type2.dm @@ -94,7 +94,7 @@ interact(user) -/obj/machinery/power/generator_type2/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/generator_type2/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 6ac50e960f15..c602f9b35e71 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -79,7 +79,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) /obj/machinery/gravity_generator/part/get_status() return main_part?.get_status() -/obj/machinery/gravity_generator/part/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/gravity_generator/part/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return main_part.attack_hand(user) /obj/machinery/gravity_generator/part/set_broken() @@ -239,7 +239,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) return return ..() -/obj/machinery/gravity_generator/main/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/gravity_generator/main/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((. = ..())) return ui_interact(user) diff --git a/code/modules/power/grid_checker.dm b/code/modules/power/grid_checker.dm index cec075759a11..9489bb531bf9 100644 --- a/code/modules/power/grid_checker.dm +++ b/code/modules/power/grid_checker.dm @@ -51,7 +51,7 @@ else if(istype(W, /obj/item/multitool) || W.is_wirecutter()) attack_hand(user) -/obj/machinery/power/grid_checker/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/grid_checker/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!user) return add_fingerprint(user) diff --git a/code/modules/power/lighting/lighting.dm b/code/modules/power/lighting/lighting.dm index 688a83ea15c7..61515e6b5059 100644 --- a/code/modules/power/lighting/lighting.dm +++ b/code/modules/power/lighting/lighting.dm @@ -77,7 +77,7 @@ var/global/list/light_type_cache = list() else to_chat(user, "This casing doesn't support power cells for backup power.") -/obj/machinery/light_construct/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/light_construct/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return . // obj/machinery/attack_hand returns 1 if user can't use the machine @@ -861,7 +861,7 @@ var/global/list/light_type_cache = list() // attack with hand - remove tube/bulb // if hands aren't protected and the light is on, burn the player -/obj/machinery/light/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/light/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) @@ -907,7 +907,7 @@ var/global/list/light_type_cache = list() // create a light tube/bulb item and put it in the user's hand user.put_in_active_hand(remove_bulb()) //puts it in our active hand -/obj/machinery/light/flamp/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/light/flamp/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(lamp_shade) if(status == LIGHT_EMPTY) to_chat(user, "There is no [get_fitting_name()] in this light.") diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index d3aa1bedcf48..749c4048b533 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -42,7 +42,7 @@ /obj/machinery/power/powered() return 1 //doesn't require an external power source -/obj/machinery/power/port_gen/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/port_gen/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return if(!anchored) @@ -302,7 +302,7 @@ return return ..() -/obj/machinery/power/port_gen/pacman/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/port_gen/pacman/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() if (!anchored) return @@ -613,7 +613,7 @@ log_and_message_admins("[ADMIN_LOOKUPFLW(Proj.firer)] triggered an Abductor Core explosion at [x],[y],[z] via projectile.") asplod() -/obj/machinery/power/rtg/abductor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/rtg/abductor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!istype(user) || (. = ..())) return diff --git a/code/modules/power/sensors/sensor_monitoring.dm b/code/modules/power/sensors/sensor_monitoring.dm index ae610062805a..85f33951033c 100644 --- a/code/modules/power/sensors/sensor_monitoring.dm +++ b/code/modules/power/sensors/sensor_monitoring.dm @@ -41,7 +41,7 @@ ..() // On user click opens the UI of this computer. -/obj/machinery/computer/power_monitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/power_monitor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 6f5d64cca10f..1e957093359c 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -21,7 +21,7 @@ FG2.cleanup() . = ..() -/obj/machinery/containment_field/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/containment_field/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(get_dist(src, user) > 1) return 0 else diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index f30acd9029b9..e55bd8972835 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -56,7 +56,7 @@ else icon_state = "emitter" -/obj/machinery/power/emitter/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/emitter/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) src.add_fingerprint(user) activate(user) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index a696d810db2d..afb0776262a9 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -73,7 +73,7 @@ field_generator power level display return -/obj/machinery/field_generator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/field_generator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(state == 2) if(get_dist(src, user) <= 1)//Need to actually touch the thing to turn it on if(src.active >= 1) diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index c015c559f851..51efce1bc5fd 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -34,7 +34,7 @@ wires = null return ..() -/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/particle_accelerator/control_box/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(construction_state >= 3) interact(user) else if(construction_state == 2) // Wires exposed diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index cd6aaf303212..e608391c8c40 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -46,7 +46,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) STOP_PROCESSING(SSobj, src) return ..() -/obj/singularity/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/singularity/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) consume(user) return 1 diff --git a/code/modules/power/smes/smes.dm b/code/modules/power/smes/smes.dm index bf8ab71127c8..bde57b6dd623 100644 --- a/code/modules/power/smes/smes.dm +++ b/code/modules/power/smes/smes.dm @@ -241,7 +241,7 @@ GLOBAL_LIST_EMPTY(smeses) add_hiddenprint(user) ui_interact(user) -/obj/machinery/power/smes/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/smes/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) ui_interact(user) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 2f131d0b7a92..6a3d720fcb7b 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -169,7 +169,7 @@ GLOBAL_LIST_EMPTY(solars_list) var/tracker = 0 var/glass_type = null -/obj/item/solar_assembly/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/solar_assembly/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!anchored || !isturf(loc)) // You can't pick it up ..() @@ -351,7 +351,7 @@ GLOBAL_LIST_EMPTY(solars_list) add_overlay(image('icons/obj/computer.dmi', "solcon-o", FLY_LAYER, angle2dir(cdir))) return -/obj/machinery/power/solar_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/solar_control/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!..()) interact(user) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index cffd51035ffc..1d942e772031 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -401,7 +401,7 @@ /obj/machinery/power/supermatter/attack_ai(mob/user as mob) ui_interact(user) -/obj/machinery/power/supermatter/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/supermatter/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/datum/gender/TU = GLOB.gender_datums[user.get_visible_gender()] user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... [TU.his] body starts to glow and bursts into flames before flashing into ash.",\ "You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\ diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 0b232429f398..ee0741ed89ae 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -59,7 +59,7 @@ return wires.Interact(user) return ..() -/obj/machinery/power/tesla_coil/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/tesla_coil/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.a_intent == INTENT_GRAB && user_buckle_mob(user.pulling, user)) return ..() @@ -125,7 +125,7 @@ return return ..() -/obj/machinery/power/grounding_rod/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/grounding_rod/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.a_intent == INTENT_GRAB && user_buckle_mob(user.pulling, user)) return ..() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 8556ed420f2f..4d52ad696e82 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -273,7 +273,7 @@ updateDialog() -/obj/machinery/power/turbine/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/turbine/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((. = ..())) return src.interact(user) @@ -340,7 +340,7 @@ id = new_ident return -/obj/machinery/computer/turbine_computer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/turbine_computer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((. = ..())) return src.interact(user) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8e87472dc996..3bacfe10b354 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -784,7 +784,7 @@ playsound(loc, selector_sound, 50, 1) return new_mode -/obj/item/gun/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 952354073de0..81d7cc6ee2f5 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -155,7 +155,7 @@ ..() load_ammo(A, user) -/obj/item/gun/energy/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/energy/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user) else diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index e017841b2c8f..87790df27a38 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -29,7 +29,7 @@ projectile_type=/obj/projectile/beam/pulse charge_cost = 120 -/obj/item/gun/energy/pulse_rifle/destroyer/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/energy/pulse_rifle/destroyer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/energy/sizegun_vr.dm b/code/modules/projectiles/guns/energy/sizegun_vr.dm index acc09284ef34..52eeab679b59 100644 --- a/code/modules/projectiles/guns/energy/sizegun_vr.dm +++ b/code/modules/projectiles/guns/energy/sizegun_vr.dm @@ -27,7 +27,7 @@ . = ..() add_obj_verb(src, /obj/item/gun/energy/sizegun/proc/select_size) -/obj/item/gun/energy/sizegun/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/energy/sizegun/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index da119725b3be..54fbf23b7d4c 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -336,7 +336,7 @@ one_handed_penalty = 0 safety_state = GUN_SAFETY_OFF -/obj/item/gun/energy/service/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/energy/service/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm index 2cb246fe6348..4d54b067df3e 100644 --- a/code/modules/projectiles/guns/launcher/crossbow.dm +++ b/code/modules/projectiles/guns/launcher/crossbow.dm @@ -84,7 +84,7 @@ update_icon() ..() -/obj/item/gun/launcher/crossbow/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/crossbow/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index d7bbcb67e1a5..b6357759d4e6 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -65,7 +65,7 @@ else to_chat(user, "[src] is empty.") -/obj/item/gun/launcher/grenade/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/grenade/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -77,7 +77,7 @@ else ..() -/obj/item/gun/launcher/grenade/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/grenade/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) unload(user) else @@ -104,7 +104,7 @@ damage_force = 5 max_grenades = 0 -/obj/item/gun/launcher/grenade/underslung/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/grenade/underslung/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index f8b57e6adad6..0e050f0c41b5 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -61,7 +61,7 @@ else to_chat(user, "There is nothing to remove in \the [src].") -/obj/item/gun/launcher/pneumatic/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/pneumatic/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_hopper(user) else @@ -77,7 +77,7 @@ else if(istype(W) && item_storage.obj_storage.can_be_inserted(W)) item_storage.obj_storage.try_insert(W, new /datum/event_args/actor(user)) -/obj/item/gun/launcher/pneumatic/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/pneumatic/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 099188501618..78ab532a9acd 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -27,7 +27,7 @@ name = "syringe dart" update_icon() -/obj/item/syringe_cartridge/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/syringe_cartridge/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -95,7 +95,7 @@ darts -= next next = null -/obj/item/gun/launcher/syringe/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/syringe/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -108,7 +108,7 @@ next = darts[1] add_fingerprint(user) -/obj/item/gun/launcher/syringe/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/launcher/syringe/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) if(!darts.len) to_chat(user, "[src] is empty.") diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm index 318ac8961477..3977c6fcbd54 100644 --- a/code/modules/projectiles/guns/magnetic/bore.dm +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -48,7 +48,7 @@ if(mat_storage) . += image(icon, "[icon_state]_loaded") -/obj/item/gun/magnetic/matfed/attack_hand(mob/user, datum/event_args/clickchain/e_args) // It doesn't keep a loaded item inside. +/obj/item/gun/magnetic/matfed/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // It doesn't keep a loaded item inside. if(user.get_inactive_held_item() == src) var/obj/item/removing diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index 88ff393194f3..8dffab58d8e4 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -150,7 +150,7 @@ return . = ..() -/obj/item/gun/magnetic/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/magnetic/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) var/obj/item/removing diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index fbecb49ee75f..1ba09e2bf4f3 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -164,7 +164,7 @@ else ..() -/obj/item/gun/ballistic/automatic/z8/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/automatic/z8/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src && use_launcher) launcher.unload(user) else @@ -247,13 +247,13 @@ update_icon() update_worn_icon() -/obj/item/gun/ballistic/automatic/lmg/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/automatic/lmg/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(cover_open) toggle_cover(user) //close the cover else return ..() //once closed, behave like normal -/obj/item/gun/ballistic/automatic/lmg/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/automatic/lmg/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!cover_open && user.get_inactive_held_item() == src) toggle_cover(user) //open the cover else diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index cc680a0db314..7b2b8018bc69 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -41,7 +41,7 @@ return update_icon() -/obj/item/gun/ballistic/bow/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/bow/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -54,7 +54,7 @@ else return -/obj/item/gun/ballistic/bow/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/bow/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user, allow_dump=0) else diff --git a/code/modules/projectiles/guns/projectile/contender.dm b/code/modules/projectiles/guns/projectile/contender.dm index c853215d26b8..cfba839e638a 100644 --- a/code/modules/projectiles/guns/projectile/contender.dm +++ b/code/modules/projectiles/guns/projectile/contender.dm @@ -13,7 +13,7 @@ load_method = SINGLE_CASING heavy = TRUE -/obj/item/gun/ballistic/contender/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/contender/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index 48732e46e643..4662a1004cad 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -136,7 +136,7 @@ for(var/obj/item/reagent_containers/glass/beaker/B in mixing) B.reagents.trans_to_obj(dart, mix_amount) -/obj/item/gun/ballistic/dartgun/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/dartgun/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index 5e061de152fe..16e1f855eaa8 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -45,7 +45,7 @@ else ..() -/obj/item/gun/ballistic/rocket/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/rocket/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) unload(user) else @@ -86,7 +86,7 @@ to_chat(user, "You cannot reload the [src]!") return -/obj/item/gun/ballistic/rocket/collapsible/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/rocket/collapsible/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) to_chat(user, "You cannot unload the [src]'s munition!") return diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 37f7ee56813f..a2d3b8fb56c0 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -26,7 +26,7 @@ return chambered.get_projectile() return null -/obj/item/gun/ballistic/shotgun/pump/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/shotgun/pump/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) // todo: this breaks other attack self interactions :( if(world.time >= recentpump + 10) pump(user) diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index 28b7348761ea..d5ca4621965a 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -30,7 +30,7 @@ else icon_state = "heavysniper" -/obj/item/gun/ballistic/heavysniper/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/heavysniper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm b/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm index 8b136ec520bc..9d5f0d0c2bdb 100644 --- a/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm @@ -68,7 +68,7 @@ . = ..() trigger_group = src -/obj/item/sniper_rifle_part/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/sniper_rifle_part/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/magazines/magazine.dm b/code/modules/projectiles/magazines/magazine.dm index 3a71eeac608f..1fd0036181b7 100644 --- a/code/modules/projectiles/magazines/magazine.dm +++ b/code/modules/projectiles/magazines/magazine.dm @@ -94,7 +94,7 @@ update_icon() // This dumps all the bullets right on the floor -/obj/item/ammo_magazine/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/ammo_magazine/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -118,7 +118,7 @@ return // This puts one bullet from the magazine into your hand -/obj/item/ammo_magazine/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/ammo_magazine/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(can_remove_ammo) // For Smart Magazines if(user.get_inactive_held_item() == src) if(stored_ammo.len) diff --git a/code/modules/projectiles/magazines/smartmag.dm b/code/modules/projectiles/magazines/smartmag.dm index f5382dd4be1b..5b4b94e08cd4 100644 --- a/code/modules/projectiles/magazines/smartmag.dm +++ b/code/modules/projectiles/magazines/smartmag.dm @@ -109,7 +109,7 @@ ..() // You can remove the power cell from the magazine by hand, but it's way slower than using a screwdriver -/obj/item/ammo_magazine/smart/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/ammo_magazine/smart/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) if(attached_cell) to_chat(user, "You struggle to remove \the [attached_cell] from \the [src].") diff --git a/code/modules/random_map/drop/droppod_doors.dm b/code/modules/random_map/drop/droppod_doors.dm index 4cfb85e8c205..619144a6e58b 100644 --- a/code/modules/random_map/drop/droppod_doors.dm +++ b/code/modules/random_map/drop/droppod_doors.dm @@ -23,7 +23,7 @@ /obj/structure/droppod_door/attack_generic(var/mob/user) attack_hand(user) -/obj/structure/droppod_door/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/droppod_door/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(deploying) return to_chat(user, "You prime the explosive bolts. Better get clear!") sleep(30) diff --git a/code/modules/reagents/chemistry/machinery.dm b/code/modules/reagents/chemistry/machinery.dm index c4075a9106fb..731bb44d72a0 100644 --- a/code/modules/reagents/chemistry/machinery.dm +++ b/code/modules/reagents/chemistry/machinery.dm @@ -160,7 +160,7 @@ if(AM in holdingitems) holdingitems -= AM -/obj/machinery/reagentgrinder/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/reagentgrinder/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) interact(user) /obj/machinery/reagentgrinder/interact(mob/user as mob) // The microwave Menu //I am reasonably certain that this is not a microwave diff --git a/code/modules/reagents/distilling/distilling.dm b/code/modules/reagents/distilling/distilling.dm index a45f65bf167f..4725df19ac04 100644 --- a/code/modules/reagents/distilling/distilling.dm +++ b/code/modules/reagents/distilling/distilling.dm @@ -105,7 +105,7 @@ ..() -/obj/machinery/portable_atmospherics/powered/reagent_distillery/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/portable_atmospherics/powered/reagent_distillery/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) var/list/options = list() options["examine"] = radial_examine options["use"] = radial_use diff --git a/code/modules/reagents/items/hypospray.dm b/code/modules/reagents/items/hypospray.dm index 799a88801698..f6b27dc3a865 100644 --- a/code/modules/reagents/items/hypospray.dm +++ b/code/modules/reagents/items/hypospray.dm @@ -60,7 +60,7 @@ icon_state = "[initial(icon_state)][vial_state]" return ..() -/obj/item/hypospray/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/hypospray/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.is_holding_inactive(src)) if(isnull(loaded)) user.action_feedback(SPAN_WARNING("[src] has no vial loaded."), src) @@ -110,7 +110,7 @@ inject_amount = amount usr.action_feedback(SPAN_NOTICE("[src] is now set to inject [amount] per use."), src) -/obj/item/hypospray/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/hypospray/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) switch(inject_mode) if(HYPOSPRAY_MODE_INJECT) inject_mode = HYPOSPRAY_MODE_SPRAY diff --git a/code/modules/reagents/machinery/chem_master.dm b/code/modules/reagents/machinery/chem_master.dm index e2809aa3a97c..8617ddbaccbe 100644 --- a/code/modules/reagents/machinery/chem_master.dm +++ b/code/modules/reagents/machinery/chem_master.dm @@ -147,7 +147,7 @@ pill_bottle = null return ..() -/obj/machinery/chem_master/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/chem_master/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & BROKEN) return user.set_machine(src) diff --git a/code/modules/reagents/machinery/dispenser/cartridge.dm b/code/modules/reagents/machinery/dispenser/cartridge.dm index 0eae5db18428..ee37e6262a59 100644 --- a/code/modules/reagents/machinery/dispenser/cartridge.dm +++ b/code/modules/reagents/machinery/dispenser/cartridge.dm @@ -41,7 +41,7 @@ if(!is_open_container()) . += "The cap is sealed." -/obj/item/reagent_containers/cartridge/dispenser/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/cartridge/dispenser/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 69211166dfb0..01cb775c4e5a 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -42,7 +42,7 @@ if(N) amount_per_transfer_from_this = N -/obj/item/reagent_containers/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/blood_pack_vr.dm b/code/modules/reagents/reagent_containers/blood_pack_vr.dm index cb08f58ce888..b7d72c326fad 100644 --- a/code/modules/reagents/reagent_containers/blood_pack_vr.dm +++ b/code/modules/reagents/reagent_containers/blood_pack_vr.dm @@ -1,4 +1,4 @@ -/obj/item/reagent_containers/blood/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/blood/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index c74265dde1bf..af64fc7e0c18 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -94,7 +94,7 @@ add_attack_logs(user, L, "Borg injected with [reagent_ids[mode]]") to_chat(user, "[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining.") -/obj/item/reagent_containers/borghypo/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/borghypo/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return //Change the mode diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index b8c0232132d8..52be9ea643d5 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -61,7 +61,7 @@ base_desc = desc -/obj/item/reagent_containers/glass/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/glass/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -172,7 +172,7 @@ . = ..() update_icon() -/obj/item/reagent_containers/glass/beaker/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/glass/beaker/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() update_icon() diff --git a/code/modules/reagents/reagent_containers/hard_candy.dm b/code/modules/reagents/reagent_containers/hard_candy.dm index ca045923f96d..cf6cef47076b 100644 --- a/code/modules/reagents/reagent_containers/hard_candy.dm +++ b/code/modules/reagents/reagent_containers/hard_candy.dm @@ -34,7 +34,7 @@ user.put_in_hands(trash) qdel(src) -/obj/item/reagent_containers/hard_candy/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/hard_candy/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 3229c2c78a7b..b7ea0ddd537c 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -93,7 +93,7 @@ volume = loaded_vial.volume reagents.maximum_volume = loaded_vial.reagents.maximum_volume -/obj/item/reagent_containers/hypospray/vial/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/hypospray/vial/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) if(loaded_vial) reagents.trans_to_holder(loaded_vial.reagents,volume) @@ -398,7 +398,7 @@ icon_state = "[initial(icon_state)]_used" -/obj/item/reagent_containers/hypospray/glukoz/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/hypospray/glukoz/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/organic.dm b/code/modules/reagents/reagent_containers/organic.dm index a61157222b22..efeb3eabbf5d 100644 --- a/code/modules/reagents/reagent_containers/organic.dm +++ b/code/modules/reagents/reagent_containers/organic.dm @@ -51,12 +51,12 @@ . = ..() update_icon() -/obj/item/reagent_containers/organic/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/organic/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() update_icon() -/obj/item/reagent_containers/organic/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/organic/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index f1242f187ce0..b1d238d94b9d 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -68,7 +68,7 @@ D.set_up(my_target, spray_size, 10) return -/obj/item/reagent_containers/spray/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/spray/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(!possible_transfer_amounts) return amount_per_transfer_from_this = next_list_item(amount_per_transfer_from_this, possible_transfer_amounts) @@ -132,7 +132,7 @@ . = ..() . += "The safety is [safety ? "on" : "off"]." -/obj/item/reagent_containers/spray/pepper/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/spray/pepper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) safety = !safety to_chat(usr, "You switch the safety [safety ? "on" : "off"].") @@ -233,7 +233,7 @@ . = ..() . += "The tank is [pumped ? "depressurized" : "pressurized"]." -/obj/item/reagent_containers/spray/squirt/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/spray/squirt/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) pumped = !pumped to_chat(usr, "You pump the handle [pumped ? "to depressurize" : "to pressurize"] the tank.") diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 828d31f5afef..bacd18931b08 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -37,7 +37,7 @@ . = ..() update_icon() -/obj/item/reagent_containers/syringe/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/syringe/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) switch(mode) if(SYRINGE_DRAW) mode = SYRINGE_INJECT @@ -47,7 +47,7 @@ return update_icon() -/obj/item/reagent_containers/syringe/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/syringe/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() update_icon() diff --git a/code/modules/reagents/reagent_containers/syringes_vr.dm b/code/modules/reagents/reagent_containers/syringes_vr.dm index 5e744dd92c9f..e4fe082db63e 100644 --- a/code/modules/reagents/reagent_containers/syringes_vr.dm +++ b/code/modules/reagents/reagent_containers/syringes_vr.dm @@ -66,7 +66,7 @@ eo.queue_syringe_infection() //Allow for capped syringe mode -/obj/item/reagent_containers/syringe/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/reagent_containers/syringe/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) switch(mode) if(SYRINGE_CAPPED) mode = SYRINGE_DRAW diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 52aa9239e81f..a40f2e6e626b 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -153,7 +153,7 @@ return ..() // attack with hand, move pulled object onto conveyor -/obj/machinery/conveyor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/conveyor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!CHECK_ALL_MOBILITY(user, MOBILITY_CAN_MOVE | MOBILITY_CAN_USE)) return if(isnull(user.pulling) || user.pulling.anchored) @@ -259,7 +259,7 @@ C.setmove() // attack with hand, switch position -/obj/machinery/conveyor_switch/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/conveyor_switch/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!allowed(user)) to_chat(user, "Access denied.") return @@ -320,7 +320,7 @@ desc = "A conveyor control switch. It appears to only go in one direction." // attack with hand, switch position -/obj/machinery/conveyor_switch/oneway/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/conveyor_switch/oneway/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(position == 0) position = convdir else diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index dd07dcc5a157..b543ee5b13a7 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -218,7 +218,7 @@ interact(user, 1) // human interact with machine -/obj/machinery/disposal/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/disposal/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & BROKEN) return diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index b26d78e5d8a4..78e0bb606052 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -13,7 +13,7 @@ var/label_x var/tag_x -/obj/structure/bigDelivery/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/bigDelivery/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) unwrap() /obj/structure/bigDelivery/proc/unwrap() @@ -129,7 +129,7 @@ var/nameset = 0 var/tag_x -/obj/item/smallDelivery/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/smallDelivery/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -346,7 +346,7 @@ return data -/obj/item/destTagger/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/destTagger/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/research/machinery/rdconsole.dm b/code/modules/research/machinery/rdconsole.dm index 1167e04fe16f..4aed6ff2db36 100644 --- a/code/modules/research/machinery/rdconsole.dm +++ b/code/modules/research/machinery/rdconsole.dm @@ -165,7 +165,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, dat += "" return dat.Join() -/obj/machinery/computer/rdconsole/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/rdconsole/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/modules/research/machinery/server.dm b/code/modules/research/machinery/server.dm index fe6df13b8f3a..734343e239b1 100644 --- a/code/modules/research/machinery/server.dm +++ b/code/modules/research/machinery/server.dm @@ -285,7 +285,7 @@ target.files.known_tech |= from.files.known_tech return TRUE -/obj/machinery/computer/rdservercontrol/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/rdservercontrol/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return ui_interact(user) diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm index 72ac7861fb7a..f4edefc7ca14 100644 --- a/code/modules/resleeving/computers.dm +++ b/code/modules/resleeving/computers.dm @@ -135,7 +135,7 @@ /obj/machinery/computer/transhuman/resleeving/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/transhuman/resleeving/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/transhuman/resleeving/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) add_fingerprint(user) @@ -431,7 +431,7 @@ icon_state = "cmoemergency" item_state = "card-id" -/obj/item/cmo_disk_holder/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/cmo_disk_holder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm index e720dd31459c..1eaee5fab35e 100644 --- a/code/modules/resleeving/implant.dm +++ b/code/modules/resleeving/implant.dm @@ -62,7 +62,7 @@ icon_state = "[initial(icon_state)][imps.len]" germ_level = 0 -/obj/item/backup_implanter/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/backup_implanter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm index a787c40c1a80..10ddd357b16b 100644 --- a/code/modules/resleeving/infomorph.dm +++ b/code/modules/resleeving/infomorph.dm @@ -343,7 +343,7 @@ var/list/infomorph_emotions = list( if(stat != 2) close_up() return -/mob/living/silicon/infomorph/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/silicon/infomorph/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) visible_message("[user.name] boops [src] on the head.") close_up() diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index 6999fec56fd8..145205f7d834 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -341,7 +341,7 @@ return 1 -/obj/machinery/transhuman/synthprinter/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/transhuman/synthprinter/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((busy == 0) || (machine_stat & NOPOWER)) return to_chat(user, "Current print cycle is [busy]% complete.") @@ -430,7 +430,7 @@ manip_rating += M.rating blur_amount = (48 - manip_rating * 8) -/obj/machinery/transhuman/resleever/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/transhuman/resleever/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) var/health_text = "" var/mind_text = "" diff --git a/code/modules/resleeving/mirror.dm b/code/modules/resleeving/mirror.dm index 58d50f4859cf..ff634bf26d70 100644 --- a/code/modules/resleeving/mirror.dm +++ b/code/modules/resleeving/mirror.dm @@ -170,7 +170,7 @@ to_chat(usr, "You must target the torso.") return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/item/mirrortool/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/mirrortool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/sleevecard.dm b/code/modules/resleeving/sleevecard.dm index e70e0904713a..162e7b807524 100644 --- a/code/modules/resleeving/sleevecard.dm +++ b/code/modules/resleeving/sleevecard.dm @@ -41,7 +41,7 @@ QDEL_NULL(radio) return ..() -/obj/item/sleevecard/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/sleevecard/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/rogueminer_vr/zone_console.dm b/code/modules/rogueminer_vr/zone_console.dm index 2b21546f3c3d..4524216bb76c 100644 --- a/code/modules/rogueminer_vr/zone_console.dm +++ b/code/modules/rogueminer_vr/zone_console.dm @@ -32,7 +32,7 @@ /obj/machinery/computer/roguezones/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/computer/roguezones/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/roguezones/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index 32255ef3a454..1506cffaca37 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -68,7 +68,7 @@ if(machine_stat & NOPOWER) icon_state = "auth_off" -/obj/machinery/keycard_auth/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/keycard_auth/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.stat || machine_stat & (NOPOWER|BROKEN)) to_chat(user, "This device is not powered.") return diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm index 2ad8cfed68bf..8251d2fe60c0 100644 --- a/code/modules/shieldgen/directional_shield.dm +++ b/code/modules/shieldgen/directional_shield.dm @@ -206,7 +206,7 @@ for(var/obj/effect/directional_shield/S in active_shields) S.update_color(new_color) -/obj/item/shield_projector/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/shield_projector/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(active) if(always_on) to_chat(user, "You can't seem to deactivate \the [src].") @@ -398,7 +398,7 @@ else my_tool.set_ready_state(1) -/obj/item/shield_projector/line/exosuit/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/shield_projector/line/exosuit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(active) if(always_on) to_chat(user, "You can't seem to deactivate \the [src].") diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 0648697640ba..725b99feb866 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -62,7 +62,7 @@ adjust_strength(damage / 20) return damage -/obj/effect/energy_field/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/energy_field/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) impact_effect(3) // Harmless, but still produces the 'impact' effect. ..() diff --git a/code/modules/shieldgen/energy_shield.dm b/code/modules/shieldgen/energy_shield.dm index 9d0ea12423ed..42691d9bb67f 100644 --- a/code/modules/shieldgen/energy_shield.dm +++ b/code/modules/shieldgen/energy_shield.dm @@ -162,7 +162,7 @@ animate(src, alpha = initial(alpha), time = 1 SECOND) // Just for fun -/obj/effect/shield/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/effect/shield/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) flash_adjacent_segments(3) /obj/effect/shield/proc/take_damage_legacy(var/damage, var/damtype, var/hitby) diff --git a/code/modules/shieldgen/handheld_defuser.dm b/code/modules/shieldgen/handheld_defuser.dm index 45cf6716f6c4..8fe5b3f01704 100644 --- a/code/modules/shieldgen/handheld_defuser.dm +++ b/code/modules/shieldgen/handheld_defuser.dm @@ -44,7 +44,7 @@ else icon_state = "hdiffuser_off" -/obj/item/shield_diffuser/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/shield_diffuser/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -61,7 +61,7 @@ to_chat(user, "The charge meter reads [cell ? cell.percent() : 0]%") to_chat(user, "It is [enabled ? "enabled" : "disabled"].") -/obj/item/shield_diffuser/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/shield_diffuser/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) if(cell) cell.update_icon() diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index fb2e16891d2a..81424707a8cd 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -25,7 +25,7 @@ var/max_stored_power = 50000 //50 kW use_power = USE_POWER_OFF //Draws directly from power net. Does not use APC power. -/obj/machinery/shieldwallgen/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/shieldwallgen/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(state != 1) to_chat(user, "The shield generator needs to be firmly secured to the floor first.") return 1 @@ -257,7 +257,7 @@ update_nearby_tiles() ..() -/obj/machinery/shieldwall/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/shieldwall/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index 333c93e09c07..739d6cf27ce5 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -67,7 +67,7 @@ else ..() -/obj/machinery/shield_capacitor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/shield_capacitor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN)) return interact(user) diff --git a/code/modules/shieldgen/shield_diffuser.dm b/code/modules/shieldgen/shield_diffuser.dm index 728ba2f4d02b..3cc8c62497c6 100644 --- a/code/modules/shieldgen/shield_diffuser.dm +++ b/code/modules/shieldgen/shield_diffuser.dm @@ -55,7 +55,7 @@ else icon_state = "fdiffuser_on" -/obj/machinery/shield_diffuser/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/shield_diffuser/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((. = ..())) return if(alarm) diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 4fe24522051b..4c9e84b79e00 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -94,7 +94,7 @@ /obj/machinery/shield_gen/attack_ai(user as mob) return src.attack_hand(user) -/obj/machinery/shield_gen/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/shield_gen/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN)) return interact(user) diff --git a/code/modules/shieldgen/shield_generator.dm b/code/modules/shieldgen/shield_generator.dm index aafe14f01de5..efcd593b77b5 100644 --- a/code/modules/shieldgen/shield_generator.dm +++ b/code/modules/shieldgen/shield_generator.dm @@ -431,7 +431,7 @@ return data -/obj/machinery/power/shield_generator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/shield_generator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((. = ..())) return if(panel_open && Adjacent(user)) diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index 1e42bb5178d5..0b5d03de94f4 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -168,7 +168,7 @@ light_color = "#3728ff" var/active -/obj/item/spaceflare/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/spaceflare/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index e97f0d66620f..9c11d8e94238 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -11,7 +11,7 @@ var/skip_act = FALSE var/tgui_subtemplate = "ShuttleControlConsoleDefault" -/obj/machinery/computer/shuttle_control/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/shuttle_control/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..(user)) return if(!allowed(user)) diff --git a/code/modules/species/xenomorphs/alien_facehugger.dm b/code/modules/species/xenomorphs/alien_facehugger.dm index 65f81bf662f3..d7ca44349e3d 100644 --- a/code/modules/species/xenomorphs/alien_facehugger.dm +++ b/code/modules/species/xenomorphs/alien_facehugger.dm @@ -30,7 +30,7 @@ var/const/MAX_ACTIVE_TIME = 400 var/strength = 5 var/attached = 0 -/obj/item/clothing/mask/facehugger/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/mask/facehugger/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((stat == CONSCIOUS && !sterile)) if(Attach(user)) return @@ -315,7 +315,7 @@ var/const/MAX_ACTIVE_TIME = 400 var/strength = 5 var/attached = 0 -/mob/living/simple_mob/animal/space/alien/facehugger/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/mob/living/simple_mob/animal/space/alien/facehugger/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if((stat == CONSCIOUS && !sterile)) if(Attach(user)) diff --git a/code/modules/spells/artifacts.dm b/code/modules/spells/artifacts.dm index 6c3765979699..408f5f1bf571 100644 --- a/code/modules/spells/artifacts.dm +++ b/code/modules/spells/artifacts.dm @@ -12,7 +12,7 @@ damage_force = 10 attack_sound = 'sound/items/welder2.ogg' -/obj/item/scrying/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/scrying/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -48,7 +48,7 @@ var/rend_desc = "You should run now." var/spawn_fast = 0 //if 1, ignores checking for mobs on loc before spawning -/obj/item/veilrender/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/veilrender/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -282,7 +282,7 @@ user.reset_perspective(null) user.unset_machine() -/obj/item/voodoo/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/voodoo/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -385,7 +385,7 @@ REMOVE_TRAIT(user, TRAIT_MOBILITY_NOPICKUP, src) user.update_mobility_blocked() -/obj/item/warpwhistle/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/warpwhistle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index 2922a46401a4..4a38852e9f48 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -252,7 +252,7 @@ . = ..() name += spellname -/obj/item/spellbook/oneuse/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/spellbook/oneuse/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/stockmarket/computer.dm b/code/modules/stockmarket/computer.dm index 7d3b3d3482e9..e30228b5a8cb 100644 --- a/code/modules/stockmarket/computer.dm +++ b/code/modules/stockmarket/computer.dm @@ -13,7 +13,7 @@ . = ..() logged_in = "Cargo Department" -/obj/machinery/computer/stockexchange/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/stockexchange/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..(user)) return diff --git a/code/modules/telesci/hyper_pad.dm b/code/modules/telesci/hyper_pad.dm index dd3c6f938586..dcc5204b7555 100644 --- a/code/modules/telesci/hyper_pad.dm +++ b/code/modules/telesci/hyper_pad.dm @@ -56,7 +56,7 @@ if(primary) primary.attack_ghost(ghost) -/obj/machinery/hyperpad/centre/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/hyperpad/centre/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -77,7 +77,7 @@ src.add_fingerprint(user) startteleport(user) -/obj/machinery/hyperpad/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/hyperpad/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(primary) primary.attack_hand(user) diff --git a/code/modules/telesci/quantum_pad.dm b/code/modules/telesci/quantum_pad.dm index cdaa8d7f4e91..ee060a8bdfab 100644 --- a/code/modules/telesci/quantum_pad.dm +++ b/code/modules/telesci/quantum_pad.dm @@ -78,7 +78,7 @@ else icon_state = initial(icon_state) -/obj/machinery/power/quantumpad/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/power/quantumpad/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 71f75e49d05c..3123dae91893 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -77,7 +77,7 @@ /obj/machinery/computer/telescience/attack_ai(mob/user) src.attack_hand(user) -/obj/machinery/computer/telescience/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/telescience/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return nano_ui_interact(user) diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm index db32b2ab089c..129ddc9d3bb2 100644 --- a/code/modules/turbolift/turbolift_console.dm +++ b/code/modules/turbolift/turbolift_console.dm @@ -39,7 +39,7 @@ /obj/structure/lift/attack_generic(var/mob/user) return attack_hand(user) -/obj/structure/lift/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/lift/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return interact(user) /obj/structure/lift/interact(var/mob/user) diff --git a/code/modules/vehicles/ridden/wheelchair.dm b/code/modules/vehicles/ridden/wheelchair.dm index 44bf4dc30d2a..ddfe769f056b 100644 --- a/code/modules/vehicles/ridden/wheelchair.dm +++ b/code/modules/vehicles/ridden/wheelchair.dm @@ -52,7 +52,7 @@ /// What we unfold to var/unfolded_type = /obj/vehicle/ridden/wheelchair -/obj/item/wheelchair/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/wheelchair/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vehicles_legacy/bike.dm b/code/modules/vehicles_legacy/bike.dm index cdaacf4ada7f..a99f152f117a 100644 --- a/code/modules/vehicles_legacy/bike.dm +++ b/code/modules/vehicles_legacy/bike.dm @@ -120,7 +120,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/vehicle_old/bike/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/vehicle_old/bike/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user == load) unload(load, user) to_chat(user, "You unbuckle yourself from \the [src].") diff --git a/code/modules/vehicles_legacy/skateboard.dm b/code/modules/vehicles_legacy/skateboard.dm index ddbd9138cd92..8fe949350b66 100644 --- a/code/modules/vehicles_legacy/skateboard.dm +++ b/code/modules/vehicles_legacy/skateboard.dm @@ -47,7 +47,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/vehicle_old/skateboard/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/vehicle_old/skateboard/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user == load) unbuckle_mob(load, user) to_chat(user, "You unbuckle yourself from \the [src].") @@ -98,7 +98,7 @@ egg?.fracture() H.adjustBrainLoss(rand(5, 10)) visible_message("[src] crashes into [A], sending [H] flying! They land on their head, that doesn't look good...") - else + else //Minor brain injury from hitting your head H.adjustBrainLoss(rand(1, 2)) visible_message("[src] crashes into [A], sending [H] flying!") @@ -116,7 +116,7 @@ egg?.fracture() H.adjustBrainLoss(rand(5, 10)) visible_message("[src] crashes into [A], sending [H] flying! They land on their head, that doesn't look good...") - else + else H.adjustBrainLoss(rand(1, 2)) visible_message("[src] crashes into [A], sending [H] flying!") H.update_health() diff --git a/code/modules/vehicles_legacy/train.dm b/code/modules/vehicles_legacy/train.dm index bcf7c34b970b..98fd43290f97 100644 --- a/code/modules/vehicles_legacy/train.dm +++ b/code/modules/vehicles_legacy/train.dm @@ -110,7 +110,7 @@ return CLICKCHAIN_DO_NOT_PROPAGATE return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/vehicle_old/train/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/vehicle_old/train/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.stat || user.restrained() || !Adjacent(user)) return 0 diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm index dad5ef2c796b..4735ccdf43ce 100644 --- a/code/modules/virus2/curer.dm +++ b/code/modules/virus2/curer.dm @@ -36,7 +36,7 @@ /obj/machinery/computer/curer/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/curer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/curer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return user.machine = src diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm index 897b25c5a20c..9d9771d2a389 100644 --- a/code/modules/virus2/diseasesplicer.dm +++ b/code/modules/virus2/diseasesplicer.dm @@ -38,7 +38,7 @@ /obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob) return src.attack_hand(user) -/obj/machinery/computer/diseasesplicer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/diseasesplicer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return TRUE ui_interact(user) diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index 9f7c4ba25f54..eb32bee10fb0 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -45,7 +45,7 @@ src.attack_hand(user) -/obj/machinery/disease2/incubator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/disease2/incubator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return nano_ui_interact(user) diff --git a/code/modules/virus2/isolator.dm b/code/modules/virus2/isolator.dm index 42bca4e16161..80093b43806d 100644 --- a/code/modules/virus2/isolator.dm +++ b/code/modules/virus2/isolator.dm @@ -41,7 +41,7 @@ src.attack_hand(user) -/obj/machinery/disease2/isolator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/disease2/isolator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return ui_interact(user) diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm index a87f53734b89..cb132c5a9e07 100644 --- a/code/modules/vore/eating/leave_remains_vr.dm +++ b/code/modules/vore/eating/leave_remains_vr.dm @@ -90,7 +90,7 @@ pred_ckey = pred.ckey pred_name = pred.name -/obj/item/digestion_remains/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/digestion_remains/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/custom_guns.dm b/code/modules/vore/fluffstuff/custom_guns.dm index 4d4cc555fab2..3958d47a7b7b 100644 --- a/code/modules/vore/fluffstuff/custom_guns.dm +++ b/code/modules/vore/fluffstuff/custom_guns.dm @@ -161,7 +161,7 @@ chambered = AC update_icon() -/obj/item/gun/ballistic/revolver/mateba/fluff/tasald_corlethian/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/revolver/mateba/fluff/tasald_corlethian/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) unload_ammo(user, allow_dump = 1) else diff --git a/code/modules/vore/fluffstuff/custom_items_cit.dm b/code/modules/vore/fluffstuff/custom_items_cit.dm index 704b54e9e760..9f7d78118f69 100644 --- a/code/modules/vore/fluffstuff/custom_items_cit.dm +++ b/code/modules/vore/fluffstuff/custom_items_cit.dm @@ -27,7 +27,7 @@ if((state > 1) || !owner) STOP_PROCESSING(SSobj, src) -/obj/item/clothing/accessory/collar/lifecrystal/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/clothing/accessory/collar/lifecrystal/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/guns/bsharpoon.dm b/code/modules/vore/fluffstuff/guns/bsharpoon.dm index 05e33b0f8080..4807a8cdaa7d 100644 --- a/code/modules/vore/fluffstuff/guns/bsharpoon.dm +++ b/code/modules/vore/fluffstuff/guns/bsharpoon.dm @@ -73,7 +73,7 @@ var/turf/real_target = prob(failchance)? pick(trange(failrange, user)) : ToTurf AM.locationTransitForceMove(real_target, allow_pulled = FALSE, allow_grabbed = GRAB_AGGRESSIVE) -/obj/item/bluespace_harpoon/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/bluespace_harpoon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm index dc7b2aca3533..1a192465e15e 100644 --- a/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm @@ -68,7 +68,7 @@ update_charge() update_icon() -/obj/item/gun/ballistic/cell_loaded/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/gun/ballistic/cell_loaded/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) if(!chambered) return diff --git a/code/modules/vore/fluffstuff/guns/gunsword.dm b/code/modules/vore/fluffstuff/guns/gunsword.dm index 873b072cfb40..a8758e6c806b 100644 --- a/code/modules/vore/fluffstuff/guns/gunsword.dm +++ b/code/modules/vore/fluffstuff/guns/gunsword.dm @@ -93,7 +93,7 @@ attack_verb = list() -/obj/item/cell/device/weapon/gunsword/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/cell/device/weapon/gunsword/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index d265760a16fb..52851d70d2cf 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -22,7 +22,7 @@ for(var/mob/living/carbon/human/O in contents) O.request_strip_menu(usr) -/obj/item/holder/micro/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/holder/micro/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/vore/weight/fitness_machines_vr.dm b/code/modules/vore/weight/fitness_machines_vr.dm index c7f3a7e2e873..5e27217d991d 100644 --- a/code/modules/vore/weight/fitness_machines_vr.dm +++ b/code/modules/vore/weight/fitness_machines_vr.dm @@ -11,7 +11,7 @@ var/cooldown = 10 var/weightloss_power = 1 -/obj/machinery/fitness/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/fitness/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -68,7 +68,7 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) return -/obj/machinery/fitness/heavy/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/fitness/heavy/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!anchored) to_chat(user, "For safety reasons, you are required to have this equipment wrenched down before using it!") return @@ -98,7 +98,7 @@ idle_power_usage = 0 active_power_usage = 0 -/obj/machinery/scale/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/scale/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/anomaly_container.dm b/code/modules/xenoarcheaology/anomaly_container.dm index b2211c98c00c..85d76cf6521f 100644 --- a/code/modules/xenoarcheaology/anomaly_container.dm +++ b/code/modules/xenoarcheaology/anomaly_container.dm @@ -14,7 +14,7 @@ if(A) contain(A) -/obj/structure/anomaly_container/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/structure/anomaly_container/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) release() /obj/structure/anomaly_container/attack_robot(var/mob/user) diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm index 048212d51687..e344fc73f33e 100644 --- a/code/modules/xenoarcheaology/artifacts/artifact.dm +++ b/code/modules/xenoarcheaology/artifacts/artifact.dm @@ -174,7 +174,7 @@ if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) secondary_effect.ToggleActivate(0) -/obj/machinery/artifact/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/artifact/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (get_dist(user, src) > 1) to_chat(user, "You can't reach [src] from here.") return diff --git a/code/modules/xenoarcheaology/artifacts/gigadrill.dm b/code/modules/xenoarcheaology/artifacts/gigadrill.dm index 4125087d6803..73a9c119aef5 100644 --- a/code/modules/xenoarcheaology/artifacts/gigadrill.dm +++ b/code/modules/xenoarcheaology/artifacts/gigadrill.dm @@ -9,7 +9,7 @@ density = 1 layer = ABOVE_JUNK_LAYER -/obj/machinery/giga_drill/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/giga_drill/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(active) active = 0 icon_state = "gigadrill" diff --git a/code/modules/xenoarcheaology/artifacts/replicator.dm b/code/modules/xenoarcheaology/artifacts/replicator.dm index 67e3d0dbd0ea..4c89df3c1c4a 100644 --- a/code/modules/xenoarcheaology/artifacts/replicator.dm +++ b/code/modules/xenoarcheaology/artifacts/replicator.dm @@ -138,7 +138,7 @@ last_process_time = world.time -/obj/machinery/replicator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/replicator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /obj/machinery/replicator/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm index 5d4e7dc094e3..cf1e87382aa7 100644 --- a/code/modules/xenoarcheaology/sampling.dm +++ b/code/modules/xenoarcheaology/sampling.dm @@ -81,7 +81,7 @@ else to_chat(user, "You are unable to take a sample of [item_to_sample].") -/obj/item/core_sampler/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/core_sampler/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index ee3d9e91af23..19d67e7b83ef 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -48,7 +48,7 @@ else return ..() -/obj/item/anodevice/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/anodevice/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm index dc6114cc07c9..40bbe0f242a5 100644 --- a/code/modules/xenoarcheaology/tools/artifact_analyser.dm +++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm @@ -24,7 +24,7 @@ if(!owned_scanner) owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src) -/obj/machinery/artifact_analyser/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/artifact_analyser/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(machine_stat & (NOPOWER|BROKEN) || get_dist(src, user) > 1) return diff --git a/code/modules/xenoarcheaology/tools/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm index 18d7fc1b0ac9..61bd66103705 100644 --- a/code/modules/xenoarcheaology/tools/artifact_harvester.dm +++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm @@ -35,7 +35,7 @@ else return..() -/obj/machinery/artifact_harvester/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/artifact_harvester/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) add_fingerprint(user) if(machine_stat & (NOPOWER|BROKEN)) return diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index c99453b2882f..99d9a99d3095 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -115,7 +115,7 @@ if(total_purity && fresh_coolant) coolant_purity = total_purity / fresh_coolant -/obj/machinery/radiocarbon_spectrometer/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/radiocarbon_spectrometer/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ui_interact(user) /obj/machinery/radiocarbon_spectrometer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/xenoarcheaology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm index 745409e53e5f..9d94bddb67ca 100644 --- a/code/modules/xenoarcheaology/tools/suspension_generator.dm +++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm @@ -35,7 +35,7 @@ else deactivate() -/obj/machinery/suspension_gen/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/suspension_gen/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(panel_open) if(cell) to_chat(user, SPAN_NOTICE("You remove [cell].")) diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index b9073a061538..b882ee810b6b 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -44,7 +44,7 @@ var/last_scan_time = 0 var/scan_delay = 25 -/obj/item/ano_scanner/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/ano_scanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -156,7 +156,7 @@ to_chat(user, "[icon2html(thing = src, target = world)] [src] pings [pick("madly","wildly","excitedly","crazily")]!") -/obj/item/depth_scanner/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/depth_scanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -283,7 +283,7 @@ else icon_state = "pinoff" -/obj/item/beacon_locator/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/beacon_locator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -346,7 +346,7 @@ anomaly_scanner = new/obj/item/ano_scanner/integrated(src) depth_scanner = new/obj/item/depth_scanner(src) -/obj/item/xenoarch_multi_tool/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/xenoarch_multi_tool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm index b0ba67f071f0..773d356c6337 100644 --- a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm +++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm @@ -151,7 +151,7 @@ w_class = 2 attack_verb = list("drilled") -/obj/item/pickaxe/excavationdrill/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/pickaxe/excavationdrill/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenobio/items/slime_objects.dm b/code/modules/xenobio/items/slime_objects.dm index d14e1ea98f9e..d622b650eff9 100644 --- a/code/modules/xenobio/items/slime_objects.dm +++ b/code/modules/xenobio/items/slime_objects.dm @@ -7,7 +7,7 @@ description_info = "Use in your hand to attempt to create a Promethean. It functions similarly to a positronic brain, in that a ghost is needed to become the Promethean." var/searching = 0 -/obj/item/slime_cube/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/slime_cube/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -93,7 +93,7 @@ qdel(src) return . | CLICKCHAIN_DO_NOT_PROPAGATE -/obj/item/slime_crystal/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/slime_crystal/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/xenobio/machinery/processor.dm b/code/modules/xenobio/machinery/processor.dm index 8dad53b44cee..3e0f9474ee46 100644 --- a/code/modules/xenobio/machinery/processor.dm +++ b/code/modules/xenobio/machinery/processor.dm @@ -29,7 +29,7 @@ . += SPAN_NOTICE("It looks slick enough to let slimes glide over it.") . += SPAN_BOLDNOTICE("The automatic intake switch is in the [auto_mode? "On" : "Off"] position.") -/obj/machinery/processor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/processor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(processing) to_chat(user, SPAN_WARNING("The processor is in the process of processing!")) return diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm index 0594c704a199..7126bf529979 100644 --- a/code/modules/xenobio2/machinery/core_extractor.dm +++ b/code/modules/xenobio2/machinery/core_extractor.dm @@ -145,7 +145,7 @@ eject_slime() //Here lies the UI -/obj/machinery/slime/extractor/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/slime/extractor/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm index 3ed601278b89..951547dff623 100644 --- a/code/modules/xenobio2/machinery/gene_manipulators.dm +++ b/code/modules/xenobio2/machinery/gene_manipulators.dm @@ -20,7 +20,7 @@ var/list/genes = list() var/genesource = "unknown" -/obj/item/disk/xenobio/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/disk/xenobio/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return @@ -59,7 +59,7 @@ /obj/machinery/xenobio/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/xenobio/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/xenobio/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) nano_ui_interact(user) /obj/machinery/xenobio/attackby(obj/item/W as obj, mob/user as mob) diff --git a/code/modules/xenobio2/machinery/injector_computer.dm b/code/modules/xenobio2/machinery/injector_computer.dm index cf5ef9833a15..2da0a6d0573c 100644 --- a/code/modules/xenobio2/machinery/injector_computer.dm +++ b/code/modules/xenobio2/machinery/injector_computer.dm @@ -23,7 +23,7 @@ injector.computer = null ..() -/obj/machinery/computer/xenobio2/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/computer/xenobio2/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(..()) return 1 nano_ui_interact(user) diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm index 86fad6052e8f..a36c97634b01 100644 --- a/code/modules/xenobio2/machinery/slime_replicator.dm +++ b/code/modules/xenobio2/machinery/slime_replicator.dm @@ -99,7 +99,7 @@ eject_core() //Here lies the UI -/obj/machinery/slime/replicator/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/obj/machinery/slime/replicator/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) user.set_machine(src) interact(user) diff --git a/code/modules/xenobio2/mob/slime/slime_monkey.dm b/code/modules/xenobio2/mob/slime/slime_monkey.dm index 723291732889..6553630c3781 100644 --- a/code/modules/xenobio2/mob/slime/slime_monkey.dm +++ b/code/modules/xenobio2/mob/slime/slime_monkey.dm @@ -8,7 +8,7 @@ Slime cube lives here. icon_state = "slime cube" var/searching = 0 -/obj/item/slime_cube/attack_self(mob/user, datum/event_args/clickchain/e_args) +/obj/item/slime_cube/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/maps/generic/misc.dm b/maps/generic/misc.dm index 9e1c2590d7c6..321757eed7e6 100644 --- a/maps/generic/misc.dm +++ b/maps/generic/misc.dm @@ -68,7 +68,7 @@ /turf/simulated/floor/maglev/Entered(var/atom/movable/AM, var/atom/old_loc) if(isliving(AM) && prob(50)) track_zap(AM) -/turf/simulated/floor/maglev/attack_hand(mob/user, datum/event_args/clickchain/e_args) +/turf/simulated/floor/maglev/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(prob(75)) track_zap(user) /turf/simulated/floor/maglev/proc/track_zap(var/mob/living/user) From ef5a5cb99f619faa19b658371ce6e61e7a00496e Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 24 May 2024 18:17:43 +0000 Subject: [PATCH 036/140] arg standardize --- code/game/machinery/buttons.dm | 2 +- code/game/machinery/computer/arcade/amputation.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/floor_inflatables.dm | 2 +- code/game/machinery/newscaster.dm | 2 +- code/game/machinery/recipe_lookup.dm | 2 +- code/game/machinery/vending/vending.dm | 2 +- code/game/objects/effects/debris/cleanable/blood.dm | 2 +- code/game/objects/items/storage/quickdraw.dm | 2 +- code/game/objects/items/weapons/game_kit.dm | 2 +- code/game/objects/objs.dm | 2 +- code/game/objects/structures/aliens.dm | 2 +- .../objects/structures/crates_lockers/closets/secure/genpop.dm | 2 +- code/game/objects/structures/props/nest.dm | 2 +- code/game/objects/structures/props/prop.dm | 2 +- code/game/objects/structures/stool_bed_chair_nest/chairs.dm | 2 +- code/game/rendering/screen_legacy.dm | 2 +- code/modules/assembly/holder.dm | 2 +- code/modules/atmospherics/machinery/air_alarm.dm | 2 +- code/modules/integrated_electronics/core/assemblies.dm | 2 +- code/modules/mob/living/silicon/pai/defense.dm | 2 +- code/modules/mob/living/silicon/pai/hologram_effect.dm | 2 +- code/modules/multiz/structures/ladder.dm | 2 +- code/modules/projectiles/guns/magnetic/bore.dm | 2 +- code/modules/projectiles/guns/projectile/contender.dm | 2 +- code/modules/projectiles/guns/projectile/pistol.dm | 2 +- code/modules/projectiles/guns/projectile/rocket.dm | 2 +- .../modules/reagents/machinery/reagent_dispenser/watercooler.dm | 2 +- code/modules/resleeving/mirror.dm | 2 +- code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 0ccf4f104f6e..1f18a33b1cc3 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -30,7 +30,7 @@ desc = "A remote control switch for polarized windows." var/range = 7 -/obj/machinery/button/windowtint/attack_hand(mob/user, list/params) +/obj/machinery/button/windowtint/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (..()) return TRUE else diff --git a/code/game/machinery/computer/arcade/amputation.dm b/code/game/machinery/computer/arcade/amputation.dm index 3725192b5169..a978a40bdf79 100644 --- a/code/game/machinery/computer/arcade/amputation.dm +++ b/code/game/machinery/computer/arcade/amputation.dm @@ -7,7 +7,7 @@ icon_screen = null circuit = /obj/item/circuitboard/arcade/amputation -/obj/machinery/computer/arcade/amputation/attack_hand(mob/user, list/modifiers) +/obj/machinery/computer/arcade/amputation/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!iscarbon(user)) return var/mob/living/carbon/c_user = user diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 0e49fb098544..24ca7b289093 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -99,7 +99,7 @@ /obj/machinery/computer/cryopod/attack_ai() attack_hand() -/obj/machinery/computer/cryopod/attack_hand(mob/user = usr) +/obj/machinery/computer/cryopod/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (NOPOWER|BROKEN)) return ..() diff --git a/code/game/machinery/floor_inflatables.dm b/code/game/machinery/floor_inflatables.dm index 7e87f68451a8..2a79c18e4d31 100644 --- a/code/game/machinery/floor_inflatables.dm +++ b/code/game/machinery/floor_inflatables.dm @@ -47,7 +47,7 @@ else to_chat(user, "[C] is to large for [src]") -/obj/machinery/floor_inflatables/attack_hand(mob/user, list/params) +/obj/machinery/floor_inflatables/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() var/confirm = input(user, "Do you want to trigger [src]'s deployment?","Trigger Floormount") as null|anything in list("Yes","No") if(confirm && confirm == "Yes") diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 726ab8db6ac6..97326b56bca6 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -250,7 +250,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/newscaster/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ +/obj/machinery/newscaster/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!ispowered || isbroken) return diff --git a/code/game/machinery/recipe_lookup.dm b/code/game/machinery/recipe_lookup.dm index 3116a8e8ea5c..8fe6954bd83a 100644 --- a/code/game/machinery/recipe_lookup.dm +++ b/code/game/machinery/recipe_lookup.dm @@ -9,7 +9,7 @@ /obj/machinery/recipe_lookup/proc/display_options() return tgui_input_list(usr, "Pick a [result_type_name] to view its recipe.", "Select [result_type_name]", recipe_list) -/obj/machinery/recipe_lookup/attack_hand(mob/user) +/obj/machinery/recipe_lookup/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // regular use checks if (!isliving(user)) return FALSE diff --git a/code/game/machinery/vending/vending.dm b/code/game/machinery/vending/vending.dm index f7506da156bd..bef9d53c8694 100644 --- a/code/game/machinery/vending/vending.dm +++ b/code/game/machinery/vending/vending.dm @@ -283,7 +283,7 @@ /obj/machinery/vending/attack_ai(mob/user as mob) return attack_hand(user) -/obj/machinery/vending/attack_hand(mob/user, list/params) +/obj/machinery/vending/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(machine_stat & (BROKEN|NOPOWER)) return diff --git a/code/game/objects/effects/debris/cleanable/blood.dm b/code/game/objects/effects/debris/cleanable/blood.dm index f87cbc9d5348..e2e3b46c13bf 100644 --- a/code/game/objects/effects/debris/cleanable/blood.dm +++ b/code/game/objects/effects/debris/cleanable/blood.dm @@ -132,7 +132,7 @@ var/global/list/image/splatter_cache=list() add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) amount = 0 -/obj/effect/debris/cleanable/blood/attack_hand(mob/user, list/params) +/obj/effect/debris/cleanable/blood/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/quickdraw.dm b/code/game/objects/items/storage/quickdraw.dm index 11575db69b74..3c64736e68ca 100644 --- a/code/game/objects/items/storage/quickdraw.dm +++ b/code/game/objects/items/storage/quickdraw.dm @@ -17,7 +17,7 @@ //When set to 1, a click while it is equipped will instead move the first item inside it to your hand // var/quickmode = 0 -// /obj/item/storage/quickdraw/attack_hand(mob/user, list/params) +// /obj/item/storage/quickdraw/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // if(src.loc == user) //If they aren't holding us, we do nothing special // if(ishuman(user)) // var/mob/living/carbon/human/H = user diff --git a/code/game/objects/items/weapons/game_kit.dm b/code/game/objects/items/weapons/game_kit.dm index 190f0364ad28..fafb6e8281ab 100644 --- a/code/game/objects/items/weapons/game_kit.dm +++ b/code/game/objects/items/weapons/game_kit.dm @@ -57,7 +57,7 @@ THAT STUPID GAME KIT /obj/item/game_kit/attack_ai(mob/user as mob, unused, flag) return src.attack_hand(user, unused, flag) -/obj/item/game_kit/attack_hand(mob/user as mob, unused, flag) +/obj/item/game_kit/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if (flag) return ..() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index ca10f1e4975c..6ab3b6e664f8 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -457,7 +457,7 @@ /obj/proc/do_climb_target(mob/living/climber) return get_turf(src) -/obj/attack_hand(mob/user, list/params) +/obj/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.a_intent == INTENT_HARM) return ..() . = ..() diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index b2a0bf93779f..ad8aa2d2cd0e 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -55,7 +55,7 @@ T.thermal_conductivity = initial(T.thermal_conductivity) ..() -/obj/structure/alien/resin/attack_hand(mob/user, list/params) +/obj/structure/alien/resin/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(iscarbon(user)) var/mob/living/carbon/C = user if(locate(/obj/item/organ/internal/xenos/hivenode) in C.internal_organs) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/genpop.dm b/code/game/objects/structures/crates_lockers/closets/secure/genpop.dm index d3410971f156..6ce0bf5f5e37 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/genpop.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/genpop.dm @@ -95,7 +95,7 @@ locked = TRUE return ..() -/obj/structure/closet/secure_closet/genpop/attack_hand(mob/user) +/obj/structure/closet/secure_closet/genpop/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.lying && get_dist(src, user) > 0) return diff --git a/code/game/objects/structures/props/nest.dm b/code/game/objects/structures/props/nest.dm index 6a24f15cf45e..30a2d8d2386a 100644 --- a/code/game/objects/structures/props/nest.dm +++ b/code/game/objects/structures/props/nest.dm @@ -34,7 +34,7 @@ STOP_PROCESSING(SSobj, src) ..() -/obj/structure/prop/nest/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // Used to tell the player that this isn't useful for anything. +/obj/structure/prop/nest/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) ..() if(user && prob(disturbance_spawn_chance)) spawn_creature(get_turf(src)) diff --git a/code/game/objects/structures/props/prop.dm b/code/game/objects/structures/props/prop.dm index b45e65323557..8471e5fde491 100644 --- a/code/game/objects/structures/props/prop.dm +++ b/code/game/objects/structures/props/prop.dm @@ -9,7 +9,7 @@ anchored = TRUE var/interaction_message = null -/obj/structure/prop/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // Used to tell the player that this isn't useful for anything. +/obj/structure/prop/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!istype(user)) return FALSE if(!interaction_message) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 26cece5c48f0..ebae37616894 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -51,7 +51,7 @@ qdel(src) return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/structure/bed/chair/attack_hand(mob/user) +/obj/structure/bed/chair/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(!stacked_size) return ..() var/obj/item/material/twohanded/folded_metal_chair/F = new(loc) diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index b5e3ffe263c8..2c8da706aa20 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -40,7 +40,7 @@ G.s_click(src) return 1 -/atom/movable/screen/grab/attack_hand(mob/user, list/params) +/atom/movable/screen/grab/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) return /atom/movable/screen/grab/attackby() diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 6534dafe8383..7e545b7d029f 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -85,7 +85,7 @@ a_right.holder_movement() -/obj/item/assembly_holder/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args)//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess +/obj/item/assembly_holder/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(a_left && a_right) a_left.holder_movement() a_right.holder_movement() diff --git a/code/modules/atmospherics/machinery/air_alarm.dm b/code/modules/atmospherics/machinery/air_alarm.dm index 96a13304af28..e79db8b4533a 100644 --- a/code/modules/atmospherics/machinery/air_alarm.dm +++ b/code/modules/atmospherics/machinery/air_alarm.dm @@ -514,7 +514,7 @@ CREATE_WALL_MOUNTING_TYPES_SHIFTED(/obj/machinery/air_alarm, 26) /obj/machinery/air_alarm/attack_ai(mob/user) ui_interact(user) -/obj/machinery/air_alarm/attack_hand(mob/user, list/params) +/obj/machinery/air_alarm/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index ad4a52afe86b..b4d8dfa0ae41 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -607,7 +607,7 @@ return ..() -/obj/item/electronic_assembly/attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) +/obj/item/electronic_assembly/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(anchored) attack_self(user) return diff --git a/code/modules/mob/living/silicon/pai/defense.dm b/code/modules/mob/living/silicon/pai/defense.dm index 2811411b7799..d6faec813e36 100644 --- a/code/modules/mob/living/silicon/pai/defense.dm +++ b/code/modules/mob/living/silicon/pai/defense.dm @@ -36,7 +36,7 @@ else . = ..() -/mob/living/silicon/pai/attack_hand(mob/user, list/params) +/mob/living/silicon/pai/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(. & CLICKCHAIN_DO_NOT_PROPAGATE) return diff --git a/code/modules/mob/living/silicon/pai/hologram_effect.dm b/code/modules/mob/living/silicon/pai/hologram_effect.dm index 8c84bf80b10c..8bc6cc288ab8 100644 --- a/code/modules/mob/living/silicon/pai/hologram_effect.dm +++ b/code/modules/mob/living/silicon/pai/hologram_effect.dm @@ -10,7 +10,7 @@ /obj/effect/pai_hologram/attackby(obj/item/W, mob/user) hologram_destroy(user) -/obj/effect/pai_hologram/attack_hand(mob/user, list/params) +/obj/effect/pai_hologram/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) hologram_destroy(user) /obj/effect/pai_hologram/proc/hologram_destroy(mob/user) diff --git a/code/modules/multiz/structures/ladder.dm b/code/modules/multiz/structures/ladder.dm index 0ac65d6d7c9c..96ebae23d1e7 100644 --- a/code/modules/multiz/structures/ladder.dm +++ b/code/modules/multiz/structures/ladder.dm @@ -39,7 +39,7 @@ attack_hand(user) return -/obj/structure/ladder/attack_hand(mob/user, list/params) +/obj/structure/ladder/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm index 3977c6fcbd54..f6bf34c5d9d1 100644 --- a/code/modules/projectiles/guns/magnetic/bore.dm +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -48,7 +48,7 @@ if(mat_storage) . += image(icon, "[icon_state]_loaded") -/obj/item/gun/magnetic/matfed/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) // It doesn't keep a loaded item inside. +/obj/item/gun/magnetic/matfed/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) var/obj/item/removing diff --git a/code/modules/projectiles/guns/projectile/contender.dm b/code/modules/projectiles/guns/projectile/contender.dm index cfba839e638a..dfcff1e1b7d9 100644 --- a/code/modules/projectiles/guns/projectile/contender.dm +++ b/code/modules/projectiles/guns/projectile/contender.dm @@ -129,7 +129,7 @@ to_chat(user, "\The [src] is completely inoperable!") handle_click_empty() -/obj/item/gun/ballistic/contender/pipegun/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/contender/pipegun/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src && destroyed) to_chat(user, "\The [src]'s chamber is too warped to extract the casing!") return diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index a6e441036c80..8ebc1e342003 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -272,7 +272,7 @@ to_chat(user, "\The [src] is completely inoperable!") handle_click_empty() -/obj/item/gun/ballistic/pirate/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/pirate/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src && destroyed) to_chat(user, "\The [src]'s chamber is too warped to extract the casing!") return diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index 16e1f855eaa8..60e9e56523cf 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -167,7 +167,7 @@ to_chat(user, "\The [src] is completely inoperable!") handle_click_empty() -/obj/item/gun/ballistic/rocket/tyrmalin/attack_hand(mob/user, list/params) +/obj/item/gun/ballistic/rocket/tyrmalin/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src && destroyed) to_chat(user, "\The [src]'s chamber is too warped to extract the casing!") return diff --git a/code/modules/reagents/machinery/reagent_dispenser/watercooler.dm b/code/modules/reagents/machinery/reagent_dispenser/watercooler.dm index 9926b6417d6d..95e3b73397d5 100644 --- a/code/modules/reagents/machinery/reagent_dispenser/watercooler.dm +++ b/code/modules/reagents/machinery/reagent_dispenser/watercooler.dm @@ -122,7 +122,7 @@ to_chat(user, "There is already a cup dispenser there!") return -/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/user) +/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(cups) new /obj/item/reagent_containers/food/drinks/sillycup(src.loc) cups-- diff --git a/code/modules/resleeving/mirror.dm b/code/modules/resleeving/mirror.dm index ff634bf26d70..f24673e68162 100644 --- a/code/modules/resleeving/mirror.dm +++ b/code/modules/resleeving/mirror.dm @@ -181,7 +181,7 @@ imp = null update_icon() -/obj/item/mirrortool/attack_hand(mob/user as mob) +/obj/item/mirrortool/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(user.get_inactive_held_item() == src) user.put_in_hands_or_drop(imp) imp = null diff --git a/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm b/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm index 29f792d3fe9c..45aa1c8a4ef7 100644 --- a/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm +++ b/code/modules/species/station/xenomorph_hybrids/hybrid_resin.dm @@ -178,7 +178,7 @@ T.thermal_conductivity = initial(T.thermal_conductivity) ..() -/obj/structure/alien/hybrid_resin/attack_hand(mob/user, list/params) +/obj/structure/alien/hybrid_resin/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) if(iscarbon(user)) var/mob/living/carbon/C = user if(locate(/obj/item/organ/internal/xenos/hivenode) in C.internal_organs) From 2a094fde700347d722b03b14e0fd4b5d55c58d91 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 24 May 2024 18:19:38 +0000 Subject: [PATCH 037/140] rid of that --- citadel.dme | 1 - code/datums/event_args/clickchain.dm | 4 - code/modules/inventory/slot_meta.dm | 938 --------------------------- 3 files changed, 943 deletions(-) delete mode 100644 code/modules/inventory/slot_meta.dm diff --git a/citadel.dme b/citadel.dme index a74690d9328a..facc8185f70f 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2965,7 +2965,6 @@ #include "code\modules\integrated_electronics\~defines\~defines.dm" #include "code\modules\inventory\hands.dm" #include "code\modules\inventory\inventory.dm" -#include "code\modules\inventory\slot_meta.dm" #include "code\modules\inventory\item\hooks.dm" #include "code\modules\inventory\item\public.dm" #include "code\modules\inventory\item\rendering.dm" diff --git a/code/datums/event_args/clickchain.dm b/code/datums/event_args/clickchain.dm index 25ba7f175e9a..e29a75114d42 100644 --- a/code/datums/event_args/clickchain.dm +++ b/code/datums/event_args/clickchain.dm @@ -4,10 +4,6 @@ * clickchain is attack_x with item procs, attack hand, unarmed/ranged, etc. */ /datum/event_args/actor/clickchain - /// the mob that initiated the action - you usually don't care about this unless you're logging - var/mob/initiator - /// the mob that is doing the action - var/mob/actor /// the original atom target of the action var/atom/target /// a_intent diff --git a/code/modules/inventory/slot_meta.dm b/code/modules/inventory/slot_meta.dm deleted file mode 100644 index 1647d9788d04..000000000000 --- a/code/modules/inventory/slot_meta.dm +++ /dev/null @@ -1,938 +0,0 @@ -//* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// - -/// global slot meta cache - all ids must be string! -/// initialized by SSearly_init -GLOBAL_LIST_EMPTY(inventory_slot_meta) -/// global slot meta cache by type - only works for hardcoded -GLOBAL_LIST_EMPTY(inventory_slot_type_cache) - -/proc/init_inventory_slot_meta() - . = list() - GLOB.inventory_slot_meta = . - GLOB.inventory_slot_type_cache = list() - for(var/path in subtypesof(/datum/inventory_slot)) - var/datum/inventory_slot/M = path - if(initial(M.abstract_type) == path) - continue - M = new path - if(!M.id) - stack_trace("no ID on [path], skipping") - continue - .[M.id || M.type] = M - if(!(M.inventory_slot_flags & INV_SLOT_ALLOW_RANDOM_ID)) - GLOB.inventory_slot_type_cache[M.type] = M - tim_sort(., GLOBAL_PROC_REF(cmp_inventory_slot_meta_dsc), TRUE) - tim_sort(GLOB.inventory_slot_type_cache, GLOBAL_PROC_REF(cmp_inventory_slot_meta_dsc), TRUE) - -/proc/all_inventory_slot_ids() - . = list() - for(var/id in GLOB.inventory_slot_meta) - . += id - -/proc/cmp_inventory_slot_meta_dsc(datum/inventory_slot/a, datum/inventory_slot/b) - return b.sort_order - a.sort_order - -/** - * returns inventory slot meta for an id - * - * String IDs are not automatically converted to paths for speed. - */ -/proc/resolve_inventory_slot(datum/inventory_slot/id) - RETURN_TYPE(/datum/inventory_slot) - if(istype(id)) - return id - else if(ispath(id)) - return inventory_slot_type_lookup(id) - return GLOB.inventory_slot_meta[id] - -/** - * returns inventory slot render key for an id - */ -/proc/resolve_inventory_slot_render_key(datum/inventory_slot/id) - return resolve_inventory_slot(id)?.render_key - -/** - * get inventory slot meta of a typepath - */ -/proc/inventory_slot_type_lookup(type) - . = GLOB.inventory_slot_type_cache[type] - if(.) - return - for(var/id in GLOB.inventory_slot_meta) - var/datum/inventory_slot/slot = GLOB.inventory_slot_meta[id] - if(slot.type != type) - continue - GLOB.inventory_slot_meta[type] = . = slot - break - if(!.) - CRASH("Failed to do type lookup for [type].") - -/** - * inventory slot meta - * stores all the required information for an inventory slot - * - * **Typepaths for these are used directly in most circumstances of slot IDs** - * **Use get_inventory_slot_meta(id) to automatically translate anything to the static datum.** - * - * ABSTRACT SLOTS: - * Abstract slots attempts to do something special, based on mob. - * They only work on equips - can_equip, and anything unrelating to unequips, cannot check for it well. - * Can equip supports some abstract slots but not others. - */ -/datum/inventory_slot - /// abstract type - abstract_type = /datum/inventory_slot - - //* Intrinsics - /// slot name - var/name = "unknown" - /// id - var/id - /// next id - var/static/id_next = 0 - /// flags - var/inventory_slot_flags = INV_SLOT_IS_RENDERED - /// display order - higher is upper. a
is applied on 0. - var/sort_order = 0 - - //* HUD - /// our screen loc - var/hud_position - - //* Grammar - /// player friendly name - var/display_name = "unknown" - /// player friendly preposition - var/display_preposition = "on" - /// is this a "plural" slot? - var/display_plural = FALSE - - //* Equip Checks - /// equip checks to use - var/slot_equip_checks = NONE - /// slot flags required to have if checking - var/slot_flags_required = NONE - /// slot flags forbidden to have if checking - var/slot_flags_forbidden = NONE - - //* Stripping - /// always show on strip/force equip menu, or only show when full - var/always_show_on_strip_menu = TRUE - /// default INV_VIEW flags for stripping - var/default_strip_inv_view_flags = NONE - - //* Rendering - /// rendering slot key - var/render_key - /// rendering plural slot key - only set on base type of plural slots - var/render_key_plural - /// rendering default layer; first is default, rest are alt layers. can be list or just one number. - VAR_PROTECTED/list/render_layer - /// rendering icon state cache for default icons - VAR_PRIVATE/list/render_state_cache - /// rendering default icons by bodytype - VAR_PROTECTED/list/render_default_icons - /// rendering dim x - VAR_PRIVATE/list/render_dim_x_cache - /// rendering dim y - VAR_PRIVATE/list/render_dim_y_cache - /// fallback states; if set for a bodytype, that bodytype converts to this if not in worn_bodytypes, rather than defaulted. - VAR_PROTECTED/list/render_fallback - /// cascade renders to these slot ids - // todo: this should be flag-based; for a future refactor via /datum/inventory, not hardcoded! - VAR_PROTECTED/list/legacy_visibility_sensitive_slots = list() - -/datum/inventory_slot/New() - if(!id && (inventory_slot_flags & INV_SLOT_ALLOW_RANDOM_ID)) - id = "[++id_next]" - - // resolve typepaths to ids - for(var/i in 1 to length(legacy_visibility_sensitive_slots)) - var/what = legacy_visibility_sensitive_slots[i] - if(ispath(what, /datum/inventory_slot)) - var/datum/inventory_slot/resolving = what - if(!initial(resolving.id)) - stack_trace("no id on [resolving]; cascade render slot targets should have hardcoded ids at this point in time") - legacy_visibility_sensitive_slots[i] = initial(resolving.id) - - rebuild_rendering_caches() - -/datum/inventory_slot/proc/_equip_check(obj/item/I, mob/wearer, mob/user, flags) - if(slot_equip_checks & SLOT_EQUIP_CHECK_USE_FLAGS) - if(!(flags & INV_OP_FORCE)) - if(!CHECK_MULTIPLE_BITFIELDS(I.slot_flags, slot_flags_required)) - return FALSE - if(I.slot_flags & slot_flags_forbidden) - return FALSE - if(slot_equip_checks & SLOT_EQUIP_CHECK_USE_PROC) - if(!allow_equip(I, wearer, user, flags)) - return FALSE - return TRUE - -/** - * checked if slot_equip_checks specifies to use proc - */ -/datum/inventory_slot/proc/allow_equip(obj/item/I, mob/wearer, mob/user, force) - return TRUE - -/** - * checks for obfuscation when making the strip menu - */ -/datum/inventory_slot/proc/strip_obfuscation_check(obj/item/equipped, mob/wearer, mob/user) - return default_strip_inv_view_flags - -//* Rendering *// - -// todo: shouldn't have to specify bodytype -// todo: yes we should? otherwise we can't tell it to render differently against a mob's default bodytype. -/datum/inventory_slot/proc/render(mob/wearer, obj/item/item, bodytype) - return item.render_mob_appearance(wearer, id, bodytype) - -/datum/inventory_slot/proc/should_render(mob/wearer, obj/item/item) - return TRUE - -/datum/inventory_slot/proc/cascade_render_visibility(mob/wearer, obj/item/item) - for(var/slot_id in legacy_visibility_sensitive_slots) - wearer.inventory.update_slot_visible(slot_id, FALSE) - -/datum/inventory_slot/proc/rebuild_rendering_caches() - PROTECTED_PROC(TRUE) // if you think you need this outside you should rethink - render_state_cache = list() - render_dim_x_cache = list() - render_dim_y_cache = list() - if(!islist(render_default_icons)) // save the checks later for null - render_default_icons = list() - if(!islist(render_fallback)) // save the checks later for null - render_fallback = list() - for(var/bodytype_str in render_default_icons) - render_default_icons[bodytype_str] = istype(render_default_icons[bodytype_str], /icon)? render_default_icons[bodytype_str] : icon(render_default_icons[bodytype_str]) - if(!isicon(render_default_icons[bodytype_str])) - stack_trace("invalid icon in cache for bodytype [bodytype_str]; discarding") - render_default_icons -= bodytype_str - continue - var/icon/I = render_default_icons[bodytype_str] - render_state_cache[bodytype_str] = fast_icon_states(I) - // turn into hash - for(var/state in render_state_cache[bodytype_str]) - render_state_cache[bodytype_str][state] = TRUE - render_dim_x_cache[bodytype_str] = I.Width() - render_dim_y_cache[bodytype_str] = I.Height() - -/** - * returns (icon, dim_x, dim_y) if found in defaults, null if not - */ -/datum/inventory_slot/proc/resolve_default_assets(bodytype, state, mob/wearer, obj/item/equipped, inhand_domain) - var/bodytype_str = bodytype_to_string(bodytype) - if(!render_state_cache[bodytype_str]?[state]) - return - return list(render_default_icons[bodytype_str], render_dim_x_cache[bodytype_str], render_dim_y_cache[bodytype_str]) - -/** - * returns layer - */ -/datum/inventory_slot/proc/resolve_default_layer(bodytype, mob/wearer, obj/item/equipped, inhand_domain) - if(!islist(render_layer)) - return render_layer - var/index = 1 - if(istype(equipped, /obj/item/clothing/shoes)) - var/obj/item/clothing/shoes/S = equipped - index = (S.shoes_under_pants == 1)? 2 : 1 - else if(istype(equipped, /obj/item/storage/belt)) - var/obj/item/storage/belt/B = equipped - index = (B.show_above_suit == 1)? 2 : 1 - return render_layer[clamp(index, 1, length(render_layer))] - -/datum/inventory_slot/proc/handle_worn_fallback(bodytype, list/worn_data) - var/bodytype_str = bodytype_to_string(bodytype) - if(!render_fallback[bodytype_str]) - return FALSE - worn_data[WORN_DATA_ICON] = render_default_icons[bodytype_str] - worn_data[WORN_DATA_SIZE_X] = render_dim_x_cache[bodytype_str] - worn_data[WORN_DATA_SIZE_Y] = render_dim_y_cache[bodytype_str] - worn_data[WORN_DATA_STATE] = render_fallback[bodytype_str] - return TRUE - -//? Implementations ?// - -/datum/inventory_slot/inventory - abstract_type = /datum/inventory_slot/inventory - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_HUD_REQUIRES_EXPAND | INV_SLOT_CONSIDERED_WORN - -/datum/inventory_slot/inventory/back - name = "back" - render_key = "back" - id = SLOT_ID_BACK - sort_order = 2000 - display_name = "back" - display_preposition = "on" - hud_position = ui_back - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN - slot_flags_required = SLOT_BACK - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/back.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/back.dmi', - BODYTYPE_STRING_WEREBEAST = 'icons/mob/clothing/species/werebeast/back.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/back.dmi', - ) - render_fallback = list( - BODYTYPE_STRING_TESHARI = "_fallback_" - ) - render_layer = HUMAN_LAYER_SLOT_BACKPACK - -/datum/inventory_slot/inventory/uniform - name = "uniform" - render_key = "under" - id = SLOT_ID_UNIFORM - sort_order = 5000 - display_name = "body" - display_preposition = "on" - hud_position = ui_iclothing - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_ICLOTHING - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_HUD_REQUIRES_EXPAND | INV_SLOT_CONSIDERED_WORN - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/uniform.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/uniform.dmi', - BODYTYPE_STRING_VOX = 'icons/mob/clothing/species/vox/uniform.dmi', - BODYTYPE_STRING_WEREBEAST = 'icons/mob/clothing/species/werebeast/uniform.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/uniform.dmi', - ) - render_fallback = list( - BODYTYPE_STRING_TESHARI = "_fallback_", - BODYTYPE_STRING_VOX = "_fallback_", - ) - render_layer = HUMAN_LAYER_SLOT_UNIFORM - legacy_visibility_sensitive_slots = list( - SLOT_ID_SHOES, - ) - - /// list of rolldown icons; must DIRECTLY corrospond to default icons. - var/list/render_rolldown_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/uniform_rolled_down.dmi', - BODYTYPE_STRING_VOX = 'icons/mob/clothing/species/vox/uniform_rolled_down.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/uniform_rolled_down.dmi', - ) - /// list of rollsleeve icons; must DIRECTLY corrospond to default icons. - var/list/render_rollsleeve_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/uniform_sleeves_rolled.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/uniform_sleeves_rolled.dmi', - ) - /// list of rolldown states - var/list/render_rolldown_states - /// list of rollsleeve states - var/list/render_rollsleeve_states - -/datum/inventory_slot/inventory/uniform/rebuild_rendering_caches() - . = ..() - render_rolldown_states = list() - for(var/bodytype_str in render_rolldown_icons) - render_rolldown_icons[bodytype_str] = istype(render_rolldown_icons[bodytype_str], /icon)? render_rolldown_icons[bodytype_str] : icon(render_rolldown_icons[bodytype_str]) - if(!isicon(render_rolldown_icons[bodytype_str])) - stack_trace("invalid icon in rolldown cache for bodytype [bodytype_str]; discarding") - render_rolldown_icons -= bodytype_str - continue - var/icon/I = render_rolldown_icons[bodytype_str] - render_rolldown_states[bodytype_str] = fast_icon_states(I) - // turn into hash - for(var/state in render_rolldown_states[bodytype_str]) - render_rolldown_states[bodytype_str][state] = TRUE - render_rollsleeve_states = list() - for(var/bodytype_str in render_rollsleeve_icons) - render_rollsleeve_icons[bodytype_str] = istype(render_rollsleeve_icons[bodytype_str], /icon)? render_rollsleeve_icons[bodytype_str] : icon(render_rollsleeve_icons[bodytype_str]) - if(!isicon(render_rollsleeve_icons[bodytype_str])) - stack_trace("invalid icon in rollsleeve cache for bodytype [bodytype_str]; discarding") - render_rollsleeve_icons -= bodytype_str - continue - var/icon/I = render_rollsleeve_icons[bodytype_str] - render_rollsleeve_states[bodytype_str] = fast_icon_states(I) - // turn into hash - for(var/state in render_rollsleeve_states[bodytype_str]) - render_rollsleeve_states[bodytype_str][state] = TRUE - -/datum/inventory_slot/inventory/uniform/resolve_default_assets(bodytype, state, mob/wearer, obj/item/equipped, inhand_domain) - if(!istype(equipped, /obj/item/clothing/under)) - return ..() - var/obj/item/clothing/under/U = equipped - var/bodytype_str = bodytype_to_string(bodytype) - if(U.worn_rolled_down == UNIFORM_ROLL_TRUE) - if(check_rolldown_cache(bodytype, state)) - return list(render_rolldown_icons[bodytype_str], render_dim_x_cache[bodytype_str], render_dim_y_cache[bodytype_str]) - else if(U.worn_rolled_sleeves == UNIFORM_ROLL_TRUE) - if(check_rollsleeve_cache(bodytype, state)) - return list(render_rollsleeve_icons[bodytype_str], render_dim_x_cache[bodytype_str], render_dim_y_cache[bodytype_str]) - else - return ..() - -/datum/inventory_slot/inventory/uniform/proc/check_rolldown_cache(bodytype, state) - return render_rolldown_states[bodytype_to_string(bodytype)]?[state] - -/datum/inventory_slot/inventory/uniform/proc/check_rollsleeve_cache(bodytype, state) - return render_rollsleeve_states[bodytype_to_string(bodytype)]?[state] - -/datum/inventory_slot/inventory/uniform/should_render(mob/wearer, obj/item/item) - if(!ishuman(wearer)) - return ..() - var/mob/living/carbon/human/casted_human = wearer - if((casted_human.wear_suit?.inv_hide_flags) & HIDEJUMPSUIT) - return FALSE - return ..() - - -/datum/inventory_slot/inventory/uniform/render(mob/wearer, obj/item/item, bodytype) - . = ..() - if(!ishuman(wearer)) - return - var/mob/living/carbon/human/human = wearer - var/icon/clipmask = human.tail_style?.clip_mask - if(!clipmask) - return - var/tail_rendered = !!human.standing_overlays[HUMAN_OVERLAY_TAIL] - if(!tail_rendered) - return - if(istype(item, /obj/item/clothing/suit)) - var/obj/item/clothing/suit/suit = item - if(suit.inv_hide_flags & HIDETAIL) - return - if(suit.taurized) - return - var/list/mutating - if(!islist(.)) - mutating = list(.) - else - mutating = . - for(var/image/appearancelike as anything in mutating) - appearancelike.filters += filter(arglist(alpha_mask_filter(icon = clipmask))) - -/datum/inventory_slot/inventory/head - name = "head" - render_key = "head" - id = SLOT_ID_HEAD - sort_order = 10000 - display_name = "head" - display_preposition = "on" - hud_position = ui_head - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_HEAD - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_HUD_REQUIRES_EXPAND | INV_SLOT_CONSIDERED_WORN - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/head.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/head.dmi', - BODYTYPE_STRING_WEREBEAST = 'icons/mob/clothing/species/werebeast/head.dmi', - BODYTYPE_STRING_VOX = 'icons/mob/clothing/species/vox/head.dmi', - BODYTYPE_STRING_TAJARAN = 'icons/mob/clothing/species/tajaran/helmet.dmi', - BODYTYPE_STRING_UNATHI = 'icons/mob/clothing/species/unathi/helmet.dmi', - BODYTYPE_STRING_AKULA = 'icons/mob/clothing/species/akula/helmet.dmi', - BODYTYPE_STRING_NEVREAN = 'icons/mob/clothing/species/nevrean/helmet.dmi', - BODYTYPE_STRING_PHORONOID = 'icons/mob/clothing/species/phoronoid/head.dmi', - BODYTYPE_STRING_PROMETHEAN = 'icons/mob/clothing/species/skrell/helmet.dmi', - BODYTYPE_STRING_SERGAL = 'icons/mob/clothing/species/sergal/helmet.dmi', - BODYTYPE_STRING_SKRELL = 'icons/mob/clothing/species/skrell/helmet.dmi', - BODYTYPE_STRING_VULPKANIN = 'icons/mob/clothing/species/vulpkanin/helmet.dmi', - BODYTYPE_STRING_XENOHYBRID = 'icons/mob/clothing/species/unathi/helmet.dmi', - BODYTYPE_STRING_ZORREN_FLAT = 'icons/mob/clothing/species/fennec/helmet.dmi', - BODYTYPE_STRING_ZORREN_HIGH = 'icons/mob/clothing/species/fox/helmet.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/head.dmi', - ) - render_layer = HUMAN_LAYER_SLOT_HEAD - legacy_visibility_sensitive_slots = list( - SLOT_ID_HEAD, - ) - -/datum/inventory_slot/inventory/suit - name = "outerwear" - render_key = "suit" - id = SLOT_ID_SUIT - sort_order = 7000 - display_name = "suit" - display_preposition = "over" - - hud_position = ui_oclothing - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_OCLOTHING - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_HUD_REQUIRES_EXPAND | INV_SLOT_CONSIDERED_WORN - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/suits.dmi', - BODYTYPE_STRING_AKULA = 'icons/mob/clothing/species/akula/suits.dmi', - BODYTYPE_STRING_NEVREAN = 'icons/mob/clothing/species/nevrean/suits.dmi', - BODYTYPE_STRING_PHORONOID = 'icons/mob/clothing/species/phoronoid/suits.dmi', - BODYTYPE_STRING_PROMETHEAN = 'icons/mob/clothing/species/skrell/suits.dmi', - BODYTYPE_STRING_SERGAL = 'icons/mob/clothing/species/sergal/suits.dmi', - BODYTYPE_STRING_SKRELL = 'icons/mob/clothing/species/skrell/suits.dmi', - BODYTYPE_STRING_TAJARAN = 'icons/mob/clothing/species/tajaran/suits.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/suits.dmi', - BODYTYPE_STRING_UNATHI = 'icons/mob/clothing/species/unathi/suits.dmi', - BODYTYPE_STRING_VOX = 'icons/mob/clothing/species/vox/suits.dmi', - BODYTYPE_STRING_VULPKANIN = 'icons/mob/clothing/species/vulpkanin/suits.dmi', - BODYTYPE_STRING_XENOHYBRID = 'icons/mob/clothing/species/unathi/suits.dmi', - BODYTYPE_STRING_ZORREN_FLAT = 'icons/mob/clothing/species/fennec/suits.dmi', - BODYTYPE_STRING_ZORREN_HIGH = 'icons/mob/clothing/species/fox/suits.dmi', - BODYTYPE_STRING_WEREBEAST = 'icons/mob/clothing/species/werebeast/suits.dmi', - BODYTYPE_STRING_ZADDAT = 'icons/mob/clothing/species/zaddat/suits.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/suits.dmi', - ) - render_layer = HUMAN_LAYER_SLOT_OVERSUIT - legacy_visibility_sensitive_slots = list( - SLOT_ID_UNIFORM, - SLOT_ID_SHOES, - ) - -/datum/inventory_slot/inventory/suit/render(mob/wearer, obj/item/item, bodytype) - . = ..() - if(!ishuman(wearer)) - return - var/mob/living/carbon/human/human = wearer - var/icon/clipmask = human.tail_style?.clip_mask - if(!clipmask) - return - var/tail_rendered = !!human.standing_overlays[HUMAN_OVERLAY_TAIL] - if(!tail_rendered) - return - if(istype(item, /obj/item/clothing/suit)) - var/obj/item/clothing/suit/suit = item - if(suit.taurized) - return - var/list/mutating - if(!islist(.)) - mutating = list(.) - else - mutating = . - for(var/image/appearancelike as anything in mutating) - appearancelike.filters += filter(arglist(alpha_mask_filter(icon = clipmask))) - -/datum/inventory_slot/inventory/suit/cascade_render_visibility(mob/wearer, obj/item/item) - . = ..() - var/mob/living/carbon/human/casted = wearer - if(!istype(casted)) - return - casted.render_spriteacc_tail() - casted.render_spriteacc_wings() - -/datum/inventory_slot/inventory/belt - name = "belt" - render_key = "belt" - id = SLOT_ID_BELT - sort_order = 6000 - display_name = "waist" - display_preposition = "on" - hud_position = ui_belt - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_BELT - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/belt.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/belt.dmi', - BODYTYPE_STRING_WEREBEAST = 'icons/mob/clothing/species/werebeast/belt.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/belt.dmi', - ) - render_layer = list(HUMAN_LAYER_SLOT_BELT, HUMAN_LAYER_SLOT_BELT_ALT) - -/datum/inventory_slot/inventory/pocket - abstract_type = /datum/inventory_slot/inventory/pocket - sort_order = 2000 - inventory_slot_flags = INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE - slot_equip_checks = SLOT_EQUIP_CHECK_USE_PROC - default_strip_inv_view_flags = INV_VIEW_OBFUSCATE_HIDE_ITEM_NAME | INV_VIEW_STRIP_FUMBLE_ON_FAILURE | INV_VIEW_STRIP_IS_SILENT - -/datum/inventory_slot/inventory/pocket/allow_equip(obj/item/I, mob/wearer, mob/user, force) - . = ..() - if(I.slot_flags & SLOT_DENYPOCKET) - return FALSE - if(I.slot_flags & SLOT_POCKET) - return TRUE - return I.w_class <= WEIGHT_CLASS_SMALL - -/datum/inventory_slot/inventory/pocket/left - name = "left pocket" - id = SLOT_ID_LEFT_POCKET - display_name = "left pocket" - display_preposition = "in" - hud_position = ui_storage1 - -/datum/inventory_slot/inventory/pocket/right - name = "right pocket" - id = SLOT_ID_RIGHT_POCKET - display_name = "right pocket" - display_preposition = "in" - hud_position = ui_storage2 - -/datum/inventory_slot/inventory/id - name = "id" - render_key = "id" - id = SLOT_ID_WORN_ID - sort_order = 3000 - display_name = "badge" - display_preposition = "as" - hud_position = ui_id - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_ID - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/mob.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/id.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/id.dmi', - ) - render_fallback = list( - BODYTYPE_STRING_TESHARI = "_fallback_" - ) - render_layer = HUMAN_LAYER_SLOT_IDSLOT - -/datum/inventory_slot/inventory/id/should_render(mob/wearer, obj/item/item) - if(ishuman(wearer)) - var/mob/living/carbon/human/H = wearer - // todo: this should be a trait system. - if(istype(H.w_uniform, /obj/item/clothing/under)) - var/obj/item/clothing/under/uni = H.w_uniform - if(!uni.displays_id) - return FALSE - return ..() - -/datum/inventory_slot/inventory/shoes - name = "shoes" - render_key = "shoes" - id = SLOT_ID_SHOES - sort_order = 4000 - display_name = "feet" - display_preposition = "on" - hud_position = ui_shoes - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_FEET - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN | INV_SLOT_HUD_REQUIRES_EXPAND - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/feet.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/shoes.dmi', - BODYTYPE_STRING_VOX = 'icons/mob/clothing/species/vox/shoes.dmi', - BODYTYPE_STRING_WEREBEAST = 'icons/mob/clothing/species/werebeast/feet.dmi', - BODYTYPE_STRING_ZADDAT = 'icons/mob/clothing/species/zaddat/shoes.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/feet.dmi', - ) - render_fallback = list( - BODYTYPE_STRING_TESHARI = "_fallback_" // this doesn't actually exist, so item becomes invis - ) - render_layer = list(HUMAN_LAYER_SLOT_SHOES, HUMAN_LAYER_SLOT_SHOES_ALT) - -/datum/inventory_slot/inventory/shoes/should_render(mob/wearer, obj/item/item) - if(!ishuman(wearer)) - return ..() - var/mob/living/carbon/human/casted_human = wearer - if((casted_human.wear_suit?.inv_hide_flags | casted_human.w_uniform?.inv_hide_flags) & HIDESHOES) - return FALSE - for(var/bodypart in list(BP_L_FOOT, BP_R_FOOT)) - var/obj/item/organ/external/foot/foot = casted_human.get_organ(bodypart) - if(istype(foot) && foot.is_hidden_by_tail()) - return FALSE - return ..() - -/datum/inventory_slot/inventory/gloves - name = "gloves" - render_key = "gloves" - id = SLOT_ID_GLOVES - sort_order = 6500 - display_name = "hands" - display_preposition = "on" - hud_position = ui_gloves - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_GLOVES - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN | INV_SLOT_HUD_REQUIRES_EXPAND - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/hands.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/gloves.dmi', - BODYTYPE_STRING_VOX = 'icons/mob/clothing/species/vox/gloves.dmi', - BODYTYPE_STRING_WEREBEAST = 'icons/mob/clothing/species/werebeast/hands.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/hands.dmi', - ) - render_fallback = list( - BODYTYPE_STRING_TESHARI = "_fallback_" - ) - render_layer = HUMAN_LAYER_SLOT_GLOVES - -/datum/inventory_slot/inventory/glasses - name = "glasses" - render_key = "glasses" - id = SLOT_ID_GLASSES - sort_order = 7500 - display_name = "eyes" - display_preposition = "over" - hud_position = ui_glasses - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_EYES - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN | INV_SLOT_HUD_REQUIRES_EXPAND - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/eyes.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/eyes.dmi', - BODYTYPE_STRING_VOX = 'icons/mob/clothing/species/vox/eyes.dmi', - BODYTYPE_STRING_WEREBEAST = 'icons/mob/clothing/species/werebeast/eyes.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/eyes.dmi', - ) - render_fallback = list( - BODYTYPE_STRING_TESHARI = "_fallback_" - ) - render_layer = HUMAN_LAYER_SLOT_GLASSES - -/datum/inventory_slot/inventory/suit_storage - name = "suit storage" - render_key = "suit-store" - id = SLOT_ID_SUIT_STORAGE - sort_order = 500 - display_name = "suit" - display_preposition = "on" - hud_position = ui_sstore1 - slot_equip_checks = SLOT_EQUIP_CHECK_USE_PROC - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE - render_layer = HUMAN_LAYER_SLOT_SUITSTORE - -/datum/inventory_slot/inventory/suit_storage/render(mob/wearer, obj/item/item, bodytype) - var/mob/living/carbon/human/casted_human = wearer - if(!istype(casted_human)) - return - var/datum/species/species = casted_human.species - return image( - icon = species.suit_storage_icon, - icon_state = item.item_state || item.icon_state, - layer = HUMAN_LAYER_SLOT_SUITSTORE, - ) - -/datum/inventory_slot/inventory/suit_storage/allow_equip(obj/item/I, mob/wearer, mob/user, force) - . = ..() - var/obj/item/suit_item = wearer.item_by_slot_id(SLOT_ID_SUIT) - if(!suit_item) - return FALSE - // todo: this check is ass - if(istype(I, /obj/item/pda) || istype(I, /obj/item/pen) || is_type_in_list(I, suit_item.allowed)) - return TRUE - return FALSE - -/datum/inventory_slot/inventory/ears - sort_order = 9500 - abstract_type = /datum/inventory_slot/inventory/ears - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN | INV_SLOT_HUD_REQUIRES_EXPAND - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/ears.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/ears.dmi', - BODYTYPE_STRING_WEREBEAST = 'icons/mob/clothing/species/werebeast/ears.dmi', - BODYTYPE_STRING_VOX = 'icons/mob/clothing/species/vox/ears.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/ears.dmi', - ) - render_fallback = list( - BODYTYPE_STRING_TESHARI = "_fallback_" - ) - render_layer = HUMAN_LAYER_SLOT_EARS - render_key_plural = "ears" - -/datum/inventory_slot/inventory/ears/left - name = "left ear" - render_key = "ear-l" - id = SLOT_ID_LEFT_EAR - display_name = "left ear" - display_preposition = "on" - hud_position = ui_l_ear - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_EARS - -/datum/inventory_slot/inventory/ears/right - name = "right ear" - render_key = "ear-r" - id = SLOT_ID_RIGHT_EAR - display_name = "right ear" - display_preposition = "on" - hud_position = ui_r_ear - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_EARS - render_layer = HUMAN_LAYER_SLOT_EARS - -/datum/inventory_slot/inventory/mask - name = "mask" - render_key = "mask" - id = SLOT_ID_MASK - sort_order = 9250 - display_name = "face" - display_preposition = "on" - hud_position = ui_mask - slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS - slot_flags_required = SLOT_MASK - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/clothing/mask.dmi', - BODYTYPE_STRING_AKULA = 'icons/mob/clothing/species/akula/mask.dmi', - BODYTYPE_STRING_NEVREAN = 'icons/mob/clothing/species/nevrean/mask.dmi', - BODYTYPE_STRING_SERGAL = 'icons/mob/clothing/species/sergal/mask.dmi', - BODYTYPE_STRING_TAJARAN = 'icons/mob/clothing/species/tajaran/mask.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/masks.dmi', - BODYTYPE_STRING_UNATHI = 'icons/mob/clothing/species/unathi/mask.dmi', - BODYTYPE_STRING_VOX = 'icons/mob/clothing/species/vox/masks.dmi', - BODYTYPE_STRING_VULPKANIN = 'icons/mob/clothing/species/vulpkanin/mask.dmi', - BODYTYPE_STRING_WEREBEAST = 'icons/mob/clothing/species/werebeast/masks.dmi', - BODYTYPE_STRING_XENOCHIMERA = 'icons/mob/clothing/species/tajaran/mask.dmi', - BODYTYPE_STRING_ZORREN_FLAT = 'icons/mob/clothing/species/fennec/mask.dmi', - BODYTYPE_STRING_ZORREN_HIGH = 'icons/mob/clothing/species/fox/mask.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/mask.dmi', - ) - render_fallback = list( - BODYTYPE_STRING_TESHARI = "_fallback_", - ) - render_layer = HUMAN_LAYER_SLOT_MASK - -/datum/inventory_slot/inventory/mask/should_render(mob/wearer, obj/item/item) - if(ishuman(wearer)) - var/mob/living/carbon/human/casted_human = wearer - if(casted_human.head?.inv_hide_flags & HIDEMASK) - return FALSE - return ..() - -/datum/inventory_slot/restraints - sort_order = -250 - always_show_on_strip_menu = FALSE - abstract_type = /datum/inventory_slot/restraints - inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_STRIPPABLE | INV_SLOT_STRIP_ONLY_REMOVES | INV_SLOT_STRIP_SIMPLE_LINK - -/datum/inventory_slot/restraints/handcuffs - name = "handcuffed" - render_key = "handcuffs" - id = SLOT_ID_HANDCUFFED - display_name = "hands" - display_preposition = "around" - slot_equip_checks = SLOT_EQUIP_CHECK_USE_PROC - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/mob.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/handcuffs.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/handcuffs.dmi', - ) - render_layer = HUMAN_LAYER_SLOT_HANDCUFFED - -/datum/inventory_slot/restraints/handcuffs/allow_equip(obj/item/I, mob/wearer, mob/user, force) - return istype(I, /obj/item/handcuffs) && !istype(I, /obj/item/handcuffs/legcuffs) - -/datum/inventory_slot/restraints/legcuffs - name = "legcuffed" - render_key = "legcuffs" - id = SLOT_ID_LEGCUFFED - display_name = "legs" - display_preposition = "around" - slot_equip_checks = SLOT_EQUIP_CHECK_USE_PROC - render_default_icons = list( - BODYTYPE_STRING_DEFAULT = 'icons/mob/mob.dmi', - BODYTYPE_STRING_TESHARI = 'icons/mob/clothing/species/teshari/handcuffs.dmi', - BODYTYPE_STRING_UNATHI_DIGI = 'icons/mob/clothing/species/unathidigi/handcuffs.dmi' - ) - render_layer = HUMAN_LAYER_SLOT_LEGCUFFED - -/datum/inventory_slot/restraints/legcuffs/allow_equip(obj/item/I, mob/wearer, mob/user, force) - return istype(I, /obj/item/handcuffs/legcuffs) - -/** - * these have no excuse to be accessed by id - * they will have randomized ids - */ -/datum/inventory_slot/abstract - inventory_slot_flags = INV_SLOT_IS_ABSTRACT | INV_SLOT_ALLOW_RANDOM_ID - abstract_type = /datum/inventory_slot/abstract - -/datum/inventory_slot/abstract/put_in_hands - name = "put in hands" - id = SLOT_ID_HANDS - display_name = "hands" - display_preposition = "in" - display_plural = TRUE - -/datum/inventory_slot/abstract/attach_as_accessory - name = "attach as accessory" - display_name = "clothes" - display_preposition = "clipped to" - -/datum/inventory_slot/abstract/put_in_backpack - name = "put in backpack" - display_name = "backpack" - display_preposition = "in" - -/datum/inventory_slot/abstract/put_in_belt - name = "put in belt" - display_name = "belt" - display_preposition = "in" - -/datum/inventory_slot/abstract/put_in_storage - name = "put in storage" - display_name = "storage" - display_preposition = "in" - -/** - * like put in storage, but prioritizes active, even if it's not on you. - */ -/datum/inventory_slot/abstract/put_in_storage_try_active - name = "put in storage (active storage)" - display_name = "storage" - display_name = "in" - -/datum/inventory_slot/abstract/hand - abstract_type = /datum/inventory_slot/abstract/hand - // our render default icons are based on inhand type - // this hijacks render_default_icons SO much but i don't care! - -/** - * returns (icon, dim_x, dim_y) if found in defaults, null if not - */ -/datum/inventory_slot/abstract/hand/resolve_default_assets(bodytype, state, mob/wearer, obj/item/equipped, inhand_domain) - if(!render_state_cache[inhand_domain]?[state]) - return - return list(render_default_icons[inhand_domain], render_dim_x_cache[inhand_domain], render_dim_y_cache[inhand_domain]) - -/datum/inventory_slot/abstract/hand/left - name = "put in left hand" - display_name = "left hand" - display_preposition = "in" - id = SLOT_ID_LEFT_HAND - render_key = "left" - render_layer = HUMAN_LAYER_SLOT_LHAND - render_default_icons = list( - INHAND_DEFAULT_ICON_BALLS = 'icons/mob/items/lefthand_balls.dmi', - INHAND_DEFAULT_ICON_BOOKS = 'icons/mob/items/lefthand_books.dmi', - INHAND_DEFAULT_ICON_GENERAL = 'icons/mob/items/lefthand.dmi', - INHAND_DEFAULT_ICON_GLOVES = 'icons/mob/items/lefthand_gloves.dmi', - INHAND_DEFAULT_ICON_GUNS = 'icons/mob/items/lefthand_guns.dmi', - INHAND_DEFAULT_ICON_HATS = 'icons/mob/items/lefthand_hats.dmi', - INHAND_DEFAULT_ICON_HOLDERS = 'icons/mob/items/lefthand_holder.dmi', - INHAND_DEFAULT_ICON_KITCHEN = 'icons/mob/items/lefthand_kitchen.dmi', - INHAND_DEFAULT_ICON_MAGIC = 'icons/mob/items/lefthand_magic.dmi', - INHAND_DEFAULT_ICON_MASKS = 'icons/mob/items/lefthand_masks.dmi', - INHAND_DEFAULT_ICON_MATERIAL = 'icons/mob/items/lefthand_material.dmi', - INHAND_DEFAULT_ICON_MELEE = 'icons/mob/items/lefthand_melee.dmi', - INHAND_DEFAULT_ICON_SHOES = 'icons/mob/items/lefthand_shoes.dmi', - INHAND_DEFAULT_ICON_STORAGE = 'icons/mob/items/lefthand_storage.dmi', - INHAND_DEFAULT_ICON_SUITS = 'icons/mob/items/lefthand_suits.dmi', - INHAND_DEFAULT_ICON_SWITCHTOOL = 'icons/mob/items/lefthand_switchtool.dmi', - INHAND_DEFAULT_ICON_UNIFORMS = 'icons/mob/items/lefthand_uniforms.dmi', - INHAND_DEFAULT_ICON_64X64 = 'icons/mob/items/64x64_lefthand.dmi', - ) - -/datum/inventory_slot/abstract/hand/right - name = "put in right hand" - display_name = "right hand" - display_preposition = "in" - id = SLOT_ID_RIGHT_HAND - render_key = "right" - render_layer = HUMAN_LAYER_SLOT_RHAND - render_default_icons = list( - INHAND_DEFAULT_ICON_BALLS = 'icons/mob/items/righthand_balls.dmi', - INHAND_DEFAULT_ICON_BOOKS = 'icons/mob/items/righthand_books.dmi', - INHAND_DEFAULT_ICON_GENERAL = 'icons/mob/items/righthand.dmi', - INHAND_DEFAULT_ICON_GLOVES = 'icons/mob/items/righthand_gloves.dmi', - INHAND_DEFAULT_ICON_GUNS = 'icons/mob/items/righthand_guns.dmi', - INHAND_DEFAULT_ICON_HATS = 'icons/mob/items/righthand_hats.dmi', - INHAND_DEFAULT_ICON_HOLDERS = 'icons/mob/items/righthand_holder.dmi', - INHAND_DEFAULT_ICON_KITCHEN = 'icons/mob/items/righthand_kitchen.dmi', - INHAND_DEFAULT_ICON_MAGIC = 'icons/mob/items/righthand_magic.dmi', - INHAND_DEFAULT_ICON_MASKS = 'icons/mob/items/righthand_masks.dmi', - INHAND_DEFAULT_ICON_MATERIAL = 'icons/mob/items/righthand_material.dmi', - INHAND_DEFAULT_ICON_MELEE = 'icons/mob/items/righthand_melee.dmi', - INHAND_DEFAULT_ICON_SHOES = 'icons/mob/items/righthand_shoes.dmi', - INHAND_DEFAULT_ICON_STORAGE = 'icons/mob/items/righthand_storage.dmi', - INHAND_DEFAULT_ICON_SUITS = 'icons/mob/items/righthand_suits.dmi', - INHAND_DEFAULT_ICON_SWITCHTOOL = 'icons/mob/items/righthand_switchtool.dmi', - INHAND_DEFAULT_ICON_UNIFORMS = 'icons/mob/items/righthand_uniforms.dmi', - INHAND_DEFAULT_ICON_64X64 = 'icons/mob/items/64x64_righthand.dmi', - ) - -/datum/inventory_slot/abstract/use_one_for_accessory - render_key = "acc" - -/datum/inventory_slot/abstract/use_one_for_all - render_key = "all" From 9d4c416b9ab512d239544acfcb8c5e734fd1187f Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 24 May 2024 18:20:39 +0000 Subject: [PATCH 038/140] fix --- code/game/rendering/mob_huds/inventory.dm | 4 +-- code/modules/inventory/inventory.dm | 4 +-- code/modules/inventory/item/public.dm | 2 +- code/modules/inventory/mob/abstraction.dm | 2 +- code/modules/inventory/mob/internal.dm | 26 +++++++++---------- code/modules/inventory/mob/public.dm | 12 ++++----- .../organs/internal/subtypes/augment.dm | 2 +- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index c0f25ef7a182..ae6d36e13518 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -13,9 +13,9 @@ /// use hand on self object var/atom/movable/screen/inventory/use_self_hand/use_self_hand -/datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot_meta/slot_or_index) +/datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) -/datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot_meta/slot_or_index) +/datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot_or_index) #warn impl all diff --git a/code/modules/inventory/inventory.dm b/code/modules/inventory/inventory.dm index 4b61966b5f47..b2f6be35399c 100644 --- a/code/modules/inventory/inventory.dm +++ b/code/modules/inventory/inventory.dm @@ -27,13 +27,13 @@ /** * called when an item is added to inventory */ -/datum/inventory/proc/item_entered(obj/item/item, datum/inventory_slot_meta/slot_or_index) +/datum/inventory/proc/item_entered(obj/item/item, datum/inventory_slot/slot_or_index) hud?.add_item(item, slot_or_index) /** * called when an item is removed from inventory */ -/datum/inventory/proc/item_exited(obj/item/item, datum/inventory_slot_meta/slot_or_index) +/datum/inventory/proc/item_exited(obj/item/item, datum/inventory_slot/slot_or_index) hud?.remove_item(item, slot_or_index) #warn hook above 2 diff --git a/code/modules/inventory/item/public.dm b/code/modules/inventory/item/public.dm index 1aec90816d34..432b27165269 100644 --- a/code/modules/inventory/item/public.dm +++ b/code/modules/inventory/item/public.dm @@ -185,7 +185,7 @@ /obj/item/proc/is_being_worn() if(!worn_slot) return FALSE - var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(worn_slot) + var/datum/inventory_slot/slot_meta = resolve_inventory_slot_meta(worn_slot) return slot_meta.inventory_slot_flags & INV_SLOT_CONSIDERED_WORN //* Stripping *// diff --git a/code/modules/inventory/mob/abstraction.dm b/code/modules/inventory/mob/abstraction.dm index c1d4eee74063..8dda2ac505d1 100644 --- a/code/modules/inventory/mob/abstraction.dm +++ b/code/modules/inventory/mob/abstraction.dm @@ -106,7 +106,7 @@ * * return TRUE if conflicting, otherwise FALSE */ -/mob/proc/inventory_slot_semantic_conflict(obj/item/I, datum/inventory_slot_meta/slot, mob/user) +/mob/proc/inventory_slot_semantic_conflict(obj/item/I, datum/inventory_slot/slot, mob/user) . = FALSE slot = resolve_inventory_slot_meta(slot) return slot._equip_check(I, src, user) diff --git a/code/modules/inventory/mob/internal.dm b/code/modules/inventory/mob/internal.dm index bc9a419a3483..612e0729f133 100644 --- a/code/modules/inventory/mob/internal.dm +++ b/code/modules/inventory/mob/internal.dm @@ -17,28 +17,28 @@ * @return true/false based on if it worked */ /mob/proc/handle_abstract_slot_insertion(obj/item/I, slot, flags) - if(!ispath(slot, /datum/inventory_slot_meta/abstract)) + if(!ispath(slot, /datum/inventory_slot/abstract)) slot = resolve_inventory_slot_meta(slot)?.type - if(!ispath(slot, /datum/inventory_slot_meta/abstract)) + if(!ispath(slot, /datum/inventory_slot/abstract)) stack_trace("invalid slot: [slot]") - else if(slot != /datum/inventory_slot_meta/abstract/put_in_hands) + else if(slot != /datum/inventory_slot/abstract/put_in_hands) stack_trace("attempted usage of slot id in abstract insertion converted successfully") . = FALSE switch(slot) - if(/datum/inventory_slot_meta/abstract/hand/left) + if(/datum/inventory_slot/abstract/hand/left) return put_in_left_hand(I, flags) - if(/datum/inventory_slot_meta/abstract/hand/right) + if(/datum/inventory_slot/abstract/hand/right) return put_in_right_hand(I, flags) - if(/datum/inventory_slot_meta/abstract/put_in_belt) + if(/datum/inventory_slot/abstract/put_in_belt) var/obj/item/storage/S = item_by_slot(SLOT_ID_BELT) return istype(S) && S.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE) - if(/datum/inventory_slot_meta/abstract/put_in_backpack) + if(/datum/inventory_slot/abstract/put_in_backpack) var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) return istype(S) && S.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE) - if(/datum/inventory_slot_meta/abstract/put_in_hands) + if(/datum/inventory_slot/abstract/put_in_hands) return put_in_hands(I, flags) - if(/datum/inventory_slot_meta/abstract/put_in_storage, /datum/inventory_slot_meta/abstract/put_in_storage_try_active) - if(slot == /datum/inventory_slot_meta/abstract/put_in_storage_try_active) + if(/datum/inventory_slot/abstract/put_in_storage, /datum/inventory_slot/abstract/put_in_storage_try_active) + if(slot == /datum/inventory_slot/abstract/put_in_storage_try_active) if(s_active && Adjacent(s_active) && s_active.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE)) return TRUE for(var/obj/item/storage/S in get_equipped_items_in_slots(list( @@ -52,7 +52,7 @@ if(S.try_insert(I, src, INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE)) return TRUE return FALSE - if(/datum/inventory_slot_meta/abstract/attach_as_accessory) + if(/datum/inventory_slot/abstract/attach_as_accessory) for(var/obj/item/clothing/C in get_equipped_items()) if(C.attempt_attach_accessory(I)) return TRUE @@ -158,7 +158,7 @@ return FALSE // resolve slot - var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(slot) + var/datum/inventory_slot/slot_meta = resolve_inventory_slot_meta(slot) if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) // if it's abstract, we go there directly - do not use can_equip as that will just guess. return handle_abstract_slot_insertion(I, slot, flags) @@ -209,7 +209,7 @@ * handles adding an item or updating an item to our hud */ /mob/proc/_handle_inventory_hud_update(obj/item/I, slot) - var/datum/inventory_slot_meta/meta = resolve_inventory_slot_meta(slot) + var/datum/inventory_slot/meta = resolve_inventory_slot_meta(slot) I.screen_loc = meta.hud_position if(client) client.screen |= I diff --git a/code/modules/inventory/mob/public.dm b/code/modules/inventory/mob/public.dm index 8f1738404601..399bcddb5117 100644 --- a/code/modules/inventory/mob/public.dm +++ b/code/modules/inventory/mob/public.dm @@ -110,7 +110,7 @@ to_chat(user, SPAN_DANGER("can_equip will now attempt to prevent the deleted item from being equipped. There should be no glitches.")) return FALSE - var/datum/inventory_slot_meta/slot_meta = resolve_inventory_slot_meta(slot) + var/datum/inventory_slot/slot_meta = resolve_inventory_slot_meta(slot) var/self_equip = user == src if(!slot_meta) . = FALSE @@ -119,21 +119,21 @@ if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) // special handling: make educated guess, defaulting to yes switch(slot_meta.type) - if(/datum/inventory_slot_meta/abstract/hand/left) + if(/datum/inventory_slot/abstract/hand/left) return (flags & INV_OP_FORCE) || !get_left_held_item() - if(/datum/inventory_slot_meta/abstract/hand/right) + if(/datum/inventory_slot/abstract/hand/right) return (flags & INV_OP_FORCE) || !get_right_held_item() - if(/datum/inventory_slot_meta/abstract/put_in_backpack) + if(/datum/inventory_slot/abstract/put_in_backpack) var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) if(!istype(S)) return FALSE return S.can_be_inserted(I, TRUE) - if(/datum/inventory_slot_meta/abstract/put_in_belt) + if(/datum/inventory_slot/abstract/put_in_belt) var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) if(!istype(S)) return FALSE return S.can_be_inserted(I, TRUE) - if(/datum/inventory_slot_meta/abstract/put_in_hands) + if(/datum/inventory_slot/abstract/put_in_hands) return (flags & INV_OP_FORCE) || !hands_full() return TRUE diff --git a/code/modules/organs/internal/subtypes/augment.dm b/code/modules/organs/internal/subtypes/augment.dm index d9bb9a32fc53..8dc71901e8c8 100644 --- a/code/modules/organs/internal/subtypes/augment.dm +++ b/code/modules/organs/internal/subtypes/augment.dm @@ -218,7 +218,7 @@ to_chat(M, SPAN_NOTICE("You cannot use your augments when restrained.")) return FALSE - if((slot == /datum/inventory_slot_meta/abstract/hand/left && get_left_held_item()) || (slot == /datum/inventory_slot_meta/abstract/hand/right && get_right_held_item())) + if((slot == /datum/inventory_slot/abstract/hand/left && get_left_held_item()) || (slot == /datum/inventory_slot/abstract/hand/right && get_right_held_item())) to_chat(M, SPAN_WARNING("Your hand is full. Drop something first.")) return FALSE From c0bedbb08a708cfcbc09b021d5d1a81eaf26c410 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:53:18 -0400 Subject: [PATCH 039/140] fix that again --- code/game/rendering/screen_legacy.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index 2c8da706aa20..8af42c62f652 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -267,7 +267,7 @@ if(!istype(tanks[index], /obj/item/tank)) continue C.internal = tanks[index] - to_chat(C, "You are now running on internals from [tanks[index]] on your [locnames[index]]") + to_chat(C, "You are now running on internals from [tanks[index]] [locnames[index]]") if(C.internals) C.internals.icon_state = "internal1" return From 0ae52090c3bec4108b40603552e37d01d8ccb369 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 6 Jul 2024 20:00:25 -0400 Subject: [PATCH 040/140] merge --- citadel.dme | 8 -- code/modules/inventory/inventory.dm | 118 ++++++++++++++++++++++--- code/modules/inventory/mob/internal.dm | 32 ++++--- 3 files changed, 128 insertions(+), 30 deletions(-) diff --git a/citadel.dme b/citadel.dme index 750c9a4c9c61..8f7f90f689fe 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3552,14 +3552,6 @@ #include "code\modules\mob\freelook\mask\cultnet.dm" #include "code\modules\mob\freelook\mask\eye.dm" #include "code\modules\mob\freelook\mask\update_triggers.dm" -#include "code\modules\mob\inventory\hands.dm" -#include "code\modules\mob\inventory\helpers.dm" -#include "code\modules\mob\inventory\inventory.dm" -#include "code\modules\mob\inventory\inventory_slot.dm" -#include "code\modules\mob\inventory\items.dm" -#include "code\modules\mob\inventory\mobs.dm" -#include "code\modules\mob\inventory\rendering.dm" -#include "code\modules\mob\inventory\stripping.dm" #include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\butchering.dm" #include "code\modules\mob\living\damage_procs.dm" diff --git a/code/modules/inventory/inventory.dm b/code/modules/inventory/inventory.dm index b2f6be35399c..868b5ac42873 100644 --- a/code/modules/inventory/inventory.dm +++ b/code/modules/inventory/inventory.dm @@ -5,15 +5,18 @@ * mob inventory data goes in here. */ /datum/inventory - //? basics + //* Basics *// /// owning mob var/mob/owner - /// hud datum, if any - var/datum/mob_hud/inventory/hud - //? slots + //* Inventory *// - //? caches + //* Caches *// + /// cached overlays by slot id + var/list/rendered_normal_overlays = list() + /// cached overlays by slot id + // todo: emissives + // var/list/rendered_emissive_overlays = list() /datum/inventory/New(mob/M) if(!istype(M)) @@ -24,19 +27,94 @@ owner = null return ..() +//* Rendering *// + +/datum/inventory/proc/remove_slot_renders() + var/list/transformed = list() + for(var/slot_id in rendered_normal_overlays) + transformed += rendered_normal_overlays[slot_id] + owner.cut_overlay(transformed) + +/datum/inventory/proc/reapply_slot_renders() + // try not to dupe + remove_slot_renders() + var/list/transformed = list() + for(var/slot_id in rendered_normal_overlays) + transformed += rendered_normal_overlays[slot_id] + owner.add_overlay(transformed) + /** - * called when an item is added to inventory + * just update if a slot is visible */ -/datum/inventory/proc/item_entered(obj/item/item, datum/inventory_slot/slot_or_index) - hud?.add_item(item, slot_or_index) +/datum/inventory/proc/update_slot_visible(slot_id, cascade = TRUE) + // resolve item + var/obj/item/target = owner.item_by_slot_id(slot_id) + + // first, cascade incase we early-abort later + if(cascade) + var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) + slot.cascade_render_visibility(owner, target) + + // check existing + if(isnull(rendered_normal_overlays[slot_id])) + return + + // remove overlay first incase it's already there + owner.cut_overlay(rendered_normal_overlays[slot_id]) + + // check if slot should render + var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) + if(!slot.should_render(owner, target)) + return + + // add overlay if it should + owner.add_overlay(rendered_normal_overlays[slot_id]) /** - * called when an item is removed from inventory + * redo a slot's render */ -/datum/inventory/proc/item_exited(obj/item/item, datum/inventory_slot/slot_or_index) - hud?.remove_item(item, slot_or_index) +/datum/inventory/proc/update_slot_render(slot_id, cascade = TRUE) + var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) + var/obj/item/target = owner.item_by_slot_id(slot_id) -#warn hook above 2 + // first, cascade incase we early-abort later + if(cascade) + slot.cascade_render_visibility(owner, target) + + if(!slot.should_render(owner, target)) + remove_slot_render(slot_id) + return + + if(isnull(target)) + remove_slot_render(slot_id) + return + + var/bodytype = BODYTYPE_DEFAULT + + if(ishuman(owner)) + var/mob/living/carbon/human/casted_human = owner + bodytype = casted_human.species.get_effective_bodytype(casted_human, target, slot_id) + + var/rendering_results = slot.render(owner, target, bodytype) + if(islist(rendering_results)? !length(rendering_results) : isnull(rendering_results)) + remove_slot_render(slot_id) + return + + set_slot_render(slot_id, rendering_results) + +/datum/inventory/proc/remove_slot_render(slot_id) + if(isnull(rendered_normal_overlays[slot_id])) + return + owner.cut_overlay(rendered_normal_overlays[slot_id]) + rendered_normal_overlays -= slot_id + +/datum/inventory/proc/set_slot_render(slot_id, overlay) + if(!isnull(rendered_normal_overlays[slot_id])) + owner.cut_overlay(rendered_normal_overlays[slot_id]) + rendered_normal_overlays[slot_id] = overlay + owner.add_overlay(overlay) + +//* Queries *// /** * returns list() of items with body_cover_flags @@ -49,6 +127,22 @@ if(I.body_cover_flags & cover_flags) . += I +#warn below + +/** + * called when an item is added to inventory + */ +/datum/inventory/proc/item_entered(obj/item/item, datum/inventory_slot/slot_or_index) + hud?.add_item(item, slot_or_index) + +/** + * called when an item is removed from inventory + */ +/datum/inventory/proc/item_exited(obj/item/item, datum/inventory_slot/slot_or_index) + hud?.remove_item(item, slot_or_index) + +#warn hook above 2 + //? init /mob/proc/init_inventory() diff --git a/code/modules/inventory/mob/internal.dm b/code/modules/inventory/mob/internal.dm index 612e0729f133..aaa869bc1eab 100644 --- a/code/modules/inventory/mob/internal.dm +++ b/code/modules/inventory/mob/internal.dm @@ -18,7 +18,7 @@ */ /mob/proc/handle_abstract_slot_insertion(obj/item/I, slot, flags) if(!ispath(slot, /datum/inventory_slot/abstract)) - slot = resolve_inventory_slot_meta(slot)?.type + slot = resolve_inventory_slot(slot)?.type if(!ispath(slot, /datum/inventory_slot/abstract)) stack_trace("invalid slot: [slot]") else if(slot != /datum/inventory_slot/abstract/put_in_hands) @@ -30,18 +30,27 @@ if(/datum/inventory_slot/abstract/hand/right) return put_in_right_hand(I, flags) if(/datum/inventory_slot/abstract/put_in_belt) - var/obj/item/storage/S = item_by_slot(SLOT_ID_BELT) - return istype(S) && S.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE) + var/obj/item/held = item_by_slot_id(SLOT_ID_BELT) + if(flags & INV_OP_FORCE) + return held?.obj_storage?.insert(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_SOUND) + return held?.obj_storage?.auto_handle_interacted_insertion(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_SUPPRESS_SOUND) if(/datum/inventory_slot/abstract/put_in_backpack) - var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) - return istype(S) && S.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE) + var/obj/item/held = item_by_slot_id(SLOT_ID_BACK) + if(flags & INV_OP_FORCE) + return held?.obj_storage?.insert(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_SOUND) + return held?.obj_storage?.auto_handle_interacted_insertion(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_SUPPRESS_SOUND) if(/datum/inventory_slot/abstract/put_in_hands) return put_in_hands(I, flags) if(/datum/inventory_slot/abstract/put_in_storage, /datum/inventory_slot/abstract/put_in_storage_try_active) if(slot == /datum/inventory_slot/abstract/put_in_storage_try_active) - if(s_active && Adjacent(s_active) && s_active.try_insert(I, src, flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE)) - return TRUE - for(var/obj/item/storage/S in get_equipped_items_in_slots(list( + // todo: redirection + if(flags & INV_OP_FORCE) + if(active_storage?.insert(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_WARNING)) + return TRUE + else + if(active_storage?.auto_handle_interacted_insertion(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_SUPPRESS_SOUND)) + return TRUE + for(var/obj/item/held in get_equipped_items_in_slots(list( SLOT_ID_BELT, SLOT_ID_BACK, SLOT_ID_UNIFORM, @@ -49,8 +58,11 @@ SLOT_ID_LEFT_POCKET, SLOT_ID_RIGHT_POCKET )) + get_held_items()) - if(S.try_insert(I, src, INV_OP_SUPPRESS_WARNING, flags & INV_OP_FORCE)) - return TRUE + if(isnull(held?.obj_storage)) + continue + if(flags & INV_OP_FORCE) + return held.obj_storage.insert(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_SOUND) + return held.obj_storage.auto_handle_interacted_insertion(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_SUPPRESS_SOUND) return FALSE if(/datum/inventory_slot/abstract/attach_as_accessory) for(var/obj/item/clothing/C in get_equipped_items()) From 3e04fe33b7b42a8d7517c8c090f5305fd2efa549 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 6 Jul 2024 20:05:34 -0400 Subject: [PATCH 041/140] merge --- code/modules/inventory/mob/abstraction.dm | 21 +- code/modules/inventory/mob/internal.dm | 9 +- code/modules/inventory/mob/public.dm | 25 +- code/modules/mob/inventory/inventory.dm | 453 ---------------------- code/modules/mob/inventory/mobs.dm | 185 --------- 5 files changed, 35 insertions(+), 658 deletions(-) delete mode 100644 code/modules/mob/inventory/mobs.dm diff --git a/code/modules/inventory/mob/abstraction.dm b/code/modules/inventory/mob/abstraction.dm index 8dda2ac505d1..a0ce952a775f 100644 --- a/code/modules/inventory/mob/abstraction.dm +++ b/code/modules/inventory/mob/abstraction.dm @@ -84,14 +84,27 @@ /** * checks for slot conflict */ -/mob/proc/inventory_slot_conflict_check(obj/item/I, slot) - if(_item_by_slot(slot)) - return CAN_EQUIP_SLOT_CONFLICT_HARD +/mob/proc/inventory_slot_conflict_check(obj/item/I, slot, flags) + var/obj/item/conflicting = _item_by_slot(slot) + if(conflicting) + if((flags & (INV_OP_CAN_DISPLACE | INV_OP_IS_FINAL_CHECK)) == (INV_OP_CAN_DISPLACE | INV_OP_IS_FINAL_CHECK)) + drop_item_to_ground(conflicting, INV_OP_FORCE) + if(_item_by_slot(slot)) + return CAN_EQUIP_SLOT_CONFLICT_HARD + else + return CAN_EQUIP_SLOT_CONFLICT_HARD switch(slot) if(SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR) if(I.slot_flags & SLOT_TWOEARS) if(_item_by_slot(SLOT_ID_LEFT_EAR) || _item_by_slot(SLOT_ID_RIGHT_EAR)) return CAN_EQUIP_SLOT_CONFLICT_SOFT + else + var/obj/item/left_ear = _item_by_slot(SLOT_ID_LEFT_EAR) + var/obj/item/right_ear = _item_by_slot(SLOT_ID_RIGHT_EAR) + if(left_ear && left_ear != INVENTORY_SLOT_DOES_NOT_EXIST && left_ear != I && left_ear.slot_flags & SLOT_TWOEARS) + return CAN_EQUIP_SLOT_CONFLICT_SOFT + else if(right_ear && right_ear != INVENTORY_SLOT_DOES_NOT_EXIST && right_ear != I && right_ear.slot_flags & SLOT_TWOEARS) + return CAN_EQUIP_SLOT_CONFLICT_SOFT return CAN_EQUIP_SLOT_CONFLICT_NONE /** @@ -108,7 +121,7 @@ */ /mob/proc/inventory_slot_semantic_conflict(obj/item/I, datum/inventory_slot/slot, mob/user) . = FALSE - slot = resolve_inventory_slot_meta(slot) + slot = resolve_inventory_slot(slot) return slot._equip_check(I, src, user) /** diff --git a/code/modules/inventory/mob/internal.dm b/code/modules/inventory/mob/internal.dm index aaa869bc1eab..d8312adebd76 100644 --- a/code/modules/inventory/mob/internal.dm +++ b/code/modules/inventory/mob/internal.dm @@ -170,12 +170,17 @@ return FALSE // resolve slot - var/datum/inventory_slot/slot_meta = resolve_inventory_slot_meta(slot) + var/datum/inventory_slot/slot_meta = resolve_inventory_slot(slot) if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) // if it's abstract, we go there directly - do not use can_equip as that will just guess. return handle_abstract_slot_insertion(I, slot, flags) - var/old_slot = slot_by_item(I) + // slots must have IDs. + ASSERT(!isnull(slot_meta.id)) + // convert to ID after abstract slot checks + slot = slot_meta.id + + var/old_slot = slot_id_by_item(I) if(old_slot) . = _handle_item_reequip(I, slot, old_slot, flags, user) diff --git a/code/modules/inventory/mob/public.dm b/code/modules/inventory/mob/public.dm index 399bcddb5117..028d4561302d 100644 --- a/code/modules/inventory/mob/public.dm +++ b/code/modules/inventory/mob/public.dm @@ -110,7 +110,7 @@ to_chat(user, SPAN_DANGER("can_equip will now attempt to prevent the deleted item from being equipped. There should be no glitches.")) return FALSE - var/datum/inventory_slot/slot_meta = resolve_inventory_slot_meta(slot) + var/datum/inventory_slot/slot_meta = resolve_inventory_slot(slot) var/self_equip = user == src if(!slot_meta) . = FALSE @@ -124,15 +124,11 @@ if(/datum/inventory_slot/abstract/hand/right) return (flags & INV_OP_FORCE) || !get_right_held_item() if(/datum/inventory_slot/abstract/put_in_backpack) - var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) - if(!istype(S)) - return FALSE - return S.can_be_inserted(I, TRUE) + var/obj/item/thing = item_by_slot_id(SLOT_ID_BACK) + return thing?.obj_storage?.can_be_inserted(I, new /datum/event_args/actor(user), TRUE) if(/datum/inventory_slot/abstract/put_in_belt) - var/obj/item/storage/S = item_by_slot(SLOT_ID_BACK) - if(!istype(S)) - return FALSE - return S.can_be_inserted(I, TRUE) + var/obj/item/thing = item_by_slot_id(SLOT_ID_BACK) + return thing?.obj_storage?.can_be_inserted(I, new /datum/event_args/actor(user), TRUE) if(/datum/inventory_slot/abstract/put_in_hands) return (flags & INV_OP_FORCE) || !hands_full() return TRUE @@ -140,12 +136,12 @@ if(!inventory_slot_bodypart_check(I, slot, user, flags) && !(flags & INV_OP_FORCE)) return FALSE - var/conflict_result = inventory_slot_conflict_check(I, slot) + var/conflict_result = inventory_slot_conflict_check(I, slot, flags) var/obj/item/to_wear_over if((flags & INV_OP_IS_FINAL_CHECK) && conflict_result && (slot != SLOT_ID_HANDS)) // try to fit over - var/obj/item/conflicting = item_by_slot(slot) + var/obj/item/conflicting = item_by_slot_id(slot) if(conflicting) // there's something there var/can_fit_over = I.equip_worn_over_check(src, slot, user, conflicting, flags) @@ -291,7 +287,7 @@ * @return TRUE/FALSE */ /mob/proc/force_equip_to_slot(obj/item/I, slot, flags, mob/user) - return _equip_item(I, flags | INV_OP_FORCE, slot, user) + return _equip_item(I, flags | INV_OP_FORCE | INV_OP_CAN_DISPLACE, slot, user) /** * forcefully equips an item to a slot @@ -336,11 +332,12 @@ return TRUE if(!slot) - slot = slot_by_item(I) + slot = slot_id_by_item(I) if(!(flags & INV_OP_FORCE) && HAS_TRAIT(I, TRAIT_ITEM_NODROP)) if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[I] is stuck to your hand!")) + var/datum/inventory_slot/slot_meta = resolve_inventory_slot(slot) + to_chat(user, SPAN_WARNING("[I] is stubbornly stuck [slot_meta.display_preposition] your [slot_meta.display_name]!")) return FALSE var/blocked_by diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 94bd5aa73558..09865149d9ad 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -1,456 +1,3 @@ -/** - * mob inventory data goes in here. - */ -/datum/inventory - //* Basics *// - /// owning mob - var/mob/owner - - //* Inventory *// - - //* Caches *// - /// cached overlays by slot id - var/list/rendered_normal_overlays = list() - /// cached overlays by slot id - // todo: emissives - // var/list/rendered_emissive_overlays = list() - -/datum/inventory/New(mob/M) - if(!istype(M)) - CRASH("no mob") - owner = M - -/datum/inventory/Destroy() - owner = null - return ..() - -//* Rendering *// - -/datum/inventory/proc/remove_slot_renders() - var/list/transformed = list() - for(var/slot_id in rendered_normal_overlays) - transformed += rendered_normal_overlays[slot_id] - owner.cut_overlay(transformed) - -/datum/inventory/proc/reapply_slot_renders() - // try not to dupe - remove_slot_renders() - var/list/transformed = list() - for(var/slot_id in rendered_normal_overlays) - transformed += rendered_normal_overlays[slot_id] - owner.add_overlay(transformed) - -/** - * just update if a slot is visible - */ -/datum/inventory/proc/update_slot_visible(slot_id, cascade = TRUE) - // resolve item - var/obj/item/target = owner.item_by_slot_id(slot_id) - - // first, cascade incase we early-abort later - if(cascade) - var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) - slot.cascade_render_visibility(owner, target) - - // check existing - if(isnull(rendered_normal_overlays[slot_id])) - return - - // remove overlay first incase it's already there - owner.cut_overlay(rendered_normal_overlays[slot_id]) - - // check if slot should render - var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) - if(!slot.should_render(owner, target)) - return - - // add overlay if it should - owner.add_overlay(rendered_normal_overlays[slot_id]) - -/** - * redo a slot's render - */ -/datum/inventory/proc/update_slot_render(slot_id, cascade = TRUE) - var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) - var/obj/item/target = owner.item_by_slot_id(slot_id) - - // first, cascade incase we early-abort later - if(cascade) - slot.cascade_render_visibility(owner, target) - - if(!slot.should_render(owner, target)) - remove_slot_render(slot_id) - return - - if(isnull(target)) - remove_slot_render(slot_id) - return - - var/bodytype = BODYTYPE_DEFAULT - - if(ishuman(owner)) - var/mob/living/carbon/human/casted_human = owner - bodytype = casted_human.species.get_effective_bodytype(casted_human, target, slot_id) - - var/rendering_results = slot.render(owner, target, bodytype) - if(islist(rendering_results)? !length(rendering_results) : isnull(rendering_results)) - remove_slot_render(slot_id) - return - - set_slot_render(slot_id, rendering_results) - -/datum/inventory/proc/remove_slot_render(slot_id) - if(isnull(rendered_normal_overlays[slot_id])) - return - owner.cut_overlay(rendered_normal_overlays[slot_id]) - rendered_normal_overlays -= slot_id - -/datum/inventory/proc/set_slot_render(slot_id, overlay) - if(!isnull(rendered_normal_overlays[slot_id])) - owner.cut_overlay(rendered_normal_overlays[slot_id]) - rendered_normal_overlays[slot_id] = overlay - owner.add_overlay(overlay) - -//* Queries *// - -/** - * returns list() of items with body_cover_flags - */ -/datum/inventory/proc/items_that_cover(cover_flags) - if(cover_flags == NONE) - return list() - . = list() - for(var/obj/item/I as anything in owner.get_equipped_items()) - if(I.body_cover_flags & cover_flags) - . += I - -/** - * handles the insertion - * item can be moved or not moved before calling - * - * slot must be a typepath - * - * @return true/false based on if it worked - */ -/mob/proc/handle_abstract_slot_insertion(obj/item/I, slot, flags) - if(!ispath(slot, /datum/inventory_slot/abstract)) - slot = resolve_inventory_slot(slot)?.type - if(!ispath(slot, /datum/inventory_slot/abstract)) - stack_trace("invalid slot: [slot]") - else if(slot != /datum/inventory_slot/abstract/put_in_hands) - stack_trace("attempted usage of slot id in abstract insertion converted successfully") - . = FALSE - switch(slot) - if(/datum/inventory_slot/abstract/hand/left) - return put_in_left_hand(I, flags) - if(/datum/inventory_slot/abstract/hand/right) - return put_in_right_hand(I, flags) - if(/datum/inventory_slot/abstract/put_in_belt) - var/obj/item/held = item_by_slot_id(SLOT_ID_BELT) - if(flags & INV_OP_FORCE) - return held?.obj_storage?.insert(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_SOUND) - return held?.obj_storage?.auto_handle_interacted_insertion(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_SUPPRESS_SOUND) - if(/datum/inventory_slot/abstract/put_in_backpack) - var/obj/item/held = item_by_slot_id(SLOT_ID_BACK) - if(flags & INV_OP_FORCE) - return held?.obj_storage?.insert(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_SOUND) - return held?.obj_storage?.auto_handle_interacted_insertion(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_SUPPRESS_SOUND) - if(/datum/inventory_slot/abstract/put_in_hands) - return put_in_hands(I, flags) - if(/datum/inventory_slot/abstract/put_in_storage, /datum/inventory_slot/abstract/put_in_storage_try_active) - if(slot == /datum/inventory_slot/abstract/put_in_storage_try_active) - // todo: redirection - if(flags & INV_OP_FORCE) - if(active_storage?.insert(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_WARNING)) - return TRUE - else - if(active_storage?.auto_handle_interacted_insertion(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_SUPPRESS_SOUND)) - return TRUE - for(var/obj/item/held in get_equipped_items_in_slots(list( - SLOT_ID_BELT, - SLOT_ID_BACK, - SLOT_ID_UNIFORM, - SLOT_ID_SUIT, - SLOT_ID_LEFT_POCKET, - SLOT_ID_RIGHT_POCKET - )) + get_held_items()) - if(isnull(held?.obj_storage)) - continue - if(flags & INV_OP_FORCE) - return held.obj_storage.insert(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_SOUND) - return held.obj_storage.auto_handle_interacted_insertion(I, new /datum/event_args/actor(src), flags & INV_OP_SUPPRESS_WARNING, flags & INV_OP_SUPPRESS_SOUND) - return FALSE - if(/datum/inventory_slot/abstract/attach_as_accessory) - for(var/obj/item/clothing/C in get_equipped_items()) - if(C.attempt_attach_accessory(I)) - return TRUE - return FALSE - else - CRASH("Invalid abstract slot [slot]") - -/** - * handles internal logic of unequipping an item - * - * @params - * - I - item - * - flags - inventory operation hint bitfield, see defines - * - newloc - where to transfer to. null for nullspace, FALSE for don't transfer - * - user - can be null - person doing the removals - * - * @return TRUE/FALSE for success - */ -/mob/proc/_unequip_item(obj/item/I, flags, newloc, mob/user = src) - PROTECTED_PROC(TRUE) - if(!I) - return TRUE - - var/hand = get_held_index(I) - var/old - if(hand) - if(!can_unequip(I, SLOT_ID_HANDS, flags, user)) - return FALSE - _unequip_held(I, TRUE) - I.unequipped(src, SLOT_ID_HANDS, flags) - old = SLOT_ID_HANDS - else - if(!I.worn_slot) - stack_trace("tried to unequip an item without current equipped slot.") - I.worn_slot = _slot_by_item(I) - if(!can_unequip(I, I.worn_slot, flags, user)) - return FALSE - old = I.worn_slot - _unequip_slot(I.worn_slot, flags) - I.unequipped(src, I.worn_slot, flags) - handle_item_denesting(I, old, flags, user) - - // this qdeleted catches unequipped() deleting the item. - . = QDELETED(I)? FALSE : TRUE - - if(I) - // todo: better rendering that takes observers into account - if(client) - client.screen -= I - I.screen_loc = null - //! at some point we should have /pre_dropped and /pre_pickup, because dropped should logically come after move. - if(I.dropped(src, flags, newloc) == ITEM_RELOCATED_BY_DROPPED) - . = FALSE - else if(QDELETED(I)) - // this check RELIES on dropped() being the first if - // make sure you don't blindly move it!! - // this is meant to catch any potential deletions dropped can cause. - . = FALSE - else - if(!(I.item_flags & ITEM_DROPDEL)) - if(newloc == null) - I.moveToNullspace() - else if(newloc != FALSE) - I.forceMove(newloc) - - log_inventory("[key_name(src)] unequipped [I] from [old].") - - update_action_buttons() - -/mob/proc/handle_item_denesting(obj/item/I, old_slot, flags, mob/user) - // if the item was inside something, - if(I.worn_inside) - var/obj/item/over = I.worn_over - var/obj/item/inside = I.worn_inside - // if we were inside something we WEREN'T the top level item - // collapse the links - inside.worn_over = over - if(over) - over.worn_inside = inside - I.worn_over = null - I.worn_inside = null - // call procs to inform things - inside.equip_on_worn_over_remove(src, old_slot, user, I, flags) - if(over) - I.equip_on_worn_over_remove(src, old_slot, user, over, flags) - - // now we're free to forcemove later - // if the item wasn't but was worn over something, there's more complicated methods required - else if(I.worn_over) - var/obj/item/over = I.worn_over - I.worn_over = null - I.equip_on_worn_over_remove(src, old_slot, user, I.worn_over, flags) - // I is free to be forcemoved now, but the old object needs to be put back on - over.worn_hook_suppressed = TRUE - over.forceMove(src) - over.worn_hook_suppressed = FALSE - // put it back in the slot - _equip_slot(over, old_slot, flags) - // put it back on the screen - over.hud_layerise() - position_hud_item(over, old_slot) - client?.screen |= over - -/** - * checks if we can unequip an item - * - * Preconditions: The item is either equipped already, or isn't equipped. - * - * @return TRUE/FALSE - * - * @params - * - I - item - * - slot - slot we're unequipping from - can be null - * - flags - inventory operation hint bitfield, see defines - * - user - stripper - can be null - */ -/mob/proc/can_unequip(obj/item/I, slot, flags, mob/user = src) - // destroyed IS allowed to call these procs - if(I && QDELETED(I) && !QDESTROYING(I)) - to_chat(user, SPAN_DANGER("A deleted [I] was checked in can_unequip(). Report this entire line to coders immediately. Debug data: [I] ([REF(I)]) slot [slot] flags [flags] user [user]")) - to_chat(user, SPAN_DANGER("can_unequip will return TRUE to allow you to drop the item, but expect potential glitches!")) - return TRUE - - if(!slot) - slot = slot_id_by_item(I) - - if(!(flags & INV_OP_FORCE) && HAS_TRAIT(I, TRAIT_ITEM_NODROP)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - var/datum/inventory_slot/slot_meta = resolve_inventory_slot(slot) - to_chat(user, SPAN_WARNING("[I] is stubbornly stuck [slot_meta.display_preposition] your [slot_meta.display_name]!")) - return FALSE - - var/blocked_by - if((blocked_by = inventory_slot_reachability_conflict(I, slot, user)) && !(flags & (INV_OP_FORCE | INV_OP_IGNORE_REACHABILITY))) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("\the [blocked_by] is in the way!")) - return FALSE - - // lastly, check item's opinion - if(!I.can_unequip(src, slot, user, flags)) - return FALSE - - return TRUE - -/** - * checks if we can equip an item to a slot - * - * Preconditions: The item will either be equipped on us already, or not yet equipped. - * - * @return TRUE/FALSE - * - * @params - * - I - item - * - slot - slot ID - * - flags - inventory operation hint bitfield, see defines - * - user - user trying to equip that thing to us there - can be null - * - denest_to - the old slot we're leaving if called from handle_item_reequip. **extremely** snowflakey - * - * todo: refactor nesting to not require this shit - */ -/mob/proc/can_equip(obj/item/I, slot, flags, mob/user, denest_to) - // let's NOT. - if(I && QDELETED(I)) - to_chat(user, SPAN_DANGER("A deleted [I] was checked in can_equip(). Report this entire line to coders immediately. Debug data: [I] ([REF(I)]) slot [slot] flags [flags] user [user]")) - to_chat(user, SPAN_DANGER("can_equip will now attempt to prevent the deleted item from being equipped. There should be no glitches.")) - return FALSE - - var/datum/inventory_slot/slot_meta = resolve_inventory_slot(slot) - var/self_equip = user == src - if(!slot_meta) - . = FALSE - CRASH("Failed to resolve to slot datm.") - - if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) - // special handling: make educated guess, defaulting to yes - switch(slot_meta.type) - if(/datum/inventory_slot/abstract/hand/left) - return (flags & INV_OP_FORCE) || !get_left_held_item() - if(/datum/inventory_slot/abstract/hand/right) - return (flags & INV_OP_FORCE) || !get_right_held_item() - if(/datum/inventory_slot/abstract/put_in_backpack) - var/obj/item/thing = item_by_slot_id(SLOT_ID_BACK) - return thing?.obj_storage?.can_be_inserted(I, new /datum/event_args/actor(user), TRUE) - if(/datum/inventory_slot/abstract/put_in_belt) - var/obj/item/thing = item_by_slot_id(SLOT_ID_BACK) - return thing?.obj_storage?.can_be_inserted(I, new /datum/event_args/actor(user), TRUE) - if(/datum/inventory_slot/abstract/put_in_hands) - return (flags & INV_OP_FORCE) || !hands_full() - return TRUE - - if(!inventory_slot_bodypart_check(I, slot, user, flags) && !(flags & INV_OP_FORCE)) - return FALSE - - var/conflict_result = inventory_slot_conflict_check(I, slot, flags) - var/obj/item/to_wear_over - - if((flags & INV_OP_IS_FINAL_CHECK) && conflict_result && (slot != SLOT_ID_HANDS)) - // try to fit over - var/obj/item/conflicting = item_by_slot_id(slot) - if(conflicting) - // there's something there - var/can_fit_over = I.equip_worn_over_check(src, slot, user, conflicting, flags) - if(can_fit_over) - conflict_result = CAN_EQUIP_SLOT_CONFLICT_NONE - to_wear_over = conflicting - // ! DANGER: snowflake time - // take it out of the slot - _unequip_slot(slot, flags | INV_OP_NO_LOGIC | INV_OP_NO_UPDATE_ICONS) - // recheck - conflict_result = inventory_slot_conflict_check(I, slot) - // put it back in incase something else breaks - _equip_slot(conflicting, slot, flags | INV_OP_NO_LOGIC | INV_OP_NO_UPDATE_ICONS) - - switch(conflict_result) - if(CAN_EQUIP_SLOT_CONFLICT_HARD) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] are already [slot_meta.display_plural? "holding too many things" : "wearing something"] [slot_meta.display_preposition] [self_equip? "your" : "their"] [slot_meta.display_name].")) - return FALSE - if(CAN_EQUIP_SLOT_CONFLICT_SOFT) - if(!(flags & INV_OP_FORCE)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] are already [slot_meta.display_plural? "holding too many things" : "wearing something"] [slot_meta.display_preposition] [self_equip? "your" : "their"] [slot_meta.display_name].")) - return FALSE - - if(!inventory_slot_semantic_conflict(I, slot, user) && !(flags & INV_OP_FORCE)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[I] doesn't fit there.")) - return FALSE - - var/blocked_by - - if((blocked_by = inventory_slot_reachability_conflict(I, slot, user)) && !(flags & (INV_OP_FORCE | INV_OP_IGNORE_REACHABILITY))) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("\the [blocked_by] is in the way!")) - return FALSE - - // lastly, check item's opinion - if(!I.can_equip(src, slot, user, flags)) - return FALSE - - // we're the final check - side effects ARE allowed - if((flags & INV_OP_IS_FINAL_CHECK) && to_wear_over) - //! Note: this means that can_unequip is NOT called for to wear over. - //! This is intentional, but very, very sonwflakey. - to_wear_over.worn_inside = I - // setting worn inside first disallows equip/unequip from triggering - to_wear_over.forceMove(I) - // check we don't have something already (wtf) - if(I.worn_over) - handle_item_denesting(I, denest_to, flags, user) - // set the other way around - I.worn_over = to_wear_over - // tell it we're inserting the old item - I.equip_on_worn_over_insert(src, slot, user, to_wear_over, flags) - // take the old item off our screen - client?.screen -= to_wear_over - to_wear_over.screen_loc = null - to_wear_over.hud_unlayerise() - // we don't call slot re-equips here because the equip proc does this for us - - return TRUE - -/** - * checks if we are missing the bodypart for a slot - * return FALSE if we are missing, or TRUE if we're not - * - * this proc should give the feedback of what's missing! - */ -/mob/proc/inventory_slot_bodypart_check(obj/item/I, slot, mob/user, flags) - return TRUE /** * drop items if a bodypart is missing diff --git a/code/modules/mob/inventory/mobs.dm b/code/modules/mob/inventory/mobs.dm deleted file mode 100644 index 44f83b5254e6..000000000000 --- a/code/modules/mob/inventory/mobs.dm +++ /dev/null @@ -1,185 +0,0 @@ -//? init - -/mob/proc/init_inventory() - return - -//? equip - -/** - * equips an item to a slot if possible - * - * @params - * - I - item - * - slot - the slot - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ -/mob/proc/equip_to_slot_if_possible(obj/item/I, slot, flags, mob/user) - return _equip_item(I, flags, slot, user) - -/** - * equips an item to a slot if possible - * item is deleted on failure - * - * @params - * - I - item - * - slot - the slot - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ -/mob/proc/equip_to_slot_or_del(obj/item/I, slot, flags, mob/user) - . = equip_to_slot_if_possible(I, slot, flags, user) - if(!.) - qdel(I) -/** - * automatically equips to the best inventory (non storage!) slot we can find for an item, if possible - * this proc is silent for the sub-calls by default to prevent spam. - * - * @params - * - I - item - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ -/mob/proc/equip_to_appropriate_slot(obj/item/I, flags, mob/user) - for(var/slot in GLOB.slot_equipment_priority) - if(equip_to_slot_if_possible(I, slot, flags | INV_OP_SUPPRESS_WARNING, user)) - return TRUE - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, user == src? SPAN_WARNING("You can't find somewhere to equip [I] to!") : SPAN_WARNING("[src] has nowhere to equip [I] to!")) - return FALSE - -/** - * automatically equips to the best inventory (non storage!) slot we can find for an item, if possible - * - * item is deleted on failure. - * - * @params - * - I - item - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ - -/mob/proc/equip_to_appropriate_slot_or_del(obj/item/I, flags, mob/user) - if(!equip_to_appropriate_slot(I, flags, user)) - qdel(I) - -/** - * forcefully equips an item to a slot - * kicks out conflicting items if possible - * - * This CAN fail, so listen to return value - * Why? YOU MIGHT EQUIP TO A MOB WITHOUT A CERTAIN SLOT! - * - * @params - * - I - item - * - slot - slot to equip to - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ -/mob/proc/force_equip_to_slot(obj/item/I, slot, flags, mob/user) - return _equip_item(I, flags | INV_OP_FORCE | INV_OP_CAN_DISPLACE, slot, user) - -/** - * forcefully equips an item to a slot - * kicks out conflicting items if possible - * if still failing, item is deleted - * - * this can fail, so listen to return values. - * @params - * - I - item - * - slot - slot to equip to - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ -/mob/proc/force_equip_to_slot_or_del(obj/item/I, slot, flags, mob/user) - if(!force_equip_to_slot(I, slot, flags, user)) - qdel(I) - return FALSE - return TRUE - -//? drop - -// So why do all of these return true if the item is null? -// Semantically, transferring/dropping nothing always works -// This lets us tidy up other pieces of code by not having to typecheck everything. -// However, if you do pass in an invalid object instead of null, the procs will fail or pass -// depending on needed behavior. -// Use the helpers when you can, it's easier for everyone and makes replacing behaviors later easier. - -// This logic is actually **stricter** than the previous logic, which was "if item doesn't exist, it always works" - -/** - * drops an item to ground - * - * semantically returns true if the thing is no longer in our inventory after our call, whether or not we dropped it - * if you require better checks, check if something is in inventory first. - * - * if the item is null, this returns true - * if an item is not in us, this returns true - */ -/mob/proc/drop_item_to_ground(obj/item/I, flags, mob/user = src) - // destroyed IS allowed to call these procs - if(I && QDELETED(I) && !QDESTROYING(I)) - to_chat(user, SPAN_DANGER("A deleted item [I] was used in drop_item_to_ground(). Report the entire line to coders. Debugging information: [I] ([REF(I)]) flags [flags] user [user]")) - to_chat(user, SPAN_DANGER("Drop item to ground will now proceed, ignoring the bugged state. Errors may ensue.")) - else if(!is_in_inventory(I)) - return TRUE - return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, drop_location(), user) - -/** - * transfers an item somewhere - * newloc MUST EXIST, use transfer_item_to_nullspace otherwise - * - * semantically returns true if we transferred something from our inventory to newloc in the call - * - * if the item is null, this returns true - * if an item is not in us, this crashes - */ -/mob/proc/transfer_item_to_loc(obj/item/I, newloc, flags, mob/user) - if(!I) - return TRUE - ASSERT(newloc) - if(!is_in_inventory(I)) - return FALSE - return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, newloc, user) - -/** - * transfers an item into nullspace - * - * semantically returns true if we transferred something from our inventory to null in the call - * - * if the item is null, this returns true - * if an item is not in us, this crashes - */ -/mob/proc/transfer_item_to_nullspace(obj/item/I, flags, mob/user) - if(!I) - return TRUE - if(!is_in_inventory(I)) - return FALSE - return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, null, user) - -/** - * removes an item from inventory. does NOT move it. - * item MUST be qdel'd or moved after this if it returns TRUE! - * - * semantically returns true if the passed item is no longer in our inventory after the call - * - * if the item is null, ths returns true - * if an item is not in us, this returns true - */ -/mob/proc/temporarily_remove_from_inventory(obj/item/I, flags, mob/user) - if(!is_in_inventory(I)) - return TRUE - return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, FALSE, user) From 0615d3d72066be3cc737175660abced010967fc4 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 6 Jul 2024 20:09:58 -0400 Subject: [PATCH 042/140] merge --- code/modules/inventory/inventory.dm | 2 +- code/modules/inventory/mob/internal.dm | 4 +- code/modules/inventory/mob/public.dm | 18 +- code/modules/mob/inventory/inventory.dm | 426 ------------------------ 4 files changed, 13 insertions(+), 437 deletions(-) delete mode 100644 code/modules/mob/inventory/inventory.dm diff --git a/code/modules/inventory/inventory.dm b/code/modules/inventory/inventory.dm index 868b5ac42873..b44974f92f12 100644 --- a/code/modules/inventory/inventory.dm +++ b/code/modules/inventory/inventory.dm @@ -225,4 +225,4 @@ affected = list(affected) for(var/obj/item/I as anything in affected) if(!inventory_slot_bodypart_check(I, I.worn_slot, null, INV_OP_SILENT)) - drop_item_to_ground(I) + drop_item_to_ground(I, INV_OP_SILENT) diff --git a/code/modules/inventory/mob/internal.dm b/code/modules/inventory/mob/internal.dm index d8312adebd76..fa4c4d46204d 100644 --- a/code/modules/inventory/mob/internal.dm +++ b/code/modules/inventory/mob/internal.dm @@ -245,8 +245,8 @@ ASSERT(slot) if(!old_slot) // DO NOT USE _slot_by_item - at this point, the item has already been var-set into the new slot! - // slot_by_item however uses cached values still! - old_slot = slot_by_item(I) + // slot_id_by_item however uses cached values still! + old_slot = slot_id_by_item(I) if(!old_slot) // still not there, wasn't already in inv return FALSE diff --git a/code/modules/inventory/mob/public.dm b/code/modules/inventory/mob/public.dm index 028d4561302d..06a02c3dd2b3 100644 --- a/code/modules/inventory/mob/public.dm +++ b/code/modules/inventory/mob/public.dm @@ -10,6 +10,14 @@ /mob/proc/item_by_slot(slot) return _item_by_slot(slot) // why the needless indirection? so people don't override this for slots! +/** + * get slot of item if it's equipped. + * null if not in inventory. SLOT_HANDS if held. + */ +/mob/proc/slot_id_by_item(obj/item/I) + return is_in_inventory(I) || null // short circuited to that too + // if equipped/unequipped didn't set worn_slot well jokes on you lmfao + /** * gets the primary item and nested items (e.g. gloves, magboots, accessories) in a slot * null if not in inventory, otherwise list @@ -39,14 +47,6 @@ var/slot = is_in_inventory(I) return slot && (slot != SLOT_ID_HANDS) -/** - * get slot of item if it's equipped. - * null if not in inventory. SLOT_HANDS if held. - */ -/mob/proc/slot_by_item(obj/item/I) - return is_in_inventory(I) || null // short circuited to that too - // if equipped/unequipped didn't set worn_slot well jokes on you lmfao - /** * get all equipped items * @@ -425,6 +425,8 @@ return TRUE return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, FALSE, user) +//* MasS Operations *// + /** * drops everything in our inventory * diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm deleted file mode 100644 index 09865149d9ad..000000000000 --- a/code/modules/mob/inventory/inventory.dm +++ /dev/null @@ -1,426 +0,0 @@ - -/** - * drop items if a bodypart is missing - */ -/mob/proc/reconsider_inventory_slot_bodypart(bodypart) - // todo: this and the above function should be on the slot datums. - var/list/obj/item/affected - switch(bodypart) - if(BP_HEAD) - affected = items_by_slot( - SLOT_ID_HEAD, - SLOT_ID_LEFT_EAR, - SLOT_ID_RIGHT_EAR, - SLOT_ID_MASK, - SLOT_ID_GLASSES - ) - if(BP_GROIN, BP_TORSO) - affected = items_by_slot( - SLOT_ID_BACK, - SLOT_ID_BELT, - SLOT_ID_SUIT, - SLOT_ID_SUIT_STORAGE, - SLOT_ID_RIGHT_POCKET, - SLOT_ID_LEFT_POCKET, - SLOT_ID_UNIFORM - ) - if(BP_L_ARM, BP_L_HAND, BP_R_ARM, BP_R_HAND) - affected = items_by_slot( - SLOT_ID_HANDCUFFED, - SLOT_ID_GLOVES - ) - if(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) - affected = items_by_slot( - SLOT_ID_LEGCUFFED, - SLOT_ID_SHOES - ) - if(!affected) - return - else if(!islist(affected)) - affected = list(affected) - for(var/obj/item/I as anything in affected) - if(!inventory_slot_bodypart_check(I, I.worn_slot, null, INV_OP_SILENT)) - drop_item_to_ground(I, INV_OP_SILENT) - -/** - * checks for slot conflict - */ -/mob/proc/inventory_slot_conflict_check(obj/item/I, slot, flags) - var/obj/item/conflicting = _item_by_slot(slot) - if(conflicting) - if((flags & (INV_OP_CAN_DISPLACE | INV_OP_IS_FINAL_CHECK)) == (INV_OP_CAN_DISPLACE | INV_OP_IS_FINAL_CHECK)) - drop_item_to_ground(conflicting, INV_OP_FORCE) - if(_item_by_slot(slot)) - return CAN_EQUIP_SLOT_CONFLICT_HARD - else - return CAN_EQUIP_SLOT_CONFLICT_HARD - switch(slot) - if(SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR) - if(I.slot_flags & SLOT_TWOEARS) - if(_item_by_slot(SLOT_ID_LEFT_EAR) || _item_by_slot(SLOT_ID_RIGHT_EAR)) - return CAN_EQUIP_SLOT_CONFLICT_SOFT - else - var/obj/item/left_ear = _item_by_slot(SLOT_ID_LEFT_EAR) - var/obj/item/right_ear = _item_by_slot(SLOT_ID_RIGHT_EAR) - if(left_ear && left_ear != INVENTORY_SLOT_DOES_NOT_EXIST && left_ear != I && left_ear.slot_flags & SLOT_TWOEARS) - return CAN_EQUIP_SLOT_CONFLICT_SOFT - else if(right_ear && right_ear != INVENTORY_SLOT_DOES_NOT_EXIST && right_ear != I && right_ear.slot_flags & SLOT_TWOEARS) - return CAN_EQUIP_SLOT_CONFLICT_SOFT - return CAN_EQUIP_SLOT_CONFLICT_NONE - -/** - * checks if you can reach a slot - * return null or the first item blocking - */ -/mob/proc/inventory_slot_reachability_conflict(obj/item/I, slot, mob/user) - return null - -/** - * semantic check - should this item fit here? slot flag checks/etc should go in here. - * - * return TRUE if conflicting, otherwise FALSE - */ -/mob/proc/inventory_slot_semantic_conflict(obj/item/I, datum/inventory_slot/slot, mob/user) - . = FALSE - slot = resolve_inventory_slot(slot) - return slot._equip_check(I, src, user) - -/** - * handles internal logic of equipping an item - * - * @params - * - I - item to equip - * - flags - inventory operation hint flags, see defines - * - slot - slot to equip it to - * - user - user trying to put it on us - * - * @return TRUE/FALSE on success - */ -/mob/proc/_equip_item(obj/item/I, flags, slot, mob/user = src) - PROTECTED_PROC(TRUE) - - if(!I) // how tf would we put on "null"? - return FALSE - - // resolve slot - var/datum/inventory_slot/slot_meta = resolve_inventory_slot(slot) - if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) - // if it's abstract, we go there directly - do not use can_equip as that will just guess. - return handle_abstract_slot_insertion(I, slot, flags) - - // slots must have IDs. - ASSERT(!isnull(slot_meta.id)) - // convert to ID after abstract slot checks - slot = slot_meta.id - - var/old_slot = slot_id_by_item(I) - - if(old_slot) - . = _handle_item_reequip(I, slot, old_slot, flags, user) - if(!.) - return - - log_inventory("[key_name(src)] moved [I] from [old_slot] to [slot].") - else - if(!can_equip(I, slot, flags | INV_OP_IS_FINAL_CHECK, user)) - return FALSE - - var/atom/oldLoc = I.loc - if(I.loc != src) - I.forceMove(src) - if(I.loc != src) - // UH OH, SOMEONE MOVED US - log_inventory("[key_name(src)] failed to equip [I] to slot (loc sanity failed).") - // UH OH x2, WE GOT WORN OVER SOMETHING - if(I.worn_over) - handle_item_denesting(I, slot, INV_OP_FATAL, user) - return FALSE - - _equip_slot(I, slot, flags) - - // TODO: HANDLE DELETIONS IN PICKUP AND EQUIPPED PROPERLY - I.pickup(src, flags, oldLoc) - I.equipped(src, slot, flags) - - log_inventory("[key_name(src)] equipped [I] to [slot].") - - update_action_buttons() - - if(I.zoom) - I.zoom() - - return TRUE - -/** - * checks if we already have something in our inventory - * if so, this will try to shift the slots over, calling equipped/unequipped automatically - * - * INV_OP_FORCE will allow ignoring can unequip. - * - * return true/false based on if we succeeded - */ -/mob/proc/_handle_item_reequip(obj/item/I, slot, old_slot, flags, mob/user = src) - ASSERT(slot) - if(!old_slot) - // DO NOT USE _slot_by_item - at this point, the item has already been var-set into the new slot! - // slot_id_by_item however uses cached values still! - old_slot = slot_id_by_item(I) - if(!old_slot) - // still not there, wasn't already in inv - return FALSE - // this IS a slot shift! - . = old_slot - if((slot == old_slot) && (slot != SLOT_ID_HANDS)) - // lol we're done (unless it was hands) - return TRUE - if(slot == SLOT_ID_HANDS) - // if we're going into hands, - // just check can unequip - if(!can_unequip(I, old_slot, flags, user)) - // check can unequip - return FALSE - // call procs - if(old_slot == SLOT_ID_HANDS) - _unequip_held(I, flags) - else - _unequip_slot(old_slot, flags) - I.unequipped(src, old_slot, flags) - // sigh - handle_item_denesting(I, old_slot, flags, user) - // TODO: HANDLE DELETIONS ON EQUIPPED PROPERLY, INCLUDING ON HANDS - // ? we don't do this on hands, hand procs do it - // _equip_slot(I, slot, update_icons) - I.equipped(src, slot, flags) - log_inventory("[key_name(src)] moved [I] from [old_slot] to hands.") - // hand procs handle rest - return TRUE - else - // else, this gets painful - if(!can_unequip(I, old_slot, flags, user)) - return FALSE - if(!can_equip(I, slot, flags | INV_OP_IS_FINAL_CHECK, user, old_slot)) - return FALSE - // ?if it's from hands, hands aren't a slot. - if(old_slot == SLOT_ID_HANDS) - _unequip_held(I, flags) - else - _unequip_slot(old_slot, flags) - I.unequipped(src, old_slot, flags) - // TODO: HANDLE DELETIONS ON EQUIPPED PROPERLY - // sigh - _equip_slot(I, slot, flags) - I.equipped(src, slot, flags) - log_inventory("[key_name(src)] moved [I] from [old_slot] to [slot].") - return TRUE - -/** - * handles removing an item from our hud - * - * some things call us from outside inventory code. this is shitcode and shouldn't be propageted. - */ -/mob/proc/_handle_inventory_hud_remove(obj/item/I) - if(client) - client.screen -= I - I.screen_loc = null - -/** - * handles adding an item or updating an item to our hud - */ -/mob/proc/_handle_inventory_hud_update(obj/item/I, slot) - var/datum/inventory_slot/meta = resolve_inventory_slot(slot) - I.screen_loc = meta.hud_position - if(client) - client.screen |= I - -/** - * get all equipped items - * - * @params - * include_inhands - include held items too? - * include_restraints - include restraints too? - */ -/mob/proc/get_equipped_items(include_inhands, include_restraints) - return get_held_items() + _get_all_slots(include_restraints) - -/** - * wipe our inventory - * - * @params - * include_inhands - include held items too? - * include_restraints - include restraints too? - */ -/mob/proc/delete_inventory(include_inhands = TRUE, include_restraints = TRUE) - for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) - qdel(I) - -/** - * drops everything in our inventory - * - * @params - * - include_inhands - include held items too? - * - include_restraints - include restraints too? - * - force - ignore nodrop and all that - */ -/mob/proc/drop_inventory(include_inhands = TRUE, include_restraints = TRUE, force = TRUE) - for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) - drop_item_to_ground(I, INV_OP_SILENT | INV_OP_FLUFFLESS | (force? INV_OP_FORCE : NONE)) - - // todo: handle what happens if dropping something requires a logic thing - // e.g. dropping jumpsuit makes it impossible to transfer a belt since it - // de-equipped from the jumpsuit - -/mob/proc/transfer_inventory_to_loc(atom/newLoc, include_inhands = TRUE, include_restraints = TRUE, force = TRUE) - for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) - transfer_item_to_loc(I, newLoc, INV_OP_SILENT | INV_OP_FLUFFLESS | (force? INV_OP_FORCE : NONE)) - // todo: handle what happens if dropping something requires a logic thing - // e.g. dropping jumpsuit makes it impossible to transfer a belt since it - // de-equipped from the jumpsuit - -/** - * gets the primary item in a slot - * null if not in inventory. inhands don't count as inventory here, use held item procs. - */ -/mob/proc/item_by_slot_id(slot) - return _item_by_slot(slot) // why the needless indirection? so people don't override this for slots! - -/** - * gets the primary item and nested items (e.g. gloves, magboots, accessories) in a slot - * null if not in inventory, otherwise list - * inhands do not count as inventory - */ -/mob/proc/items_by_slot(slot) - var/obj/item/I = _item_by_slot(slot) - if(!I) - return list() - I = I._inv_return_attached() - return islist(I)? I : list(I) - -/** - * returns if we have something equipped - the slot if it is, null if not - * - * SLOT_ID_HANDS if in hands - */ -/mob/proc/is_in_inventory(obj/item/I) - return (I?.worn_mob() == src) && I.worn_slot - // we use entirely cached vars for speed. - // if this returns bad data well fuck you, don't break equipped()/unequipped(). - -/** - * returns if an item is in inventory (equipped) rather than hands - */ -/mob/proc/is_wearing(obj/item/I) - var/slot = is_in_inventory(I) - return slot && (slot != SLOT_ID_HANDS) - -/** - * get slot of item if it's equipped. - * null if not in inventory. SLOT_HANDS if held. - */ -/mob/proc/slot_id_by_item(obj/item/I) - return is_in_inventory(I) || null // short circuited to that too - // if equipped/unequipped didn't set worn_slot well jokes on you lmfao - -/mob/proc/_equip_slot(obj/item/I, slot, flags) - SHOULD_NOT_OVERRIDE(TRUE) - . = _set_inv_slot(slot, I, flags) != INVENTORY_SLOT_DOES_NOT_EXIST - -/mob/proc/_unequip_slot(slot, flags) - SHOULD_NOT_OVERRIDE(TRUE) - . = _set_inv_slot(slot, null, flags) != INVENTORY_SLOT_DOES_NOT_EXIST - -/mob/proc/_unequip_held(obj/item/I, flags) - return - -/mob/proc/has_slot(id) - SHOULD_NOT_OVERRIDE(TRUE) - return _item_by_slot(id) != INVENTORY_SLOT_DOES_NOT_EXIST - -// todo: both of these below procs needs optimization for when we need the datum anyways, to avoid two lookups - -/mob/proc/semantically_has_slot(id) - return has_slot(id) && _semantic_slot_id_check(id) - -/mob/proc/get_inventory_slot_ids(semantic, sorted) - // get all - if(sorted) - . = list() - for(var/id as anything in GLOB.inventory_slot_meta) - if(!semantically_has_slot(id)) - continue - . += id - return - else - . = _get_inventory_slot_ids() - // check if we should filter - if(!semantic) - return - . = _get_inventory_slot_ids() - for(var/id in .) - if(!_semantic_slot_id_check(id)) - . -= id - -/** - * THESE PROCS MUST BE OVERRIDDEN FOR NEW SLOTS ON MOBS - * yes, i managed to shove all basic behaviors that needed overriding into 5-6 procs - * you're - * welcome. - * - * These are UNSAFE PROCS. - * - * oh and can_equip_x* might need overriding for complex mobs like humans but frankly - * sue me, there's no better way right now. - */ - -/** - * sets a slot to icon or null - * - * some behaviors may be included other than update icons - * even update icons is unpreferred but we're stuck with this for now. - * - * todo: logic should be moved out of the proc, but where? - * - * @params - * slot - slot to set - * I - item or null - * update_icons - update icons immediately? - * logic - apply logic like dropping stuff from pockets when unequippiing a jumpsuit imemdiately? - */ -/mob/proc/_set_inv_slot(slot, obj/item/I, flags) - PROTECTED_PROC(TRUE) - . = INVENTORY_SLOT_DOES_NOT_EXIST - CRASH("Attempting to set inv slot of [slot] to [I] went to base /mob. You probably had someone assigning to a nonexistant slot!") - -/** - * ""expensive"" proc that scans for the real slot of an item - * usually used when safety checks detect something is amiss - */ -/mob/proc/_slot_by_item(obj/item/I) - PROTECTED_PROC(TRUE) - -/** - * doubles as slot detection - * returns -1 if no slot - * YES, MAGIC VALUE BUT SOLE USER IS 20 LINES ABOVE, SUE ME. - */ -/mob/proc/_item_by_slot(slot) - PROTECTED_PROC(TRUE) - return INVENTORY_SLOT_DOES_NOT_EXIST - -/mob/proc/_get_all_slots(include_restraints) - PROTECTED_PROC(TRUE) - return list() - -/** - * return all slot ids we implement - */ -/mob/proc/_get_inventory_slot_ids() - PROTECTED_PROC(TRUE) - return list() - -/** - * override this if you need to make a slot not semantically exist - * useful for other species that don't have a slot so you don't have jumpsuit requirements apply - */ -/mob/proc/_semantic_slot_id_check(id) - PROTECTED_PROC(TRUE) - return TRUE From eb88ad193a171897c67531335830979f09b9af7c Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 6 Jul 2024 20:10:30 -0400 Subject: [PATCH 043/140] merge --- code/modules/{mob => }/inventory/inventory_slot.dm | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename code/modules/{mob => }/inventory/inventory_slot.dm (100%) diff --git a/code/modules/mob/inventory/inventory_slot.dm b/code/modules/inventory/inventory_slot.dm similarity index 100% rename from code/modules/mob/inventory/inventory_slot.dm rename to code/modules/inventory/inventory_slot.dm From 0cddd254d03460a26986e4bdefb8d51e4b5efa0b Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 6 Jul 2024 20:18:01 -0400 Subject: [PATCH 044/140] finish merge --- citadel.dme | 23 ++++++++++--------- code/game/rendering/screen.dm | 6 +++++ code/game/rendering/screen_legacy.dm | 3 --- code/modules/{ => mob}/inventory/hands.dm | 0 code/modules/{ => mob}/inventory/inventory.dm | 0 .../{ => mob}/inventory/inventory_slot.dm | 0 .../modules/{ => mob}/inventory/item/hooks.dm | 0 .../{ => mob}/inventory/item/public.dm | 0 .../{ => mob}/inventory/item/rendering.dm | 0 .../{ => mob}/inventory/mob/abstraction.dm | 0 code/modules/{ => mob}/inventory/mob/hands.dm | 0 .../{ => mob}/inventory/mob/helpers.dm | 0 .../{ => mob}/inventory/mob/internal.dm | 0 .../modules/{ => mob}/inventory/mob/public.dm | 4 ++-- .../{ => mob}/inventory/mob/stripping.dm | 0 .../mob/living/simple_mob/simple_mob.dm | 4 ++-- 16 files changed, 22 insertions(+), 18 deletions(-) rename code/modules/{ => mob}/inventory/hands.dm (100%) rename code/modules/{ => mob}/inventory/inventory.dm (100%) rename code/modules/{ => mob}/inventory/inventory_slot.dm (100%) rename code/modules/{ => mob}/inventory/item/hooks.dm (100%) rename code/modules/{ => mob}/inventory/item/public.dm (100%) rename code/modules/{ => mob}/inventory/item/rendering.dm (100%) rename code/modules/{ => mob}/inventory/mob/abstraction.dm (100%) rename code/modules/{ => mob}/inventory/mob/hands.dm (100%) rename code/modules/{ => mob}/inventory/mob/helpers.dm (100%) rename code/modules/{ => mob}/inventory/mob/internal.dm (100%) rename code/modules/{ => mob}/inventory/mob/public.dm (99%) rename code/modules/{ => mob}/inventory/mob/stripping.dm (100%) diff --git a/citadel.dme b/citadel.dme index 8f7f90f689fe..a32ecef83d21 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3017,17 +3017,18 @@ #include "code\modules\integrated_electronics\subtypes\time.dm" #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\integrated_electronics\~defines\~defines.dm" -#include "code\modules\inventory\hands.dm" -#include "code\modules\inventory\inventory.dm" -#include "code\modules\inventory\item\hooks.dm" -#include "code\modules\inventory\item\public.dm" -#include "code\modules\inventory\item\rendering.dm" -#include "code\modules\inventory\mob\abstraction.dm" -#include "code\modules\inventory\mob\hands.dm" -#include "code\modules\inventory\mob\helpers.dm" -#include "code\modules\inventory\mob\internal.dm" -#include "code\modules\inventory\mob\public.dm" -#include "code\modules\inventory\mob\stripping.dm" +#include "code\modules\mob\inventory\hands.dm" +#include "code\modules\mob\inventory\inventory_slot.dm" +#include "code\modules\mob\inventory\inventory.dm" +#include "code\modules\mob\inventory\item\hooks.dm" +#include "code\modules\mob\inventory\item\public.dm" +#include "code\modules\mob\inventory\item\rendering.dm" +#include "code\modules\mob\inventory\mob\abstraction.dm" +#include "code\modules\mob\inventory\mob\hands.dm" +#include "code\modules\mob\inventory\mob\helpers.dm" +#include "code\modules\mob\inventory\mob\internal.dm" +#include "code\modules\mob\inventory\mob\public.dm" +#include "code\modules\mob\inventory\mob\stripping.dm" #include "code\modules\jobs\access.dm" #include "code\modules\jobs\alt_title.dm" #include "code\modules\jobs\department.dm" diff --git a/code/game/rendering/screen.dm b/code/game/rendering/screen.dm index b04003ea4831..9b760c9013fb 100644 --- a/code/game/rendering/screen.dm +++ b/code/game/rendering/screen.dm @@ -4,9 +4,15 @@ /atom/movable/screen appearance_flags = PIXEL_SCALE | NO_CLIENT_COLOR atom_colouration_system = FALSE + var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. + var/datum/hud/hud = null // A reference to the owner HUD, if any. /** * called to resync to a hud_style datum */ /atom/movable/screen/proc/sync_style(datum/hud_style/style, alpha, color) return + +/atom/movable/screen/Destroy() + master = null + return ..() diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index 8af42c62f652..74c3099357b3 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -1,6 +1,3 @@ -/atom/movable/screen/Destroy() - master = null - return ..() /atom/movable/screen/text icon = null diff --git a/code/modules/inventory/hands.dm b/code/modules/mob/inventory/hands.dm similarity index 100% rename from code/modules/inventory/hands.dm rename to code/modules/mob/inventory/hands.dm diff --git a/code/modules/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm similarity index 100% rename from code/modules/inventory/inventory.dm rename to code/modules/mob/inventory/inventory.dm diff --git a/code/modules/inventory/inventory_slot.dm b/code/modules/mob/inventory/inventory_slot.dm similarity index 100% rename from code/modules/inventory/inventory_slot.dm rename to code/modules/mob/inventory/inventory_slot.dm diff --git a/code/modules/inventory/item/hooks.dm b/code/modules/mob/inventory/item/hooks.dm similarity index 100% rename from code/modules/inventory/item/hooks.dm rename to code/modules/mob/inventory/item/hooks.dm diff --git a/code/modules/inventory/item/public.dm b/code/modules/mob/inventory/item/public.dm similarity index 100% rename from code/modules/inventory/item/public.dm rename to code/modules/mob/inventory/item/public.dm diff --git a/code/modules/inventory/item/rendering.dm b/code/modules/mob/inventory/item/rendering.dm similarity index 100% rename from code/modules/inventory/item/rendering.dm rename to code/modules/mob/inventory/item/rendering.dm diff --git a/code/modules/inventory/mob/abstraction.dm b/code/modules/mob/inventory/mob/abstraction.dm similarity index 100% rename from code/modules/inventory/mob/abstraction.dm rename to code/modules/mob/inventory/mob/abstraction.dm diff --git a/code/modules/inventory/mob/hands.dm b/code/modules/mob/inventory/mob/hands.dm similarity index 100% rename from code/modules/inventory/mob/hands.dm rename to code/modules/mob/inventory/mob/hands.dm diff --git a/code/modules/inventory/mob/helpers.dm b/code/modules/mob/inventory/mob/helpers.dm similarity index 100% rename from code/modules/inventory/mob/helpers.dm rename to code/modules/mob/inventory/mob/helpers.dm diff --git a/code/modules/inventory/mob/internal.dm b/code/modules/mob/inventory/mob/internal.dm similarity index 100% rename from code/modules/inventory/mob/internal.dm rename to code/modules/mob/inventory/mob/internal.dm diff --git a/code/modules/inventory/mob/public.dm b/code/modules/mob/inventory/mob/public.dm similarity index 99% rename from code/modules/inventory/mob/public.dm rename to code/modules/mob/inventory/mob/public.dm index 06a02c3dd2b3..45ba47125da5 100644 --- a/code/modules/inventory/mob/public.dm +++ b/code/modules/mob/inventory/mob/public.dm @@ -7,7 +7,7 @@ * gets the primary item in a slot * null if not in inventory. inhands don't count as inventory here, use held item procs. */ -/mob/proc/item_by_slot(slot) +/mob/proc/item_by_slot_id(slot) return _item_by_slot(slot) // why the needless indirection? so people don't override this for slots! /** @@ -23,7 +23,7 @@ * null if not in inventory, otherwise list * inhands do not count as inventory */ -/mob/proc/items_by_slot(slot) +/mob/proc/items_by_slot_id(slot) var/obj/item/I = _item_by_slot(slot) if(!I) return list() diff --git a/code/modules/inventory/mob/stripping.dm b/code/modules/mob/inventory/mob/stripping.dm similarity index 100% rename from code/modules/inventory/mob/stripping.dm rename to code/modules/mob/inventory/mob/stripping.dm diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index 06570dceea61..c38d76eb3be8 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -14,7 +14,7 @@ mob_swap_flags = ~HEAVY mob_push_flags = ~HEAVY - //? Attacks - Basic + //* Attacks - Basic *// /// melee style var/datum/unarmed_attack/melee_style @@ -22,7 +22,7 @@ /// our innate darksight var/datum/vision/baseline/vision_innate = /datum/vision/baseline/default - //? Inventory + //* Inventory *// /// how many hands we have var/hand_count = 0 From 1e631d78d7f9addd68cdf5c2def24e3a6d60b551 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 16 Jul 2024 17:41:46 -0400 Subject: [PATCH 045/140] changes --- citadel.dme | 1 - code/game/click/mobs.dm | 6 +++--- code/modules/mob/inventory/hands.dm | 21 ------------------- code/modules/mob/inventory/inventory.dm | 8 +++---- code/modules/mob/inventory/mob/hands.dm | 6 +++--- code/modules/mob/living/carbon/carbon.dm | 2 +- .../living/carbon/human/human_attackhand.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 2 +- code/modules/mob/living/inventory.dm | 2 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/vore/fluffstuff/custom_guns.dm | 2 +- 11 files changed, 16 insertions(+), 38 deletions(-) delete mode 100644 code/modules/mob/inventory/hands.dm diff --git a/citadel.dme b/citadel.dme index c32a806c7a52..705ca043e3e3 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3023,7 +3023,6 @@ #include "code\modules\integrated_electronics\subtypes\time.dm" #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\integrated_electronics\~defines\~defines.dm" -#include "code\modules\mob\inventory\hands.dm" #include "code\modules\mob\inventory\inventory_slot.dm" #include "code\modules\mob\inventory\inventory.dm" #include "code\modules\mob\inventory\item\hooks.dm" diff --git a/code/game/click/mobs.dm b/code/game/click/mobs.dm index 327bdf5a272d..c377fc0c2000 100644 --- a/code/game/click/mobs.dm +++ b/code/game/click/mobs.dm @@ -129,10 +129,10 @@ /mob/proc/default_clickchain_event_args(atom/target, unarmed = FALSE) var/datum/event_args/actor/clickchain/constructed = new constructed.initiator = src - constructed.actor = src + constructed.performer = src constructed.target = target - constructed.click_params = list() - constructed.attack_intent = a_intent + constructed.params = list() + constructed.intent = a_intent constructed.hand_index = active_hand if(!unarmed) constructed.using = get_active_held_item() diff --git a/code/modules/mob/inventory/hands.dm b/code/modules/mob/inventory/hands.dm deleted file mode 100644 index 7d437b7ba7b9..000000000000 --- a/code/modules/mob/inventory/hands.dm +++ /dev/null @@ -1,21 +0,0 @@ -//* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// - -// todo: we need a set of 'core' procs subtypes need to override, and the rest are composites of those procs. - -/** - * get number of hand slots - * - * semantically this means "physically there" - * a broken hand is still there, a stump isn't - */ -/mob/proc/get_number_of_hands() - return 0 - -/** - * do we have hands? - */ -/mob/proc/has_hands() - return FALSE - -#warn ughh diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index cc3a6f54f397..7c2514ccaff2 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -206,7 +206,7 @@ var/list/obj/item/affected switch(bodypart) if(BP_HEAD) - affected = items_by_slot( + affected = items_by( SLOT_ID_HEAD, SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR, @@ -214,7 +214,7 @@ SLOT_ID_GLASSES ) if(BP_GROIN, BP_TORSO) - affected = items_by_slot( + affected = items_by_slot_id( SLOT_ID_BACK, SLOT_ID_BELT, SLOT_ID_SUIT, @@ -224,12 +224,12 @@ SLOT_ID_UNIFORM ) if(BP_L_ARM, BP_L_HAND, BP_R_ARM, BP_R_HAND) - affected = items_by_slot( + affected = items_by_slot_id( SLOT_ID_HANDCUFFED, SLOT_ID_GLOVES ) if(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) - affected = items_by_slot( + affected = items_by_slot_id( SLOT_ID_LEGCUFFED, SLOT_ID_SHOES ) diff --git a/code/modules/mob/inventory/mob/hands.dm b/code/modules/mob/inventory/mob/hands.dm index 1e50b4550943..533bcbb2ddd5 100644 --- a/code/modules/mob/inventory/mob/hands.dm +++ b/code/modules/mob/inventory/mob/hands.dm @@ -307,7 +307,7 @@ * that nominally have hands. */ /mob/proc/get_nominal_hand_count() - #warn impl + return length(held_items) /** * get number of usable hands / arms / whatever that we have and should check for @@ -320,14 +320,14 @@ * basically if a red deny symbol is in the hand it is not usable, otherwise it's usable. */ /mob/proc/get_usable_hand_count() - #warn impl + #warn impl + subtypes /** * get indices of usable hands */ /mob/proc/get_usable_hand_indices() RETURN_TYPE(/list) - #warn impl + #warn impl + subtypes //* Internals *// diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index aa7c29ab42fc..e05e15168561 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -45,7 +45,7 @@ if (ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - if (H.hand) + if (H.active_hand % 2) temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) to_chat(H, "You can't use your [temp.name]") diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 977305cf1b4e..ead7f2ad9049 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -30,7 +30,7 @@ var/mob/living/carbon/human/H = user if(istype(H)) var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - if(H.hand) + if(H.active_hand % 2) temp = H.organs_by_name["l_hand"] if(!temp || !temp.is_usable()) to_chat(H, "You can't use your hand.") diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a8a00493701c..a103920aa386 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -454,7 +454,7 @@ meteor_act /mob/living/carbon/human/proc/can_catch(var/obj/O) if(!get_active_held_item()) // If active hand is empty var/obj/item/organ/external/temp = organs_by_name["r_hand"] - if (hand) + if (active_hand % 2) temp = organs_by_name["l_hand"] if(temp && !temp.is_usable()) return FALSE // The hand isn't working in the first place diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 3602f2732317..ab491dccdfd4 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -148,7 +148,7 @@ else remove_movespeed_modifier(/datum/movespeed_modifier/mob_inventory_carry) -//* hard movespeed slowdown +//* Movespeed *// /mob/living/update_item_slowdown() var/tally = get_item_slowdown() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 7425c08dc056..00c53c68c3f4 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -117,7 +117,7 @@ /// our abilities - set to list of paths to init to intrinsic abilities. var/list/datum/ability/abilities - //? Inventory + //* Inventory *// /// our inventory datum, if any. var/datum/inventory/inventory /// inventory hud used diff --git a/code/modules/vore/fluffstuff/custom_guns.dm b/code/modules/vore/fluffstuff/custom_guns.dm index 28c62cdf1c09..0e89fecbad1a 100644 --- a/code/modules/vore/fluffstuff/custom_guns.dm +++ b/code/modules/vore/fluffstuff/custom_guns.dm @@ -57,7 +57,7 @@ /obj/item/gun/ballistic/automatic/battlerifle/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/battlerifle/update_icon_state() . = ..() From e524c11e616bada0318fe2345b131f15a798b069 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 16 Jul 2024 18:00:23 -0400 Subject: [PATCH 046/140] fix --- code/datums/components/items/wielding.dm | 4 ++-- code/datums/components/riding/riding_filter.dm | 2 +- code/game/objects/items.dm | 2 +- code/game/objects/items/stacks/medical.dm | 4 ++-- code/modules/mob/inventory/inventory.dm | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/datums/components/items/wielding.dm b/code/datums/components/items/wielding.dm index 1294b37e5b26..e3ff1e77bbef 100644 --- a/code/datums/components/items/wielding.dm +++ b/code/datums/components/items/wielding.dm @@ -1,7 +1,7 @@ // todo: can element this by usign 3 signals instead of 2, one to receive a keybind signal. /datum/component/wielding registered_type = /datum/component/wielding - + /// hands needed var/hands /// lazylist @@ -45,7 +45,7 @@ /datum/component/wielding/proc/wield(mob/wielder) if(src.wielder) return - var/possible = wielder.get_number_of_hands() + var/possible = wielder.get_nominal_hand_count() var/wanted = hands - 1 if(possible < wanted) return diff --git a/code/datums/components/riding/riding_filter.dm b/code/datums/components/riding/riding_filter.dm index 464e7c9f7fab..e7bc2c34aec3 100644 --- a/code/datums/components/riding/riding_filter.dm +++ b/code/datums/components/riding/riding_filter.dm @@ -210,7 +210,7 @@ ASSERT(islist(offhands)) var/amount_needed = rider_offhands_needed(rider, semantic) if(!offhand_requirements_are_rigid) - amount_needed = min(amount_needed, rider.get_number_of_hands()) + amount_needed = min(amount_needed, rider.get_nominal_hand_count()) if(!amount_needed) return TRUE for(var/i in 1 to amount_needed) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0b7b77f4bc74..8ff896dcad29 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1098,7 +1098,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if (hasorgans(user)) var/mob/living/carbon/human/H = user var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] - if (H.hand) + if (H.active_hand % 2) temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) to_chat(user, "You try to move your [temp.name], but cannot!") diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index e39b4b3fb6c8..50b057d55690 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -384,8 +384,8 @@ if (M != user) user.visible_message("[user] starts to apply \the [src] to [M]'s [limb].", "You start to apply \the [src] to [M]'s [limb].", "You hear something being wrapped.") else - if(( !H.hand && (affecting.organ_tag in list(BP_R_ARM, BP_R_HAND)) || \ - H.hand && (affecting.organ_tag in list(BP_L_ARM, BP_L_HAND)) )) + if(( !(H.active_hand % 2) && (affecting.organ_tag in list(BP_R_ARM, BP_R_HAND)) || \ + (H.active_hand % 2) && (affecting.organ_tag in list(BP_L_ARM, BP_L_HAND)) )) to_chat(user, "You can't apply a splint to the arm you're using!") return user.visible_message("[user] starts to apply \the [src] to their [limb].", "You start to apply \the [src] to your [limb].", "You hear something being wrapped.") diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 7c2514ccaff2..203ba9d01de5 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -206,7 +206,7 @@ var/list/obj/item/affected switch(bodypart) if(BP_HEAD) - affected = items_by( + affected = items_by_slot_id( SLOT_ID_HEAD, SLOT_ID_LEFT_EAR, SLOT_ID_RIGHT_EAR, From 3f4055a1b602c46c823d27043fec554d664f498f Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 28 Jul 2024 18:50:05 -0400 Subject: [PATCH 047/140] sigh --- code/__DEFINES/screen.dm | 36 ++++++++------------- code/modules/vehicles/sealed/mecha/mecha.dm | 26 --------------- 2 files changed, 14 insertions(+), 48 deletions(-) diff --git a/code/__DEFINES/screen.dm b/code/__DEFINES/screen.dm index 98fd11a04f87..17c616e24cd1 100644 --- a/code/__DEFINES/screen.dm +++ b/code/__DEFINES/screen.dm @@ -26,6 +26,20 @@ //* Mob HUD screen object positions //* These should be widescreen-agnostic and use anchorings to the sides of the screen / center. +//Pop-up inventory +#define ui_shoes "LEFT+1:8,BOTTOM:5" + +#define ui_iclothing "LEFT:6,BOTTOM+1:7" +#define ui_oclothing "LEFT+1:8,BOTTOM+1:7" +#define ui_gloves "LEFT+2:10,BOTTOM+1:7" + +#define ui_glasses "LEFT:6,BOTTOM+2:9" +#define ui_mask "LEFT+1:8,BOTTOM+2:9" +#define ui_l_ear "LEFT+2:10,BOTTOM+2:9" +#define ui_r_ear "LEFT+2:10,BOTTOM+3:11" + +#define ui_head "LEFT+1:8,BOTTOM+3:11" + /// Hands #define SCREEN_LOC_INV_HAND(index) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" @@ -141,20 +155,6 @@ //#define ui_wiz_instability_display "RIGHT-2:28,CENTER-3:15" #define ui_wiz_instability_display "RIGHT-1:28,TOP-2:27" -//Pop-up inventory -#define ui_shoes "LEFT+1:8,BOTTOM:5" - -#define ui_iclothing "LEFT:6,BOTTOM+1:7" -#define ui_oclothing "LEFT+1:8,BOTTOM+1:7" -#define ui_gloves "LEFT+2:10,BOTTOM+1:7" - -#define ui_glasses "LEFT:6,BOTTOM+2:9" -#define ui_mask "LEFT+1:8,BOTTOM+2:9" -#define ui_l_ear "LEFT+2:10,BOTTOM+2:9" -#define ui_r_ear "LEFT+2:10,BOTTOM+3:11" - -#define ui_head "LEFT+1:8,BOTTOM+3:11" - //Intent small buttons #define ui_help_small "RIGHT-3:8,BOTTOM:1" #define ui_disarm_small "RIGHT-3:15,BOTTOM:18" @@ -163,17 +163,9 @@ //#define ui_swapbutton "6:-16,1:5" //Unused -//#define ui_headset "BOTTOM,8" -#define ui_hand "CENTER-1:14,BOTTOM:5" -#define ui_hstore1 "CENTER-2,CENTER-2" -//#define ui_resist "RIGHT+1,BOTTOM-1" #define ui_sleep "RIGHT+1,TOP-13" #define ui_rest "RIGHT+1,TOP-14" - -#define ui_iarrowleft "BOTTOM-1,RIGHT-4" -#define ui_iarrowright "BOTTOM-1,RIGHT-2" - #define ui_spell_master "RIGHT-1:16,TOP-1:16" #define ui_genetic_master "RIGHT-1:16,TOP-2:16" #define ui_ability_master "RIGHT-1:16,TOP-3:16" diff --git a/code/modules/vehicles/sealed/mecha/mecha.dm b/code/modules/vehicles/sealed/mecha/mecha.dm index 73919f388592..d49d1d2f09ee 100644 --- a/code/modules/vehicles/sealed/mecha/mecha.dm +++ b/code/modules/vehicles/sealed/mecha/mecha.dm @@ -562,32 +562,6 @@ occupant_legacy << browse(src.get_stats_html(), "window=exosuit") -//////////////////////////// -///// Action processing //// -//////////////////////////// -/* -/atom/DblClick(object,location,control,params) - var/mob/M = src.mob - if(M && M.in_contents_of(/obj/vehicle/sealed/mecha)) - - if(mech_click == world.time) return - mech_click = world.time - - if(!istype(object, /atom)) return - if(istype(object, /atom/movable/screen)) - var/atom/movable/screen/using = object - if(using.screen_loc == ui_acti || using.screen_loc == ui_iarrowleft || using.screen_loc == ui_iarrowright)//ignore all HUD objects save 'intent' and its arrows - return ..() - else - return - var/obj/vehicle/sealed/mecha/Mech = M.loc - spawn() //this helps prevent clickspam fest. - if (Mech) - Mech.click_action(object,M) -// else -// return ..() -*/ - /obj/vehicle/sealed/mecha/proc/click_action(atom/target,mob/user, params) if(!src.occupant_legacy || src.occupant_legacy != user ) return if(user.stat) return From 0d2ba3d79732301930a06d7b1f1172f8036b1fdc Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 5 Aug 2024 18:27:43 +0000 Subject: [PATCH 048/140] changes --- citadel.dme | 1 + code/game/rendering/mob_huds/inventory.dm | 43 +---------- .../rendering/mob_huds/inventory_hands.dm | 77 +++++++++++++++++++ code/modules/mob/inventory/inventory.dm | 3 + code/modules/mob/inventory/mob/hands.dm | 7 ++ code/modules/mob/inventory/mob/stripping.dm | 6 +- code/modules/mob/living/inventory.dm | 11 --- 7 files changed, 95 insertions(+), 53 deletions(-) create mode 100644 code/game/rendering/mob_huds/inventory_hands.dm diff --git a/citadel.dme b/citadel.dme index 06a5f29bfb7b..1d87162120cd 100644 --- a/citadel.dme +++ b/citadel.dme @@ -1930,6 +1930,7 @@ #include "code\game\rendering\legacy\inventory\inventory.dm" #include "code\game\rendering\legacy\objects\waypoint_tracker.dm" #include "code\game\rendering\mob_huds\inventory.dm" +#include "code\game\rendering\mob_huds\inventory_hands.dm" #include "code\game\rendering\mob_huds\mob_hud.dm" #include "code\game\rendering\parallax\parallax.dm" #include "code\game\rendering\parallax\parallax_holder.dm" diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index ae6d36e13518..7eebd247fb8d 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -1,17 +1,12 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 silicons *// +/** + * Inventory slots specifically, not hands. + */ /datum/mob_hud/inventory /// owning inventory var/datum/inventory/host - /// ordered hand objects - var/list/atom/movable/screen/inventory/hand/hands - /// swap hand object - var/atom/movable/screen/inventory/swap_hand/swap_hand - /// equip object - var/atom/movable/screen/inventory/equip_hand/equip_hand - /// use hand on self object - var/atom/movable/screen/inventory/use_self_hand/use_self_hand /datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) @@ -45,33 +40,3 @@ * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. */ /atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) - -#warn impl all - -/atom/movable/screen/inventory/hand - /// target hand index - var/hand_index - -/atom/movable/screen/inventory/hand/Initialize(mapload, datum/inventory/host, hand_index) - . = ..() - src.hand_index = hand_index - sync_index(hand_index) - -/atom/movable/screen/inventory/hand/proc/sync_index(index = hand_index) - screen_loc = SCREEN_LOC_INV_HAND(index) - var/index_of_side = round(index / 2) - name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" - icon_state = "hand-[index % 2? "left" : "right"]" - -/atom/movable/screen/inventory/swap_hand - icon_state = "swap" - -/atom/movable/screen/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) - icon = style.inventory_icons_wide - alpha = style_alpha - color = style_color - -/atom/movable/screen/inventory/equip_hand - icon_state = "equip" - -// /atom/movable/screen/inventory/use_self_hand diff --git a/code/game/rendering/mob_huds/inventory_hands.dm b/code/game/rendering/mob_huds/inventory_hands.dm new file mode 100644 index 000000000000..371f48fcd657 --- /dev/null +++ b/code/game/rendering/mob_huds/inventory_hands.dm @@ -0,0 +1,77 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +/datum/mob_hud/hands + /// ordered hand objects + var/list/atom/movable/screen/hands/hand/hands + /// swap hand object + var/atom/movable/screen/hands/swap_hand/swap_hand + /// equip object + var/atom/movable/screen/hands/equip_hand/equip_hand + /// use hand on self object + var/atom/movable/screen/hands/use_self_hand/use_self_hand + +/datum/mob_hud/hands/proc/add_item(obj/item/item, index) + +/datum/mob_hud/hands/proc/remove_item(obj/item/item, index) + +/datum/mob_hud/hands/proc/move_item(obj/item/item, from_index, to_index) + +#warn impl all + +/atom/movable/screen/hands + name = "inventory" + icon = 'icons/screen/hud/midnight/inventory.dmi' + + /// our owning mob hud + var/datum/mob_hud/hands/hud + +/atom/movable/screen/hands/Initialize(mapload, datum/mob_hud/hands/hud) + . = ..() + src.hud = hud + sync_style(hud.style) + +/atom/movable/screen/hands/sync_style(datum/hud_style/style, style_alpha, style_color) + icon = style.inventory_icons + alpha = style_alpha + color = style_color + +/** + * handle an inventory operation + * + * @params + * * user - clicking user; not necessarily the inventory's owner + * * slot_or_index - slot ID or numerical hand index + * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. + */ +/atom/movable/screen/hands/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) + +#warn impl all + +/atom/movable/screen/hands/hand + /// target hand index + var/hand_index + +/atom/movable/screen/hands/hand/Initialize(mapload, datum/inventory/host, hand_index) + . = ..() + src.hand_index = hand_index + sync_index(hand_index) + +/atom/movable/screen/hands/hand/proc/sync_index(index = hand_index) + screen_loc = SCREEN_LOC_INV_HAND(index) + var/index_of_side = round(index / 2) + name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" + icon_state = "hand-[index % 2? "left" : "right"]" + +/atom/movable/screen/hands/swap_hand + icon_state = "swap" + +/atom/movable/screen/hands/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) + icon = style.inventory_icons_wide + alpha = style_alpha + color = style_color + +/atom/movable/screen/hands/equip_hand + icon_state = "equip" + +// /atom/movable/screen/hands/use_self_hand diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 203ba9d01de5..4e1a81210e55 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -3,6 +3,9 @@ /** * mob inventory data goes in here. + * + * * this does not include hands; that's handled mob-side. + * * this only includes inventory slots. */ /datum/inventory //* Basics *// diff --git a/code/modules/mob/inventory/mob/hands.dm b/code/modules/mob/inventory/mob/hands.dm index 533bcbb2ddd5..fbb0825fbbd0 100644 --- a/code/modules/mob/inventory/mob/hands.dm +++ b/code/modules/mob/inventory/mob/hands.dm @@ -298,6 +298,13 @@ //* Abstraction *// +/** + * gets if we have any hands at all + */ +/mob/proc/has_hands() + SHOULD_NOT_OVERRIDE(TRUE) + return !!!get_nominal_hand_count() + /** * get number of physical hands / arms / whatever that we have and should check for * diff --git a/code/modules/mob/inventory/mob/stripping.dm b/code/modules/mob/inventory/mob/stripping.dm index 5c0ad6ce40e3..8d21790c15dc 100644 --- a/code/modules/mob/inventory/mob/stripping.dm +++ b/code/modules/mob/inventory/mob/stripping.dm @@ -78,7 +78,7 @@ // now for hands if(has_hands()) - for(var/i in 1 to get_number_of_hands()) + for(var/i in 1 to get_nominal_hand_count()) switch(i) if(1) . += "Left hand: " @@ -136,7 +136,7 @@ if(!strip_interaction_prechecks(user)) return FALSE - if((index < 1) || (index > get_number_of_hands())) + if((index < 1) || (index > get_nominal_hand_count())) return FALSE var/obj/item/ours = get_held_item_of_index(index) @@ -247,7 +247,7 @@ . = attempt_slot_strip(user, slot) if("hand") var/index = text2num(href_list["id"]) - if(!index || (index < 1) || (index > get_number_of_hands())) + if(!index || (index < 1) || (index > get_nominal_hand_count())) return . = attempt_hand_strip(user, index) // option mob diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index ab491dccdfd4..b0c8fa3689d0 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -1,17 +1,6 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2023 Citadel Station developers. *// -/mob/living/get_number_of_hands() - return 2 - -/mob/living/get_number_of_hands() - return has_hands? 2 : 0 - -/mob/living/has_hands() - return has_hands - -#warn parse above - //* Abstraction *// /mob/living/_slot_by_item(obj/item/I) From 263f3cb9bf402d37162fa12634848e7615df2893 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 5 Aug 2024 18:29:59 +0000 Subject: [PATCH 049/140] changes --- citadel.dme | 2 -- code/modules/mob/living/inventory_legacy.dm | 15 --------------- code/modules/species/protean/protean_blob.dm | 4 ++-- code/modules/vore/resizing/resize_vr.dm | 6 +----- 4 files changed, 3 insertions(+), 24 deletions(-) diff --git a/citadel.dme b/citadel.dme index 1d87162120cd..15fd3ea7529b 100644 --- a/citadel.dme +++ b/citadel.dme @@ -255,7 +255,6 @@ #include "code\__DEFINES\mobs\characteristics.dm" #include "code\__DEFINES\mobs\grab.dm" #include "code\__DEFINES\mobs\hands.dm" -#include "code\__DEFINES\mobs\health.dm" #include "code\__DEFINES\mobs\intent.dm" #include "code\__DEFINES\mobs\life.dm" #include "code\__DEFINES\mobs\mobility.dm" @@ -1903,7 +1902,6 @@ #include "code\game\rendering\mob.dm" #include "code\game\rendering\screen.dm" #include "code\game\rendering\screen_legacy.dm" -#include "code\game\rendering\atom_huds\alternate_appearance.dm" #include "code\game\rendering\atom_huds\atom_hud.dm" #include "code\game\rendering\atom_huds\atom_hud_provider.dm" #include "code\game\rendering\atom_huds\legacy.dm" diff --git a/code/modules/mob/living/inventory_legacy.dm b/code/modules/mob/living/inventory_legacy.dm index 45e800055cc5..8e0ed6f2a08c 100644 --- a/code/modules/mob/living/inventory_legacy.dm +++ b/code/modules/mob/living/inventory_legacy.dm @@ -1,18 +1,3 @@ -/mob/living/mode() - set name = "Activate Held Object" - set category = "Object" - set src = usr - - if(world.time <= next_click) // This isn't really a 'click' but it'll work for our purposes. - return - - next_click = world.time + 1 - - if(istype(loc,/obj/mecha)) - return - - get_active_held_item()?.attack_self(src) - /mob/living/abiotic(full_body) if(full_body) if(item_considered_abiotic(wear_mask)) diff --git a/code/modules/species/protean/protean_blob.dm b/code/modules/species/protean/protean_blob.dm index 025de3a40bd3..80b864e03334 100644 --- a/code/modules/species/protean/protean_blob.dm +++ b/code/modules/species/protean/protean_blob.dm @@ -51,7 +51,7 @@ var/obj/item/organ/internal/nano/refactory/refactory var/datum/modifier/healing - var/datum/list/obj/item/previously_held + var/list/datum/weakref/previously_held player_msg = "In this form, you can move a little faster and your health will regenerate as long as you have metal in you!" holder_type = /obj/item/holder/protoblob @@ -323,7 +323,7 @@ var/obj/item/held = held_items[i] if(isnull(held)) continue - prev_held[i] = WEAKREF(held) + previously_held[i] = WEAKREF(held) //languages!! for(var/datum/language/L in languages) blob.add_language(L.name) diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 575893221045..80bc66725b4b 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -125,12 +125,8 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 var/size_diff = M.get_effective_size() - get_effective_size() if(!holder_default && holder_type) holder_default = holder_type - if(!istype(M)) + if(!istype(M) || !M.has_hands()) return FALSE - if(isanimal(M)) - var/mob/living/simple_mob/SA = M - if(!SA.has_hands) - return FALSE if(M.get_active_held_item() && !istype(M.get_active_held_item(), /obj/item/grab)) //scooper's hand is holding something that isn't a grab. to_chat(M, SPAN_WARNING("You can't pick up someone with your occupied hand.")) return TRUE From b2efb24a8ca62e611476c6c61c6b357c362b5e2b Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 5 Aug 2024 18:31:51 +0000 Subject: [PATCH 050/140] there --- code/__DEFINES/dcs/signals/signals_object.dm | 2 +- code/game/click/telekinesis.dm | 2 +- .../content/enigmas/unsorted/deadringer.dm | 2 +- .../game/gamemodes/changeling/powers/armor.dm | 2 +- code/game/gamemodes/cult/ritual.dm | 4 +-- code/game/gamemodes/cult/soulstone.dm | 2 +- code/game/gamemodes/cult/talisman.dm | 2 +- code/game/gamemodes/nuclear/pinpointer.dm | 8 +++--- code/game/gamemodes/technomancer/catalog.dm | 2 +- .../devices/disposable_teleporter.dm | 2 +- .../technomancer/devices/shield_armor.dm | 2 +- .../technomancer/devices/tesla_armor.dm | 2 +- code/game/gamemodes/technomancer/equipment.dm | 2 +- .../game/gamemodes/technomancer/spell_objs.dm | 2 +- code/game/machinery/cell_charger.dm | 2 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/arcade/orion.dm | 2 +- code/game/machinery/newscaster.dm | 2 +- code/game/machinery/pipe/construction.dm | 2 +- code/game/machinery/supplybeacon.dm | 2 +- code/game/machinery/wall_frames.dm | 2 +- code/game/objects/effects/mines.dm | 2 +- code/game/objects/items.dm | 2 +- code/game/objects/items/antag_spawners.dm | 4 +-- code/game/objects/items/balls.dm | 2 +- code/game/objects/items/blueprints.dm | 2 +- code/game/objects/items/bodybag.dm | 2 +- code/game/objects/items/contraband.dm | 6 ++--- code/game/objects/items/devices/PDA/PDA.dm | 4 +-- code/game/objects/items/devices/aicard.dm | 2 +- code/game/objects/items/devices/binoculars.dm | 2 +- .../objects/items/devices/body_snatcher_vr.dm | 2 +- .../objects/items/devices/chameleonproj.dm | 2 +- .../devices/communicator/communicator.dm | 2 +- code/game/objects/items/devices/flash.dm | 4 +-- code/game/objects/items/devices/flashlight.dm | 6 ++--- .../objects/items/devices/floor_painter.dm | 2 +- code/game/objects/items/devices/geiger.dm | 2 +- code/game/objects/items/devices/gps.dm | 2 +- .../game/objects/items/devices/holowarrant.dm | 2 +- .../objects/items/devices/lightreplacer.dm | 2 +- code/game/objects/items/devices/megaphone.dm | 2 +- code/game/objects/items/devices/multitool.dm | 2 +- code/game/objects/items/devices/paicard.dm | 2 +- .../objects/items/devices/pipe_painter.dm | 2 +- .../objects/items/devices/radio/beacon.dm | 2 +- .../items/devices/radio/electropack.dm | 2 +- .../objects/items/devices/radio/jammer.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 2 +- .../game/objects/items/devices/scanners_vr.dm | 2 +- code/game/objects/items/devices/spy_bug.dm | 4 +-- .../objects/items/devices/suit_cooling.dm | 2 +- code/game/objects/items/devices/t_scanner.dm | 2 +- .../devices/tape_recorder/cassette_tape.dm | 2 +- .../devices/tape_recorder/tape_recorder.dm | 2 +- .../objects/items/devices/taperecorder.dm | 4 +-- .../objects/items/devices/text_to_speech.dm | 2 +- .../objects/items/devices/traitordevices.dm | 2 +- .../objects/items/devices/transfer_valve.dm | 2 +- code/game/objects/items/devices/translator.dm | 2 +- code/game/objects/items/devices/tvcamera.dm | 2 +- code/game/objects/items/devices/uplink.dm | 4 +-- code/game/objects/items/devices/whistle.dm | 2 +- code/game/objects/items/gifts.dm | 2 +- code/game/objects/items/glassjar.dm | 2 +- code/game/objects/items/godfigures.dm | 2 +- code/game/objects/items/gunbox.dm | 18 ++++++------- code/game/objects/items/holosign_creator.dm | 4 +-- code/game/objects/items/id_cards/cards.dm | 2 +- code/game/objects/items/id_cards/guest.dm | 2 +- .../objects/items/id_cards/station_ids.dm | 2 +- .../objects/items/id_cards/syndicate_ids.dm | 2 +- code/game/objects/items/inflatables.dm | 2 +- code/game/objects/items/pizza_voucher.dm | 2 +- code/game/objects/items/robot/gripper.dm | 4 +-- .../objects/items/robot/robot_upgrades.dm | 2 +- code/game/objects/items/scanners/atmos.dm | 2 +- code/game/objects/items/scanners/biology.dm | 2 +- code/game/objects/items/scanners/plant.dm | 2 +- .../objects/items/scanners/spectrometer.dm | 2 +- code/game/objects/items/signs.dm | 2 +- code/game/objects/items/spritechanger.dm | 2 +- .../objects/items/stacks/marker_beacons.dm | 2 +- .../game/objects/items/stacks/sheets/glass.dm | 2 +- code/game/objects/items/stacks/telecrystal.dm | 2 +- code/game/objects/items/storage/boxes.dm | 2 +- .../objects/items/storage/misc_legacy/misc.dm | 2 +- .../items/storage/misc_legacy/trinket_box.dm | 2 +- code/game/objects/items/storage/secure.dm | 2 +- code/game/objects/items/tools/crowbar.dm | 2 +- code/game/objects/items/tools/screwdriver.dm | 2 +- code/game/objects/items/tools/switchtool.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 4 +-- code/game/objects/items/tools/wirecutters.dm | 2 +- code/game/objects/items/tools/wrench.dm | 2 +- code/game/objects/items/toys.dm | 26 +++++++++---------- code/game/objects/items/weapons/AI_modules.dm | 10 +++---- code/game/objects/items/weapons/RCD.dm | 4 +-- code/game/objects/items/weapons/RPD.dm | 2 +- code/game/objects/items/weapons/RSF.dm | 2 +- .../objects/items/weapons/barrier_tape.dm | 2 +- code/game/objects/items/weapons/candle.dm | 2 +- .../objects/items/weapons/cigs_lighters.dm | 6 ++--- .../game/objects/items/weapons/clown_items.dm | 2 +- code/game/objects/items/weapons/cosmetics.dm | 6 ++--- code/game/objects/items/weapons/duct_tape.dm | 4 +-- code/game/objects/items/weapons/explosives.dm | 2 +- .../objects/items/weapons/extinguisher.dm | 2 +- .../objects/items/weapons/flamethrower.dm | 2 +- .../objects/items/weapons/gift_wrappaper.dm | 8 +++--- .../items/weapons/grenades/chem_grenade.dm | 2 +- .../objects/items/weapons/grenades/grenade.dm | 2 +- .../items/weapons/implants/implantcircuits.dm | 2 +- .../items/weapons/implants/implanter.dm | 2 +- .../items/weapons/implants/implantpad.dm | 2 +- .../items/weapons/material/chainsaw.dm | 2 +- .../items/weapons/material/gravemarker.dm | 2 +- .../objects/items/weapons/material/knives.dm | 2 +- .../objects/items/weapons/material/misc.dm | 2 +- .../objects/items/weapons/melee/energy.dm | 6 ++--- code/game/objects/items/weapons/melee/misc.dm | 8 +++--- code/game/objects/items/weapons/mop.dm | 2 +- code/game/objects/items/weapons/mop_deploy.dm | 2 +- code/game/objects/items/weapons/nullrod.dm | 4 +-- code/game/objects/items/weapons/other.dm | 6 ++--- code/game/objects/items/weapons/scrolls.dm | 2 +- code/game/objects/items/weapons/shields.dm | 6 ++--- code/game/objects/items/weapons/stunbaton.dm | 2 +- .../objects/items/weapons/swords_axes_etc.dm | 4 +-- code/game/objects/items/weapons/syndie.dm | 2 +- code/game/objects/items/weapons/tanks/tank.dm | 2 +- .../objects/items/weapons/teleportation.dm | 4 +-- code/game/objects/items/weapons/towels.dm | 2 +- code/game/objects/items/weapons/traps.dm | 2 +- code/game/objects/structures/bedsheet_bin.dm | 2 +- .../structures/stool_bed_chair_nest/bed.dm | 4 +-- .../stool_bed_chair_nest/wheelchair.dm | 2 +- code/game/objects/structures/watercloset.dm | 2 +- code/modules/assembly/assembly.dm | 2 +- code/modules/assembly/holder.dm | 2 +- code/modules/assembly/igniter.dm | 2 +- code/modules/assembly/mousetrap.dm | 2 +- code/modules/assembly/shock_kit.dm | 2 +- code/modules/assembly/voice.dm | 2 +- code/modules/catalogue/cataloguer.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 8 +++--- code/modules/clothing/glasses/hud.dm | 6 ++--- code/modules/clothing/gloves/miscellaneous.dm | 2 +- code/modules/clothing/gloves/rings/rings.dm | 6 ++--- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/head/helmet.dm | 6 ++--- code/modules/clothing/head/misc.dm | 4 +-- code/modules/clothing/head/misc_special.dm | 6 ++--- code/modules/clothing/head/pilot_helmet.dm | 2 +- code/modules/clothing/head/soft_caps.dm | 2 +- code/modules/clothing/masks/breath.dm | 2 +- code/modules/clothing/masks/gasmask.dm | 4 +-- code/modules/clothing/masks/miscellaneous.dm | 4 +-- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/clothing/shoes/boots.dm | 2 +- code/modules/clothing/shoes/colour.dm | 2 +- code/modules/clothing/shoes/magboots.dm | 4 +-- code/modules/clothing/spacesuits/void/void.dm | 2 +- code/modules/clothing/suits/armor.dm | 4 +-- code/modules/clothing/suits/medieval_armor.dm | 4 +-- .../clothing/under/accessories/accessory.dm | 8 +++--- .../clothing/under/accessories/armor.dm | 2 +- .../clothing/under/accessories/badges.dm | 6 ++--- .../clothing/under/accessories/clothing.dm | 2 +- .../clothing/under/accessories/lockets.dm | 2 +- .../clothing/under/accessories/permits.dm | 2 +- .../detectivework/tools/evidencebag.dm | 2 +- code/modules/detectivework/tools/rag.dm | 2 +- .../detectivework/tools/sample_kits.dm | 2 +- code/modules/detectivework/tools/uvlight.dm | 2 +- code/modules/economy/items/EFTPOS.dm | 2 +- code/modules/economy/items/cash.dm | 4 +-- code/modules/economy/items/coins.dm | 2 +- code/modules/economy/items/retail_scanner.dm | 2 +- code/modules/fishing/aquarium/aquarium_kit.dm | 2 +- code/modules/fishing/equipment/bait_can.dm | 2 +- code/modules/food/drinks/bottle.dm | 2 +- code/modules/food/drinks/shaker.dm | 2 +- code/modules/food/food/condiment.dm | 2 +- code/modules/food/food/drinks.dm | 2 +- code/modules/food/food/snacks.dm | 8 +++--- code/modules/games/cards.dm | 6 ++--- code/modules/games/dice.dm | 4 +-- code/modules/hardsuits/suits/ert.dm | 2 +- code/modules/holodeck/HolodeckObjects.dm | 2 +- .../modules/hydroponics/beekeeping/beehive.dm | 2 +- code/modules/hydroponics/grown.dm | 2 +- code/modules/hydroponics/seed_machines.dm | 2 +- code/modules/instruments/instruments/item.dm | 2 +- .../integrated_electronics/core/assemblies.dm | 2 +- .../core/assemblies/clothing.dm | 2 +- .../core/assemblies/device.dm | 2 +- .../integrated_electronics/core/detailer.dm | 2 +- .../integrated_electronics/core/printer.dm | 2 +- .../integrated_electronics/core/tools.dm | 6 ++--- .../subtypes/manipulation.dm | 6 ++--- .../integrated_electronics/subtypes/memory.dm | 2 +- .../subtypes/reagents.dm | 2 +- .../integrated_electronics/subtypes/smart.dm | 4 +-- code/modules/library/book.dm | 2 +- code/modules/library/lib_items.dm | 2 +- code/modules/lore_codex/codex.dm | 2 +- code/modules/materials/material_sheets.dm | 2 +- code/modules/media/walkpod.dm | 2 +- code/modules/mining/drilling/scanner.dm | 2 +- code/modules/mining/fulton.dm | 4 +-- code/modules/mining/mine_items.dm | 4 +-- code/modules/mining/resonator.dm | 2 +- code/modules/mining/resonator_vr.dm | 2 +- code/modules/mining/shelter_atoms.dm | 2 +- code/modules/mining/vertibore.dm | 2 +- code/modules/mob/grab.dm | 2 +- code/modules/mob/living/carbon/brain/MMI.dm | 4 +-- .../mob/living/carbon/brain/posibrain.dm | 2 +- code/modules/mob/living/carbon/brain/robot.dm | 2 +- .../silicon/robot/dogborg/dog_modules_vr.dm | 12 ++++----- .../silicon/robot/dogborg/dog_sleeper_vr.dm | 2 +- .../mob/living/silicon/robot/robot_items.dm | 10 +++---- .../subtypes/animal/passive/mouse.dm | 2 +- .../simple_mob/subtypes/animal/pets/cat.dm | 2 +- .../computers/modular_computer/interaction.dm | 2 +- code/modules/multiz/structures/hoist.dm | 2 +- code/modules/nifsoft/nifsoft.dm | 2 +- code/modules/organs/external/external.dm | 2 +- .../organs/internal/species/adherent.dm | 2 +- code/modules/organs/organ.dm | 2 +- code/modules/paperwork/clipboard.dm | 2 +- code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/handlabeler.dm | 2 +- code/modules/paperwork/paper/paper.dm | 2 +- code/modules/paperwork/paper_bundle.dm | 2 +- code/modules/paperwork/paperplane.dm | 2 +- code/modules/paperwork/pen.dm | 8 +++--- code/modules/paperwork/stamps.dm | 2 +- code/modules/photography/camera.dm | 2 +- code/modules/photography/photo.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 2 +- .../guns/energy/kinetic_accelerator.dm | 2 +- .../projectiles/guns/energy/sizegun_vr.dm | 2 +- .../projectiles/guns/energy/special.dm | 2 +- .../projectiles/guns/launcher/crossbow.dm | 2 +- .../guns/launcher/grenade_launcher.dm | 4 +-- .../projectiles/guns/launcher/pneumatic.dm | 2 +- .../projectiles/guns/launcher/syringe_gun.dm | 4 +-- .../projectiles/guns/projectile/automatic.dm | 2 +- .../projectiles/guns/projectile/bow.dm | 2 +- .../projectiles/guns/projectile/contender.dm | 2 +- .../projectiles/guns/projectile/dartgun.dm | 2 +- .../projectiles/guns/projectile/pistol.dm | 2 +- .../projectiles/guns/projectile/rocket.dm | 2 +- .../projectiles/guns/projectile/shotgun.dm | 2 +- .../projectiles/guns/projectile/sniper.dm | 2 +- .../projectile/sniper/collapsible_sniper.dm | 2 +- .../modules/projectiles/magazines/magazine.dm | 2 +- code/modules/reagents/items/hypospray.dm | 2 +- .../reagents/machinery/dispenser/cartridge.dm | 2 +- code/modules/reagents/reagent_containers.dm | 2 +- .../reagent_containers/blood_pack_vr.dm | 2 +- .../reagents/reagent_containers/borghydro.dm | 2 +- .../reagents/reagent_containers/glass.dm | 2 +- .../reagents/reagent_containers/hard_candy.dm | 2 +- .../reagents/reagent_containers/hypospray.dm | 2 +- .../reagents/reagent_containers/organic.dm | 2 +- .../reagents/reagent_containers/spray.dm | 6 ++--- .../reagents/reagent_containers/syringes.dm | 2 +- .../reagent_containers/syringes_vr.dm | 2 +- code/modules/recycling/sortingmachinery.dm | 4 +-- code/modules/resleeving/computers.dm | 2 +- code/modules/resleeving/implant.dm | 2 +- code/modules/resleeving/mirror.dm | 2 +- code/modules/resleeving/sleevecard.dm | 2 +- code/modules/shieldgen/directional_shield.dm | 4 +-- code/modules/shieldgen/handheld_defuser.dm | 2 +- code/modules/shuttles/landmarks.dm | 2 +- code/modules/spells/artifacts.dm | 8 +++--- code/modules/spells/spellbook.dm | 4 +-- code/modules/telesci/bscyrstal.dm | 2 +- code/modules/vehicles/ridden/wheelchair.dm | 2 +- code/modules/vore/eating/leave_remains_vr.dm | 2 +- code/modules/vore/fluffstuff/custom_items.dm | 22 ++++++++-------- .../vore/fluffstuff/custom_items_cit.dm | 2 +- .../modules/vore/fluffstuff/guns/bsharpoon.dm | 2 +- .../guns/cell_loaded/cell_loaded.dm | 2 +- code/modules/vore/fluffstuff/guns/gunsword.dm | 2 +- code/modules/vore/fluffstuff/life_crystals.dm | 2 +- code/modules/vore/resizing/holder_micro_vr.dm | 2 +- code/modules/xenoarcheaology/sampling.dm | 2 +- .../tools/ano_device_battery.dm | 2 +- code/modules/xenoarcheaology/tools/tools.dm | 8 +++--- .../xenoarcheaology/tools/tools_pickaxe.dm | 2 +- code/modules/xenobio/items/slime_objects.dm | 6 ++--- .../xenobio2/machinery/gene_manipulators.dm | 2 +- .../xenobio2/mob/slime/slime_monkey.dm | 2 +- 299 files changed, 436 insertions(+), 436 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 070bace22243..0dc676b257c3 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -13,5 +13,5 @@ // todo: these two shouldn't be here #define COMSIG_ITEM_ATTACK "item_attack" -/// From base of obj/item/attack_self(): (/mob) +/// From base of obj/item/attack_self(mob/user, datum/event_args/actor/e_args) #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" diff --git a/code/game/click/telekinesis.dm b/code/game/click/telekinesis.dm index 9d5c39a795bd..449b8e3ed8b0 100644 --- a/code/game/click/telekinesis.dm +++ b/code/game/click/telekinesis.dm @@ -80,7 +80,7 @@ var/const/tk_maxrange = 15 if(slot != SLOT_ID_HANDS) qdel(src) -/obj/item/tk_grab/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/tk_grab/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/content/enigmas/unsorted/deadringer.dm b/code/game/content/enigmas/unsorted/deadringer.dm index 497b818063fa..8fc55f2bbe52 100644 --- a/code/game/content/enigmas/unsorted/deadringer.dm +++ b/code/game/content/enigmas/unsorted/deadringer.dm @@ -28,7 +28,7 @@ reveal() watchowner = null -/obj/item/deadringer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/deadringer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm index 01a9aa96375f..6fdec472f52f 100644 --- a/code/game/gamemodes/changeling/powers/armor.dm +++ b/code/game/gamemodes/changeling/powers/armor.dm @@ -67,7 +67,7 @@ encumbrance = ITEM_ENCUMBRANCE_CHANGELING_MAGBOOTS encumbrance_on = ITEM_ENCUMBRANCE_CHANGELING_MAGBOOTS_PULSE -/obj/item/clothing/shoes/magboots/changeling/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/shoes/magboots/changeling/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 705a3df8913c..1b2ec6eecdea 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -308,7 +308,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," O.show_message("\The [user] beats \the [L] with \the [src]!", 1) to_chat(target, "You feel searing heat inside!") -/obj/item/book/tome/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/book/tome/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -426,7 +426,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," w_class = WEIGHT_CLASS_SMALL var/cultistsonly = 1 -/obj/item/book/tome/imbued/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/book/tome/imbued/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/cult/soulstone.dm b/code/game/gamemodes/cult/soulstone.dm index f1346cc3ea09..9f93d26a5029 100644 --- a/code/game/gamemodes/cult/soulstone.dm +++ b/code/game/gamemodes/cult/soulstone.dm @@ -36,7 +36,7 @@ ///////////////////Options for using captured souls/////////////////////////////////////// -/obj/item/soulstone/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/soulstone/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 8e5278e1fe3c..0b62953705a0 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -5,7 +5,7 @@ var/uses = 0 info = "


" -/obj/item/paper/talisman/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/paper/talisman/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index c07ca93a10f6..5992cd4d2838 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -13,7 +13,7 @@ var/active = 0 -/obj/item/pinpointer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pinpointer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -64,7 +64,7 @@ var/turf/location = null var/obj/target = null -/obj/item/pinpointer/advpinpointer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pinpointer/advpinpointer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -189,7 +189,7 @@ var/mode = 0 //Mode 0 locates disk, mode 1 locates the shuttle var/obj/machinery/computer/shuttle_control/multi/syndicate/home = null -/obj/item/pinpointer/nukeop/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pinpointer/nukeop/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -278,7 +278,7 @@ var/shuttle_comp_id = null var/obj/machinery/computer/shuttle_control/our_shuttle = null -/obj/item/pinpointer/shuttle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pinpointer/shuttle/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm index 11c4b9edf802..e181954b3aeb 100644 --- a/code/game/gamemodes/technomancer/catalog.dm +++ b/code/game/gamemodes/technomancer/catalog.dm @@ -97,7 +97,7 @@ // Proc: attack_self() // Parameters: 1 (user - the mob clicking on the catalog) // Description: Shows an HTML window, to buy equipment and spells, if the user is the legitimate owner. Otherwise it cannot be used. -/obj/item/technomancer_catalog/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/technomancer_catalog/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm index a2b147ee3f42..6d54be26a74a 100644 --- a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm +++ b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm @@ -26,7 +26,7 @@ . = ..() . += "There are [uses] uses remaining." -/obj/item/disposable_teleporter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/disposable_teleporter/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm index f6de12eb113b..01f821736048 100644 --- a/code/game/gamemodes/technomancer/devices/shield_armor.dm +++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm @@ -73,7 +73,7 @@ playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) return 0 // This shield does not block all damage, so returning 0 is needed to tell the game to apply the new damage. -/obj/item/clothing/suit/armor/shield/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/suit/armor/shield/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/devices/tesla_armor.dm b/code/game/gamemodes/technomancer/devices/tesla_armor.dm index c81ed9a2e3a0..8fdba0b96de5 100644 --- a/code/game/gamemodes/technomancer/devices/tesla_armor.dm +++ b/code/game/gamemodes/technomancer/devices/tesla_armor.dm @@ -52,7 +52,7 @@ return 1 return 0 -/obj/item/clothing/suit/armor/tesla/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/suit/armor/tesla/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm index d0358ff85c40..7f31c4cb89ed 100644 --- a/code/game/gamemodes/technomancer/equipment.dm +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -193,7 +193,7 @@ slot_flags = SLOT_BELT attack_verb = list("beaten", "smashed", "struck", "whacked") -/obj/item/scepter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/scepter/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index 66a5f70f23ca..cba72daf4c98 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -206,7 +206,7 @@ // Proc: attack_self() // Parameters: 1 (user - the Technomancer that invoked this proc) // Description: Tries to call on_use_cast() if it is allowed to do so. Don't override this, override on_use_cast() instead. -/obj/item/spell/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/spell/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 4354571ba259..bac7e93da3c1 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -145,7 +145,7 @@ w_class = WEIGHT_CLASS_NORMAL materials_base = list(MAT_STEEL = 4000, MAT_GLASS = 1000) -/obj/item/cell_charger_kit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/cell_charger_kit/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b29796fd44cf..12bf817260ad 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -525,7 +525,7 @@ var/diskcolor = pick(0,1,2) icon_state = "datadisk[diskcolor]" -/obj/item/disk/data/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/disk/data/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index d642ffacd847..598a23c3f204 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -505,7 +505,7 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events()) else . += SPAN_NOTICE("There's a little switch on the bottom. It's flipped up.") -/obj/item/orion_ship/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/orion_ship/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 97326b56bca6..9f5fcd58bf01 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -811,7 +811,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' -/obj/item/newspaper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/newspaper/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index d314f2b0610e..6be8d2e46699 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -158,7 +158,7 @@ Buildable meters if(dir in GLOB.cornerdirs) setDir(turn(dir, 45)) -/obj/item/pipe/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pipe/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 34f5e0825c8b..c2075d412afa 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -11,7 +11,7 @@ name = "inactive supermatter supply beacon" deploy_path = /obj/machinery/power/supply_beacon/supermatter -/obj/item/supply_beacon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/supply_beacon/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 4815c98be19d..089720da18d2 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -23,7 +23,7 @@ return ..() -/obj/item/frame/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/frame/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index f247e231f413..49c67080d540 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -223,7 +223,7 @@ var/countdown = 10 var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime. -/obj/item/mine/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/mine/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8ff896dcad29..e385460db92b 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -868,7 +868,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. * * @return TRUE to signal to overrides to stop the chain and do nothing. */ -/obj/item/proc/attack_self(mob/user) +/obj/item/proc/attack_self(mob/user, datum/event_args/actor/e_args) // SHOULD_CALL_PARENT(TRUE) // attack_self isn't really part of the item attack chain. SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) diff --git a/code/game/objects/items/antag_spawners.dm b/code/game/objects/items/antag_spawners.dm index fd782602487e..8b1d0137535d 100644 --- a/code/game/objects/items/antag_spawners.dm +++ b/code/game/objects/items/antag_spawners.dm @@ -48,7 +48,7 @@ icon_state = "oldshieldoff" ghost_query_type = /datum/ghost_query/apprentice -/obj/item/antag_spawner/technomancer_apprentice/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/antag_spawner/technomancer_apprentice/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -97,7 +97,7 @@ ghost_query_type = /datum/ghost_query/syndicate_drone var/drone_type = null -/obj/item/antag_spawner/syndicate_drone/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/antag_spawner/syndicate_drone/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/balls.dm b/code/game/objects/items/balls.dm index 16eee008ea05..f42aa5242074 100644 --- a/code/game/objects/items/balls.dm +++ b/code/game/objects/items/balls.dm @@ -27,7 +27,7 @@ 'sound/items/toysqueak3.ogg' ) -/obj/item/toy/tennis/rainbow/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/tennis/rainbow/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index e3f93fa99680..70ea2f0723d0 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -46,7 +46,7 @@ var/can_expand_areas_into = AREA_SPACE // Can expand station areas only into space. var/can_rename_areas_in = AREA_STATION // Only station areas can be reanamed -/obj/item/blueprints/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/blueprints/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index e8edc36bb94f..b2242dd140d0 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -9,7 +9,7 @@ var/bag_type = /obj/structure/closet/body_bag -/obj/item/bodybag/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/bodybag/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm index fcfade6bd2c1..5f52c3b60189 100644 --- a/code/game/objects/items/contraband.dm +++ b/code/game/objects/items/contraband.dm @@ -50,7 +50,7 @@ worth_intrinsic = 200 w_class = WEIGHT_CLASS_HUGE -/obj/item/stolenpackage/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/stolenpackage/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -179,7 +179,7 @@ worth_intrinsic = 350 w_class = WEIGHT_CLASS_HUGE -/obj/item/stolenpackageplus/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/stolenpackageplus/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -245,7 +245,7 @@ w_class = WEIGHT_CLASS_HUGE worth_intrinsic = 400 -/obj/item/mechasalvage/attack_self(mob/user) +/obj/item/mechasalvage/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index dc4a5a78771c..09471495a7de 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -322,7 +322,7 @@ GLOBAL_LIST_EMPTY(PDAs) return 1 -/obj/item/pda/ai/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pda/ai/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -674,7 +674,7 @@ GLOBAL_LIST_EMPTY(PDAs) ui.set_auto_update(auto_update) //NOTE: graphic resources are loaded on client login -/obj/item/pda/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pda/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 5ae1532eddd4..2f351434a94a 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -21,7 +21,7 @@ to_chat(user, "ERROR ERROR ERROR") return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/item/aicard/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/aicard/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index 60a03f9dc019..7dca35046c65 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -12,7 +12,7 @@ //materials_base = list("metal" = 50, MAT_GLASS = 50) -/obj/item/binoculars/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/binoculars/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/body_snatcher_vr.dm b/code/game/objects/items/devices/body_snatcher_vr.dm index 69fc9f8be11b..e67f7f62b33a 100644 --- a/code/game/objects/items/devices/body_snatcher_vr.dm +++ b/code/game/objects/items/devices/body_snatcher_vr.dm @@ -67,7 +67,7 @@ else to_chat(user," A warning pops up on the LED display on the side of the device, informing you that the target is not able to have their mind swapped with!") -/obj/item/bodysnatcher/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/bodysnatcher/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index adab5bdb35ef..eee71d87eb0a 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -24,7 +24,7 @@ . = ..() disrupt() -/obj/item/chameleon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/chameleon/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index abf8f0c3ec74..1cf5e411158d 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -218,7 +218,7 @@ var/global/list/obj/item/communicator/all_communicators = list() // Parameters: 1 (user - the mob that clicked the device in their hand) // Description: Makes an exonet datum if one does not exist, allocates an address for it, maintains the lists of all devies, clears the alert icon, and // finally makes NanoUI appear. -/obj/item/communicator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/communicator/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 396ee6999be7..00e0aa68252f 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -243,7 +243,7 @@ else user.visible_message("[user] fails to blind [M] with the flash!") -/obj/item/flash/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) +/obj/item/flash/attack_self(mob/user, datum/event_args/actor/e_args) if(!user || !clown_check(user)) return @@ -312,7 +312,7 @@ to_chat(user, "The bulb has burnt out!") update_icon() -/obj/item/flash/synthetic/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) +/obj/item/flash/synthetic/attack_self(mob/user, datum/event_args/actor/e_args) ..() if(!broken) broken = 1 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 82e2eecfaa05..613f51d40288 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -116,7 +116,7 @@ /obj/item/flashlight/AltClick(mob/user) attack_self(user) -/obj/item/flashlight/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/flashlight/attack_self(mob/user, datum/event_args/actor/e_args) if(power_use) if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc].") //To prevent some lighting anomalities. @@ -354,7 +354,7 @@ src.damtype = initial(src.damtype) update_appearance() -/obj/item/flashlight/flare/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/flashlight/flare/attack_self(mob/user, datum/event_args/actor/e_args) // Usual checks if(!fuel) @@ -411,7 +411,7 @@ on = FALSE update_appearance() -/obj/item/flashlight/glowstick/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/flashlight/glowstick/attack_self(mob/user, datum/event_args/actor/e_args) if(!fuel) to_chat(user, SPAN_NOTICE("The glowstick has already been turned on.")) diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index 381d0e7835a9..6aea9b141041 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -100,7 +100,7 @@ new painting_decal(F, painting_dir, painting_colour) -/obj/item/floor_painter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/floor_painter/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index 4c014176aae8..c8c93fd3e468 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -131,7 +131,7 @@ current_tick_amount += amount update_appearance() -/obj/item/geiger_counter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/geiger_counter/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index b4a5fcab9b71..3784f0d68881 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -162,7 +162,7 @@ update_icon() visible_message(SPAN_WARNING("[src] clicks, resetting itself from the electromagnetic interference.")) -/obj/item/gps/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gps/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm index 8a7cdc9001d8..51f6a0303ebb 100644 --- a/code/game/objects/items/devices/holowarrant.dm +++ b/code/game/objects/items/devices/holowarrant.dm @@ -22,7 +22,7 @@ to_chat(user, "You have to go closer if you want to read it.") //hit yourself with it -/obj/item/holowarrant/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/holowarrant/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index c316938387c9..fa12909c0670 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -135,7 +135,7 @@ return -/obj/item/lightreplacer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/lightreplacer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 566ee03a6da9..d342201c22d6 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -41,7 +41,7 @@ spamcheck = 0 return -/obj/item/megaphone/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/megaphone/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index a406910eeaa1..58651550fde5 100755 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -46,7 +46,7 @@ return update_icon() -/obj/item/multitool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/multitool/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 330ecf3c6127..cad18f513907 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -41,7 +41,7 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/paicard) QDEL_NULL(radio) return ..() -/obj/item/paicard/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/paicard/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 60fa2a364155..2e3f10d42d6b 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -22,7 +22,7 @@ P.change_color(pipe_colors[mode]) -/obj/item/pipe_painter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pipe_painter/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 00fb89857b66..76cecdc4d668 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -82,7 +82,7 @@ GLOBAL_LIST_BOILERPLATE(all_beacons, /obj/item/radio/beacon) desc = "A label on it reads: Activate to have a singularity beacon teleported to your location." origin_tech = list(TECH_BLUESPACE = 1, TECH_ILLEGAL = 7) -/obj/item/radio/beacon/syndicate/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/radio/beacon/syndicate/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 75904ec4eacb..56561bfc2ea1 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -104,7 +104,7 @@ master.receive_signal() return -/obj/item/radio/electropack/attack_self(mob/user as mob, flag1) +/obj/item/radio/electropack/attack_self(mob/user, datum/event_args/actor/e_args) if(!istype(user, /mob/living/carbon/human)) return diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index 53665803b241..a2b1264ae008 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -78,7 +78,7 @@ var/global/list/active_radio_jammers = list() else return ..() -/obj/item/radio_jammer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/radio_jammer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 6e7b31ccbac4..ac11db1e1a46 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list( radio_controller.remove_object(src, radiochannels[ch_name]) return ..() -/obj/item/radio/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/radio/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/scanners_vr.dm b/code/game/objects/items/devices/scanners_vr.dm index d4b9b1cd28b1..b8ecc76d8ded 100644 --- a/code/game/objects/items/devices/scanners_vr.dm +++ b/code/game/objects/items/devices/scanners_vr.dm @@ -23,7 +23,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob scan_mob(target, user) to_chat(user,"Not a compatible subject to work with!") -/obj/item/sleevemate/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/sleevemate/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index f12de737f047..fd47bfa297db 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -20,7 +20,7 @@ . = ..() camera = new camtype(src) -/obj/item/camerabug/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/camerabug/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -137,7 +137,7 @@ var/obj/machinery/camera/bug/selected_camera var/list/obj/machinery/camera/bug/cameras = new() -/obj/item/bug_monitor/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/bug_monitor/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index 5ceef086cb65..85153c6712af 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -123,7 +123,7 @@ STOP_PROCESSING(SSobj, src) updateicon() -/obj/item/suit_cooling_unit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/suit_cooling_unit/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index b123c6a8e017..e57b6219d0fd 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -26,7 +26,7 @@ /obj/item/t_scanner/AltClick() set_active(!on) -/obj/item/t_scanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/t_scanner/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/tape_recorder/cassette_tape.dm b/code/game/objects/items/devices/tape_recorder/cassette_tape.dm index 2c77e9515064..b7a1f34f90bc 100644 --- a/code/game/objects/items/devices/tape_recorder/cassette_tape.dm +++ b/code/game/objects/items/devices/tape_recorder/cassette_tape.dm @@ -97,7 +97,7 @@ /obj/item/cassette_tape/fire_act() ruin() -/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm index c1600c7747d9..ef6273c401f1 100644 --- a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm +++ b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm @@ -441,7 +441,7 @@ /obj/item/tape_recorder/proc/print_cooldown() TIMER_COOLDOWN_START(src, CD_INDEX_TAPE_PRINT, 30 SECONDS) -/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index c994ce041f7e..e34ae04afa54 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -341,7 +341,7 @@ canprint = 1 -/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -389,7 +389,7 @@ /obj/item/cassette_tape/fire_act() ruin() -/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/text_to_speech.dm b/code/game/objects/items/devices/text_to_speech.dm index 19fd879565b4..41a8202268ea 100644 --- a/code/game/objects/items/devices/text_to_speech.dm +++ b/code/game/objects/items/devices/text_to_speech.dm @@ -8,7 +8,7 @@ var/activated = FALSE var/mob/linked_user -/obj/item/text_to_speech/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/text_to_speech/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 4bf461a56d7e..daf2eaf570c1 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -28,7 +28,7 @@ effective or pretty fucking useless. var/times_used = 0 //Number of times it's been used. var/max_uses = 2 -/obj/item/batterer/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) +/obj/item/batterer/attack_self(mob/user, datum/event_args/actor/e_args) if(!user) return if(times_used >= max_uses) to_chat(user, "The mind batterer has been burnt out!") diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index b11e04998bb4..0d63d5e8892f 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -71,7 +71,7 @@ SStgui.update_uis(src) //Update all UIs attached to src return ..() -/obj/item/transfer_valve/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/transfer_valve/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm index 41a8b14aeee3..479345861ab6 100644 --- a/code/game/objects/items/devices/translator.dm +++ b/code/game/objects/items/devices/translator.dm @@ -88,7 +88,7 @@ var/datum/translation_context/variable/ours = context ours.copy_knowledge(theirs) -/obj/item/universal_translator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/universal_translator/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index abb7163a60ce..692d5518e90a 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -43,7 +43,7 @@ radio.hear_talk(M,msg,verb,speaking) ..() -/obj/item/tvcamera/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/tvcamera/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index 689f8e3cd2b5..c5ec76094447 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -224,7 +224,7 @@ hidden_uplink = new(src, target_mind, telecrystals) icon_state = "radio" -/obj/item/radio/uplink/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/radio/uplink/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -235,7 +235,7 @@ . = ..() hidden_uplink = new(src) -/obj/item/multitool/uplink/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/multitool/uplink/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index ff9bd73a0585..f082f7a7625f 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -28,7 +28,7 @@ to_chat(usr, "You configure the hailer to shout \"[use_message]\".") -/obj/item/hailer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/hailer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/gifts.dm b/code/game/objects/items/gifts.dm index b4e8d0c1f790..e893126d98b9 100644 --- a/code/game/objects/items/gifts.dm +++ b/code/game/objects/items/gifts.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(possible_gifts) . = ..() . += SPAN_NOTICE("It contains \a [initial(contains_type.name)].") -/obj/item/a_gift/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/a_gift/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index c10f3bf556df..d50b89747d60 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -41,7 +41,7 @@ update_icon() return -/obj/item/glass_jar/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/glass_jar/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/godfigures.dm b/code/game/objects/items/godfigures.dm index 1c0a0d78d749..3cbf2eb90923 100644 --- a/code/game/objects/items/godfigures.dm +++ b/code/game/objects/items/godfigures.dm @@ -10,7 +10,7 @@ throw_force = 10 w_class = WEIGHT_CLASS_SMALL -/obj/item/godfig/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/godfig/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/gunbox.dm b/code/game/objects/items/gunbox.dm index cf579f9936ca..6ba1726bafed 100644 --- a/code/game/objects/items/gunbox.dm +++ b/code/game/objects/items/gunbox.dm @@ -5,7 +5,7 @@ icon_state = "gunbox" worth_intrinsic = 350 -/obj/item/gunbox/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gunbox/attack_self(mob/user, datum/event_args/actor/e_args) var/list/options = list() options["NT Mk58 (.45)"] = list(/obj/item/gun/ballistic/sec, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/flash) options["SW 625 Revolver (.45)"] = list(/obj/item/gun/ballistic/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber) @@ -26,7 +26,7 @@ icon_state = "gunbox" worth_intrinsic = 450 -/obj/item/gunbox/lethal/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gunbox/lethal/attack_self(mob/user, datum/event_args/actor/e_args) var/list/options = list() options["M1911 Dynamic (.45)"] = list(/obj/item/gun/ballistic/colt, /obj/item/ammo_magazine/m45, /obj/item/ammo_magazine/m45) options["SW 625 Revolver (.45)"] = list(/obj/item/gun/ballistic/revolver/detective45, /obj/item/ammo_magazine/s45, /obj/item/ammo_magazine/s45) @@ -48,7 +48,7 @@ icon_state = "gunbox" w_class = WEIGHT_CLASS_HUGE -/obj/item/gunbox/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gunbox/attack_self(mob/user, datum/event_args/actor/e_args) var/list/options = list() options[".45 Pistol"] = list(/obj/item/gun/ballistic/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber) options[".45 Revolver"] = list(/obj/item/gun/ballistic/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber) @@ -69,7 +69,7 @@ icon_state = "gunbox" w_class = WEIGHT_CLASS_HUGE -/obj/item/gunbox/marksman/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gunbox/marksman/attack_self(mob/user, datum/event_args/actor/e_args) var/list/options = list() options["Marksman Energy Rifle"] = list(/obj/item/gun/energy/sniperrifle/locked) options["M1A Garand"] = list(/obj/item/gun/ballistic/garand/sniper, /obj/item/storage/belt/security/tactical/bandolier, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter, /obj/item/ammo_magazine/m762garand/sniperhunter) // 7 clips, 56 rounds @@ -89,7 +89,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "donkbox" -/obj/item/gunbox/donksoft/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gunbox/donksoft/attack_self(mob/user, datum/event_args/actor/e_args) var/list/options = list() options["Classic DONKsoft Pistol"] = list(/obj/item/gun/ballistic/pistol/foam, /obj/item/ammo_magazine/mfoam/pistol, /obj/item/ammo_magazine/mfoam/pistol) options["Blue DONKsoft Pistol"] = list(/obj/item/gun/ballistic/pistol/foam/blue, /obj/item/ammo_magazine/mfoam/pistol, /obj/item/ammo_magazine/mfoam/pistol) @@ -109,7 +109,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "donkbox2" -/obj/item/gunbox/donksoft/shotgun/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gunbox/donksoft/shotgun/attack_self(mob/user, datum/event_args/actor/e_args) var/list/options = list() options["Classic DONKsoft Shotgun"] = list(/obj/item/gun/ballistic/shotgun/pump/foam, /obj/item/storage/box/foamdart, /obj/item/storage/box/foamdart) options["Blue DONKsoft Shotgun"] = list(/obj/item/gun/ballistic/shotgun/pump/foam/blue, /obj/item/storage/box/foamdart, /obj/item/storage/box/foamdart) @@ -128,7 +128,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "donkbox3" -/obj/item/gunbox/donksoft/smg/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gunbox/donksoft/smg/attack_self(mob/user, datum/event_args/actor/e_args) var/list/options = list() options["Classic DONKsoft SMG"] = list(/obj/item/gun/ballistic/automatic/advanced_smg/foam, /obj/item/ammo_magazine/mfoam/smg, /obj/item/ammo_magazine/mfoam/smg) options["Blue DONKsoft SMG"] = list(/obj/item/gun/ballistic/automatic/advanced_smg/foam/blue, /obj/item/ammo_magazine/mfoam/smg, /obj/item/ammo_magazine/mfoam/smg) @@ -147,7 +147,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" -/obj/item/gunbox/carrier/blueshield/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gunbox/carrier/blueshield/attack_self(mob/user, datum/event_args/actor/e_args) var/list/options = list() options["\improper Black Carrier"] = list(/obj/item/clothing/suit/storage/hooded/covertcarrier/blueshield) options["\improper Black-Short Carrier"] = list(/obj/item/clothing/suit/storage/hooded/covertcarrier/blueshield/alt) @@ -167,7 +167,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" -/obj/item/gunbox/armor/security/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gunbox/armor/security/attack_self(mob/user, datum/event_args/actor/e_args) var/list/options = list() options["\improper Flat Vest"] = list(/obj/item/clothing/suit/armor/vest) options["\improper Security Vest"] = list(/obj/item/clothing/suit/armor/vest/alt) diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 6d1c11e914c2..b4b64ec28ae5 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -48,7 +48,7 @@ else to_chat(user, "[src] is projecting at max capacity!") -/obj/item/holosign_creator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/holosign_creator/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -114,7 +114,7 @@ holosign_type = /obj/structure/holosign/barrier/cyborg var/shock = 0 -/obj/item/holosign_creator/cyborg/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/holosign_creator/cyborg/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/id_cards/cards.dm b/code/game/objects/items/id_cards/cards.dm index c5a3467204c9..3d44370a5a1c 100644 --- a/code/game/objects/items/id_cards/cards.dm +++ b/code/game/objects/items/id_cards/cards.dm @@ -117,7 +117,7 @@ if(I) icon = I -/obj/item/card_fluff/attack_self() +/obj/item/card_fluff/attack_self(mob/user, datum/event_args/actor/e_args) var/choice = tgui_input_list(usr, "What element would you like to customize?", "Customize Card", list("Band","Stamp","Reset")) if(!choice) return diff --git a/code/game/objects/items/id_cards/guest.dm b/code/game/objects/items/id_cards/guest.dm index e28529260bd7..794423c94daf 100644 --- a/code/game/objects/items/id_cards/guest.dm +++ b/code/game/objects/items/id_cards/guest.dm @@ -65,7 +65,7 @@ . += SPAN_NOTICE("Issuer name: [giver_name]") . += SPAN_NOTICE("Issuer rank: [giver_rank]") -/obj/item/card/id/guest/attack_self(mob/user) +/obj/item/card/id/guest/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/id_cards/station_ids.dm b/code/game/objects/items/id_cards/station_ids.dm index 1dcdfababa21..a249946ff4bf 100644 --- a/code/game/objects/items/id_cards/station_ids.dm +++ b/code/game/objects/items/id_cards/station_ids.dm @@ -183,7 +183,7 @@ dat += "The confidential information flap is closed." return dat -/obj/item/card/id/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/card/id/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/id_cards/syndicate_ids.dm b/code/game/objects/items/id_cards/syndicate_ids.dm index c32f81638e2a..ccec9e0fccb6 100644 --- a/code/game/objects/items/id_cards/syndicate_ids.dm +++ b/code/game/objects/items/id_cards/syndicate_ids.dm @@ -29,7 +29,7 @@ if(player_is_antag(user.mind)) to_chat(user, "The microscanner activates as you pass it over the ID, copying its access.") -/obj/item/card/id/syndicate/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/card/id/syndicate/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/inflatables.dm b/code/game/objects/items/inflatables.dm index 0f8f5be29357..de4cfded0d87 100644 --- a/code/game/objects/items/inflatables.dm +++ b/code/game/objects/items/inflatables.dm @@ -7,7 +7,7 @@ worth_intrinsic = 15 var/deploy_path = /obj/structure/inflatable -/obj/item/inflatable/attack_self(mob/user) +/obj/item/inflatable/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/pizza_voucher.dm b/code/game/objects/items/pizza_voucher.dm index 306d3b6df0aa..476c5ebf438b 100644 --- a/code/game/objects/items/pizza_voucher.dm +++ b/code/game/objects/items/pizza_voucher.dm @@ -20,7 +20,7 @@ "WE ALWAYS DELIVER! WE ALWAYS DELIVER! WE ALWAYS DELIVER!") desc = "A pocket-sized plastic slip with a button in the middle. \"[pick(descstrings)]\" is written on the back." -/obj/item/pizzavoucher/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pizzavoucher/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/robot/gripper.dm b/code/game/objects/items/robot/gripper.dm index 155570eb196a..4c3274540d47 100644 --- a/code/game/objects/items/robot/gripper.dm +++ b/code/game/objects/items/robot/gripper.dm @@ -74,7 +74,7 @@ /obj/item/gripper/CtrlClick(mob/user) drop_item() -/obj/item/gripper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gripper/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -313,7 +313,7 @@ /obj/item/gripper/no_use //Used when you want to hold and put items in other things, but not able to 'use' the item -/obj/item/gripper/no_use/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gripper/no_use/attack_self(mob/user, datum/event_args/actor/e_args) return /obj/item/gripper/no_use/organ/robotics diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index adec597cfb21..768ec94bcfd3 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -39,7 +39,7 @@ item_state = "cyborg_upgrade" var/heldname = "default name" -/obj/item/borg/upgrade/rename/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/borg/upgrade/rename/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/scanners/atmos.dm b/code/game/objects/items/scanners/atmos.dm index fb10b13e407c..52302a0fa080 100644 --- a/code/game/objects/items/scanners/atmos.dm +++ b/code/game/objects/items/scanners/atmos.dm @@ -38,7 +38,7 @@ return atmosanalyzer_scan(src, air, user) -/obj/item/atmos_analyzer/attack_self(mob/user) +/obj/item/atmos_analyzer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/scanners/biology.dm b/code/game/objects/items/scanners/biology.dm index fa90d9bba86c..9a445647c2a5 100644 --- a/code/game/objects/items/scanners/biology.dm +++ b/code/game/objects/items/scanners/biology.dm @@ -31,7 +31,7 @@ user.visible_message("\The [src] spits out a piece of paper.") return -/obj/item/biology_analyzer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/biology_analyzer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/scanners/plant.dm b/code/game/objects/items/scanners/plant.dm index cfb901f01a5d..e17faab556d8 100644 --- a/code/game/objects/items/scanners/plant.dm +++ b/code/game/objects/items/scanners/plant.dm @@ -6,7 +6,7 @@ var/datum/seed/last_seed var/list/last_reagents -/obj/item/plant_analyzer/attack_self(mob/user) +/obj/item/plant_analyzer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/scanners/spectrometer.dm b/code/game/objects/items/scanners/spectrometer.dm index c104792376b4..14e66ff03111 100644 --- a/code/game/objects/items/scanners/spectrometer.dm +++ b/code/game/objects/items/scanners/spectrometer.dm @@ -28,7 +28,7 @@ else icon_state = initial(icon_state) -/obj/item/mass_spectrometer/attack_self(mob/user) +/obj/item/mass_spectrometer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index 23554f33b55b..7ddb8ec5031f 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -27,7 +27,7 @@ else return ..() -/obj/item/picket_sign/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/picket_sign/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/spritechanger.dm b/code/game/objects/items/spritechanger.dm index 17a554376612..4983f8adb02e 100644 --- a/code/game/objects/items/spritechanger.dm +++ b/code/game/objects/items/spritechanger.dm @@ -13,7 +13,7 @@ after the sprite has been set you can use it again to remove overlays that may h var/path var/state -/obj/item/spritechanger/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/spritechanger/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm index fcd58d93d772..5f1b02091165 100644 --- a/code/game/objects/items/stacks/marker_beacons.dm +++ b/code/game/objects/items/stacks/marker_beacons.dm @@ -50,7 +50,7 @@ var/list/marker_beacon_colors = list( /obj/item/stack/marker_beacon/update_icon() icon_state = "[initial(icon_state)][lowertext(picked_color)]" -/obj/item/stack/marker_beacon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/stack/marker_beacon/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 34a3d37b8e00..de1523c64e0f 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -19,7 +19,7 @@ pickup_sound = 'sound/items/pickup/glass.ogg' var/is_reinforced = 0 -/obj/item/stack/material/glass/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/stack/material/glass/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 2cd2d4669671..ba4b8fd3f88d 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -23,7 +23,7 @@ to_chat(user, "There are not enough telecrystals to do that.") return NONE -/obj/item/stack/telecrystal/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/stack/telecrystal/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index b37502e90f1c..9c25471cee5f 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -43,7 +43,7 @@ // todo: implement dynamic state, like how /tg/ boxes work // BubbleWrap - A box can be folded up to make card -/obj/item/storage/box/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/storage/box/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/misc_legacy/misc.dm b/code/game/objects/items/storage/misc_legacy/misc.dm index 4aa010e76c43..95f69ab16287 100644 --- a/code/game/objects/items/storage/misc_legacy/misc.dm +++ b/code/game/objects/items/storage/misc_legacy/misc.dm @@ -99,7 +99,7 @@ ) starts_with = list(/obj/item/pen/crayon/chalk, /obj/item/reagent_containers/pill/nutriment, /obj/item/gps/survival) -/obj/item/storage/box/survival_knife/attack_self(mob/user) +/obj/item/storage/box/survival_knife/attack_self(mob/user, datum/event_args/actor/e_args) return /obj/item/storage/box/papersack diff --git a/code/game/objects/items/storage/misc_legacy/trinket_box.dm b/code/game/objects/items/storage/misc_legacy/trinket_box.dm index db81355671cd..51e1146c9f86 100644 --- a/code/game/objects/items/storage/misc_legacy/trinket_box.dm +++ b/code/game/objects/items/storage/misc_legacy/trinket_box.dm @@ -41,7 +41,7 @@ closed_state = "[initial(icon_state)]" . = ..() -/obj/item/storage/trinketbox/attack_self(mob/user) +/obj/item/storage/trinketbox/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index a3ad536a4009..733b0a13cb6f 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -70,7 +70,7 @@ ..() -/obj/item/storage/secure/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/storage/secure/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 5dfea498b34c..b64d94934d89 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -124,7 +124,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/crowbar/power/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/tool/crowbar/power/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index e17bc6d607fa..bb7f0dde529e 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -178,7 +178,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/screwdriver/power/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/tool/screwdriver/power/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/switchtool.dm b/code/game/objects/items/tools/switchtool.dm index 5a319ae51191..64c29a9f27a9 100644 --- a/code/game/objects/items/tools/switchtool.dm +++ b/code/game/objects/items/tools/switchtool.dm @@ -104,7 +104,7 @@ module_string += "\a [module.name], " return module_string -/obj/item/switchtool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/switchtool/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index ce4ae8bf767e..ca8381fb9bc0 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -151,7 +151,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 50, 1) -/obj/item/weldingtool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/weldingtool/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -746,7 +746,7 @@ item_state = welding ? "crystal_tool_lit" : "crystal_tool" update_worn_icon() -/obj/item/weldingtool/electric/crystal/attack_self(var/mob/living/carbon/human/user) +/obj/item/weldingtool/electric/crystal/attack_self(mob/user, datum/event_args/actor/e_args) if(user.species.name == SPECIES_ADHERENT) if(user.nutrition >= 40) setWelding(!welding, user) diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index af5cd15cc072..45f80938b2e5 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -152,7 +152,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/wirecutters/power/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/tool/wirecutters/power/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 3f11598f9039..f796a5ca39a5 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -156,7 +156,7 @@ QDEL_NULL(counterpart) return ..() -/obj/item/tool/wrench/power/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/tool/wrench/power/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 203391c99231..987f8f138d75 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -272,7 +272,7 @@ var/colorable = TRUE var/rainbow = FALSE -/obj/item/toy/sword/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/sword/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -486,7 +486,7 @@ w_class = WEIGHT_CLASS_TINY slot_flags = SLOT_EARS | SLOT_HOLSTER -/obj/item/toy/bosunwhistle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/bosunwhistle/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -504,7 +504,7 @@ var/cooldown = 0 //all credit to skasi for toy mech fun ideas -/obj/item/toy/prize/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/prize/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -591,7 +591,7 @@ . = ..() desc = "A \"Space Life\" brand [name]" -/obj/item/toy/figure/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/figure/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -856,7 +856,7 @@ playsound(src, bitesound, 20, 1) // Play bite sound in local area // Attack self -/obj/item/toy/plushie/carp/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/plushie/carp/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -968,7 +968,7 @@ var/last_message = 0 var/pokephrase = "Uww!" -/obj/item/toy/plushie/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/plushie/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1434,7 +1434,7 @@ var/cooldown = 0 var/list/possible_answers = list("Definitely.", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.") -/obj/item/toy/eight_ball/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/eight_ball/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1509,7 +1509,7 @@ w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 /* -/obj/item/toy/AI/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/AI/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1531,7 +1531,7 @@ w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 -/obj/item/toy/owl/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/owl/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1552,7 +1552,7 @@ w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 -/obj/item/toy/griffin/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/griffin/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1573,7 +1573,7 @@ w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 -/obj/item/toy/cowgirlprize/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/cowgirlprize/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1594,7 +1594,7 @@ w_class = WEIGHT_CLASS_SMALL var/cooldown = 0 -/obj/item/toy/snakeoilprize/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/toy/snakeoilprize/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1641,7 +1641,7 @@ max_combined_volume = STORAGE_VOLUME_BOX var/last_message = 0 -/obj/item/storage/daki/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/storage/daki/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index d2d2dc7848e6..b81fe6447286 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -130,7 +130,7 @@ AI MODULES desc = "A 'safeguard' AI module: 'Safeguard . Anyone threatening or attempting to harm is no longer to be considered a crew member, and is a threat which must be neutralized.'" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) -/obj/item/aiModule/safeguard/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/aiModule/safeguard/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -159,7 +159,7 @@ AI MODULES desc = "A 'one crew member' AI module: 'Only is a crew member.'" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) //made with diamonds! -/obj/item/aiModule/oneHuman/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/aiModule/oneHuman/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -243,7 +243,7 @@ AI MODULES desc = "A 'freeform' AI module: ''" origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) -/obj/item/aiModule/freeform/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/aiModule/freeform/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -362,7 +362,7 @@ AI MODULES desc = "A 'freeform' Core AI module: ''" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) -/obj/item/aiModule/freeformcore/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/aiModule/freeformcore/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -389,7 +389,7 @@ AI MODULES desc = "A hacked AI law module: ''" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6, TECH_ILLEGAL = 7) -/obj/item/aiModule/syndicate/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/aiModule/syndicate/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 7a672fc6593e..2ed534ab97b3 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -103,7 +103,7 @@ return TRUE // Changes which mode it is on. -/obj/item/rcd/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/rcd/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -363,7 +363,7 @@ /obj/item/rcd/electric/mounted/hardsuit // Old method for swapping modes as there is no way to bring up the radial. -/obj/item/rcd/electric/mounted/hardsuit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/rcd/electric/mounted/hardsuit/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index 8815b3b5a843..0ce98490f6b1 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -106,7 +106,7 @@ // UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) // return ..() -/obj/item/pipe_dispenser/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pipe_dispenser/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 5d8c3863d46d..ace29d176760 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -62,7 +62,7 @@ RSF else glasstype = /obj/item/reagent_containers/food/drinks/metaglass -/obj/item/rsf/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/rsf/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/barrier_tape.dm b/code/game/objects/items/weapons/barrier_tape.dm index 61b52362bada..210a0c83de6a 100644 --- a/code/game/objects/items/weapons/barrier_tape.dm +++ b/code/game/objects/items/weapons/barrier_tape.dm @@ -137,7 +137,7 @@ var/list/tape_roll_applications = list() update_icon() return ..() -/obj/item/barrier_tape_roll/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/barrier_tape_roll/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index 75c983683d3b..daa95f5c9460 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -61,7 +61,7 @@ var/turf/T = loc T.hotspot_expose(700, 5) -/obj/item/flame/candle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/flame/candle/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 66e4c7698e1c..b0837248255c 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -305,7 +305,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM else to_chat(user, "[src] is full.") -/obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user, datum/event_args/actor/e_args) if(lit == 1) if(user.a_intent == INTENT_HARM) user.visible_message("[user] drops and treads on the lit [src], putting it out instantly.") @@ -435,7 +435,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM . = ..() name = "empty [initial(name)]" -/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user, datum/event_args/actor/e_args) if(lit == 1) if(user.a_intent == INTENT_HARM) user.visible_message("[user] empties the lit [src] on the floor!.") @@ -590,7 +590,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM item_state = icon_state base_state = icon_state -/obj/item/flame/lighter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/flame/lighter/attack_self(mob/user, datum/event_args/actor/e_args) if(!base_state) base_state = icon_state if(!lit) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 261c8cc0e768..039f76d8697f 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -69,7 +69,7 @@ /* * Bike Horns */ -/obj/item/bikehorn/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/bikehorn/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 92a46b57c807..374358226f0c 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -56,7 +56,7 @@ colour = pick("red","orange","yellow","jade","cyan","purple","pink","maroon","black","white") name = "[colour] lipstick" -/obj/item/lipstick/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/lipstick/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -102,7 +102,7 @@ icon = 'icons/obj/items.dmi' icon_state = "purplecomb" -/obj/item/haircomb/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/haircomb/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -130,7 +130,7 @@ icon_state = "trinketbox" var/list/ui_users = list() -/obj/item/makeover/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/makeover/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/duct_tape.dm b/code/game/objects/items/weapons/duct_tape.dm index 49404eaee580..6761e90c57b7 100644 --- a/code/game/objects/items/weapons/duct_tape.dm +++ b/code/game/objects/items/weapons/duct_tape.dm @@ -129,7 +129,7 @@ return return ..() -/obj/item/duct_tape_roll/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/duct_tape_roll/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -180,7 +180,7 @@ name = W.name + " (taped)" copy_overlays(W) -/obj/item/duct_tape_piece/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/duct_tape_piece/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index ea45f1292c6e..f01f5e946466 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -38,7 +38,7 @@ else ..() -/obj/item/plastique/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/plastique/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index fe9e73d03431..0574dba848fa 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -49,7 +49,7 @@ . = ..() . += "[icon2html(thing = src, target = user)] [src.name] contains [src.reagents.total_volume] units of water left!" -/obj/item/extinguisher/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/extinguisher/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 9609d1566f2d..c2d61747ecd1 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -123,7 +123,7 @@ return -/obj/item/flamethrower/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/flamethrower/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 14b5c00c246a..e68e7ff6beb4 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -40,7 +40,7 @@ if(!isnull(gift)) . += gift -/obj/item/gift/attack_self(mob/user) +/obj/item/gift/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -74,7 +74,7 @@ qdel(src) -/obj/item/a_gift/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/a_gift/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -143,7 +143,7 @@ pixel_x = rand(-10,10) pixel_y = rand(-10,10) -/obj/item/gift/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gift/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -158,7 +158,7 @@ /obj/item/b_gift/legacy_ex_act() qdel(src) -/obj/item/b_gift/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/b_gift/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 8eb91d6be08c..acb41857ffc2 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -24,7 +24,7 @@ QDEL_LIST_NULL(beakers) return ..() -/obj/item/grenade/chem_grenade/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/grenade/chem_grenade/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index cfc1e486eb82..4f6d198bc4d2 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -53,7 +53,7 @@ . += "The [src] is set for instant detonation." -/obj/item/grenade/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/grenade/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implantcircuits.dm b/code/game/objects/items/weapons/implants/implantcircuits.dm index b4fd6b36b5f8..dc03f5b08f12 100644 --- a/code/game/objects/items/weapons/implants/implantcircuits.dm +++ b/code/game/objects/items/weapons/implants/implantcircuits.dm @@ -45,7 +45,7 @@ else ..() -/obj/item/implant/integrated_circuit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/implant/integrated_circuit/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 2ee0cdd3a220..b94a6ea30c76 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -10,7 +10,7 @@ var/obj/item/implant/imp = null var/active = 1 -/obj/item/implanter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/implanter/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index e3602dc2cda4..f5cae401cd49 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -48,7 +48,7 @@ return -/obj/item/implantpad/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/implantpad/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/chainsaw.dm b/code/game/objects/items/weapons/material/chainsaw.dm index 07a38b9905cb..bfd4e1c25c51 100644 --- a/code/game/objects/items/weapons/material/chainsaw.dm +++ b/code/game/objects/items/weapons/material/chainsaw.dm @@ -58,7 +58,7 @@ on = 0 update_icon() -/obj/item/chainsaw/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/chainsaw/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/gravemarker.dm b/code/game/objects/items/weapons/material/gravemarker.dm index 2de1f1ef5ca9..99d5cbb0e9cd 100644 --- a/code/game/objects/items/weapons/material/gravemarker.dm +++ b/code/game/objects/items/weapons/material/gravemarker.dm @@ -59,7 +59,7 @@ ..() -/obj/item/material/gravemarker/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/material/gravemarker/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 5dab8a5456fa..8343b0095642 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -52,7 +52,7 @@ icon_state = "boxcutter" material_significance = MATERIAL_SIGNIFICANCE_WEAPON_ULTRALIGHT -/obj/item/material/butterfly/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/material/butterfly/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 8c09b7d61d76..e80097be79df 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -95,7 +95,7 @@ w_class = WEIGHT_CLASS_SMALL attack_verb = list("mushed", "splatted", "splooshed", "splushed") // Words that totally exist. -/obj/item/material/snow/snowball/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/material/snow/snowball/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 3c6c740f8252..3a8c3a636724 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -75,7 +75,7 @@ if(!bcell) . += "The blade does not have a power source installed." -/obj/item/melee/energy/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/energy/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -485,7 +485,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/melee/energy/blade/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/energy/blade/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -610,7 +610,7 @@ /obj/item/melee/energy/hfmachete/update_icon() icon_state = "[base_state][active]" -/obj/item/melee/energy/hfmachete/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/energy/hfmachete/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index cee74058df59..4cea071b10fc 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -31,7 +31,7 @@ . = ..() update_icon() -/obj/item/melee/umbrella/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/umbrella/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -250,7 +250,7 @@ if(SA_vulnerability & tm.mob_class) tm.apply_damage(SA_bonus_damage) // fuck em -/obj/item/melee/ashlander/elder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/ashlander/elder/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -331,7 +331,7 @@ return 1 return 0 -/obj/item/melee/twohanded/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/twohanded/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -467,7 +467,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 50, 1) -/obj/item/melee/thermalcutter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/thermalcutter/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index b21777d4894a..71390ba7a9a8 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/mop) create_reagents(30) -/obj/item/mop/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/mop/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/mop_deploy.dm b/code/game/objects/items/weapons/mop_deploy.dm index ebcff139d6ce..e864e3101745 100644 --- a/code/game/objects/items/weapons/mop_deploy.dm +++ b/code/game/objects/items/weapons/mop_deploy.dm @@ -52,7 +52,7 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/mop_deploy/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/mop_deploy/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/nullrod.dm b/code/game/objects/items/weapons/nullrod.dm index 200174557b6e..f23ef6203a74 100644 --- a/code/game/objects/items/weapons/nullrod.dm +++ b/code/game/objects/items/weapons/nullrod.dm @@ -40,7 +40,7 @@ if(SA_vulnerability & tm.mob_class) tm.apply_damage(SA_bonus_damage) // fuck em -/obj/item/nullrod/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/nullrod/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -352,7 +352,7 @@ attack_sound = 'sound/weapons/bite.ogg' var/used_blessing = FALSE -/obj/item/nullrod/carp/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/nullrod/carp/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/other.dm b/code/game/objects/items/weapons/other.dm index 999435bc4ceb..fd08b62cd142 100644 --- a/code/game/objects/items/weapons/other.dm +++ b/code/game/objects/items/weapons/other.dm @@ -84,7 +84,7 @@ flip_mobs() return ..() -/obj/item/bikehorn/golden/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/bikehorn/golden/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -138,7 +138,7 @@ temp_blade.set_active(TRUE) concealed_blade = temp_blade -/obj/item/cane/concealed/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/cane/concealed/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -208,7 +208,7 @@ damage_force = 3 var/on = 0 -/obj/item/cane/whitecane/collapsible/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/cane/whitecane/collapsible/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index f212b6ea39a1..ef3fb571d42a 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -10,7 +10,7 @@ throw_range = 20 origin_tech = list(TECH_BLUESPACE = 4) -/obj/item/teleportation_scroll/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/teleportation_scroll/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 672cba1b442b..7401acbb2d41 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -125,7 +125,7 @@ return ..() return embedded_flash.attack_mob(arglist(args)) -/obj/item/shield/riot/flash/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/shield/riot/flash/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -326,7 +326,7 @@ return (base_block_chance - round(damage / 3)) //block bullets and beams using the old block chance return base_block_chance -/obj/item/shield/energy/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/shield/energy/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -402,7 +402,7 @@ else return 0 */ -/obj/item/shield/riot/tele/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/shield/riot/tele/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index bfd5a6d3e882..e95c92d56a8a 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -114,7 +114,7 @@ else return ..() -/obj/item/melee/baton/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/baton/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index f44384825d69..14366a0ce329 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -57,7 +57,7 @@ drop_sound = 'sound/items/drop/crowbar.ogg' pickup_sound = 'sound/items/pickup/crowbar.ogg' -/obj/item/melee/telebaton/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/telebaton/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -190,7 +190,7 @@ damage_force = 0 attack_sound = "sound/items/bikehorn.ogg" -/obj/item/melee/stool/faiza/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/stool/faiza/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index 6aa663a9b9b3..e0125337424f 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -78,7 +78,7 @@ var/detonator_mode = 0 var/obj/item/syndie/c4explosive/bomb -/obj/item/flame/lighter/zippo/c4detonator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/flame/lighter/zippo/c4detonator/attack_self(mob/user, datum/event_args/actor/e_args) if(!detonator_mode) ..() diff --git a/code/game/objects/items/weapons/tanks/tank.dm b/code/game/objects/items/weapons/tanks/tank.dm index 882c57f2bf44..9cd98b096e47 100644 --- a/code/game/objects/items/weapons/tanks/tank.dm +++ b/code/game/objects/items/weapons/tanks/tank.dm @@ -220,7 +220,7 @@ var/list/global/tank_gauge_cache = list() -/obj/item/tank/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/tank/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 1e5886b52e2e..1ebdb57b74e5 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -23,7 +23,7 @@ origin_tech = list(TECH_MAGNET = 1) materials_base = list(MAT_STEEL = 400) -/obj/item/locator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/locator/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -133,7 +133,7 @@ Frequency: materials_base = list(MAT_STEEL = 10000) preserve_item = 1 -/obj/item/hand_tele/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/hand_tele/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index 783b09f1e110..6014a8f83b79 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -23,7 +23,7 @@ if(SLOT_ID_BELT) sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/clothing/species/teshari/belt.dmi') -/obj/item/towel/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/towel/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index ee487e466ec9..2c1971710d50 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -39,7 +39,7 @@ user.visible_message("[user] is putting the [src.name] on [T.his] head! It looks like [T.hes] trying to commit suicide.") return (BRUTELOSS) -/obj/item/beartrap/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/beartrap/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index d7729c63a71d..bd432d632fcb 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -19,7 +19,7 @@ LINEN BINS drop_sound = 'sound/items/drop/backpack.ogg' pickup_sound = 'sound/items/pickup/backpack.ogg' -/obj/item/bedsheet/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/bedsheet/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index b529b7a89435..298b665c5274 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -262,7 +262,7 @@ drop_sound = 'sound/items/drop/axe.ogg' pickup_sound = 'sound/items/pickup/axe.ogg' -/obj/item/roller/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/roller/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -301,7 +301,7 @@ . = ..() held = new /obj/item/roller(src) -/obj/item/roller_holder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/roller_holder/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 164047ea0b03..2f4da3ca27d2 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -195,7 +195,7 @@ /// What we unfold to var/unfolded_type = /obj/structure/bed/chair/wheelchair -/obj/item/wheelchair/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/wheelchair/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 0218e737908d..d8bb1e82f738 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -131,7 +131,7 @@ reagents.add_reagent("chlorine", 3) reagents.add_reagent("ammonia", 1) -/obj/item/reagent_containers/food/urinalcake/attack_self(mob/living/user) +/obj/item/reagent_containers/food/urinalcake/attack_self(mob/user, datum/event_args/actor/e_args) user.visible_message("[user] squishes [src]!", "You squish [src].", "You hear a squish.") icon_state = "urinalcake_squish" addtimer(VARSET_CALLBACK(src, icon_state, "urinalcake"), 8) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index a7e9112de9be..524b3747e142 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -98,7 +98,7 @@ return -/obj/item/assembly/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/assembly/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 7e545b7d029f..b86d28f6e363 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -108,7 +108,7 @@ else ..() -/obj/item/assembly_holder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/assembly_holder/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index be6d75fc8860..795ffa83708a 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -32,7 +32,7 @@ return TRUE -/obj/item/assembly/igniter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/assembly/igniter/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 406aeed44cad..a649ec583cb4 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -48,7 +48,7 @@ update_icon() pulse(0) -/obj/item/assembly/mousetrap/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/assembly/mousetrap/attack_self(mob/user, datum/event_args/actor/e_args) if(!armed) to_chat(user, "You arm [src].") else diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 1ba8083ce21f..89bd7558d299 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -33,7 +33,7 @@ add_fingerprint(user) return -/obj/item/assembly/shock_kit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/assembly/shock_kit/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 9ce11f99f074..065b33920dbd 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -25,7 +25,7 @@ T.visible_message("[icon2html(thing = src, target = world)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") -/obj/item/assembly/voice/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/assembly/voice/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm index 4dce4d95dc68..fde3cd01275d 100644 --- a/code/modules/catalogue/cataloguer.dm +++ b/code/modules/catalogue/cataloguer.dm @@ -250,7 +250,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers) /obj/item/cataloguer/proc/adjust_points(amount) points_stored = max(0, points_stored += amount) -/obj/item/cataloguer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/cataloguer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index b4c6494bb830..fe6026d07dd0 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -48,7 +48,7 @@ BLIND // can't see anything if(!isnull(vision_modifier)) user.remove_vision_modifier(vision_modifier) -/obj/item/clothing/glasses/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/glasses/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -429,7 +429,7 @@ BLIND // can't see anything flash_protection = FLASH_PROTECTION_MAJOR tint = TINT_HEAVY -/obj/item/clothing/glasses/welding/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/glasses/welding/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -563,7 +563,7 @@ BLIND // can't see anything toggleable = 1 activation_sound = 'sound/effects/pop.ogg' -/obj/item/clothing/glasses/sunglasses/sechud/aviator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/glasses/sunglasses/sechud/aviator/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -682,7 +682,7 @@ BLIND // can't see anything body_cover_flags = EYES species_restricted = list(SPECIES_TESHARI) -/obj/item/clothing/glasses/aerogelgoggles/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/glasses/aerogelgoggles/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 63d3a28e8bb6..a093966670d4 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -111,7 +111,7 @@ name = "[initial(name)]" user.visible_message("[user] deletes the prescription data on the [src.name].") -/obj/item/clothing/glasses/omnihud/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/glasses/omnihud/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -209,7 +209,7 @@ vision_flags = SEE_TURFS //but they can spot breaches. Due to the way HUDs work, they don't provide darkvision up-close the way mesons do. -/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -299,7 +299,7 @@ toggleable = 1 vision_flags = SEE_TURFS //but they can spot breaches. Due to the way HUDs work, they don't provide darkvision up-close the way mesons do. -/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 3c26786bf3b9..c05cb3566e24 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -183,7 +183,7 @@ var/blessed = FALSE -/obj/item/clothing/gloves/swat/para/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/gloves/swat/para/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/gloves/rings/rings.dm b/code/modules/clothing/gloves/rings/rings.dm index 2aa29da30917..6388eea668c9 100644 --- a/code/modules/clothing/gloves/rings/rings.dm +++ b/code/modules/clothing/gloves/rings/rings.dm @@ -6,7 +6,7 @@ icon_state = "diamond" item_state = "diamond_s" -/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -100,7 +100,7 @@ icon_state = "seal-signet" var/nameset = FALSE -/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -124,7 +124,7 @@ item_state = "wedring_g" var/partnername = "" -/obj/item/clothing/gloves/ring/wedding/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/gloves/ring/wedding/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 1eff2464e3ad..b5335c12392a 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -22,7 +22,7 @@ unequip_sound = 'sound/items/drop/hat.ogg' pickup_sound = 'sound/items/pickup/hat.ogg' -/obj/item/clothing/head/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index db423eb5d2ab..6a43deef3f5b 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -67,7 +67,7 @@ valid_accessory_slots = ACCESSORY_SLOT_HELM_R item_action_name = "Toggle Visor" -/obj/item/clothing/head/helmet/riot/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/helmet/riot/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -283,7 +283,7 @@ var/blessed = TRUE -/obj/item/clothing/head/helmet/para/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/helmet/para/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -312,7 +312,7 @@ armor_type = /datum/armor/centcom/ert/paracausal item_action_name = "Enable Wards" -/obj/item/clothing/head/helmet/para/inquisitor/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/helmet/para/inquisitor/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 52c846d7b849..fcdd1fe27aab 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -552,7 +552,7 @@ icon_state = "reindeer0" item_action_name = "Toggle Nose" -/obj/item/clothing/head/reindeer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/reindeer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -694,7 +694,7 @@ worn_render_flags = WORN_RENDER_SLOT_ONE_FOR_ALL item_action_name = "Toggle Hood" -/obj/item/clothing/head/cowl/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/cowl/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index b729a9c011f9..ee958f85744c 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -31,7 +31,7 @@ drop_sound = 'sound/items/drop/helm.ogg' pickup_sound = 'sound/items/pickup/helm.ogg' -/obj/item/clothing/head/welding/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/welding/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -143,7 +143,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 1) -/obj/item/clothing/head/cakehat/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/cakehat/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -171,7 +171,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE cold_protection_cover = HEAD -/obj/item/clothing/head/ushanka/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/ushanka/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/pilot_helmet.dm b/code/modules/clothing/head/pilot_helmet.dm index d1dbca522397..706656829e1a 100644 --- a/code/modules/clothing/head/pilot_helmet.dm +++ b/code/modules/clothing/head/pilot_helmet.dm @@ -188,7 +188,7 @@ icon_state = "pilot_helmet2" item_action_name = "Toggle Visor" -/obj/item/clothing/head/pilot/alt/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/pilot/alt/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index a7dd1cbf0819..2810e357b086 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -12,7 +12,7 @@ flipped=0 ..() -/obj/item/clothing/head/soft/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/soft/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 0562c9a5f1fc..d2280ee1cbf6 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -29,7 +29,7 @@ to_chat(user, "You pull the mask up to cover your face.") update_worn_icon() -/obj/item/clothing/mask/breath/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/mask/breath/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index a835f8891723..3e0a80295bc0 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -80,7 +80,7 @@ set src in usr adjust_mask(usr) -/obj/item/clothing/mask/gas/half/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/mask/gas/half/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -123,7 +123,7 @@ to_chat(user, "Your mask moves to cover your mouth.") return -/obj/item/clothing/mask/gas/swat/vox/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/mask/gas/swat/vox/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 32e335967088..24632d96e520 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -211,7 +211,7 @@ icon_state = "bandblack" item_state_slots = list(SLOT_ID_RIGHT_HAND = "bandblack", SLOT_ID_LEFT_HAND = "bandblack") -/obj/item/clothing/mask/bandana/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/mask/bandana/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(src.icon_state == initial(icon_state)) src.icon_state = "[icon_state]_up" @@ -275,7 +275,7 @@ icon_state = "plainmask" inv_hide_flags = HIDEEARS|HIDEEYES|HIDEFACE -/obj/item/clothing/mask/paper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/mask/paper/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 74d9a90ea86c..8541c81e5d8c 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -104,7 +104,7 @@ else return ..() -/obj/item/clothing/shoes/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/shoes/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return //gtfo my shoe diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index 8dc01455ad01..9726bf584349 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -207,7 +207,7 @@ var/blessed = FALSE -/obj/item/clothing/shoes/boots/swat/para/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/shoes/boots/swat/para/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 3480ec094939..96825abb6acd 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -113,7 +113,7 @@ icon_state = "orange" chained = null -/obj/item/clothing/shoes/orange/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/shoes/orange/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 558cafa05e1a..f2e50e55ca57 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -23,7 +23,7 @@ /obj/item/clothing/shoes/magboots/proc/update_magboot_encumbrance() set_encumbrance(initial(encumbrance) + (magpulse? encumbrance_on : 0)) -/obj/item/clothing/shoes/magboots/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/shoes/magboots/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -80,7 +80,7 @@ item_action_name = "Toggle the magclaws" -/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user, datum/event_args/actor/e_args) if(src.magpulse) clothing_flags &= ~NOSLIP magpulse = 0 diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 165e6a94ccef..ff0582baf9fd 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -285,7 +285,7 @@ to_chat(H, "You deploy your magboots.") // below is code for the action button method. im dumb. but it works? if you figure out a way to make it better tell me // hey peesh i made it better -hatter -/obj/item/clothing/suit/space/void/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/suit/space/void/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index c2026f082a3d..6fc7efcdc467 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -216,7 +216,7 @@ return PROJECTILE_FORCE_MISS return 0 -/obj/item/clothing/suit/armor/reactive/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/suit/armor/reactive/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -774,7 +774,7 @@ var/anti_magic = FALSE var/blessed = FALSE -/obj/item/clothing/suit/armor/vest/para/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/suit/armor/vest/para/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/suits/medieval_armor.dm b/code/modules/clothing/suits/medieval_armor.dm index 876373a94b0e..3ed668f233bc 100644 --- a/code/modules/clothing/suits/medieval_armor.dm +++ b/code/modules/clothing/suits/medieval_armor.dm @@ -32,7 +32,7 @@ icon_state = "paladinhelm" item_action_name = "Toggle Visor" -/obj/item/clothing/head/helmet/medieval/paladin/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/helmet/medieval/paladin/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -178,7 +178,7 @@ icon_state = "paladinhelm" item_action_name = "Toggle Visor" -/obj/item/clothing/head/medievalfake/paladin/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/head/medievalfake/paladin/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 98533a624ece..46919bc9862e 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -386,7 +386,7 @@ slot = ACCESSORY_SLOT_DECOR item_action_name = "Adjust Gaiter" -/obj/item/clothing/accessory/gaiter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/gaiter/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -497,7 +497,7 @@ overlay_state = "choker_cst_overlay" var/customized = 0 -/obj/item/clothing/accessory/choker/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/choker/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -694,7 +694,7 @@ M.afflict_paralyze(20 * 10) return -/obj/item/clothing/accessory/collar/shock/attack_self(mob/user as mob, flag1) +/obj/item/clothing/accessory/collar/shock/attack_self(mob/user, datum/event_args/actor/e_args) if(!istype(user, /mob/living/carbon/human)) return user.set_machine(src) @@ -767,7 +767,7 @@ /obj/item/clothing/accessory/collar/holo/indigestible/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/clothing/accessory/collar/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/collar/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm index 4d0f5c1ed520..e6b07ee0f2ab 100644 --- a/code/modules/clothing/under/accessories/armor.dm +++ b/code/modules/clothing/under/accessories/armor.dm @@ -480,7 +480,7 @@ camera_networks = list(NETWORK_CIV_HELMETS) -/obj/item/clothing/accessory/armor/helmetcamera/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/armor/helmetcamera/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index db791fad1afa..f171c49d3a94 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -28,7 +28,7 @@ /obj/item/clothing/accessory/badge/proc/set_desc(var/mob/living/carbon/human/H) -/obj/item/clothing/accessory/badge/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/badge/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -56,7 +56,7 @@ icon_state = "sheriff" item_state = "goldbadge" -/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -79,7 +79,7 @@ icon_state = "holobadge-cord" slot_flags = SLOT_MASK | SLOT_TIE | SLOT_BELT -/obj/item/clothing/accessory/badge/holo/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/badge/holo/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 9d2419ac710f..bd27d3ff3fe9 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -136,7 +136,7 @@ /obj/item/gun/ballistic, /obj/item/ammo_magazine, /obj/item/melee/baton) item_action_name = "Adjust Cloak" -/obj/item/clothing/accessory/poncho/rough_cloak/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/poncho/rough_cloak/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/lockets.dm b/code/modules/clothing/under/accessories/lockets.dm index e12238fa8292..c964eb8ff628 100644 --- a/code/modules/clothing/under/accessories/lockets.dm +++ b/code/modules/clothing/under/accessories/lockets.dm @@ -11,7 +11,7 @@ var/open var/obj/item/held //Item inside locket. -/obj/item/clothing/accessory/locket/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/locket/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/clothing/under/accessories/permits.dm b/code/modules/clothing/under/accessories/permits.dm index a3243a877332..695a8d1f8a27 100755 --- a/code/modules/clothing/under/accessories/permits.dm +++ b/code/modules/clothing/under/accessories/permits.dm @@ -9,7 +9,7 @@ slot = ACCESSORY_SLOT_MEDAL var/owner = 0 //To prevent people from just renaming the thing if they steal it -/obj/item/clothing/accessory/permit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/permit/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index 15904d6a8caf..e833a3865839 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -72,7 +72,7 @@ stored_item = I set_weight_class(I.w_class) -/obj/item/evidencebag/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/evidencebag/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 2422288026d4..85dc7bc7ea25 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -57,7 +57,7 @@ STOP_PROCESSING(SSobj, src) //so we don't continue turning to ash while gc'd return ..() -/obj/item/reagent_containers/glass/rag/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/glass/rag/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/sample_kits.dm b/code/modules/detectivework/tools/sample_kits.dm index 8c3efd883538..d77d09318923 100644 --- a/code/modules/detectivework/tools/sample_kits.dm +++ b/code/modules/detectivework/tools/sample_kits.dm @@ -60,7 +60,7 @@ icon_state = "fingerprint0" item_state = "paper" -/obj/item/sample/print/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/sample/print/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm index 489db775952e..c02a444d5d43 100644 --- a/code/modules/detectivework/tools/uvlight.dm +++ b/code/modules/detectivework/tools/uvlight.dm @@ -18,7 +18,7 @@ var/on = 0 var/step_alpha = 50 -/obj/item/uv_light/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/uv_light/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/EFTPOS.dm b/code/modules/economy/items/EFTPOS.dm index 191751a811e8..4b6d5f946be2 100644 --- a/code/modules/economy/items/EFTPOS.dm +++ b/code/modules/economy/items/EFTPOS.dm @@ -84,7 +84,7 @@ D.wrapped = R D.name = "small parcel - 'EFTPOS access code'" -/obj/item/eftpos/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/eftpos/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/cash.dm b/code/modules/economy/items/cash.dm index 1f10a70831d1..8c21576a67ba 100644 --- a/code/modules/economy/items/cash.dm +++ b/code/modules/economy/items/cash.dm @@ -85,7 +85,7 @@ update_icon() return worth -/obj/item/spacecash/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/spacecash/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -187,7 +187,7 @@ pickup_sound = 'sound/items/pickup/card.ogg' var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions. -/obj/item/spacecash/ewallet/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/spacecash/ewallet/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/coins.dm b/code/modules/economy/items/coins.dm index a485d2d0c628..5ed1bae38210 100644 --- a/code/modules/economy/items/coins.dm +++ b/code/modules/economy/items/coins.dm @@ -103,7 +103,7 @@ to_chat(user, "You detach the string from the coin.") else ..() -/obj/item/coin/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/coin/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/economy/items/retail_scanner.dm b/code/modules/economy/items/retail_scanner.dm index 6b488109d2cf..5c2ad353f16a 100644 --- a/code/modules/economy/items/retail_scanner.dm +++ b/code/modules/economy/items/retail_scanner.dm @@ -46,7 +46,7 @@ setDir(SOUTH) pixel_y = 0 -/obj/item/retail_scanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/retail_scanner/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index 06d79e6aadd1..059d28c0dd4c 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -18,6 +18,6 @@ icon_state = "construction_kit" w_class = WEIGHT_CLASS_TINY -/obj/item/aquarium_kit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/aquarium_kit/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() to_chat(user, SPAN_NOTICE("There's instruction and tools necessary to build aquarium inside. All you need is to start crafting.")) diff --git a/code/modules/fishing/equipment/bait_can.dm b/code/modules/fishing/equipment/bait_can.dm index ce2ab308ed75..14038a7d8534 100644 --- a/code/modules/fishing/equipment/bait_can.dm +++ b/code/modules/fishing/equipment/bait_can.dm @@ -14,7 +14,7 @@ /// how much it has left; null for infinite var/bait_left = 50 -/obj/item/bait_can/attack_self(mob/user, modifiers) +/obj/item/bait_can/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() var/fresh_bait = retrieve_bait(user) if(fresh_bait) diff --git a/code/modules/food/drinks/bottle.dm b/code/modules/food/drinks/bottle.dm index 72d4ecbfc805..72c9b337136f 100644 --- a/code/modules/food/drinks/bottle.dm +++ b/code/modules/food/drinks/bottle.dm @@ -107,7 +107,7 @@ return ..() -/obj/item/reagent_containers/food/drinks/bottle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/food/drinks/bottle/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/food/drinks/shaker.dm b/code/modules/food/drinks/shaker.dm index 8a425e83ab8f..758972ea4f3c 100644 --- a/code/modules/food/drinks/shaker.dm +++ b/code/modules/food/drinks/shaker.dm @@ -7,7 +7,7 @@ center_of_mass = list("x"=17, "y"=10) -/obj/item/reagent_containers/food/drinks/shaker/attack_self(mob/user) +/obj/item/reagent_containers/food/drinks/shaker/attack_self(mob/user, datum/event_args/actor/e_args) playsound(loc, "sound/items/shaker.ogg", 75, 1, -1) if(prob(50)) diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm index fce40d6280bd..12c1c616b07c 100644 --- a/code/modules/food/food/condiment.dm +++ b/code/modules/food/food/condiment.dm @@ -18,7 +18,7 @@ /obj/item/reagent_containers/food/condiment/attackby(var/obj/item/W as obj, var/mob/user as mob) return -/obj/item/reagent_containers/food/condiment/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/food/condiment/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm index d430d998e622..5fb6629233c4 100644 --- a/code/modules/food/food/drinks.dm +++ b/code/modules/food/food/drinks.dm @@ -25,7 +25,7 @@ price_tag = null return -/obj/item/reagent_containers/food/drinks/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/food/drinks/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index fa78d0d72aac..a16c7c36baca 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -49,7 +49,7 @@ M.put_in_hands(trash) qdel(src) -/obj/item/reagent_containers/food/snacks/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/food/snacks/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1004,7 +1004,7 @@ heated_reagents = list("doctorsdelight" = 5, "hyperzine" = 0.75, "synaptizine" = 0.25) var/has_been_heated = 0 -/obj/item/reagent_containers/food/snacks/donkpocket/sinpocket/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/food/snacks/donkpocket/sinpocket/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1858,7 +1858,7 @@ . = ..() reagents.add_reagent("protein", 10) -/obj/item/reagent_containers/food/snacks/monkeycube/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/food/snacks/monkeycube/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -3298,7 +3298,7 @@ return . = ..() -/obj/item/pizzabox/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pizzabox/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 3b96a63c096f..d8808080f8f6 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -212,7 +212,7 @@ ..() -/obj/item/deck/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/deck/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -275,7 +275,7 @@ pickup_sound = 'sound/items/pickup/paper.ogg' -/obj/item/pack/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pack/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -337,7 +337,7 @@ if(!cards.len) qdel(src) -/obj/item/hand/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/hand/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/games/dice.dm b/code/modules/games/dice.dm index f0e15edc3335..1f90b9ac27f9 100644 --- a/code/modules/games/dice.dm +++ b/code/modules/games/dice.dm @@ -55,7 +55,7 @@ sides = 10 result = 10 -/obj/item/dice/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/dice/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -148,7 +148,7 @@ /obj/item/dice, ) -/obj/item/storage/dicecup/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/storage/dicecup/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/hardsuits/suits/ert.dm b/code/modules/hardsuits/suits/ert.dm index 7f8ba626d738..466047d4937c 100644 --- a/code/modules/hardsuits/suits/ert.dm +++ b/code/modules/hardsuits/suits/ert.dm @@ -153,7 +153,7 @@ /obj/item/hardsuit_module/self_destruct ) -/obj/item/hardsuit/ert/para/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/hardsuit/ert/para/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index e190d7d0ce87..c7f9bf0c5ec1 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -250,7 +250,7 @@ return TRUE return FALSE -/obj/item/holo/esword/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/holo/esword/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index 4a06f6293b10..615514531922 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -228,7 +228,7 @@ icon = 'icons/obj/apiary_bees_etc.dmi' icon_state = "apiary" -/obj/item/beehive_assembly/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/beehive_assembly/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 2b6670063b7e..397c690415a7 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -258,7 +258,7 @@ to_chat(user, "\The [src] has fallen to bits.") qdel(src) -/obj/item/reagent_containers/food/snacks/grown/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/food/snacks/grown/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 994c176dd90e..8267fd540450 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -13,7 +13,7 @@ pixel_x = rand(-5,5) pixel_y = rand(-5,5) -/obj/item/disk/botany/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/disk/botany/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/instruments/instruments/item.dm b/code/modules/instruments/instruments/item.dm index 84126108ae50..e382f333634b 100644 --- a/code/modules/instruments/instruments/item.dm +++ b/code/modules/instruments/instruments/item.dm @@ -50,7 +50,7 @@ user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like they're trying to commit suicide!") return (BRUTELOSS) -/obj/item/instrument/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/instrument/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 9e58b0bd4d8a..69bac3057aa8 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -514,7 +514,7 @@ return TRUE return ..() -/obj/item/electronic_assembly/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/electronic_assembly/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/assemblies/clothing.dm b/code/modules/integrated_electronics/core/assemblies/clothing.dm index 5387ce8fe511..aa309ead7876 100644 --- a/code/modules/integrated_electronics/core/assemblies/clothing.dm +++ b/code/modules/integrated_electronics/core/assemblies/clothing.dm @@ -65,7 +65,7 @@ else ..() -/obj/item/clothing/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/assemblies/device.dm b/code/modules/integrated_electronics/core/assemblies/device.dm index 2685ddfa3852..4d0a2e4d76a4 100644 --- a/code/modules/integrated_electronics/core/assemblies/device.dm +++ b/code/modules/integrated_electronics/core/assemblies/device.dm @@ -39,7 +39,7 @@ if(opened) icon_state = icon_state + "-open" -/obj/item/assembly/electronic_assembly/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/assembly/electronic_assembly/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm index d005b01c5eee..4381cb8c694f 100644 --- a/code/modules/integrated_electronics/core/detailer.dm +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -62,7 +62,7 @@ update_icon() return TRUE -/obj/item/integrated_electronics/detailer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_electronics/detailer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 7737152e9546..f8cc1ec3b0d9 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -174,7 +174,7 @@ dirty_items = TRUE return ..() -/obj/item/integrated_circuit_printer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_circuit_printer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index 8552d82d483f..1ad576b7873b 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -77,7 +77,7 @@ [io.name] are not connected.") return -/obj/item/integrated_electronics/wirer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_electronics/wirer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -115,7 +115,7 @@ var/accepting_refs = FALSE var/copy_values = FALSE -/obj/item/integrated_electronics/debugger/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_electronics/debugger/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -247,7 +247,7 @@ var/datum/integrated_io/selected_io = null var/mode = 0 -/obj/item/multitool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/multitool/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index f3a9683e2dcd..e4ea767fece1 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -291,7 +291,7 @@ set_pin_data(IC_OUTPUT, 4, contents) push_data() -/obj/item/integrated_circuit/manipulation/grabber/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_circuit/manipulation/grabber/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -858,7 +858,7 @@ else ..() -/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -968,7 +968,7 @@ else return ..() -/obj/item/integrated_circuit/manipulation/grenade/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_circuit/manipulation/grenade/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index c05fff4a19b1..fb3f646b10cf 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -80,7 +80,7 @@ var/datum/integrated_io/O = outputs[1] O.push_data() -/obj/item/integrated_circuit/memory/constant/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_circuit/memory/constant/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index d808ef53af08..0e48e781ef10 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -345,7 +345,7 @@ activate_pin(1) activate_pin(3) -/obj/item/integrated_circuit/input/beaker_connector/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_circuit/input/beaker_connector/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index 85f63de84ad0..a1ae4807e124 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -192,7 +192,7 @@ O.brainmob.remote_control=src set_pin_data(IC_OUTPUT, 1, O) -/obj/item/integrated_circuit/input/mmi_tank/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_circuit/input/mmi_tank/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -319,7 +319,7 @@ O.pai.remote_control=src set_pin_data(IC_OUTPUT, 1, O) -/obj/item/integrated_circuit/input/pAI_connector/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/integrated_circuit/input/pAI_connector/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/library/book.dm b/code/modules/library/book.dm index e3d1ff6e231b..ae61a214891c 100644 --- a/code/modules/library/book.dm +++ b/code/modules/library/book.dm @@ -19,7 +19,7 @@ drop_sound = 'sound/items/drop/book.ogg' pickup_sound = 'sound/items/pickup/book.ogg' -/obj/item/book/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/book/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 14ba0c7cda95..43790066cac2 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -223,7 +223,7 @@ var/obj/item/book/book // Currently scanned book var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory -/obj/item/barcodescanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/barcodescanner/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/lore_codex/codex.dm b/code/modules/lore_codex/codex.dm index a10e7cf915f7..97a14fccb06f 100644 --- a/code/modules/lore_codex/codex.dm +++ b/code/modules/lore_codex/codex.dm @@ -12,7 +12,7 @@ tree = new(src, root_type) . = ..() -/obj/item/book/codex/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/book/codex/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index d2a48b452566..90c9d217a187 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -91,7 +91,7 @@ if(M) M.update_strings() return transfer -/obj/item/stack/material/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/stack/material/attack_self(mob/user, datum/event_args/actor/e_args) if(!allow_window_autobuild || !material.build_windows(user, src)) return ..() diff --git a/code/modules/media/walkpod.dm b/code/modules/media/walkpod.dm index 2a0d61520df7..e2b6f68af225 100644 --- a/code/modules/media/walkpod.dm +++ b/code/modules/media/walkpod.dm @@ -77,7 +77,7 @@ else if(loc == L) // at least they're holding it to_chat(L, "Turn on the [src] first.") -/obj/item/device/walkpod/attack_self(mob/living/L) +/obj/item/device/walkpod/attack_self(mob/user, datum/event_args/actor/e_args) if(!istype(L) || loc != L) return if(!listener) diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 3acbd375d1d3..7260be1d4215 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -27,7 +27,7 @@ to_chat(usr, "New scan range set to [scanrange] step(s) around user, including current location.") . = ..() -/obj/item/mining_scanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/mining_scanner/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 2e935bcdbe7a..273644194ff3 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -29,7 +29,7 @@ var/global/list/total_extraction_beacons = list() . = ..() . +="It has [uses_left] use\s remaining." -/obj/item/extraction_pack/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/extraction_pack/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -165,7 +165,7 @@ var/global/list/total_extraction_beacons = list() icon = 'icons/obj/stock_parts.dmi' icon_state = "subspace_amplifier" -/obj/item/fulton_core/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/fulton_core/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 42668a0cf6c4..c202e14e3a6a 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -205,7 +205,7 @@ active = FALSE update_icon() -/obj/item/pickaxe/tyrmalin/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pickaxe/tyrmalin/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -380,7 +380,7 @@ else ..() -/obj/item/stack/flag/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/stack/flag/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mining/resonator.dm b/code/modules/mining/resonator.dm index 0cc39817b035..2c48fa4af183 100644 --- a/code/modules/mining/resonator.dm +++ b/code/modules/mining/resonator.dm @@ -33,7 +33,7 @@ spawn(burst_time) fieldsactive-- -/obj/item/resonator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/resonator/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mining/resonator_vr.dm b/code/modules/mining/resonator_vr.dm index 057db5a9351c..6cc1326edc31 100644 --- a/code/modules/mining/resonator_vr.dm +++ b/code/modules/mining/resonator_vr.dm @@ -37,7 +37,7 @@ spawn(burst_time) fieldsactive-- -/obj/item/resonator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/resonator/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mining/shelter_atoms.dm b/code/modules/mining/shelter_atoms.dm index b55fec8738e3..30f0c1657a1f 100644 --- a/code/modules/mining/shelter_atoms.dm +++ b/code/modules/mining/shelter_atoms.dm @@ -35,7 +35,7 @@ . += "This capsule has the [template.name] stored." . += template.description -/obj/item/survivalcapsule/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/survivalcapsule/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mining/vertibore.dm b/code/modules/mining/vertibore.dm index 3de2dec78de9..5e96bc8e47e9 100644 --- a/code/modules/mining/vertibore.dm +++ b/code/modules/mining/vertibore.dm @@ -71,7 +71,7 @@ return . = ..() -/obj/item/vertibore/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/vertibore/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mob/grab.dm b/code/modules/mob/grab.dm index c2ab49252cbf..8b4831eb64cb 100644 --- a/code/modules/mob/grab.dm +++ b/code/modules/mob/grab.dm @@ -234,7 +234,7 @@ if(!affecting.has_status_effect(/datum/status_effect/sight/blindness)) affecting.apply_status_effect(/datum/status_effect/sight/blindness, 3 SECONDS) -/obj/item/grab/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/grab/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 00e046217f4c..efcd06fd9be6 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -109,7 +109,7 @@ ..() //TODO: ORGAN REMOVAL UPDATE. Make the brain remain in the MMI so it doesn't lose organ data. -/obj/item/mmi/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/mmi/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -249,7 +249,7 @@ H.mind.transfer(brainmob) return -/obj/item/mmi/digital/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/mmi/digital/attack_self(mob/user, datum/event_args/actor/e_args) if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. to_chat(user, "You carefully locate the manual activation switch and start the [src]'s boot process.") diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 1b209d3ca9d5..5c32d8a4cc45 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -33,7 +33,7 @@ if(istype(ghost)) question(ghost) -/obj/item/mmi/digital/posibrain/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/mmi/digital/posibrain/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm index 93533b03ec99..00843d779b9b 100644 --- a/code/modules/mob/living/carbon/brain/robot.dm +++ b/code/modules/mob/living/carbon/brain/robot.dm @@ -29,7 +29,7 @@ to_chat(brainmob, "You feel slightly disoriented. That's normal when you're little more than a complex circuit.") return -/obj/item/mmi/digital/robot/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/mmi/digital/robot/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index c61fd64d8483..b03fb51c1388 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -21,7 +21,7 @@ w_class = WEIGHT_CLASS_NORMAL var/emagged = 0 -/obj/item/dogborg/jaws/small/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/dogborg/jaws/small/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -60,7 +60,7 @@ attack_verb = list("nuzzled", "nosed", "booped") w_class = WEIGHT_CLASS_TINY -/obj/item/dogborg/boop_module/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/dogborg/boop_module/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -190,7 +190,7 @@ if(water.energy < 5) . += "[src] is dry." -/obj/item/dogborg/tongue/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/dogborg/tongue/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -304,7 +304,7 @@ item_flags = ITEM_NOBLUDGEON | ITEM_ENCUMBERS_WHILE_HELD var/enabled = FALSE -/obj/item/pupscrubber/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pupscrubber/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -350,7 +350,7 @@ var/cooldown = 0 var/datum/matter_synth/glass = null -/obj/item/lightreplacer/dogborg/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/lightreplacer/dogborg/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return//Recharger refill is so last season. Now we recycle without magic! @@ -383,7 +383,7 @@ item_flags = ITEM_NOBLUDGEON | ITEM_ENCUMBERS_WHILE_HELD throw_force = 0 -/obj/item/dogborg/pounce/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/dogborg/pounce/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 92a474e23328..2583017f20ad 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -178,7 +178,7 @@ hound = hound.loc hound.cell.charge = hound.cell.charge - amt -/obj/item/dogborg/sleeper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/dogborg/sleeper/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 5fe6ff843c47..96ea0f5a61aa 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -16,7 +16,7 @@ . = ..() files = new /datum/research/techonly(src) //Setup the research data holder. -/obj/item/portable_destructive_analyzer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/portable_destructive_analyzer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -274,7 +274,7 @@ name = "Printing Pen" var/mode = 1 -/obj/item/pen/robopen/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pen/robopen/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -335,7 +335,7 @@ if(istype(target,/obj/structure/table)) deploy_paper(get_turf(target)) -/obj/item/form_printer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/form_printer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -368,7 +368,7 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/borg/combat/shield/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/borg/combat/shield/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -443,7 +443,7 @@ . += "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored." . += "It is set to deploy [mode ? "doors" : "walls"]" -/obj/item/inflatable_dispenser/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/inflatable_dispenser/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 6c68662f01f8..c21139dde972 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -154,7 +154,7 @@ else ..() -/obj/item/holder/mouse/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/holder/mouse/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index c3b60e7d1227..e126dcb41778 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -189,7 +189,7 @@ icon_state = "box" var/cattype = /mob/living/simple_mob/animal/passive/cat -/obj/item/cat_box/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/cat_box/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 9119153a3000..554434e4a562 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -115,7 +115,7 @@ return ..() /// On-click handling. Turns on the computer if it's off and opens the GUI. -/obj/item/modular_computer/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/modular_computer/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/multiz/structures/hoist.dm b/code/modules/multiz/structures/hoist.dm index f019b71bbcd2..a92d10cb72af 100644 --- a/code/modules/multiz/structures/hoist.dm +++ b/code/modules/multiz/structures/hoist.dm @@ -10,7 +10,7 @@ icon = 'icons/obj/hoists.dmi' icon_state = "hoist_case" -/obj/item/hoist_kit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/hoist_kit/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm index ec56c8f52c89..4759502b95e6 100644 --- a/code/modules/nifsoft/nifsoft.dm +++ b/code/modules/nifsoft/nifsoft.dm @@ -277,7 +277,7 @@ return return ..() -/obj/item/disk/nifsoft/compliance/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/disk/nifsoft/compliance/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/organs/external/external.dm b/code/modules/organs/external/external.dm index ed0039e8d9fc..47a938564f7f 100644 --- a/code/modules/organs/external/external.dm +++ b/code/modules/organs/external/external.dm @@ -200,7 +200,7 @@ weapon_descriptor = "electromagnetic overload", ) -/obj/item/organ/external/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/organ/external/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/organs/internal/species/adherent.dm b/code/modules/organs/internal/species/adherent.dm index 859a7babc015..361be6d2af18 100644 --- a/code/modules/organs/internal/species/adherent.dm +++ b/code/modules/organs/internal/species/adherent.dm @@ -35,7 +35,7 @@ action.button_icon_state = "[base_action_state]-[active ? "on" : "off"]" return ..() -/obj/item/organ/internal/powered/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/organ/internal/powered/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 0d5f12f3fdf1..4145fa72c850 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -668,7 +668,7 @@ user.put_in_active_hand(O) qdel(src) -/obj/item/organ/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/organ/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index c933aecafb33..5592cfa64f3d 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -45,7 +45,7 @@ return ..() -/obj/item/clipboard/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clipboard/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 41beb2bc9384..bda1fc300930 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -75,7 +75,7 @@ else return ..() -/obj/item/folder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/folder/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 564689681485..62297918f68b 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -57,7 +57,7 @@ "You label [target] as [label].") target.name = "[target.name] ([label])" -/obj/item/hand_labeler/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/hand_labeler/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/paper/paper.dm b/code/modules/paperwork/paper/paper.dm index 88365063a739..734f71085d1e 100644 --- a/code/modules/paperwork/paper/paper.dm +++ b/code/modules/paperwork/paper/paper.dm @@ -130,7 +130,7 @@ add_fingerprint(usr) return -/obj/item/paper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/paper/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index f6f8f77e09b7..9e517de2d3c9 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -133,7 +133,7 @@ dat += P.html(user) user << browse(dat, "window=[name]") -/obj/item/paper_bundle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/paper_bundle/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 915bd1c6e604..edc479e28029 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -45,7 +45,7 @@ add_overlay(overlays_to_add) -/obj/item/paperplane/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/paperplane/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 1962ba41ca6d..c63e9d77f156 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -36,7 +36,7 @@ /// can we click? var/clickable = TRUE -/obj/item/pen/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pen/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -72,7 +72,7 @@ playsound(src, 'sound/items/penclick.ogg', 50, 1) return -/obj/item/pen/multi/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pen/multi/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -91,7 +91,7 @@ /obj/item/pen/click name = "clicker pen" -/obj/item/pen/click/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pen/click/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -261,7 +261,7 @@ /obj/item/pen/chameleon var/signature = "" -/obj/item/pen/chameleon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pen/chameleon/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index f581abe1b3ec..2ea694bc6086 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -81,7 +81,7 @@ // Syndicate stamp to forge documents. -/obj/item/stamp/chameleon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/stamp/chameleon/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/photography/camera.dm b/code/modules/photography/camera.dm index dd23dffc31a7..e39dccff06e0 100644 --- a/code/modules/photography/camera.dm +++ b/code/modules/photography/camera.dm @@ -27,7 +27,7 @@ size = nsize to_chat(usr, "Camera will now take [size]x[size] photos.") -/obj/item/camera/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/camera/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/photography/photo.dm b/code/modules/photography/photo.dm index dc5ce4302c35..c61e71c1e568 100644 --- a/code/modules/photography/photo.dm +++ b/code/modules/photography/photo.dm @@ -85,7 +85,7 @@ scribble_spans = data["spans"] photograph_id = data["photo"] -/obj/item/photo/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/photo/attack_self(mob/user, datum/event_args/actor/e_args) user.examinate(src) return ..() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 32a9ebf772aa..db8821b2b5b2 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -790,7 +790,7 @@ playsound(loc, selector_sound, 50, 1) return new_mode -/obj/item/gun/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index a44aae0254bd..51e3a1f8939a 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -264,7 +264,7 @@ set_weight_class(WEIGHT_CLASS_SMALL) update_icon() -/obj/item/gun/ballistic/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/ballistic/attack_self(mob/user, datum/event_args/actor/e_args) if(firemodes.len > 1) switch_firemodes(user) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 2d393f7e4e8f..a0fd43a38ec4 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -642,7 +642,7 @@ name = "adjustable tracer bolts" desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color." -/obj/item/ka_modkit/tracer/adjustable/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/ka_modkit/tracer/adjustable/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/energy/sizegun_vr.dm b/code/modules/projectiles/guns/energy/sizegun_vr.dm index 52eeab679b59..1ef1cdb42004 100644 --- a/code/modules/projectiles/guns/energy/sizegun_vr.dm +++ b/code/modules/projectiles/guns/energy/sizegun_vr.dm @@ -27,7 +27,7 @@ . = ..() add_obj_verb(src, /obj/item/gun/energy/sizegun/proc/select_size) -/obj/item/gun/energy/sizegun/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/energy/sizegun/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 66708921e480..f6065de81f46 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -337,7 +337,7 @@ one_handed_penalty = 0 safety_state = GUN_SAFETY_OFF -/obj/item/gun/energy/service/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/energy/service/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm index 4d54b067df3e..eea7ba145890 100644 --- a/code/modules/projectiles/guns/launcher/crossbow.dm +++ b/code/modules/projectiles/guns/launcher/crossbow.dm @@ -84,7 +84,7 @@ update_icon() ..() -/obj/item/gun/launcher/crossbow/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/launcher/crossbow/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index b6357759d4e6..608d5aaf5b0b 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -65,7 +65,7 @@ else to_chat(user, "[src] is empty.") -/obj/item/gun/launcher/grenade/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/launcher/grenade/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -104,7 +104,7 @@ damage_force = 5 max_grenades = 0 -/obj/item/gun/launcher/grenade/underslung/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/launcher/grenade/underslung/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 0e050f0c41b5..f2d0ae6463b7 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -77,7 +77,7 @@ else if(istype(W) && item_storage.obj_storage.can_be_inserted(W)) item_storage.obj_storage.try_insert(W, new /datum/event_args/actor(user)) -/obj/item/gun/launcher/pneumatic/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/launcher/pneumatic/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 78ab532a9acd..13da027ef25a 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -27,7 +27,7 @@ name = "syringe dart" update_icon() -/obj/item/syringe_cartridge/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/syringe_cartridge/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -95,7 +95,7 @@ darts -= next next = null -/obj/item/gun/launcher/syringe/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/launcher/syringe/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 0bf45e94a386..4a6b45f9b53f 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -249,7 +249,7 @@ update_icon() update_worn_icon() -/obj/item/gun/ballistic/automatic/lmg/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/ballistic/automatic/lmg/attack_self(mob/user, datum/event_args/actor/e_args) if(cover_open) toggle_cover(user) //close the cover else diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index 7b2b8018bc69..426c593e50de 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -41,7 +41,7 @@ return update_icon() -/obj/item/gun/ballistic/bow/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/ballistic/bow/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/contender.dm b/code/modules/projectiles/guns/projectile/contender.dm index dfcff1e1b7d9..5cbad1d91826 100644 --- a/code/modules/projectiles/guns/projectile/contender.dm +++ b/code/modules/projectiles/guns/projectile/contender.dm @@ -13,7 +13,7 @@ load_method = SINGLE_CASING heavy = TRUE -/obj/item/gun/ballistic/contender/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/ballistic/contender/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index 3a82a70747f8..07ebae7e75e1 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -136,7 +136,7 @@ for(var/obj/item/reagent_containers/glass/beaker/B in mixing) B.reagents.trans_to_obj(dart, mix_amount) -/obj/item/gun/ballistic/dartgun/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/ballistic/dartgun/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 8ebc1e342003..94ef8dcf9016 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -453,7 +453,7 @@ else icon_state = "ntles-empty" -/obj/item/gun/ballistic/ntles/attack_self(mob/user, obj/item/gun/G) +/obj/item/gun/ballistic/ntles/attack_self(mob/user, datum/event_args/actor/e_args) if(collapsible && !extended) to_chat(user, "You pull out the stock on the [src], steadying the weapon.") set_weight_class(WEIGHT_CLASS_BULKY) diff --git a/code/modules/projectiles/guns/projectile/rocket.dm b/code/modules/projectiles/guns/projectile/rocket.dm index 60e9e56523cf..347b77aecd49 100644 --- a/code/modules/projectiles/guns/projectile/rocket.dm +++ b/code/modules/projectiles/guns/projectile/rocket.dm @@ -93,7 +93,7 @@ else return ..() -/obj/item/gun/ballistic/rocket/collapsible/attack_self(mob/user, obj/item/gun/G) +/obj/item/gun/ballistic/rocket/collapsible/attack_self(mob/user, datum/event_args/actor/e_args) if(collapsed) to_chat(user, "You pull out the tube on the [src], readying the weapon to be fired.") icon_state = "[initial(icon_state)]-extended" diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 51b7f9e44363..4d5d99c86a8e 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -26,7 +26,7 @@ return chambered.get_projectile() return null -/obj/item/gun/ballistic/shotgun/pump/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/ballistic/shotgun/pump/attack_self(mob/user, datum/event_args/actor/e_args) // todo: this breaks other attack self interactions :( if(world.time >= recentpump + 10) pump(user) diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index d5ca4621965a..bf1469170413 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -30,7 +30,7 @@ else icon_state = "heavysniper" -/obj/item/gun/ballistic/heavysniper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/ballistic/heavysniper/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm b/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm index 9d5f0d0c2bdb..7694a6170102 100644 --- a/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm @@ -68,7 +68,7 @@ . = ..() trigger_group = src -/obj/item/sniper_rifle_part/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/sniper_rifle_part/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/projectiles/magazines/magazine.dm b/code/modules/projectiles/magazines/magazine.dm index 0a650c304b39..39bb0b03a5f5 100644 --- a/code/modules/projectiles/magazines/magazine.dm +++ b/code/modules/projectiles/magazines/magazine.dm @@ -99,7 +99,7 @@ update_icon() // This dumps all the bullets right on the floor -/obj/item/ammo_magazine/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/ammo_magazine/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/items/hypospray.dm b/code/modules/reagents/items/hypospray.dm index f6b27dc3a865..66a3353f37a7 100644 --- a/code/modules/reagents/items/hypospray.dm +++ b/code/modules/reagents/items/hypospray.dm @@ -110,7 +110,7 @@ inject_amount = amount usr.action_feedback(SPAN_NOTICE("[src] is now set to inject [amount] per use."), src) -/obj/item/hypospray/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/hypospray/attack_self(mob/user, datum/event_args/actor/e_args) switch(inject_mode) if(HYPOSPRAY_MODE_INJECT) inject_mode = HYPOSPRAY_MODE_SPRAY diff --git a/code/modules/reagents/machinery/dispenser/cartridge.dm b/code/modules/reagents/machinery/dispenser/cartridge.dm index bc38813d0264..d7f932ed0f86 100644 --- a/code/modules/reagents/machinery/dispenser/cartridge.dm +++ b/code/modules/reagents/machinery/dispenser/cartridge.dm @@ -41,7 +41,7 @@ if(!is_open_container()) . += "The cap is sealed." -/obj/item/reagent_containers/cartridge/dispenser/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/cartridge/dispenser/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 01cb775c4e5a..e4c655ff5dd9 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -42,7 +42,7 @@ if(N) amount_per_transfer_from_this = N -/obj/item/reagent_containers/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/blood_pack_vr.dm b/code/modules/reagents/reagent_containers/blood_pack_vr.dm index b7d72c326fad..9e395eea3dc3 100644 --- a/code/modules/reagents/reagent_containers/blood_pack_vr.dm +++ b/code/modules/reagents/reagent_containers/blood_pack_vr.dm @@ -1,4 +1,4 @@ -/obj/item/reagent_containers/blood/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/blood/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index af64fc7e0c18..4fb14cadc4e4 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -94,7 +94,7 @@ add_attack_logs(user, L, "Borg injected with [reagent_ids[mode]]") to_chat(user, "[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining.") -/obj/item/reagent_containers/borghypo/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/borghypo/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return //Change the mode diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index c2ebaadc2529..a5eb82ac9c23 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -61,7 +61,7 @@ base_desc = desc -/obj/item/reagent_containers/glass/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/glass/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/hard_candy.dm b/code/modules/reagents/reagent_containers/hard_candy.dm index cf6cef47076b..859107e502e6 100644 --- a/code/modules/reagents/reagent_containers/hard_candy.dm +++ b/code/modules/reagents/reagent_containers/hard_candy.dm @@ -34,7 +34,7 @@ user.put_in_hands(trash) qdel(src) -/obj/item/reagent_containers/hard_candy/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/hard_candy/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index b7ea0ddd537c..124cd762092b 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -398,7 +398,7 @@ icon_state = "[initial(icon_state)]_used" -/obj/item/reagent_containers/hypospray/glukoz/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/hypospray/glukoz/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/organic.dm b/code/modules/reagents/reagent_containers/organic.dm index efeb3eabbf5d..fea6f9c2c629 100644 --- a/code/modules/reagents/reagent_containers/organic.dm +++ b/code/modules/reagents/reagent_containers/organic.dm @@ -56,7 +56,7 @@ update_icon() -/obj/item/reagent_containers/organic/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/organic/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index bb81fba7bcf8..94c68ee83596 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -69,7 +69,7 @@ D.set_up(my_target, spray_size, 10) return -/obj/item/reagent_containers/spray/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/spray/attack_self(mob/user, datum/event_args/actor/e_args) if(!possible_transfer_amounts) return amount_per_transfer_from_this = next_list_item(amount_per_transfer_from_this, possible_transfer_amounts) @@ -135,7 +135,7 @@ . = ..() . += "The safety is [safety ? "on" : "off"]." -/obj/item/reagent_containers/spray/pepper/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/spray/pepper/attack_self(mob/user, datum/event_args/actor/e_args) safety = !safety to_chat(usr, "You switch the safety [safety ? "on" : "off"].") @@ -241,7 +241,7 @@ . = ..() . += "The tank is [pumped ? "depressurized" : "pressurized"]." -/obj/item/reagent_containers/spray/squirt/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/spray/squirt/attack_self(mob/user, datum/event_args/actor/e_args) pumped = !pumped to_chat(usr, "You pump the handle [pumped ? "to depressurize" : "to pressurize"] the tank.") diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index bacd18931b08..d5f809909a63 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -37,7 +37,7 @@ . = ..() update_icon() -/obj/item/reagent_containers/syringe/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/syringe/attack_self(mob/user, datum/event_args/actor/e_args) switch(mode) if(SYRINGE_DRAW) mode = SYRINGE_INJECT diff --git a/code/modules/reagents/reagent_containers/syringes_vr.dm b/code/modules/reagents/reagent_containers/syringes_vr.dm index e4fe082db63e..86b10fe85c8e 100644 --- a/code/modules/reagents/reagent_containers/syringes_vr.dm +++ b/code/modules/reagents/reagent_containers/syringes_vr.dm @@ -66,7 +66,7 @@ eo.queue_syringe_infection() //Allow for capped syringe mode -/obj/item/reagent_containers/syringe/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/reagent_containers/syringe/attack_self(mob/user, datum/event_args/actor/e_args) switch(mode) if(SYRINGE_CAPPED) mode = SYRINGE_DRAW diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 0cf90df0c8e6..b0cac12657cc 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -129,7 +129,7 @@ var/nameset = 0 var/tag_x -/obj/item/smallDelivery/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/smallDelivery/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -346,7 +346,7 @@ return data -/obj/item/destTagger/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/destTagger/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm index f4edefc7ca14..7664ddb068c6 100644 --- a/code/modules/resleeving/computers.dm +++ b/code/modules/resleeving/computers.dm @@ -431,7 +431,7 @@ icon_state = "cmoemergency" item_state = "card-id" -/obj/item/cmo_disk_holder/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/cmo_disk_holder/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm index 1eaee5fab35e..700c9b6f815b 100644 --- a/code/modules/resleeving/implant.dm +++ b/code/modules/resleeving/implant.dm @@ -62,7 +62,7 @@ icon_state = "[initial(icon_state)][imps.len]" germ_level = 0 -/obj/item/backup_implanter/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/backup_implanter/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/mirror.dm b/code/modules/resleeving/mirror.dm index f24673e68162..71eebe1595d6 100644 --- a/code/modules/resleeving/mirror.dm +++ b/code/modules/resleeving/mirror.dm @@ -170,7 +170,7 @@ to_chat(usr, "You must target the torso.") return CLICKCHAIN_DO_NOT_PROPAGATE -/obj/item/mirrortool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/mirrortool/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/resleeving/sleevecard.dm b/code/modules/resleeving/sleevecard.dm index 162e7b807524..39cb953673ed 100644 --- a/code/modules/resleeving/sleevecard.dm +++ b/code/modules/resleeving/sleevecard.dm @@ -41,7 +41,7 @@ QDEL_NULL(radio) return ..() -/obj/item/sleevecard/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/sleevecard/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm index 595f9f1eae87..45b437ec1440 100644 --- a/code/modules/shieldgen/directional_shield.dm +++ b/code/modules/shieldgen/directional_shield.dm @@ -206,7 +206,7 @@ for(var/obj/effect/directional_shield/S in active_shields) S.update_color(new_color) -/obj/item/shield_projector/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/shield_projector/attack_self(mob/user, datum/event_args/actor/e_args) if(active) if(always_on) to_chat(user, "You can't seem to deactivate \the [src].") @@ -398,7 +398,7 @@ else my_tool.set_ready_state(1) -/obj/item/shield_projector/line/exosuit/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/shield_projector/line/exosuit/attack_self(mob/user, datum/event_args/actor/e_args) if(active) if(always_on) to_chat(user, "You can't seem to deactivate \the [src].") diff --git a/code/modules/shieldgen/handheld_defuser.dm b/code/modules/shieldgen/handheld_defuser.dm index 8fe5b3f01704..f7deea8e866f 100644 --- a/code/modules/shieldgen/handheld_defuser.dm +++ b/code/modules/shieldgen/handheld_defuser.dm @@ -44,7 +44,7 @@ else icon_state = "hdiffuser_off" -/obj/item/shield_diffuser/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/shield_diffuser/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index 0b5d03de94f4..78a7c5437cb3 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -168,7 +168,7 @@ light_color = "#3728ff" var/active -/obj/item/spaceflare/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/spaceflare/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/spells/artifacts.dm b/code/modules/spells/artifacts.dm index 408f5f1bf571..7ab40f239e26 100644 --- a/code/modules/spells/artifacts.dm +++ b/code/modules/spells/artifacts.dm @@ -12,7 +12,7 @@ damage_force = 10 attack_sound = 'sound/items/welder2.ogg' -/obj/item/scrying/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/scrying/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -48,7 +48,7 @@ var/rend_desc = "You should run now." var/spawn_fast = 0 //if 1, ignores checking for mobs on loc before spawning -/obj/item/veilrender/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/veilrender/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -282,7 +282,7 @@ user.reset_perspective(null) user.unset_machine() -/obj/item/voodoo/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/voodoo/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -385,7 +385,7 @@ REMOVE_TRAIT(user, TRAIT_MOBILITY_NOPICKUP, src) user.update_mobility_blocked() -/obj/item/warpwhistle/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/warpwhistle/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index d53166a6eb5d..9c1d3655b60a 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -11,7 +11,7 @@ var/max_uses = 5 var/op = 1 -/obj/item/spellbook/attack_self(mob/user = usr) +/obj/item/spellbook/attack_self(mob/user, datum/event_args/actor/e_args) if(!user) return if((user.mind && !wizards.is_antagonist(user.mind))) @@ -252,7 +252,7 @@ . = ..() name += spellname -/obj/item/spellbook/oneuse/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/spellbook/oneuse/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/telesci/bscyrstal.dm b/code/modules/telesci/bscyrstal.dm index 0f603d1c965a..7fbb6c117645 100644 --- a/code/modules/telesci/bscyrstal.dm +++ b/code/modules/telesci/bscyrstal.dm @@ -14,7 +14,7 @@ pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) -/obj/item/bluespace_crystal/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/bluespace_crystal/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/vehicles/ridden/wheelchair.dm b/code/modules/vehicles/ridden/wheelchair.dm index ddfe769f056b..e0c79c9a926e 100644 --- a/code/modules/vehicles/ridden/wheelchair.dm +++ b/code/modules/vehicles/ridden/wheelchair.dm @@ -52,7 +52,7 @@ /// What we unfold to var/unfolded_type = /obj/vehicle/ridden/wheelchair -/obj/item/wheelchair/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/wheelchair/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm index cb132c5a9e07..cc6acf62e8ec 100644 --- a/code/modules/vore/eating/leave_remains_vr.dm +++ b/code/modules/vore/eating/leave_remains_vr.dm @@ -90,7 +90,7 @@ pred_ckey = pred.ckey pred_name = pred.name -/obj/item/digestion_remains/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/digestion_remains/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index 23df54d98f04..7dbe79e36cf4 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -139,7 +139,7 @@ assignment = "Centcom Officer" -/obj/item/card/id/centcom/station/fluff/joanbadge/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/card/id/centcom/station/fluff/joanbadge/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -211,7 +211,7 @@ icon_override = 'icons/vore/custom_items_vr.dmi' item_state = "Flag_Nanotrasen_mob" -/obj/item/flag/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/flag/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -332,7 +332,7 @@ assignment = "CC Medical" var/configured = 0 -/obj/item/card/id/centcom/station/fluff/aronai/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/card/id/centcom/station/fluff/aronai/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -446,7 +446,7 @@ var/last_use = 0 var/cooldown = 30 -/obj/item/cane/wand/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/cane/wand/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -570,7 +570,7 @@ icon_state = "dragor_dot" w_class = WEIGHT_CLASS_SMALL -/obj/item/fluff/dragor_dot/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/fluff/dragor_dot/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -601,7 +601,7 @@ desc = "A primarily blue ID with a holographic 'WAH' etched onto its back. The letters do not obscure anything important on the card. It is shiny and it feels very bumpy." var/title_strings = list("Amaya Rahl's Wah-identification card", "Amaya Rahl's Wah-ID card") -/obj/item/card/id/fluff/amaya/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/card/id/fluff/amaya/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -731,7 +731,7 @@ else return ..() -/obj/item/perfect_tele/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/perfect_tele/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -996,7 +996,7 @@ ..() -/obj/item/perfect_tele_beacon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/perfect_tele_beacon/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1090,7 +1090,7 @@ user.do_attack_animation(target) user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam -/obj/item/clothing/accessory/badge/holo/detective/ruda/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/badge/holo/detective/ruda/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1316,7 +1316,7 @@ spawn(0) update_worn_icon() -/obj/item/melee/baton/fluff/stunstaff/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/baton/fluff/stunstaff/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -1388,7 +1388,7 @@ edge = initial(edge) set_weight_class(initial(w_class)) -/obj/item/melee/fluffstuff/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/melee/fluffstuff/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/custom_items_cit.dm b/code/modules/vore/fluffstuff/custom_items_cit.dm index 9f7d78118f69..4bca778d989a 100644 --- a/code/modules/vore/fluffstuff/custom_items_cit.dm +++ b/code/modules/vore/fluffstuff/custom_items_cit.dm @@ -27,7 +27,7 @@ if((state > 1) || !owner) STOP_PROCESSING(SSobj, src) -/obj/item/clothing/accessory/collar/lifecrystal/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/clothing/accessory/collar/lifecrystal/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/guns/bsharpoon.dm b/code/modules/vore/fluffstuff/guns/bsharpoon.dm index 4807a8cdaa7d..7e0f82cff11f 100644 --- a/code/modules/vore/fluffstuff/guns/bsharpoon.dm +++ b/code/modules/vore/fluffstuff/guns/bsharpoon.dm @@ -73,7 +73,7 @@ var/turf/real_target = prob(failchance)? pick(trange(failrange, user)) : ToTurf AM.locationTransitForceMove(real_target, allow_pulled = FALSE, allow_grabbed = GRAB_AGGRESSIVE) -/obj/item/bluespace_harpoon/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/bluespace_harpoon/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm index 1a192465e15e..63d085964dcd 100644 --- a/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm @@ -68,7 +68,7 @@ update_charge() update_icon() -/obj/item/gun/ballistic/cell_loaded/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/gun/ballistic/cell_loaded/attack_self(mob/user, datum/event_args/actor/e_args) if(!chambered) return diff --git a/code/modules/vore/fluffstuff/guns/gunsword.dm b/code/modules/vore/fluffstuff/guns/gunsword.dm index a8758e6c806b..1941fe14349a 100644 --- a/code/modules/vore/fluffstuff/guns/gunsword.dm +++ b/code/modules/vore/fluffstuff/guns/gunsword.dm @@ -93,7 +93,7 @@ attack_verb = list() -/obj/item/cell/device/weapon/gunsword/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/cell/device/weapon/gunsword/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/vore/fluffstuff/life_crystals.dm b/code/modules/vore/fluffstuff/life_crystals.dm index 3e2c78e853e7..b03e2e2893e9 100644 --- a/code/modules/vore/fluffstuff/life_crystals.dm +++ b/code/modules/vore/fluffstuff/life_crystals.dm @@ -33,7 +33,7 @@ if(!owner) STOP_PROCESSING(SSobj, src) -/obj/item/clothing/accessory/collar/vmcrystal/attack_self(mob/user) +/obj/item/clothing/accessory/collar/vmcrystal/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index 52851d70d2cf..7da4957564c1 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -22,7 +22,7 @@ for(var/mob/living/carbon/human/O in contents) O.request_strip_menu(usr) -/obj/item/holder/micro/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/holder/micro/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm index da85d7e63b71..92279e324d38 100644 --- a/code/modules/xenoarcheaology/sampling.dm +++ b/code/modules/xenoarcheaology/sampling.dm @@ -82,7 +82,7 @@ else to_chat(user, "You are unable to take a sample of [item_to_sample].") -/obj/item/core_sampler/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/core_sampler/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index 19d67e7b83ef..5ed536a47f65 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -48,7 +48,7 @@ else return ..() -/obj/item/anodevice/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/anodevice/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index c1e7e1d29846..41e7b2fa4d7e 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -44,7 +44,7 @@ var/last_scan_time = 0 var/scan_delay = 25 -/obj/item/ano_scanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/ano_scanner/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -156,7 +156,7 @@ to_chat(user, "[icon2html(thing = src, target = world)] [src] pings [pick("madly","wildly","excitedly","crazily")]!") -/obj/item/depth_scanner/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/depth_scanner/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -283,7 +283,7 @@ else icon_state = "pinoff" -/obj/item/beacon_locator/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/beacon_locator/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -347,7 +347,7 @@ anomaly_scanner = new/obj/item/ano_scanner/integrated(src) depth_scanner = new/obj/item/depth_scanner(src) -/obj/item/xenoarch_multi_tool/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/xenoarch_multi_tool/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm index ad5f1f86f564..32d2edd83434 100644 --- a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm +++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm @@ -152,7 +152,7 @@ attack_verb = list("drilled") worth_intrinsic = 250 // this is gonna be very useful/powerful later -/obj/item/pickaxe/excavationdrill/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/pickaxe/excavationdrill/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/xenobio/items/slime_objects.dm b/code/modules/xenobio/items/slime_objects.dm index d622b650eff9..c01bc71f0792 100644 --- a/code/modules/xenobio/items/slime_objects.dm +++ b/code/modules/xenobio/items/slime_objects.dm @@ -7,7 +7,7 @@ description_info = "Use in your hand to attempt to create a Promethean. It functions similarly to a positronic brain, in that a ghost is needed to become the Promethean." var/searching = 0 -/obj/item/slime_cube/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/slime_cube/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -93,7 +93,7 @@ qdel(src) return . | CLICKCHAIN_DO_NOT_PROPAGATE -/obj/item/slime_crystal/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/slime_crystal/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return @@ -160,7 +160,7 @@ /obj/item/flashlight/slime/update_appearance(updates = ~UPDATE_ICON_STATE) return ..() -/obj/item/flashlight/slime/attack_self(mob/user) +/obj/item/flashlight/slime/attack_self(mob/user, datum/event_args/actor/e_args) return //Bio-luminescence does not toggle. diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm index 951547dff623..243d98812ae0 100644 --- a/code/modules/xenobio2/machinery/gene_manipulators.dm +++ b/code/modules/xenobio2/machinery/gene_manipulators.dm @@ -20,7 +20,7 @@ var/list/genes = list() var/genesource = "unknown" -/obj/item/disk/xenobio/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/disk/xenobio/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return diff --git a/code/modules/xenobio2/mob/slime/slime_monkey.dm b/code/modules/xenobio2/mob/slime/slime_monkey.dm index 6553630c3781..0ebddf0e81b9 100644 --- a/code/modules/xenobio2/mob/slime/slime_monkey.dm +++ b/code/modules/xenobio2/mob/slime/slime_monkey.dm @@ -8,7 +8,7 @@ Slime cube lives here. icon_state = "slime cube" var/searching = 0 -/obj/item/slime_cube/attack_self(mob/user, datum/event_args/actor/clickchain/e_args) +/obj/item/slime_cube/attack_self(mob/user, datum/event_args/actor/e_args) . = ..() if(.) return From 9d14fe4afaf7209c55fb3fb6e5e277e576c43dbd Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 5 Aug 2024 21:56:07 +0000 Subject: [PATCH 051/140] start on new hud system --- citadel.dme | 3 +- code/__DEFINES/inventory/hud.dm | 24 +++++++++++++ code/__DEFINES/inventory/misc.dm | 1 + code/__DEFINES/screen.dm | 21 +++++++---- .../technomancer/spells/apportation.dm | 1 - code/game/objects/items/tools/weldingtool.dm | 3 +- code/game/rendering/hud_style.dm | 2 +- code/game/rendering/legacy/ghost.dm | 18 +++++----- code/game/rendering/legacy/hud_object.dm | 10 +++--- code/game/rendering/legacy/human.dm | 4 +-- .../game/rendering/legacy/intents/throwing.dm | 4 +-- .../mob_huds/{inventory_hands.dm => hands.dm} | 4 +++ code/game/rendering/mob_huds/inventory.dm | 12 +++++-- code/game/rendering/mob_huds/mob_hud.dm | 35 ++++++++++++++++--- code/game/rendering/screen.dm | 2 +- code/game/rendering/screen_legacy.dm | 2 -- code/modules/media/walkpod.dm | 1 + code/modules/mob/grab.dm | 11 +----- code/modules/mob/inventory/inventory_slot.dm | 4 ++- code/modules/mob/inventory/item/public.dm | 2 +- code/modules/mob/inventory/mob/internal.dm | 2 +- .../mob/living/carbon/alien/alien_attacks.dm | 1 - .../living/carbon/human/human_attackhand.dm | 1 - code/modules/mob/living/simple_mob/defense.dm | 1 - .../mob/living/simple_mob/simple_hud.dm | 4 +-- code/modules/mob/mob_defines.dm | 4 +-- .../species/xenomorphs/alien_powers.dm | 1 - 27 files changed, 119 insertions(+), 59 deletions(-) create mode 100644 code/__DEFINES/inventory/hud.dm rename code/game/rendering/mob_huds/{inventory_hands.dm => hands.dm} (92%) diff --git a/citadel.dme b/citadel.dme index ef75af40f9b0..1bd2c92e3d85 100644 --- a/citadel.dme +++ b/citadel.dme @@ -215,6 +215,7 @@ #include "code\__DEFINES\inventory\accessories.dm" #include "code\__DEFINES\inventory\bodytypes.dm" #include "code\__DEFINES\inventory\carry_weight.dm" +#include "code\__DEFINES\inventory\hud.dm" #include "code\__DEFINES\inventory\icons.dm" #include "code\__DEFINES\inventory\misc.dm" #include "code\__DEFINES\inventory\procs.dm" @@ -1951,8 +1952,8 @@ #include "code\game\rendering\legacy\intents\throwing.dm" #include "code\game\rendering\legacy\inventory\inventory.dm" #include "code\game\rendering\legacy\objects\waypoint_tracker.dm" +#include "code\game\rendering\mob_huds\hands.dm" #include "code\game\rendering\mob_huds\inventory.dm" -#include "code\game\rendering\mob_huds\inventory_hands.dm" #include "code\game\rendering\mob_huds\mob_hud.dm" #include "code\game\rendering\parallax\parallax.dm" #include "code\game\rendering\parallax\parallax_holder.dm" diff --git a/code/__DEFINES/inventory/hud.dm b/code/__DEFINES/inventory/hud.dm new file mode 100644 index 000000000000..83101edacc26 --- /dev/null +++ b/code/__DEFINES/inventory/hud.dm @@ -0,0 +1,24 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* inventory_hud_anchor *// + +/// anchor to the main inventory drawer +/// +/// * main axis runs towards the middle of screen on Y axis +/// * cross axis runs towards the middle of screen on X axis +/// * both main and cross cannot be 0, as that is where the drawer button is +/// +/// * valid main-axis indices: >= 0 +/// * valid cross-axis indices: >= 0 +#define INVENTORY_HUD_ANCHOR_TO_DRAWER "drawer" +/// anchor to next to hands panel +/// +/// * main axis runs left/right of hands +/// * cross axis runs away from edge of screen of hands +/// +/// * valid main-axis indices: != 0 +/// * valid cross-axis indices: >= 0 +#define INVENTORY_HUD_ANCHOR_TO_HANDS "hands" + +#warn impl all diff --git a/code/__DEFINES/inventory/misc.dm b/code/__DEFINES/inventory/misc.dm index 8bbf978e80ae..175330159241 100644 --- a/code/__DEFINES/inventory/misc.dm +++ b/code/__DEFINES/inventory/misc.dm @@ -1,4 +1,5 @@ // proc: dropped() on /obj/item // todo: this should be in procs.dm and the names need to be changed probably +// todo: comsig instead? /// relocated; return false #define ITEM_RELOCATED_BY_DROPPED -1 diff --git a/code/__DEFINES/screen.dm b/code/__DEFINES/screen.dm index 17c616e24cd1..cdcd26321b34 100644 --- a/code/__DEFINES/screen.dm +++ b/code/__DEFINES/screen.dm @@ -17,14 +17,23 @@ //! BYOND will 100% allow you to. //! DO NOT DO THIS. -//* General HUD positions -//* These should be as widescreen-agnostic as possible. +//* General HUD positions *// +//* These should be as widescreen-agnostic as possible. *// /// Fill screen #define SCREEN_LOC_FULLSCREEN "LEFT,BOTTOM to RIGHT,TOP" -//* Mob HUD screen object positions -//* These should be widescreen-agnostic and use anchorings to the sides of the screen / center. +//* Mob HUD positions *// +//* These should be widescreen-agnostic and use anchorings *// +//* to the sides of the screen / center. *// + +/// the bottom-left hand of hands HUD +#define SCREEN_LOC_MOB_HANDS_HUD_ANCHOR "CENTER-1:16,BOTTOM+1:5" + +/// the bottom-left drawer position of inventory HUD +#define SCREEN_LOC_MOB_INVENTORY_HUD_ANCHOR "LEFT:6,BOTTOM:5" + +#warn deal with this crap //Pop-up inventory #define ui_shoes "LEFT+1:8,BOTTOM:5" @@ -42,6 +51,8 @@ /// Hands #define SCREEN_LOC_INV_HAND(index) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" +#define ui_swaphand1 "CENTER-1:16,BOTTOM+1:5" +#define ui_swaphand2 "CENTER:16,BOTTOM+1:5" //Lower left, persistant menu #define ui_inventory "LEFT:6,BOTTOM:5" @@ -53,8 +64,6 @@ #define ui_back "CENTER-2:14,BOTTOM:5" #define ui_equip "CENTER-1:16,BOTTOM+1:5" -#define ui_swaphand1 "CENTER-1:16,BOTTOM+1:5" -#define ui_swaphand2 "CENTER:16,BOTTOM+1:5" #define ui_storage1 "CENTER+1:16,BOTTOM:5" #define ui_storage2 "CENTER+2:16,BOTTOM:5" #define ui_smallquad "RIGHT-4:18,BOTTOM:4" diff --git a/code/game/gamemodes/technomancer/spells/apportation.dm b/code/game/gamemodes/technomancer/spells/apportation.dm index 998ba0f432f9..356f37350353 100644 --- a/code/game/gamemodes/technomancer/spells/apportation.dm +++ b/code/game/gamemodes/technomancer/spells/apportation.dm @@ -73,6 +73,5 @@ G.state = GRAB_PASSIVE G.icon_state = "grabbed1" - G.synch() qdel(src) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index ca8381fb9bc0..1f794f3988cf 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -747,7 +747,8 @@ update_worn_icon() /obj/item/weldingtool/electric/crystal/attack_self(mob/user, datum/event_args/actor/e_args) - if(user.species.name == SPECIES_ADHERENT) + var/mob/living/carbon/human/H = user + if(istype(H) && H.species.name == SPECIES_ADHERENT) if(user.nutrition >= 40) setWelding(!welding, user) else diff --git a/code/game/rendering/hud_style.dm b/code/game/rendering/hud_style.dm index c073973070dc..7f95f7ad93f5 100644 --- a/code/game/rendering/hud_style.dm +++ b/code/game/rendering/hud_style.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 silicons *// GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) diff --git a/code/game/rendering/legacy/ghost.dm b/code/game/rendering/legacy/ghost.dm index 8b290167fd2c..aaba2cbb6247 100644 --- a/code/game/rendering/legacy/ghost.dm +++ b/code/game/rendering/legacy/ghost.dm @@ -108,47 +108,47 @@ var/atom/movable/screen/using using = new /atom/movable/screen/ghost/returntomenu() using.screen_loc = ui_ghost_returntomenu - using.hud = src + using.hud_legacy = src adding += using using = new /atom/movable/screen/ghost/jumptomob() using.screen_loc = ui_ghost_jumptomob - using.hud = src + using.hud_legacy = src adding += using using = new /atom/movable/screen/ghost/orbit() using.screen_loc = ui_ghost_orbit - using.hud = src + using.hud_legacy = src adding += using using = new /atom/movable/screen/ghost/reenter_corpse() using.screen_loc = ui_ghost_reenter_corpse - using.hud = src + using.hud_legacy = src adding += using using = new /atom/movable/screen/ghost/teleport() using.screen_loc = ui_ghost_teleport - using.hud = src + using.hud_legacy = src adding += using using = new /atom/movable/screen/ghost/pai() using.screen_loc = ui_ghost_pai - using.hud = src + using.hud_legacy = src adding += using using = new /atom/movable/screen/ghost/up() using.screen_loc = ui_ghost_updown - using.hud = src + using.hud_legacy = src adding += using using = new /atom/movable/screen/ghost/down() using.screen_loc = ui_ghost_updown - using.hud = src + using.hud_legacy = src adding += using using = new /atom/movable/screen/ghost/spawners using.screen_loc = ui_ghost_spawners - using.hud = src + using.hud_legacy = src adding += using if(mymob.client && apply_to_client) diff --git a/code/game/rendering/legacy/hud_object.dm b/code/game/rendering/legacy/hud_object.dm index cc3620e8f813..121a8e11266f 100644 --- a/code/game/rendering/legacy/hud_object.dm +++ b/code/game/rendering/legacy/hud_object.dm @@ -2,15 +2,15 @@ /atom/movable/screen/hud/Initialize(mapload, datum/hud/master) . = ..() - hud = master + hud_legacy = master sync_to_hud() /atom/movable/screen/hud/proc/sync_to_hud() - if(!hud) + if(!hud_legacy) return - icon = hud.ui_style - color = hud.ui_color - alpha = hud.ui_alpha + icon = hud_legacy.ui_style + color = hud_legacy.ui_color + alpha = hud_legacy.ui_alpha /atom/movable/screen/hud/Click(location, control, params) SEND_SIGNAL(src, COMSIG_CLICK, location, control, params) diff --git a/code/game/rendering/legacy/human.dm b/code/game/rendering/legacy/human.dm index b1158856be78..714ebaafdd8c 100644 --- a/code/game/rendering/legacy/human.dm +++ b/code/game/rendering/legacy/human.dm @@ -159,7 +159,7 @@ var/atom/movable/screen/inventory/hand/right/right_hand = new right_hand.index = 2 using = right_hand - using.hud = src + using.hud_legacy = src using.name = "r_hand" using.icon = ui_style using.icon_state = "r_hand_inactive" @@ -175,7 +175,7 @@ var/atom/movable/screen/inventory/hand/left/left_hand = new left_hand.index = 1 using = left_hand - using.hud = src + using.hud_legacy = src using.name = "l_hand" using.icon = ui_style using.icon_state = "l_hand_inactive" diff --git a/code/game/rendering/legacy/intents/throwing.dm b/code/game/rendering/legacy/intents/throwing.dm index a66842211956..8ce693cfef7f 100644 --- a/code/game/rendering/legacy/intents/throwing.dm +++ b/code/game/rendering/legacy/intents/throwing.dm @@ -10,10 +10,10 @@ /atom/movable/screen/hud/throwmode/shift_clicked(mob/user) user.toggle_throw_mode(TRUE) -/atom/movable/screen/hud/update_icon_state() +/atom/movable/screen/hud/throwmode/update_icon_state() . = ..() remove_filter("overhand", FALSE) - switch(hud?.mymob?.in_throw_mode) + switch(hud_legacy?.mymob?.in_throw_mode) if(THROW_MODE_ON) icon_state = "act_throw_on" if(THROW_MODE_OFF) diff --git a/code/game/rendering/mob_huds/inventory_hands.dm b/code/game/rendering/mob_huds/hands.dm similarity index 92% rename from code/game/rendering/mob_huds/inventory_hands.dm rename to code/game/rendering/mob_huds/hands.dm index 371f48fcd657..07dc4e419193 100644 --- a/code/game/rendering/mob_huds/inventory_hands.dm +++ b/code/game/rendering/mob_huds/hands.dm @@ -17,6 +17,10 @@ /datum/mob_hud/hands/proc/move_item(obj/item/item, from_index, to_index) +/datum/mob_hud/hands/proc/swap_active_hand(from_index, to_index) + var/atom/movable/screen/hands/old_hand = hands[from_index] + var/atom/movable/screen/hands/new_hand = hands[to_index] + #warn impl all /atom/movable/screen/hands diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index 7eebd247fb8d..9b4273d07d4b 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -8,9 +8,11 @@ /// owning inventory var/datum/inventory/host -/datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) +/datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot) -/datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot_or_index) +/datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot) + +/datum/mob_hud/inventory/proc/move_item(obj/item/item, datum/inventory_slot/from_slot, datum/inventory_slot/to_slot) #warn impl all @@ -31,6 +33,10 @@ alpha = style_alpha color = style_color +/atom/movable/screen/inventory/slot + /// our inventory slot id + var/inventory_slot_id + /** * handle an inventory operation * @@ -39,4 +45,4 @@ * * slot_or_index - slot ID or numerical hand index * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. */ -/atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) +/atom/movable/screen/inventory/slot/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) diff --git a/code/game/rendering/mob_huds/mob_hud.dm b/code/game/rendering/mob_huds/mob_hud.dm index 8df18f91b3da..f08e1602bdfe 100644 --- a/code/game/rendering/mob_huds/mob_hud.dm +++ b/code/game/rendering/mob_huds/mob_hud.dm @@ -5,12 +5,17 @@ * owned by one mob as the user, and one mob as the owner * * therefore, keep screen locs as widescreen/viewrange agnostic as possible. + * + * * mob_hud is **owned** by a mob, meaning it's that mob's viewpoint + * * mob_hud is **consumed / used** by clients, including the owning mob's client, as clients render the HUD. + * * "but this is so low level it's hard to use for remote control"; that's what later on /datum/remote_control is for! + * * mob_hud does not track screens/images unlike perspective! these are mostly stateless as they're externally synchronized. */ /datum/mob_hud /// mob we're for (aka rendering the state of) var/mob/owner /// users using us - var/list/mob/using + var/list/client/using /// desired hud style - set at base of sync_client var/datum/hud_style/style @@ -20,8 +25,16 @@ /datum/mob_hud/proc/images() return list() +/datum/mob_hud/proc/add_user(client/C) + LAZYADD(users, C) + apply_client(C) + +/datum/mob_hud/proc/remove_user(client/C) + LAZYREMOVE(users, C) + unapply_client(C) + /datum/mob_hud/proc/sync_client(client/C) - var/requested = C.prefs.UI_style + var/requested = C.get_preference_entry(/datum/game_preference_entry/dropdown/hud_style) style = GLOB.hud_styles[all_ui_style_ids[requested]] if(isnull(style)) stack_trace("failed to get style [requested]") @@ -32,8 +45,22 @@ C.screen += screens() C.screen += images() -/datum/mob_hud/proc/remove_client(client/C) +/datum/mob_hud/proc/unapply_client(client/C) C.screen -= screens() C.images -= images() -#warn impl all +/datum/mob_hud/proc/add_screen(atom/movable/what) + for(var/client/C as anything in users) + C.screen += what + +/datum/mob_hud/proc/remove_screen(atom/movable/what) + for(var/client/C as anything in users) + C.screen -= what + +/datum/mob_hud/proc/add_image(image/what) + for(var/client/C as anything in users) + C.images += what + +/datum/mob_hud/proc/remove_image(image/what) + for(var/client/C as anything in users) + C.images -= what diff --git a/code/game/rendering/screen.dm b/code/game/rendering/screen.dm index 9b760c9013fb..a5fd71fbb19c 100644 --- a/code/game/rendering/screen.dm +++ b/code/game/rendering/screen.dm @@ -5,7 +5,7 @@ appearance_flags = PIXEL_SCALE | NO_CLIENT_COLOR atom_colouration_system = FALSE var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - var/datum/hud/hud = null // A reference to the owner HUD, if any. + var/datum/hud/hud_legacy = null // A reference to the owner HUD, if any. /** * called to resync to a hud_style datum diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index 74c3099357b3..9d80787a09fb 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -147,8 +147,6 @@ usr.hud_used.hidden_inventory_update() if("equip") - if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech - return 1 if(ishuman(usr)) var/mob/living/carbon/human/H = usr H.quick_equip() diff --git a/code/modules/media/walkpod.dm b/code/modules/media/walkpod.dm index e2b6f68af225..711b086dfb90 100644 --- a/code/modules/media/walkpod.dm +++ b/code/modules/media/walkpod.dm @@ -78,6 +78,7 @@ to_chat(L, "Turn on the [src] first.") /obj/item/device/walkpod/attack_self(mob/user, datum/event_args/actor/e_args) + var/mob/living/L = user if(!istype(L) || loc != L) return if(!listener) diff --git a/code/modules/mob/grab.dm b/code/modules/mob/grab.dm index 8b4831eb64cb..b99c6079b30a 100644 --- a/code/modules/mob/grab.dm +++ b/code/modules/mob/grab.dm @@ -137,6 +137,7 @@ icon_state = "grabbed" hud.name = "reinforce grab" hud.master = src + vis_contents += hud //check if assailant is grabbed by victim as well if(assailant.grabbed_by) @@ -152,16 +153,6 @@ adjust_position() -//This makes sure that the grab screen object is displayed in the correct hand. -/obj/item/grab/proc/synch() //why is this needed? - if(QDELETED(src)) - return - if(affecting) - if(assailant.r_hand == src) - hud.screen_loc = ui_rhand - else - hud.screen_loc = ui_lhand - /obj/item/grab/process(delta_time) if(QDELETED(src)) // GC is trying to delete us, we'll kill our processing so we can cleanly GC return PROCESS_KILL diff --git a/code/modules/mob/inventory/inventory_slot.dm b/code/modules/mob/inventory/inventory_slot.dm index 1647d9788d04..adda2bebbd62 100644 --- a/code/modules/mob/inventory/inventory_slot.dm +++ b/code/modules/mob/inventory/inventory_slot.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 silicons *// /// global slot meta cache - all ids must be string! /// initialized by SSearly_init @@ -99,6 +99,8 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) //* HUD /// our screen loc var/hud_position + #warn uh oh! + /// our nominal //* Grammar /// player friendly name diff --git a/code/modules/mob/inventory/item/public.dm b/code/modules/mob/inventory/item/public.dm index 596fe03c4d5f..a9eed905a0e4 100644 --- a/code/modules/mob/inventory/item/public.dm +++ b/code/modules/mob/inventory/item/public.dm @@ -184,7 +184,7 @@ /obj/item/proc/is_being_worn() if(!worn_slot) return FALSE - var/datum/inventory_slot/slot_meta = resolve_inventory_slot_meta(worn_slot) + var/datum/inventory_slot/slot_meta = resolve_inventory_slot(worn_slot) return slot_meta.inventory_slot_flags & INV_SLOT_CONSIDERED_WORN //* Stripping *// diff --git a/code/modules/mob/inventory/mob/internal.dm b/code/modules/mob/inventory/mob/internal.dm index 59fd56f744b5..1f762c326c7e 100644 --- a/code/modules/mob/inventory/mob/internal.dm +++ b/code/modules/mob/inventory/mob/internal.dm @@ -222,7 +222,7 @@ * handles adding an item or updating an item to our hud */ /mob/proc/_handle_inventory_hud_update(obj/item/I, slot) - var/datum/inventory_slot/meta = resolve_inventory_slot_meta(slot) + var/datum/inventory_slot/meta = resolve_inventory_slot(slot) I.screen_loc = meta.hud_position if(client) client.screen |= I diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index 41b16b48f56a..744421493b1f 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -25,7 +25,6 @@ grabbed_by += G G.affecting = src - G.synch() LAssailant = L diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index ead7f2ad9049..d181cce422fe 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -90,7 +90,6 @@ if(!G) //the grab will delete itself in New if affecting is anchored return L.put_in_active_hand(G) - G.synch() LAssailant = L H.do_attack_animation(src) diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index af337354f3ea..9713a555c9e9 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -30,7 +30,6 @@ L.put_in_active_hand(G) - G.synch() G.affecting = src LAssailant = L diff --git a/code/modules/mob/living/simple_mob/simple_hud.dm b/code/modules/mob/living/simple_mob/simple_hud.dm index c17c0c2bd2c1..5c183ef9a7af 100644 --- a/code/modules/mob/living/simple_mob/simple_hud.dm +++ b/code/modules/mob/living/simple_mob/simple_hud.dm @@ -244,7 +244,7 @@ var/atom/movable/screen/inventory/hand/right/right_hand = new right_hand.index = 2 using = right_hand - using.hud = src + using.hud_legacy = src using.name = "r_hand" using.icon = ui_style using.icon_state = "r_hand_inactive" @@ -260,7 +260,7 @@ var/atom/movable/screen/inventory/hand/left/left_hand = new left_hand.index = 1 using = left_hand - using.hud = src + using.hud_legacy = src using.name = "l_hand" using.icon = ui_style using.icon_state = "l_hand_inactive" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 7fb174abbe92..4792326b4159 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -56,11 +56,11 @@ /// Atom we're buckl**ing** to. Used to stop stuff like lava from incinerating those who are mid buckle. var/atom/movable/buckling - //* HUD (Atom) + //* HUD (Atom) *// /// HUDs to initialize, typepaths var/list/atom_huds_to_initialize - //* HUD + //* HUD *// /// active, opened storage // todo: doesn't clear from clients properly on logout, relies on login clearing screne. // todo: we'll eventually need a system to handle ckey transfers properly. diff --git a/code/modules/species/xenomorphs/alien_powers.dm b/code/modules/species/xenomorphs/alien_powers.dm index bbe915984662..ef1d297b79fb 100644 --- a/code/modules/species/xenomorphs/alien_powers.dm +++ b/code/modules/species/xenomorphs/alien_powers.dm @@ -319,7 +319,6 @@ G.state = GRAB_PASSIVE G.icon_state = "grabbed1" - G.synch() /mob/living/carbon/human/proc/gut() set category = "Abilities" From bc6e124d6fa18a0f63c83dc5793212af557c9876 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:33:51 +0000 Subject: [PATCH 052/140] update --- citadel.dme | 1 + code/game/rendering/mob.dm | 8 ++ code/game/rendering/mob_huds/inventory.dm | 4 + code/game/rendering/mob_huds/mob_hud.dm | 15 +-- .../client/game_preferences/entries/game.dm | 3 + .../mob/inventory/inventory-rendering.dm | 89 ++++++++++++++++++ code/modules/mob/inventory/inventory.dm | 94 ++----------------- code/modules/mob/{login.dm => mob-login.dm} | 5 +- code/modules/mob/{logout.dm => mob-logout.dm} | 1 + code/modules/mob/mob.dm | 3 - code/modules/species/protean/protean_blob.dm | 2 +- 11 files changed, 130 insertions(+), 95 deletions(-) create mode 100644 code/modules/mob/inventory/inventory-rendering.dm rename code/modules/mob/{login.dm => mob-login.dm} (95%) rename code/modules/mob/{logout.dm => mob-logout.dm} (97%) diff --git a/citadel.dme b/citadel.dme index 1bd2c92e3d85..28acdb5781cb 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2944,6 +2944,7 @@ #include "code\modules\integrated_electronics\subtypes\time.dm" #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\integrated_electronics\~defines\~defines.dm" +#include "code\modules\mob\inventory\inventory-rendering.dm" #include "code\modules\mob\inventory\inventory_slot.dm" #include "code\modules\mob\inventory\inventory.dm" #include "code\modules\mob\inventory\item\hooks.dm" diff --git a/code/game/rendering/mob.dm b/code/game/rendering/mob.dm index 114e1b9a9f31..1bc15a4e5c34 100644 --- a/code/game/rendering/mob.dm +++ b/code/game/rendering/mob.dm @@ -42,3 +42,11 @@ */ /mob/proc/dispose_rendering() wipe_fullscreens() + +/** + * updates rendering on hud style or other appearance change + */ +/mob/proc/resync_rendering() + if(!client) + return + inventory?.hud?.sync_client(client) diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index 9b4273d07d4b..de4cd0133d8a 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -8,6 +8,10 @@ /// owning inventory var/datum/inventory/host +/datum/mob_hud/inventory/New(mob/owner, datum/inventory/host) + src.host = host + ..() + /datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot) /datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot) diff --git a/code/game/rendering/mob_huds/mob_hud.dm b/code/game/rendering/mob_huds/mob_hud.dm index f08e1602bdfe..64887ecb51a2 100644 --- a/code/game/rendering/mob_huds/mob_hud.dm +++ b/code/game/rendering/mob_huds/mob_hud.dm @@ -19,6 +19,9 @@ /// desired hud style - set at base of sync_client var/datum/hud_style/style +/datum/mob_hud/New(mob/owner) + src.owner = owner + /datum/mob_hud/proc/screens() return list() @@ -26,11 +29,11 @@ return list() /datum/mob_hud/proc/add_user(client/C) - LAZYADD(users, C) + LAZYADD(using, C) apply_client(C) /datum/mob_hud/proc/remove_user(client/C) - LAZYREMOVE(users, C) + LAZYREMOVE(using, C) unapply_client(C) /datum/mob_hud/proc/sync_client(client/C) @@ -50,17 +53,17 @@ C.images -= images() /datum/mob_hud/proc/add_screen(atom/movable/what) - for(var/client/C as anything in users) + for(var/client/C as anything in using) C.screen += what /datum/mob_hud/proc/remove_screen(atom/movable/what) - for(var/client/C as anything in users) + for(var/client/C as anything in using) C.screen -= what /datum/mob_hud/proc/add_image(image/what) - for(var/client/C as anything in users) + for(var/client/C as anything in using) C.images += what /datum/mob_hud/proc/remove_image(image/what) - for(var/client/C as anything in users) + for(var/client/C as anything in using) C.images -= what diff --git a/code/modules/client/game_preferences/entries/game.dm b/code/modules/client/game_preferences/entries/game.dm index e409bbc6037e..1f4caff7eb73 100644 --- a/code/modules/client/game_preferences/entries/game.dm +++ b/code/modules/client/game_preferences/entries/game.dm @@ -18,6 +18,7 @@ /datum/game_preference_entry/dropdown/hud_style/on_set(client/user, value, first_init) . = ..() user.set_ui_style(value) + user.mob.resync_rendering() /datum/game_preference_entry/simple_color/hud_color name = "HUD Color" @@ -31,6 +32,7 @@ /datum/game_preference_entry/simple_color/hud_color/on_set(client/user, value, first_init) . = ..() user.set_ui_color(value) + user.mob.resync_rendering() /datum/game_preference_entry/number/hud_alpha name = "HUD Alpha" @@ -47,6 +49,7 @@ /datum/game_preference_entry/number/hud_alpha/on_set(client/user, value, first_init) . = ..() user.set_ui_alpha(value) + user.mob.resync_rendering() /datum/game_preference_entry/dropdown/tooltip_style name = "Tooltips Style" diff --git a/code/modules/mob/inventory/inventory-rendering.dm b/code/modules/mob/inventory/inventory-rendering.dm new file mode 100644 index 000000000000..fc86dbb8ab1f --- /dev/null +++ b/code/modules/mob/inventory/inventory-rendering.dm @@ -0,0 +1,89 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* Rendering *// + +/datum/inventory/proc/remove_slot_renders() + var/list/transformed = list() + for(var/slot_id in rendered_normal_overlays) + transformed += rendered_normal_overlays[slot_id] + owner.cut_overlay(transformed) + +/datum/inventory/proc/reapply_slot_renders() + // try not to dupe + remove_slot_renders() + var/list/transformed = list() + for(var/slot_id in rendered_normal_overlays) + transformed += rendered_normal_overlays[slot_id] + owner.add_overlay(transformed) + +/** + * just update if a slot is visible + */ +/datum/inventory/proc/update_slot_visible(slot_id, cascade = TRUE) + // resolve item + var/obj/item/target = owner.item_by_slot_id(slot_id) + + // first, cascade incase we early-abort later + if(cascade) + var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) + slot.cascade_render_visibility(owner, target) + + // check existing + if(isnull(rendered_normal_overlays[slot_id])) + return + + // remove overlay first incase it's already there + owner.cut_overlay(rendered_normal_overlays[slot_id]) + + // check if slot should render + var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) + if(!slot.should_render(owner, target)) + return + + // add overlay if it should + owner.add_overlay(rendered_normal_overlays[slot_id]) + +/** + * redo a slot's render + */ +/datum/inventory/proc/update_slot_render(slot_id, cascade = TRUE) + var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) + var/obj/item/target = owner.item_by_slot_id(slot_id) + + // first, cascade incase we early-abort later + if(cascade) + slot.cascade_render_visibility(owner, target) + + if(!slot.should_render(owner, target)) + remove_slot_render(slot_id) + return + + if(isnull(target)) + remove_slot_render(slot_id) + return + + var/bodytype = BODYTYPE_DEFAULT + + if(ishuman(owner)) + var/mob/living/carbon/human/casted_human = owner + bodytype = casted_human.species.get_effective_bodytype(casted_human, target, slot_id) + + var/rendering_results = slot.render(owner, target, bodytype) + if(islist(rendering_results)? !length(rendering_results) : isnull(rendering_results)) + remove_slot_render(slot_id) + return + + set_slot_render(slot_id, rendering_results) + +/datum/inventory/proc/remove_slot_render(slot_id) + if(isnull(rendered_normal_overlays[slot_id])) + return + owner.cut_overlay(rendered_normal_overlays[slot_id]) + rendered_normal_overlays -= slot_id + +/datum/inventory/proc/set_slot_render(slot_id, overlay) + if(!isnull(rendered_normal_overlays[slot_id])) + owner.cut_overlay(rendered_normal_overlays[slot_id]) + rendered_normal_overlays[slot_id] = overlay + owner.add_overlay(overlay) diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 4e1a81210e55..726fc120336a 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 silicons *// /** * mob inventory data goes in here. @@ -16,6 +16,10 @@ /// our action holder var/datum/action_holder/actions + //* HUD *// + /// our hud + var/datum/mob_hud/inventory/hud + //* Inventory *// //* Caches *// @@ -38,92 +42,14 @@ owner = null return ..() -//* Rendering *// - -/datum/inventory/proc/remove_slot_renders() - var/list/transformed = list() - for(var/slot_id in rendered_normal_overlays) - transformed += rendered_normal_overlays[slot_id] - owner.cut_overlay(transformed) - -/datum/inventory/proc/reapply_slot_renders() - // try not to dupe - remove_slot_renders() - var/list/transformed = list() - for(var/slot_id in rendered_normal_overlays) - transformed += rendered_normal_overlays[slot_id] - owner.add_overlay(transformed) - -/** - * just update if a slot is visible - */ -/datum/inventory/proc/update_slot_visible(slot_id, cascade = TRUE) - // resolve item - var/obj/item/target = owner.item_by_slot_id(slot_id) - - // first, cascade incase we early-abort later - if(cascade) - var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) - slot.cascade_render_visibility(owner, target) - - // check existing - if(isnull(rendered_normal_overlays[slot_id])) - return - - // remove overlay first incase it's already there - owner.cut_overlay(rendered_normal_overlays[slot_id]) - - // check if slot should render - var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) - if(!slot.should_render(owner, target)) - return - - // add overlay if it should - owner.add_overlay(rendered_normal_overlays[slot_id]) +//* HUD *// /** - * redo a slot's render + * returns our mob inventory */ -/datum/inventory/proc/update_slot_render(slot_id, cascade = TRUE) - var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) - var/obj/item/target = owner.item_by_slot_id(slot_id) - - // first, cascade incase we early-abort later - if(cascade) - slot.cascade_render_visibility(owner, target) - - if(!slot.should_render(owner, target)) - remove_slot_render(slot_id) - return - - if(isnull(target)) - remove_slot_render(slot_id) - return - - var/bodytype = BODYTYPE_DEFAULT - - if(ishuman(owner)) - var/mob/living/carbon/human/casted_human = owner - bodytype = casted_human.species.get_effective_bodytype(casted_human, target, slot_id) - - var/rendering_results = slot.render(owner, target, bodytype) - if(islist(rendering_results)? !length(rendering_results) : isnull(rendering_results)) - remove_slot_render(slot_id) - return - - set_slot_render(slot_id, rendering_results) - -/datum/inventory/proc/remove_slot_render(slot_id) - if(isnull(rendered_normal_overlays[slot_id])) - return - owner.cut_overlay(rendered_normal_overlays[slot_id]) - rendered_normal_overlays -= slot_id - -/datum/inventory/proc/set_slot_render(slot_id, overlay) - if(!isnull(rendered_normal_overlays[slot_id])) - owner.cut_overlay(rendered_normal_overlays[slot_id]) - rendered_normal_overlays[slot_id] = overlay - owner.add_overlay(overlay) +/datum/inventory/proc/get_hud() + RETURN_TYPE(/datum/mob_hud/inventory) + #warn impl //* Queries *// diff --git a/code/modules/mob/login.dm b/code/modules/mob/mob-login.dm similarity index 95% rename from code/modules/mob/login.dm rename to code/modules/mob/mob-login.dm index 256211c38fba..ce2c46ade52e 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/mob-login.dm @@ -81,7 +81,7 @@ client.action_drawer.register_holder(actions_innate) if(inventory) client.action_drawer.register_holder(inventory.actions) - // we really hate that this is needed but it is until the screens/images reset isn't there + // todo: we really hate that this is needed but it is until the screens/images reset isn't in Login() client.action_drawer.reassert_screen() // reset statpanel of any verbs/whatnot client.statpanel_reload() @@ -91,6 +91,9 @@ login_cutscene() // Make sure blindness fullscreen is applied if needed blindness_handle_reconnect() + // load inventory HUD + var/datum/mob_hud/inventory/inventory_hud = inventory?.get_hud() + inventory_hud?.add_user(client) //* legacy // this is below reset_perspective so self perspective generates. diff --git a/code/modules/mob/logout.dm b/code/modules/mob/mob-logout.dm similarity index 97% rename from code/modules/mob/logout.dm rename to code/modules/mob/mob-logout.dm index 6096b0519ac6..e2d805f0b4be 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/mob-logout.dm @@ -15,6 +15,7 @@ client.action_drawer.unregister_holder(actions_innate) if(inventory) client.action_drawer.unregister_holder(inventory.actions) + inventory?.hud?.remove_user(client) /** * Linter check, do not call. diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 9357a2fbaca0..cfc441b3f803 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -427,9 +427,6 @@ . += M . -= src -/mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag) - return - /** * Verb to activate the object in your held hand * diff --git a/code/modules/species/protean/protean_blob.dm b/code/modules/species/protean/protean_blob.dm index 80b864e03334..c50b12356d21 100644 --- a/code/modules/species/protean/protean_blob.dm +++ b/code/modules/species/protean/protean_blob.dm @@ -323,7 +323,7 @@ var/obj/item/held = held_items[i] if(isnull(held)) continue - previously_held[i] = WEAKREF(held) + blob.previously_held[i] = WEAKREF(held) //languages!! for(var/datum/language/L in languages) blob.add_language(L.name) From e886893569e7c38f1fa5e44d772d3eeb2687f861 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:40:19 +0000 Subject: [PATCH 053/140] that --- .../projectiles/guns/ballistic/microbattery/microbattery.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/ballistic/microbattery/microbattery.dm b/code/modules/projectiles/guns/ballistic/microbattery/microbattery.dm index a095b680d660..66440c0349e7 100644 --- a/code/modules/projectiles/guns/ballistic/microbattery/microbattery.dm +++ b/code/modules/projectiles/guns/ballistic/microbattery/microbattery.dm @@ -67,7 +67,7 @@ update_charge() update_icon() -/obj/item/gun/ballistic/microbattery/attack_self(mob/user) +/obj/item/gun/ballistic/microbattery/attack_self(mob/user, datum/event_args/actor/e_args) if(!chambered) return From d6bc594a7aff190df9500af8e06d56ab4b975174 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 6 Aug 2024 14:45:33 +0000 Subject: [PATCH 054/140] changes --- code/__DEFINES/mobs/rendering.dm | 3 +-- code/game/rendering/mob_huds/mob_hud.dm | 21 +++++++++++++++---- .../mob/living/carbon/human/rendering.dm | 19 +++++------------ code/modules/mob/living/simple_mob/hands.dm | 2 +- .../simple_mob/subtypes/humanoid/possessed.dm | 1 - 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/code/__DEFINES/mobs/rendering.dm b/code/__DEFINES/mobs/rendering.dm index 0b854a1f52e7..339ee2151bbd 100644 --- a/code/__DEFINES/mobs/rendering.dm +++ b/code/__DEFINES/mobs/rendering.dm @@ -13,8 +13,7 @@ #define HUMAN_OVERLAY_UNDERWEAR "underwear" #define HUMAN_OVERLAY_FIRE "fire" #define HUMAN_OVERLAY_LIQUID "liquid" -#define HUMAN_OVERLAY_RHAND "rhand" -#define HUMAN_OVERLAY_LHAND "lhand" +#define HUMAN_OVERLAY_HAND(INDEX) "hand-[INDEX]" // todo: sprite accessories list system diff --git a/code/game/rendering/mob_huds/mob_hud.dm b/code/game/rendering/mob_huds/mob_hud.dm index 64887ecb51a2..bd310c73e991 100644 --- a/code/game/rendering/mob_huds/mob_hud.dm +++ b/code/game/rendering/mob_huds/mob_hud.dm @@ -16,8 +16,15 @@ var/mob/owner /// users using us var/list/client/using + + //* hud config *// + /// desired hud style - set at base of sync_client - var/datum/hud_style/style + var/datum/hud_style/hud_style + /// desired hud color - set at base of sync_client + var/hud_color + /// desired hud alpha - set at base of sync_client + var/hud_alpha /datum/mob_hud/New(mob/owner) src.owner = owner @@ -37,12 +44,18 @@ unapply_client(C) /datum/mob_hud/proc/sync_client(client/C) + if(!C) + hud_style = GLOB.hud_styles[/datum/hud_style/midnight::id] + hud_color = "#ffffff" + hud_alpha = 255 + return var/requested = C.get_preference_entry(/datum/game_preference_entry/dropdown/hud_style) - style = GLOB.hud_styles[all_ui_style_ids[requested]] + hud_style = GLOB.hud_styles[all_ui_style_ids[requested]] if(isnull(style)) stack_trace("failed to get style [requested]") - style = new /datum/hud_style/midnight - #warn take alpha/etc into account + hud_style = new /datum/hud_style/midnight + hud_color = C.get_preference_entry(/datum/game_preference_entry/simple_color/hud_color) + hud_alpha = C.get_preference_entry(/datum/game_preference_entry/number/hud_alpha) /datum/mob_hud/proc/apply_client(client/C) C.screen += screens() diff --git a/code/modules/mob/living/carbon/human/rendering.dm b/code/modules/mob/living/carbon/human/rendering.dm index 1e601df9b654..91d9a1a1a96d 100644 --- a/code/modules/mob/living/carbon/human/rendering.dm +++ b/code/modules/mob/living/carbon/human/rendering.dm @@ -843,20 +843,11 @@ /mob/living/carbon/human/update_inv_legcuffed() inventory.update_slot_render(SLOT_ID_LEGCUFFED) -/mob/living/carbon/human/update_inv_r_hand() - if(isnull(r_hand)) - remove_standing_overlay(HUMAN_OVERLAY_RHAND) +/mob/living/carbon/human/update_inv_hand(index) + if(isnull(held_items[index])) + remove_standing_overlay(HUMAN_OVERLAY_HAND(index)) return set_standing_overlay( - HUMAN_OVERLAY_RHAND, - r_hand.render_mob_appearance(src, 2, BODYTYPE_DEFAULT), - ) - -/mob/living/carbon/human/update_inv_l_hand() - if(isnull(l_hand)) - remove_standing_overlay(HUMAN_OVERLAY_LHAND) - return - set_standing_overlay( - HUMAN_OVERLAY_LHAND, - l_hand.render_mob_appearance(src, 1, BODYTYPE_DEFAULT), + HUMAN_OVERLAY_HAND(index), + held_items[index].render_mob_appearance(src, index, BODYTYPE_DEFAULT), ) diff --git a/code/modules/mob/living/simple_mob/hands.dm b/code/modules/mob/living/simple_mob/hands.dm index 33752ad247b9..908ec9452873 100644 --- a/code/modules/mob/living/simple_mob/hands.dm +++ b/code/modules/mob/living/simple_mob/hands.dm @@ -4,7 +4,7 @@ //If they can or cannot use tools/machines/etc /mob/living/simple_mob/IsAdvancedToolUser() - return has_hands + return hand_count /mob/living/simple_mob/proc/IsHumanoidToolUser(var/atom/tool) if(!humanoid_hands) diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm index e6ac60113c90..77d3a9e80eb6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/possessed.dm @@ -39,7 +39,6 @@ armor_legacy_mob = list(melee = 30, bullet = 10, laser = 20,energy = 25, bomb = 20, bio = 100, rad = 100) //This should be the same as the base RIG. hand_count = 2 - has_hands = 1 humanoid_hands = 1 grab_resist = 100 From 8c4e805de0ea79afdefc7d01b2bbca2985a4be38 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:23:33 +0000 Subject: [PATCH 055/140] update --- citadel.dme | 2 ++ code/datums/event_args/clickchain.dm | 3 +-- code/game/objects/items/toys.dm | 7 ++--- .../rendering/legacy/inventory/inventory.dm | 2 +- code/game/rendering/mob_huds/hands.dm | 1 + code/game/rendering/mob_huds/mob_hud.dm | 4 +-- code/modules/assembly/mousetrap.dm | 4 +-- code/modules/mob/inventory.dm | 22 +--------------- code/modules/mob/inventory/inventory.dm | 4 ++- code/modules/mob/inventory/mob/hands.dm | 26 ++++++++++++++++--- code/modules/mob/inventory/mob/internal.dm | 3 +-- .../mob/living/simple_mob/appearance.dm | 6 ----- .../modules/mob/living/simple_mob/on_click.dm | 6 ++--- .../mob/living/simple_mob/simple_mob.dm | 4 --- code/modules/mob/mob-login.dm | 5 ++++ code/modules/mob/mob_defines.dm | 4 +-- .../projectiles/guns/energy/frontier.dm | 7 ----- .../guns/legacy_vr_guns/custom_guns.dm | 6 ++--- 18 files changed, 51 insertions(+), 65 deletions(-) diff --git a/citadel.dme b/citadel.dme index 6e875a790c46..899758696891 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2950,6 +2950,8 @@ #include "code\modules\integrated_electronics\subtypes\time.dm" #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\integrated_electronics\~defines\~defines.dm" +#include "code\modules\mob\mob-login.dm" +#include "code\modules\mob\mob-logout.dm" #include "code\modules\mob\inventory\inventory-rendering.dm" #include "code\modules\mob\inventory\inventory_slot.dm" #include "code\modules\mob\inventory\inventory.dm" diff --git a/code/datums/event_args/clickchain.dm b/code/datums/event_args/clickchain.dm index 695ef32603ee..208f1f15c041 100644 --- a/code/datums/event_args/clickchain.dm +++ b/code/datums/event_args/clickchain.dm @@ -8,13 +8,12 @@ var/intent /// optional: click params var/list/params - /// hand index, if any + /// optional: hand index, if any var/hand_index /// with item, if any var/obj/item/using /// optional: target atom var/atom/target - #warn deal with hand index lol /datum/event_args/actor/clickchain/New(mob/performer, mob/initiator, atom/target, list/params, intent) ..() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 987f8f138d75..a8cdd0a240a0 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -318,7 +318,6 @@ return ..() /obj/item/toy/sword/update_icon() - . = ..() var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade") blade_overlay.color = color if(rainbow) @@ -328,10 +327,8 @@ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other if(active) add_overlay(blade_overlay) - if(istype(usr,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = usr - H.update_inv_l_hand() - H.update_inv_r_hand() + . = ..() + update_worn_icon() /obj/item/toy/sword/AltClick(mob/living/user) if(!colorable) //checks if is not colorable diff --git a/code/game/rendering/legacy/inventory/inventory.dm b/code/game/rendering/legacy/inventory/inventory.dm index 70c331aa297f..55655cc843a4 100644 --- a/code/game/rendering/legacy/inventory/inventory.dm +++ b/code/game/rendering/legacy/inventory/inventory.dm @@ -16,7 +16,7 @@ if(!check_inventory_usage(usr)) return - usr.attack_ui(slot_id) + // usr.attack_ui(slot_id) // Hand slots are special to handle the handcuffs overlay /atom/movable/screen/inventory/hand diff --git a/code/game/rendering/mob_huds/hands.dm b/code/game/rendering/mob_huds/hands.dm index 07dc4e419193..72b19e88a9f5 100644 --- a/code/game/rendering/mob_huds/hands.dm +++ b/code/game/rendering/mob_huds/hands.dm @@ -21,6 +21,7 @@ var/atom/movable/screen/hands/old_hand = hands[from_index] var/atom/movable/screen/hands/new_hand = hands[to_index] + #warn impl all /atom/movable/screen/hands diff --git a/code/game/rendering/mob_huds/mob_hud.dm b/code/game/rendering/mob_huds/mob_hud.dm index bd310c73e991..5f5caebb9f1c 100644 --- a/code/game/rendering/mob_huds/mob_hud.dm +++ b/code/game/rendering/mob_huds/mob_hud.dm @@ -16,7 +16,7 @@ var/mob/owner /// users using us var/list/client/using - + //* hud config *// /// desired hud style - set at base of sync_client @@ -51,7 +51,7 @@ return var/requested = C.get_preference_entry(/datum/game_preference_entry/dropdown/hud_style) hud_style = GLOB.hud_styles[all_ui_style_ids[requested]] - if(isnull(style)) + if(isnull(hud_style)) stack_trace("failed to get style [requested]") hud_style = new /datum/hud_style/midnight hud_color = C.get_preference_entry(/datum/game_preference_entry/simple_color/hud_color) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index a649ec583cb4..f46e9316cdbb 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -74,9 +74,7 @@ return if(armed) if((MUTATION_CLUMSY in user.mutations) && prob(50)) - var/which_hand = "l_hand" - if(!L.hand) - which_hand = "r_hand" + var/which_hand = user.active_hand % 2? "l_hand" : "r_hand" triggered(user, which_hand) user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ "You accidentally trigger [src]!") diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 3d318e6cc8e1..8f4a49baf016 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -1,20 +1,3 @@ -// todo: see all this? needs to be decided what to do with and shoved into the inventory handling system proper once evaluated. - -//This proc is called whenever someone clicks an inventory ui slot. -/mob/proc/attack_ui(var/slot) - var/obj/item/W = get_active_held_item() - - var/obj/item/E = item_by_slot_id(slot) - if (istype(E)) - if(istype(W)) - E.attackby(W,src) - else - E.attack_hand(src) - else - equip_to_slot_if_possible(W, slot) - -//! helpers below - /** * smart equips an item - puts in a slot or tries to put it in storage. */ @@ -58,8 +41,6 @@ //* Hands *// /mob/proc/swap_hand(to_index) - #warn all of this doesn't properly support multi-user. - var/obj/item/was_active = length(held_items) <= active_hand? held_items[active_hand] : null var/old_index = active_hand @@ -75,7 +56,7 @@ . = TRUE - inventory?.hud?.swap_active_hand(old_index, active_hand) + hands_hud?.swap_active_hand(old_index, to_index) //! LEGACY // We just swapped hands, so the thing in our inactive hand will notice it's not the focus @@ -122,7 +103,6 @@ var/number_on_side = round(index / 2) return "[index % 2? "left" : "right"] hand[number_on_side > 1 && " #[number_on_side]"]" - //* Hands - Helpers *// /mob/proc/standard_hand_usability_check(atom/target, hand_index, manipulation_level) diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 726fc120336a..32ae0066fcf9 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -49,7 +49,9 @@ */ /datum/inventory/proc/get_hud() RETURN_TYPE(/datum/mob_hud/inventory) - #warn impl + if(!hud) + hud = new(owner, src) + return hud //* Queries *// diff --git a/code/modules/mob/inventory/mob/hands.dm b/code/modules/mob/inventory/mob/hands.dm index fbb0825fbbd0..d109abf788f6 100644 --- a/code/modules/mob/inventory/mob/hands.dm +++ b/code/modules/mob/inventory/mob/hands.dm @@ -16,7 +16,7 @@ //* Public API - Pickup *// /mob/proc/put_in_hand(obj/item/I, index, flags) - return put_in_hand_impl(I, index, flags) + return equip_hand_impl(I, index, flags) /mob/proc/put_in_hands(obj/item/I, flags) if(is_holding(I)) @@ -342,7 +342,7 @@ * the big, bad proc ultimately in charge of putting something into someone's hand * whether it's from the ground, from a slot, or from another hand. */ -/mob/proc/put_in_hand_impl(obj/item/I, index, flags) +/mob/proc/equip_hand_impl(obj/item/I, index, flags) PRIVATE_PROC(TRUE) if(!I) return TRUE @@ -382,6 +382,7 @@ log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") held_items[index] = I + #warn hud //! LEGACY BEGIN I.update_twohanding() @@ -395,8 +396,27 @@ else I.add_hiddenprint(src) +/** + * get something out of our hand + * + * @return unequipped item + */ +/mob/proc/unequip_hand_impl(obj/item/I, index, flags) + ASSERT(held_items[index] == I) + + held_items[index] = null + + I.unequipped(src, SLOT_ID_HANDS, flags) + #warn impl; hud + /** * handle swapping item from one hand index to another */ /mob/proc/handle_item_handswap(obj/item/I, index, old_index, flags, mob/user = src) - #warn impl + ASSERT(held_items[old_index] == I) + ASSERT(isnull(held_items[index])) + + held_items[old_index] = null + held_items[index] = I + + #warn impl; hud diff --git a/code/modules/mob/inventory/mob/internal.dm b/code/modules/mob/inventory/mob/internal.dm index 1f762c326c7e..54a5188d18d2 100644 --- a/code/modules/mob/inventory/mob/internal.dm +++ b/code/modules/mob/inventory/mob/internal.dm @@ -95,8 +95,7 @@ if(hand) if(!can_unequip(I, SLOT_ID_HANDS, flags, user)) return FALSE - _unequip_held(I, TRUE) - I.unequipped(src, SLOT_ID_HANDS, flags) + unequip_hand_impl(I, hand, flags) old = SLOT_ID_HANDS else if(!I.worn_slot) diff --git a/code/modules/mob/living/simple_mob/appearance.dm b/code/modules/mob/living/simple_mob/appearance.dm index c14f12c7b83a..b33ac8e588e7 100644 --- a/code/modules/mob/living/simple_mob/appearance.dm +++ b/code/modules/mob/living/simple_mob/appearance.dm @@ -26,12 +26,6 @@ else icon_state = initial(icon_state) - if(has_hands) - if(r_hand_sprite) - add_overlay(r_hand_sprite) - if(l_hand_sprite) - add_overlay(l_hand_sprite) - if(has_eye_glow) if(icon_state != icon_living) remove_eyes() diff --git a/code/modules/mob/living/simple_mob/on_click.dm b/code/modules/mob/living/simple_mob/on_click.dm index 6bafe9f6573c..3d56890f0e29 100644 --- a/code/modules/mob/living/simple_mob/on_click.dm +++ b/code/modules/mob/living/simple_mob/on_click.dm @@ -7,7 +7,7 @@ // setClickCooldown(get_attack_speed()) - if(has_hands && istype(A,/obj) && a_intent != INTENT_HARM) + if(has_hands() && istype(A,/obj) && a_intent != INTENT_HARM) var/obj/O = A return O.attack_hand(src) @@ -27,13 +27,13 @@ attack_target(A) if(INTENT_GRAB) - if(has_hands) + if(has_hands()) A.attack_hand(src) else attack_target(A) if(INTENT_DISARM) - if(has_hands) + if(has_hands()) A.attack_hand(src) else attack_target(A) diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index c38d76eb3be8..6c82fd7ca886 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -40,10 +40,6 @@ var/list/hud_gears /// Icon file path to use for the HUD, otherwise generic icons are used var/ui_icons - /// If they have hands, they could use some icons. - var/r_hand_sprite - /// If they have hands, they could use some icons. - var/l_hand_sprite /// Message to print to players about 'how' to play this mob on login. var/player_msg diff --git a/code/modules/mob/mob-login.dm b/code/modules/mob/mob-login.dm index ce2c46ade52e..750274d376c3 100644 --- a/code/modules/mob/mob-login.dm +++ b/code/modules/mob/mob-login.dm @@ -94,6 +94,11 @@ // load inventory HUD var/datum/mob_hud/inventory/inventory_hud = inventory?.get_hud() inventory_hud?.add_user(client) + // load hands HUD + if(has_hands()) + if(!hands_hud) + hands_hud = new(src) + hands_hud.add_user(client) //* legacy // this is below reset_perspective so self perspective generates. diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 4792326b4159..35ddd75e3f8b 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -116,8 +116,8 @@ //* Inventory *// /// our inventory datum, if any. var/datum/inventory/inventory - /// inventory hud used - var/datum/mob_hud/inventory/using_inventory_hud + /// our hand hud, if any + var/datum/mob_hud/hands/hands_hud /// held items; indexed list. defaults to null, lazy. /// the length of this is also the abstracted number of hands we should have /// * 1, 3, 5, ... are left diff --git a/code/modules/projectiles/guns/energy/frontier.dm b/code/modules/projectiles/guns/energy/frontier.dm index ded27a270018..3796836a2209 100644 --- a/code/modules/projectiles/guns/energy/frontier.dm +++ b/code/modules/projectiles/guns/energy/frontier.dm @@ -39,7 +39,6 @@ /obj/item/gun/energy/frontier/update_icon() if(recharging) icon_state = "[initial(icon_state)]_pump" - update_held_icon() return ..() @@ -68,12 +67,6 @@ ) -/obj/item/gun/energy/frontier/locked/carbine/update_icon_state() - . = ..() - if(recharging) - icon_state = "[modifystate]_pump" - update_held_icon() - //Expeditionary Holdout Phaser Pistol /obj/item/gun/energy/frontier/locked/holdout name = "Holdout Phaser Pistol" diff --git a/code/modules/projectiles/guns/legacy_vr_guns/custom_guns.dm b/code/modules/projectiles/guns/legacy_vr_guns/custom_guns.dm index a07897a1a390..c2b69bf76695 100644 --- a/code/modules/projectiles/guns/legacy_vr_guns/custom_guns.dm +++ b/code/modules/projectiles/guns/legacy_vr_guns/custom_guns.dm @@ -20,7 +20,7 @@ /obj/item/gun/ballistic/automatic/battlerifle/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/battlerifle/update_icon_state() . = ..() @@ -61,7 +61,7 @@ /obj/item/gun/ballistic/automatic/pdw/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/pdw/update_icon_state() . = ..() @@ -102,7 +102,7 @@ /obj/item/gun/ballistic/automatic/stg/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/stg/update_icon_state() . = ..() From 467570cd6c501968f5cc6b6265d2b8cdd90851f6 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:25:39 +0000 Subject: [PATCH 056/140] change --- citadel.dme | 2 -- code/game/rendering/screen_legacy.dm | 11 ++++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/citadel.dme b/citadel.dme index 899758696891..348576139038 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3433,8 +3433,6 @@ #include "code\modules\mob\holder.dm" #include "code\modules\mob\inventory.dm" #include "code\modules\mob\life.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\logout.dm" #include "code\modules\mob\mob-keybind-triggers.dm" #include "code\modules\mob\mob.dm" #include "code\modules\mob\mob_defines.dm" diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index 9d80787a09fb..eed975c3460e 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -232,11 +232,12 @@ // suit storage locnames += "on your suit" tanks += H.s_store - // right/left hands - locnames += "in your right hand" - tanks += H.r_hand - locnames += "in your left hand" - tanks += H.l_hand + for(var/i in 1 to length(H.held_items)) + tanks += H.held_items[i] + if(i <= 2) + locnames += "in your [i == 1? "left" : "right"] hand" + else + locnames += "in your [ceil(i / 2)](th) [i % 2? "left" : "right"] hand" // pockets locnames += "in your left pocket" tanks += H.l_store From ba19f84fc2252645333cab827e28b4eaad72b75f Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:45:20 +0000 Subject: [PATCH 057/140] changes --- code/game/rendering/screen_legacy.dm | 13 ++++++---- code/modules/assembly/mousetrap.dm | 4 +-- code/modules/mob/inventory/mob/hands.dm | 6 +++++ code/modules/mob/living/carbon/human/human.dm | 3 +-- .../mob/living/carbon/human/inventory.dm | 6 +++-- code/modules/mob/living/living.dm | 26 ------------------- code/modules/species/species_hud.dm | 13 ---------- .../species/xenomorphs/alien_species.dm | 2 -- 8 files changed, 20 insertions(+), 53 deletions(-) diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index eed975c3460e..2a6f57affddc 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -232,6 +232,7 @@ // suit storage locnames += "on your suit" tanks += H.s_store + // hands for(var/i in 1 to length(H.held_items)) tanks += H.held_items[i] if(i <= 2) @@ -250,11 +251,13 @@ locnames += "on your back" tanks += H.back else - // right/left hands - locnames += "in your right hand" - tanks += C.r_hand - locnames += "in your left hand" - tanks += C.l_hand + // hands + for(var/i in 1 to length(H.held_items)) + tanks += H.held_items[i] + if(i <= 2) + locnames += "in your [i == 1? "left" : "right"] hand" + else + locnames += "in your [ceil(i / 2)](th) [i % 2? "left" : "right"] hand" // back locnames += "on your back" tanks += C.back diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index f46e9316cdbb..418b0786712e 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -96,7 +96,6 @@ triggered(AM) ..() - /obj/item/assembly/mousetrap/on_containing_storage_opening(datum/event_args/actor/actor, datum/object_system/storage/storage) . = ..() @@ -106,11 +105,10 @@ if(armed) finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \ "You accidentally trigger [src]!") - triggered(finder, finder.hand % 2? "l_hand" : "r_hand") + triggered(finder, finder.active_hand % 2? "l_hand" : "r_hand") return 1 //end the search! return 0 - /obj/item/assembly/mousetrap/throw_impacted(atom/movable/AM, datum/thrownthing/TT) . = ..() if(!armed) diff --git a/code/modules/mob/inventory/mob/hands.dm b/code/modules/mob/inventory/mob/hands.dm index d109abf788f6..18814560a28e 100644 --- a/code/modules/mob/inventory/mob/hands.dm +++ b/code/modules/mob/inventory/mob/hands.dm @@ -336,6 +336,12 @@ RETURN_TYPE(/list) #warn impl + subtypes +/** + * sets number of physical hands we should account for potentialy having + */ +/mob/proc/set_nominal_hand_count() + #warn impl + //* Internals *// /** diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c267cb56b428..bfe63483938b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1130,8 +1130,7 @@ // i seriously hate vorecode species.on_apply(src) - // set our has hands - has_hands = (species && species.hud)? species.hud.has_hands : TRUE + set_nominal_hand_count(species.hud? (species.hud.has_hands ? 2 : 0) : 2) // until we unfuck hud datums, this will force reload our entire hud if(hud_used) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 53988893808b..eb92b9cb3363 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -219,8 +219,7 @@ var/self_equip = user == src - // first, check species - if(species?.hud?.equip_slots && !(slot in species.hud.equip_slots)) + if(!semantically_has_slot(slot)) if(!(flags & INV_OP_SUPPRESS_WARNING)) to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] have nowhere to put that!")) return FALSE @@ -266,6 +265,9 @@ . = ..() if(!.) return + switch(id) + if(SLOT_ID_HANDCUFFED) + return has_hands() var/datum/inventory_slot/slot_meta = resolve_inventory_slot(id) if(!slot_meta) return FALSE diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5ea401e54e50..688ff741f91c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -639,32 +639,6 @@ default behaviour is: else // No colors, so remove the client's color. animate(client, color = null, time = 10) -/mob/proc/activate_hand(selhand) - -/mob/living/activate_hand(selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand. - - if(istext(selhand)) - selhand = lowertext(selhand) - - if(selhand == "right" || selhand == "r") - selhand = 0 - if(selhand == "left" || selhand == "l") - selhand = 1 - - if(selhand != src.hand) - swap_hand() - -// todo: multihands - -/mob/proc/activate_hand_of_index(index) - -/mob/living/activate_hand_of_index(index) - switch(index) - if(1) - activate_hand("l") - if(2) - activate_hand("r") - /mob/living/get_sound_env(var/pressure_factor) if (hallucination) return PSYCHOTIC diff --git a/code/modules/species/species_hud.dm b/code/modules/species/species_hud.dm index dbbdcdff25fc..0ca78ac12b18 100644 --- a/code/modules/species/species_hud.dm +++ b/code/modules/species/species_hud.dm @@ -1,7 +1,5 @@ /datum/hud_data var/icon // If set, overrides ui_style. - var/has_a_intent = 1 // Set to draw intent box. - var/has_m_intent = 1 // Set to draw move intent box. var/has_warnings = 1 // Set to draw environment warnings. var/has_pressure = 1 // Draw the pressure indicator. var/has_nutrition = 1 // Draw the nutrition indicator. @@ -11,7 +9,6 @@ var/has_throw = 1 // Set to draw throw button. var/has_resist = 1 // Set to draw resist button. var/has_internals = 1 // Set to draw the internals toggle button. - var/list/equip_slots = list() // Checked by mob_can_equip(). // Contains information on the position and tag for all inventory slots // to be drawn for the mob. This is fairly delicate, try to avoid messing with it @@ -35,16 +32,6 @@ SLOT_ID_BELT = list("loc" = ui_belt, "name" = "Belt", "slot" = SLOT_ID_BELT, "state" = "belt") ) -/datum/hud_data/New() - ..() - for(var/slot in gear) - equip_slots |= gear[slot]["slot"] - - if(has_hands) - equip_slots |= SLOT_ID_HANDCUFFED - - equip_slots |= SLOT_ID_LEGCUFFED - /datum/hud_data/diona has_internals = 0 gear = list( diff --git a/code/modules/species/xenomorphs/alien_species.dm b/code/modules/species/xenomorphs/alien_species.dm index 6d9404b247c1..134bd635be4c 100644 --- a/code/modules/species/xenomorphs/alien_species.dm +++ b/code/modules/species/xenomorphs/alien_species.dm @@ -334,8 +334,6 @@ /datum/hud_data/alien icon = 'icons/mob/screen1_alien.dmi' - has_a_intent = 1 - has_m_intent = 1 has_warnings = 1 has_drop = 1 has_throw = 1 From a99f5a572c20c6146c79037754ced5fb0b2e069b Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:48:45 +0000 Subject: [PATCH 058/140] hell. --- code/game/rendering/legacy/human.dm | 149 +++++++++++++-------------- code/game/rendering/screen_legacy.dm | 4 +- 2 files changed, 75 insertions(+), 78 deletions(-) diff --git a/code/game/rendering/legacy/human.dm b/code/game/rendering/legacy/human.dm index 714ebaafdd8c..42418e63ddcf 100644 --- a/code/game/rendering/legacy/human.dm +++ b/code/game/rendering/legacy/human.dm @@ -58,82 +58,79 @@ src.adding += using // Draw the attack intent dialogue. - if(hud_data.has_a_intent) - - using = new /atom/movable/screen() - using.name = "act_intent" - using.icon = ui_style - using.icon_state = "intent_"+mymob.a_intent - using.screen_loc = ui_acti - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - action_intent = using - - hud_elements |= using - - //intent small hud objects - var/icon/ico - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) - using = new /atom/movable/screen() - using.name = INTENT_HELP - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = HUD_LAYER_ITEM //These sit on the intent box - src.adding += using - help_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) - using = new /atom/movable/screen() - using.name = INTENT_DISARM - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = HUD_LAYER_ITEM - src.adding += using - disarm_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) - using = new /atom/movable/screen() - using.name = INTENT_GRAB - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = HUD_LAYER_ITEM - src.adding += using - grab_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) - using = new /atom/movable/screen() - using.name = INTENT_HARM - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = HUD_LAYER_ITEM - src.adding += using - hurt_intent = using - //end intent small hud objects - - if(hud_data.has_m_intent) - using = new /atom/movable/screen() - using.name = "mov_intent" - using.icon = ui_style - using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - move_intent = using + using = new /atom/movable/screen() + using.name = "act_intent" + using.icon = ui_style + using.icon_state = "intent_"+mymob.a_intent + using.screen_loc = ui_acti + using.color = ui_color + using.alpha = ui_alpha + src.adding += using + action_intent = using + + hud_elements |= using + + //intent small hud objects + var/icon/ico + + ico = new(ui_style, "black") + ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) + ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) + using = new /atom/movable/screen() + using.name = INTENT_HELP + using.icon = ico + using.screen_loc = ui_acti + using.alpha = ui_alpha + using.layer = HUD_LAYER_ITEM //These sit on the intent box + src.adding += using + help_intent = using + + ico = new(ui_style, "black") + ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) + ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) + using = new /atom/movable/screen() + using.name = INTENT_DISARM + using.icon = ico + using.screen_loc = ui_acti + using.alpha = ui_alpha + using.layer = HUD_LAYER_ITEM + src.adding += using + disarm_intent = using + + ico = new(ui_style, "black") + ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) + ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) + using = new /atom/movable/screen() + using.name = INTENT_GRAB + using.icon = ico + using.screen_loc = ui_acti + using.alpha = ui_alpha + using.layer = HUD_LAYER_ITEM + src.adding += using + grab_intent = using + + ico = new(ui_style, "black") + ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) + ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) + using = new /atom/movable/screen() + using.name = INTENT_HARM + using.icon = ico + using.screen_loc = ui_acti + using.alpha = ui_alpha + using.layer = HUD_LAYER_ITEM + src.adding += using + hurt_intent = using + //end intent small hud objects + + using = new /atom/movable/screen() + using.name = "mov_intent" + using.icon = ui_style + using.icon_state = (mymob.m_intent == "run" ? "running" : "walking") + using.screen_loc = ui_movi + using.color = ui_color + using.alpha = ui_alpha + src.adding += using + move_intent = using if(hud_data.has_drop) using = new /atom/movable/screen() diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index 2a6f57affddc..d885228eeb3b 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -252,8 +252,8 @@ tanks += H.back else // hands - for(var/i in 1 to length(H.held_items)) - tanks += H.held_items[i] + for(var/i in 1 to length(C.held_items)) + tanks += C.held_items[i] if(i <= 2) locnames += "in your [i == 1? "left" : "right"] hand" else From 53ef1b511f457eae27232129aa43c878324e3dcc Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 7 Aug 2024 14:47:21 +0000 Subject: [PATCH 059/140] hell --- citadel.dme | 3 + code/__DEFINES/mobs/hands.dm | 12 +- code/modules/mob/inventory.dm | 118 ------------------ code/modules/mob/inventory_legacy.dm | 47 +++++++ .../modules/mob/living/carbon/carbon-hands.dm | 40 ++++++ code/modules/mob/mob-hands.dm | 99 +++++++++++++++ code/modules/mob/mob-inventory.dm | 10 ++ 7 files changed, 206 insertions(+), 123 deletions(-) delete mode 100644 code/modules/mob/inventory.dm create mode 100644 code/modules/mob/inventory_legacy.dm create mode 100644 code/modules/mob/living/carbon/carbon-hands.dm create mode 100644 code/modules/mob/mob-hands.dm create mode 100644 code/modules/mob/mob-inventory.dm diff --git a/citadel.dme b/citadel.dme index 348576139038..3a5378a4e18d 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2950,6 +2950,8 @@ #include "code\modules\integrated_electronics\subtypes\time.dm" #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\integrated_electronics\~defines\~defines.dm" +#include "code\modules\mob\mob-hands.dm" +#include "code\modules\mob\mob-inventory.dm" #include "code\modules\mob\mob-login.dm" #include "code\modules\mob\mob-logout.dm" #include "code\modules\mob\inventory\inventory-rendering.dm" @@ -3530,6 +3532,7 @@ #include "code\modules\mob\living\bot\secbot.dm" #include "code\modules\mob\living\bot\SLed209bot.dm" #include "code\modules\mob\living\carbon\breathe.dm" +#include "code\modules\mob\living\carbon\carbon-hands.dm" #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" #include "code\modules\mob\living\carbon\carbon_defines.dm" diff --git a/code/__DEFINES/mobs/hands.dm b/code/__DEFINES/mobs/hands.dm index ac9f9c21e65d..064f1acadf12 100644 --- a/code/__DEFINES/mobs/hands.dm +++ b/code/__DEFINES/mobs/hands.dm @@ -1,8 +1,10 @@ -//* hand manipulation levels +//* hand manipulation levels *// -/// use keyboards / precision work -#define HAND_MANIPULATION_PRECISE 3 -/// pick up an item roughly -#define HAND_MANIPULATION_GENERAL 2 +/// do surgery / precise tooling / precision work +#define HAND_MANIPULATION_PRECISE 4 +/// use simple keyboards, manipulate a small switch, rotate objects, etc +#define HAND_MANIPULATION_GENERAL 3 +/// pick up an item roughly, pull a switch, etc +#define HAND_MANIPULATION_MOVE 2 /// just hit your hand against something #define HAND_MANIPULATION_DULL 1 diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm deleted file mode 100644 index 8f4a49baf016..000000000000 --- a/code/modules/mob/inventory.dm +++ /dev/null @@ -1,118 +0,0 @@ -/** - * smart equips an item - puts in a slot or tries to put it in storage. - */ -/mob/proc/smart_equip(obj/item/I) - if(equip_to_appropriate_slot(I, INV_OP_SUPPRESS_WARNING)) - return TRUE - if(equip_to_slot_if_possible(I, /datum/inventory_slot/abstract/put_in_storage_try_active, INV_OP_SUPPRESS_WARNING)) - return TRUE - to_chat(src, SPAN_WARNING("You have nowhere to put [I]!")) - return FALSE - -/** - * call this one instead of smart_equip directly from verbs. - */ -/mob/proc/attempt_smart_equip(obj/item/I = get_active_held_item(), silent = FALSE) - if(!I) - if(!silent) - to_chat(src, SPAN_WARNING("You are not holding anything to equip!")) - return FALSE - - if(!is_holding(I)) - if(!silent) - to_chat(src, SPAN_WARNING("You must be holding [I] to equip it!")) - return FALSE - - return smart_equip(I) - -/** - * kicks out all physical restraints on us - */ -/mob/proc/remove_all_restraints() - drop_slots_to_ground(list(SLOT_ID_HANDCUFFED, SLOT_ID_LEGCUFFED), INV_OP_FORCE) - var/obj/item/suit_check = item_by_slot_id(SLOT_ID_SUIT) - if(istype(suit_check, /obj/item/clothing/suit/straight_jacket)) - drop_item_to_ground(suit_check, INV_OP_FORCE) - // guess at if it's a bad thing - // todo: actual flag like BUCKLING_IS_CONSIDERED_RESTRICTING or something - if(buckled?.buckle_flags & (BUCKLING_NO_DEFAULT_RESIST | BUCKLING_NO_DEFAULT_UNBUCKLE)) - unbuckle(BUCKLE_OP_FORCE) - -//* Hands *// - -/mob/proc/swap_hand(to_index) - var/obj/item/was_active = length(held_items) <= active_hand? held_items[active_hand] : null - var/old_index = active_hand - - if(isnull(to_index)) - if(active_hand >= length(held_items)) - active_hand = length(held_items)? 1 : null - else - ++active_hand - else - if(to_index > length(held_items)) - return FALSE - active_hand = to_index - - . = TRUE - - hands_hud?.swap_active_hand(old_index, to_index) - - //! LEGACY - // We just swapped hands, so the thing in our inactive hand will notice it's not the focus - if(!isnull(was_active)) - if(was_active.zoom) - was_active.zoom() - //! End - -/mob/proc/get_active_hand_organ_key() - return null - -/mob/proc/get_active_hand_organ() - RETURN_TYPE(/obj/item/organ/external) - return null - -/mob/proc/get_hand_organ_key(index) - return null - -/mob/proc/get_hand_organ(index) - return null - -/mob/proc/is_hand_functional(index, manipulation_level) - return TRUE - -/mob/proc/get_hand_index_of_organ(obj/item/organ/external/organ) - return null - -/mob/proc/get_active_arm_organ_key() - return null - -/mob/proc/get_active_arm_organ() - return null - -/mob/proc/get_arm_organ_key(index) - return null - -/mob/proc/get_arm_organ(index) - return null - -/mob/proc/get_hand_fail_message(index, manipulation_level) - return "You try to move your [get_generalized_hand_name(index)], and should be able to, but can't. Report this to coders!" - -/mob/proc/get_generalized_hand_name(index) - var/number_on_side = round(index / 2) - return "[index % 2? "left" : "right"] hand[number_on_side > 1 && " #[number_on_side]"]" - -//* Hands - Helpers *// - -/mob/proc/standard_hand_usability_check(atom/target, hand_index, manipulation_level) - if(!is_hand_functional(hand_index, manipulation_level)) - action_feedback(SPAN_WARNING(get_hand_fail_message(hand_index, manipulation_level)), target) - -//* Carry Weight - -/mob/proc/update_carry_slowdown() - return - -/mob/proc/update_item_slowdown() - return diff --git a/code/modules/mob/inventory_legacy.dm b/code/modules/mob/inventory_legacy.dm new file mode 100644 index 000000000000..aa191330a34b --- /dev/null +++ b/code/modules/mob/inventory_legacy.dm @@ -0,0 +1,47 @@ +/** + * smart equips an item - puts in a slot or tries to put it in storage. + */ +/mob/proc/smart_equip(obj/item/I) + if(equip_to_appropriate_slot(I, INV_OP_SUPPRESS_WARNING)) + return TRUE + if(equip_to_slot_if_possible(I, /datum/inventory_slot/abstract/put_in_storage_try_active, INV_OP_SUPPRESS_WARNING)) + return TRUE + to_chat(src, SPAN_WARNING("You have nowhere to put [I]!")) + return FALSE + +/** + * call this one instead of smart_equip directly from verbs. + */ +/mob/proc/attempt_smart_equip(obj/item/I = get_active_held_item(), silent = FALSE) + if(!I) + if(!silent) + to_chat(src, SPAN_WARNING("You are not holding anything to equip!")) + return FALSE + + if(!is_holding(I)) + if(!silent) + to_chat(src, SPAN_WARNING("You must be holding [I] to equip it!")) + return FALSE + + return smart_equip(I) + +/** + * kicks out all physical restraints on us + */ +/mob/proc/remove_all_restraints() + drop_slots_to_ground(list(SLOT_ID_HANDCUFFED, SLOT_ID_LEGCUFFED), INV_OP_FORCE) + var/obj/item/suit_check = item_by_slot_id(SLOT_ID_SUIT) + if(istype(suit_check, /obj/item/clothing/suit/straight_jacket)) + drop_item_to_ground(suit_check, INV_OP_FORCE) + // guess at if it's a bad thing + // todo: actual flag like BUCKLING_IS_CONSIDERED_RESTRICTING or something + if(buckled?.buckle_flags & (BUCKLING_NO_DEFAULT_RESIST | BUCKLING_NO_DEFAULT_UNBUCKLE)) + unbuckle(BUCKLE_OP_FORCE) + +//* Carry Weight + +/mob/proc/update_carry_slowdown() + return + +/mob/proc/update_item_slowdown() + return diff --git a/code/modules/mob/living/carbon/carbon-hands.dm b/code/modules/mob/living/carbon/carbon-hands.dm new file mode 100644 index 000000000000..dc82c29b5a8b --- /dev/null +++ b/code/modules/mob/living/carbon/carbon-hands.dm @@ -0,0 +1,40 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* Hands - Organs *// + +/** + * Get the hand index of an organ + * + * * If an organ is responsible for more than one index, this only returns one of them. + */ +/mob/proc/get_hand_index_of_organ(obj/item/organ/external/organ) + return null + +/** + * Get all hand indexes of an organ + */ +/mob/proc/get_hand_index_of_organ(obj/item/organ/external/organ) + RETURN_TYPE(/list) + return list() + +/** + * Get the external organ of an arm + */ +/mob/proc/get_hand_organ(index) + RETURN_TYPE(/obj/item/organ/external) + +#warn impl + +//* Hands - Organs - Legacy Default Handling *// +//* To allow for multiple people able to control multiple active hands later, *// +//* we'll need to pass active hand index through the clickchain / actor handlers. *// +//* +//* However, this system isn't in yet, so old code should still use these procs. *// + +/** + * Get the external organ of an arm + */ +/mob/proc/get_active_hand_organ(index) + RETURN_TYPE(/obj/item/organ/external) + return get_hand_organ(active_hand) diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm new file mode 100644 index 000000000000..b6904065e131 --- /dev/null +++ b/code/modules/mob/mob-hands.dm @@ -0,0 +1,99 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* Hands - Checks *// + +/** + * Gets effective manipulation level of a hand index + */ +/mob/proc/get_hand_manipulation_level(index) + return HAND_MANIPULATION_PRECISE + +/** + * Checks if a hand can be used at a given manipulation level. + */ +/mob/proc/is_hand_manipulation_sufficient(index, manipulation) + return get_hand_manipulation_level(index) >= manipulation + +/** + * get a list of reasons (e.g. 'broken bone', 'stunned', etc) + * a hand **cannot** be at a certain manipulation level. + */ +/mob/proc/why_hand_manipulation_insufficient(index, manipulation) + RETURN_TYPE(/list) + return list() + +//* Hands - Helpers *// + +/** + * Runs a standard hand usability check against a target with a given manipulation level required. + * + * @params + * * target - what is being interacted with + * * index - hand index being used + * * manipulation - required manipulation level + * * actor - (optional) interactor + * * silent - (optional) if set, will not emit error message + * + * @return TRUE / FALSE sucecss / fail + */ +/mob/proc/standard_hand_usability_check(atom/target, index, manipulation, datum/event_args/actor/actor, silent) + if(is_hand_manipulation_sufficient(index, manipulation)) + return + if(silent) + return + var/list/reasons_we_cant = why_hand_manipulation_insufficient(index, manipulation) + if(actor) + actor.action_feedback( + SPAN_WARNING("You can't do that right now! ([length(reasons_we_cant) ? english_list(reasons_we_cant) : "hand nonfunctional for unknown reason"])"), + target = target, + ) + else + action_feedback( + SPAN_WARNING("You can't do that right now! ([length(reasons_we_cant) ? english_list(reasons_we_cant) : "hand nonfunctional for unknown reason"])"), + target = target, + ) + +//* Hands - Identity *// + +/** + * Returns something like "left hand", "right hand", "3rd right hand", "left hand #2", etc. + */ +/mob/proc/get_hand_generalized_name(index) + var/number_on_side = round(index / 2) + return "[index % 2? "left" : "right"] hand[number_on_side > 1 && " #[number_on_side]"]" + +//* Hands - Legacy / WIP *// + +/** + * Swaps our active hand + * + * * In the future, we'll want to track active hand, attack intents, etc, by operator, instead of by mob. + * * This is so remote control abstraction works. + */ +/mob/proc/swap_hand(to_index) + var/obj/item/was_active = length(held_items) <= active_hand? held_items[active_hand] : null + var/old_index = active_hand + + if(isnull(to_index)) + if(active_hand >= length(held_items)) + active_hand = length(held_items)? 1 : null + else + ++active_hand + else + if(to_index > length(held_items)) + return FALSE + active_hand = to_index + + . = TRUE + + hands_hud?.swap_active_hand(old_index, to_index) + + //! LEGACY + // We just swapped hands, so the thing in our inactive hand will notice it's not the focus + if(!isnull(was_active)) + if(was_active.zoom) + was_active.zoom() + //! End + +#warn impl diff --git a/code/modules/mob/mob-inventory.dm b/code/modules/mob/mob-inventory.dm new file mode 100644 index 000000000000..f94f1aa66f05 --- /dev/null +++ b/code/modules/mob/mob-inventory.dm @@ -0,0 +1,10 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* Carry Weight *// + +/mob/proc/update_carry_slowdown() + return + +/mob/proc/update_item_slowdown() + return From 9399afab123d7adeb8eca8ffbb5aaa99b9b12036 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 7 Aug 2024 15:03:25 +0000 Subject: [PATCH 060/140] new approach --- .../modules/mob/living/carbon/carbon-hands.dm | 25 +++++++++--- code/modules/mob/living/carbon/inventory.dm | 38 ------------------- code/modules/mob/mob-hands.dm | 2 + code/modules/mob/mob.dm | 3 -- code/modules/organs/external/external.dm | 10 +---- 5 files changed, 24 insertions(+), 54 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon-hands.dm b/code/modules/mob/living/carbon/carbon-hands.dm index dc82c29b5a8b..bcc85fbfe256 100644 --- a/code/modules/mob/living/carbon/carbon-hands.dm +++ b/code/modules/mob/living/carbon/carbon-hands.dm @@ -1,6 +1,14 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2024 silicons *// +//* Hands - Checks *// + +/mob/living/carbon/get_hand_manipulation_level(index) + #warn impl + +/mob/living/carbon/why_hand_manipulation_insufficient(index, manipulation) + #warn impl + //* Hands - Organs *// /** @@ -8,23 +16,30 @@ * * * If an organ is responsible for more than one index, this only returns one of them. */ -/mob/proc/get_hand_index_of_organ(obj/item/organ/external/organ) +/mob/living/carbon/proc/get_hand_index_of_organ(obj/item/organ/external/organ) + #warn impl return null /** * Get all hand indexes of an organ */ -/mob/proc/get_hand_index_of_organ(obj/item/organ/external/organ) +/mob/living/carbon/proc/get_hand_indices_of_organ(obj/item/organ/external/organ) RETURN_TYPE(/list) + #warn impl return list() /** * Get the external organ of an arm */ -/mob/proc/get_hand_organ(index) +/mob/living/carbon/proc/get_hand_organ_of_index(index) RETURN_TYPE(/obj/item/organ/external) + #warn impl -#warn impl +/** + * Get the external organ of a held iteem + */ +/mob/living/carbon/proc/get_hand_organ_of_held(obj/item/held) + return get_hand_organ_of_index(get_held_index(held)) //* Hands - Organs - Legacy Default Handling *// //* To allow for multiple people able to control multiple active hands later, *// @@ -35,6 +50,6 @@ /** * Get the external organ of an arm */ -/mob/proc/get_active_hand_organ(index) +/mob/living/carbon/proc/get_active_hand_organ(index) RETURN_TYPE(/obj/item/organ/external) return get_hand_organ(active_hand) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index e6ae25ae4a60..8256d60a3e13 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -50,44 +50,6 @@ SLOT_ID_LEGCUFFED, ) -//* Hands *// - -/mob/living/carbon/get_active_hand_organ_key() - return get_hand_organ_key(active_hand) - -/mob/living/carbon/get_active_hand_organ() - RETURN_TYPE(/obj/item/organ/external) - return get_organ(get_hand_organ_key(active_hand)) - -/mob/living/carbon/get_hand_organ_key(index) - #warn impl - -/mob/living/carbon/get_hand_organ(index) - return get_organ(get_hand_organ_key(index)) - -/mob/living/carbon/is_hand_functional(index, fine_manipulation) - var/obj/item/organ/external/part = get_hand_organ(index) - #warn impl - -/mob/living/carbon/get_hand_index_of_organ(obj/item/organ/external/organ) - #warn impl - -/mob/living/carbon/get_active_arm_organ_key() - return get_arm_organ_key(active_hand) - -/mob/living/carbon/get_active_arm_organ() - RETURN_TYPE(/obj/item/organ/external) - return get_organ(get_arm_organ_key(active_hand)) - -/mob/living/carbon/get_arm_organ_key(index) - #warn impl - -/mob/living/carbon/get_arm_organ(index) - return get_organ(get_arm_organ_key(index)) - -/mob/living/carbon/get_hand_fail_message(index) - #warn impl - //* carry weight /mob/living/carbon/carry_weight_to_penalty(amount) diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index b6904065e131..d750562e5656 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -13,6 +13,8 @@ * Checks if a hand can be used at a given manipulation level. */ /mob/proc/is_hand_manipulation_sufficient(index, manipulation) + // until there's a reason to do otherwise, get_hand_manipulation_level() should be what you override! + SHOULD_NOT_OVERRIDE(TRUE) return get_hand_manipulation_level(index) >= manipulation /** diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 6c4eccc05ae3..4517bdee8ba7 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1029,9 +1029,6 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) animate(client, color = null, time = 10) return -/mob/proc/swap_hand() - return - /mob/proc/will_show_tooltip() if(alpha <= EFFECTIVE_INVIS) return FALSE diff --git a/code/modules/organs/external/external.dm b/code/modules/organs/external/external.dm index 47a938564f7f..318d00e8b0e9 100644 --- a/code/modules/organs/external/external.dm +++ b/code/modules/organs/external/external.dm @@ -542,14 +542,8 @@ return FALSE if(user == src.owner) - var/grasp - if(user.l_hand == tool && (src.body_part_flags & (ARM_LEFT|HAND_LEFT))) - grasp = BP_L_HAND - else if(user.r_hand == tool && (src.body_part_flags & (ARM_RIGHT|HAND_RIGHT))) - grasp = BP_R_HAND - - if(grasp) - to_chat(user, SPAN_WARNING("You can't reach your [src.name] while holding [tool] in your [owner.get_bodypart_name(grasp)].")) + if(owner.get_hand_organ(owner.get_held_index(tool)) == src) + to_chat(user, SPAN_WARNING("You can't reach your [src] while holding [tool] in the same hand!")) return FALSE user.setClickCooldown(user.get_attack_speed(tool)) From c8d595666717407b5de5078d90db72646df8ca19 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 7 Aug 2024 16:11:01 +0000 Subject: [PATCH 061/140] please help this is hell --- citadel.dme | 8 +- code/__DEFINES/inventory/procs.dm | 17 +- code/game/objects/items/weapons/handcuffs.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 2 +- code/modules/mob/grab.dm | 2 +- .../mob/inventory/inventory-hands-check.dm | 74 +++ .../mob/inventory/inventory-hands-drop.dm | 56 +++ .../mob/inventory/inventory-hands-get.dm | 166 +++++++ .../mob/inventory/inventory-hands-legacy.dm | 23 + .../mob/inventory/inventory-hands-put.dm | 82 ++++ code/modules/mob/inventory/inventory-hands.dm | 97 ++++ code/modules/mob/inventory/inventory.dm | 26 +- code/modules/mob/inventory/mob/hands.dm | 428 ------------------ .../modules/mob/living/carbon/carbon-hands.dm | 6 +- code/modules/mob/living/carbon/carbon.dm | 2 +- .../living/carbon/human/human_attackhand.dm | 2 +- .../mob/living/carbon/human/human_organs.dm | 2 +- code/modules/mob/living/mobility.dm | 2 +- code/modules/mob/mob-hands.dm | 108 ++++- code/modules/mob/mob_defines.dm | 7 - .../organs/external/subtypes/standard.dm | 16 +- code/modules/projectiles/projectile/hook.dm | 2 +- 22 files changed, 668 insertions(+), 462 deletions(-) create mode 100644 code/modules/mob/inventory/inventory-hands-check.dm create mode 100644 code/modules/mob/inventory/inventory-hands-drop.dm create mode 100644 code/modules/mob/inventory/inventory-hands-get.dm create mode 100644 code/modules/mob/inventory/inventory-hands-legacy.dm create mode 100644 code/modules/mob/inventory/inventory-hands-put.dm create mode 100644 code/modules/mob/inventory/inventory-hands.dm delete mode 100644 code/modules/mob/inventory/mob/hands.dm diff --git a/citadel.dme b/citadel.dme index 3a5378a4e18d..01cdbdbc1eff 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2950,10 +2950,17 @@ #include "code\modules\integrated_electronics\subtypes\time.dm" #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\integrated_electronics\~defines\~defines.dm" +#include "code\modules\mob\inventory_legacy.dm" #include "code\modules\mob\mob-hands.dm" #include "code\modules\mob\mob-inventory.dm" #include "code\modules\mob\mob-login.dm" #include "code\modules\mob\mob-logout.dm" +#include "code\modules\mob\inventory\inventory-hands-check.dm" +#include "code\modules\mob\inventory\inventory-hands-drop.dm" +#include "code\modules\mob\inventory\inventory-hands-get.dm" +#include "code\modules\mob\inventory\inventory-hands-legacy.dm" +#include "code\modules\mob\inventory\inventory-hands-put.dm" +#include "code\modules\mob\inventory\inventory-hands.dm" #include "code\modules\mob\inventory\inventory-rendering.dm" #include "code\modules\mob\inventory\inventory_slot.dm" #include "code\modules\mob\inventory\inventory.dm" @@ -2961,7 +2968,6 @@ #include "code\modules\mob\inventory\item\public.dm" #include "code\modules\mob\inventory\item\rendering.dm" #include "code\modules\mob\inventory\mob\abstraction.dm" -#include "code\modules\mob\inventory\mob\hands.dm" #include "code\modules\mob\inventory\mob\helpers.dm" #include "code\modules\mob\inventory\mob\internal.dm" #include "code\modules\mob\inventory\mob\public.dm" diff --git a/code/__DEFINES/inventory/procs.dm b/code/__DEFINES/inventory/procs.dm index 1b8766abd684..f569fd24db66 100644 --- a/code/__DEFINES/inventory/procs.dm +++ b/code/__DEFINES/inventory/procs.dm @@ -1,4 +1,8 @@ -//! flags for inventory ops +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* Inventory Operation Flags *// + /// force; implies INV_OP_IGNORE_DELAY and INV_OP_IGNORE_REACHABILITY #define INV_OP_FORCE (1<<0) /// components that intercept to relocate should refrain - usually used with force @@ -47,6 +51,17 @@ // todo: INV_OP_RECRUSE +//* Inventory Return Flags *// + +/// Failed +/// +/// * Yes, on a failure, we just return null. +#define INV_RETURN_FAILED null +/// Success +#define INV_RETURN_SUCCESS (1<<0) +/// Success, but was relocated instead of going to where it should go. +#define INV_RETURN_RELOCATED (1<<1) + //! return values from can_equip_conflict_check /// yes #define CAN_EQUIP_SLOT_CONFLICT_NONE 0 diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index e59858133bc5..2779b2e35027 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -103,7 +103,7 @@ /obj/item/handcuffs/equipped(mob/living/user, slot, accessory) . = ..() if(slot == SLOT_ID_HANDCUFFED) - user.drop_all_held_items() + user.drop_held_items() user.stop_pulling() /* grimdark code that's disabled for code quality reasons - readd later if we care diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index cf1a986d9494..91db8efd5627 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -305,7 +305,7 @@ /obj/item/clothing/suit/straight_jacket/equipped(var/mob/living/user,var/slot) . = ..() if(slot == SLOT_ID_SUIT) - user.drop_all_held_items() + user.drop_held_items() user.drop_item_to_ground(user.item_by_slot_id(SLOT_ID_HANDCUFFED), INV_OP_FORCE) /obj/item/clothing/suit/ianshirt diff --git a/code/modules/mob/grab.dm b/code/modules/mob/grab.dm index b99c6079b30a..5ed3a404eec9 100644 --- a/code/modules/mob/grab.dm +++ b/code/modules/mob/grab.dm @@ -187,7 +187,7 @@ hud.icon_state = "!reinforce" if(state >= GRAB_AGGRESSIVE) - affecting.drop_all_held_items() + affecting.drop_held_items() if(iscarbon(affecting)) handle_eye_mouth_covering(affecting, assailant, assailant.zone_sel.selecting) diff --git a/code/modules/mob/inventory/inventory-hands-check.dm b/code/modules/mob/inventory/inventory-hands-check.dm new file mode 100644 index 000000000000..21556940ff0c --- /dev/null +++ b/code/modules/mob/inventory/inventory-hands-check.dm @@ -0,0 +1,74 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* Procs in this file are mirrored to the /mob level for ease of use. *// +//* *// +//* In the future, there should likely be a separation of concerns *// +//* and the enforcement of 'mob.inventory' access, but given the overhead of *// +//* a proc-call, this is currently not done. *// + +/** + * Returns if the mob is holding something in hand. + * + * @return TRUE / FALSE + */ +/datum/inventory/proc/is_holding(obj/item/I) + return !!get_held_index(I) + +/** + * Returns if we are holding something in hand. + */ +/mob/proc/is_holding(obj/item/I) + return !!get_held_index(I) + +/** + * Returns the number of nominal hand slots that are empty. + * + * @return number + */ +/datum/inventory/proc/count_empty_hands() + . = 0 + for(var/i in 1 to length(held_items)) + if(isnull(held_items[i])) + .++ + +/** + * Returns the number of empty hands we have. + * + * * This is not based on usable hands, this based on the hands in our inventory, e.g. nominal hand count. + * * This is 0 if we have no inventory. + * + * @return number + */ +/mob/proc/count_empty_hands() + . = 0 + for(var/i in 1 to length(inventory?.held_items)) + if(isnull(inventory.held_items[i])) + .++ + +/** + * Returns the number of nominal hand slots that are full. + * + * @return number + */ +/datum/inventory/proc/count_full_hands() + . = 0 + for(var/i in 1 to length(held_items)) + if(isnull(held_items[i])) + continue + .++ + +/** + * Returns the number of full hands we have. + * + * * This is not based on usable hands, this based on the hands in our inventory, e.g. nominal hand count. + * * This is 0 if we have no inventory. + * + * @return number + */ +/mob/proc/count_full_hands() + . = 0 + for(var/i in 1 to length(inventory?.held_items)) + if(isnull(inventory.held_items[i])) + continue + .++ diff --git a/code/modules/mob/inventory/inventory-hands-drop.dm b/code/modules/mob/inventory/inventory-hands-drop.dm new file mode 100644 index 000000000000..e432890b247a --- /dev/null +++ b/code/modules/mob/inventory/inventory-hands-drop.dm @@ -0,0 +1,56 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* Procs in this file are mirrored to the /mob level for ease of use. *// +//* *// +//* In the future, there should likely be a separation of concerns *// +//* and the enforcement of 'mob.inventory' access, but given the overhead of *// +//* a proc-call, this is currently not done. *// + +/** + * Drops all of the mob's held items. + * + * @params + * * inv_op_flags - inventory operation flags + * + * @return Nothing + */ +/datum/inventory/proc/drop_held_items(inv_op_flags) + for(var/obj/item/I in held_items) + drop_item_to_ground(I, inv_op_flags) + +/** + * Drops all our held items. + * + * @params + * * inv_op_flags - inventory operation flags + * + * @return Nothing + */ +/mob/proc/drop_held_items(inv_op_flags) + for(var/obj/item/I as anything in get_held_items()) + inventory.drop_item_to_ground(I, inv_op_flags) + +/** + * Drops the item held in a given hand index. + * + * @params + * * index - the hand index + * * inv_op_flags - inventory operation flags + * + * @return INV_RETURN_* flags + */ +/datum/inventory/proc/drop_held_index(index, inv_op_flags) + return drop_item_to_ground(get_held_item_of_index(index), flags) + +/** + * Drops the item held in a given hand index. + * + * @params + * * index - the hand index + * * inv_op_flags - inventory operation flags + * + * @return INV_RETURN_* flags + */ +/mob/proc/drop_held_index(index, flags) + return drop_item_to_ground(get_held_item_of_index(index), flags) diff --git a/code/modules/mob/inventory/inventory-hands-get.dm b/code/modules/mob/inventory/inventory-hands-get.dm new file mode 100644 index 000000000000..889386b644e6 --- /dev/null +++ b/code/modules/mob/inventory/inventory-hands-get.dm @@ -0,0 +1,166 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* Procs in this file are mirrored to the /mob level for ease of use. *// +//* *// +//* In the future, there should likely be a separation of concerns *// +//* and the enforcement of 'mob.inventory' access, but given the overhead of *// +//* a proc-call, this is currently not done. *// + +/** + * Gets the item held in a given hand index + * + * * This expects a valid index. + * + * @return /obj/item or null. + */ +/datum/inventory/proc/get_held_item(index) + RETURN_TYPE(/obj/item) + return held_items[index] + +/** + * Gets the item held in a given hand index + * + * * This expects a valid index. + * + * @return /obj/item or null. + */ +/mob/proc/get_held_item(index) + RETURN_TYPE(/obj/item) + return inventory?.held_items[index] + +/** + * Gets the hand index that an item is in, if any. + * + * @return index of item, or null if not found. + */ +/datum/inventory/proc/get_held_index(obj/item/I) + return held_items?.Find(I) || null + +/** + * Gets the hand index that an item is in, if any. + * + * @return index of item, or null if not found. + */ +/mob/proc/get_held_index(obj/item/I) + return inventory?.held_items?.Find(I) || null + +#warn mirror & check below + +/** + * returns first item on left + */ +/mob/proc/get_left_held_item() + RETURN_TYPE(/obj/item) + for(var/i in 1 to length(held_items) step 2) + if(isnull(inventory?.held_items[i])) + continue + return inventory?.held_items[i] + +/** + * returns first item on right + */ +/mob/proc/get_right_held_item() + RETURN_TYPE(/obj/item) + for(var/i in 2 to length(inventory?.held_items) step 2) + if(isnull(inventory?.held_items[i])) + continue + return inventory?.held_items[i] + +/** + * returns all items on left + */ +/mob/proc/get_left_held_items() + RETURN_TYPE(/obj/item) + . = list() + for(var/i in 1 to length(inventory?.held_items) step 2) + if(isnull(inventory?.held_items[i])) + continue + . += inventory?.held_items[i] + +/** + * returns all items on right + */ +/mob/proc/get_right_held_items() + RETURN_TYPE(/obj/item) + . = list() + for(var/i in 2 to length(inventory?.held_items) step 2) + if(isnull(inventory?.held_items[i])) + continue + . += inventory?.held_items[i] + +/** + * returns held items + */ +/mob/proc/get_held_items() + . = list() + for(var/obj/item/I in inventory?.held_items) + . += I + +/** + * get held items of type + */ +/mob/proc/get_held_items_of_type(type) + . = list() + for(var/obj/item/I as anything in get_held_items()) + if(istype(I, type)) + . += I + +/** + * get first held item of type + */ +/mob/proc/get_held_item_of_type(type) + RETURN_TYPE(/obj/item) + for(var/obj/item/I as anything in get_held_items()) + if(istype(I, type)) + return I + +/** + * get full indices + */ +/mob/proc/get_full_hand_indices() + . = list() + for(var/i in 1 to length(inventory?.held_items)) + if(!isnull(inventory?.held_items[i])) + . += i + +/** + * get empty indices + */ +/mob/proc/get_empty_hand_indices() + . = list() + for(var/i in 1 to length(inventory?.held_items)) + if(isnull(inventory?.held_items[i])) + . += i + +/** + * returns held item in active hand + */ +/mob/proc/get_active_held_item() + RETURN_TYPE(/obj/item) + return inventory?.held_items?[active_hand] + +/** + * returns held item in inactive hand (or any inactive hand if more than 1) + */ +/mob/proc/get_inactive_held_item() + RETURN_TYPE(/obj/item) + for(var/i in 1 to length(inventory?.held_items)) + if(i == active_hand) + continue + if(isnull(inventory?.held_items[i])) + continue + return inventory?.held_items[i] + +/** + * returns all items held in non active hands + */ +/mob/proc/get_inactive_held_items() + RETURN_TYPE(/list) + . = list() + for(var/i in 1 to length(inventory?.held_items)) + if(i == active_hand) + continue + if(isnull(inventory?.held_items[i])) + continue + . += inventory?.held_items[i] diff --git a/code/modules/mob/inventory/inventory-hands-legacy.dm b/code/modules/mob/inventory/inventory-hands-legacy.dm new file mode 100644 index 000000000000..a583900cdaf6 --- /dev/null +++ b/code/modules/mob/inventory/inventory-hands-legacy.dm @@ -0,0 +1,23 @@ + +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +/** + * returns if we're holding something in inactive hand slots + * + * todo: deprecate; 'active hand' should be based on client intent, not on the mob. + */ +/mob/proc/is_holding_inactive(obj/item/I) + return is_holding(I) && (get_active_held_item() != I) + +/** + * todo: deprecate; 'active hand' should be based on client intent, not on the mob. + */ +/mob/proc/drop_active_held_item(flags) + return drop_item_to_ground(get_active_held_item(), flags) + +/** + * todo: deprecate; 'active hand' should be based on client intent, not on the mob. + */ +/mob/proc/drop_inactive_held_item(flags) + return drop_item_to_ground(get_inactive_held_item(), flags) diff --git a/code/modules/mob/inventory/inventory-hands-put.dm b/code/modules/mob/inventory/inventory-hands-put.dm new file mode 100644 index 000000000000..85193946146f --- /dev/null +++ b/code/modules/mob/inventory/inventory-hands-put.dm @@ -0,0 +1,82 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* Procs in this file are mirrored to the /mob level for ease of use. *// +//* *// +//* In the future, there should likely be a separation of concerns *// +//* and the enforcement of 'mob.inventory' access, but given the overhead of *// +//* a proc-call, this is currently not done. *// + +#warn mirror & check below + +/mob/proc/put_in_hand(obj/item/I, index, flags) + return equip_hand_impl(I, index, flags) + +/mob/proc/put_in_hands(obj/item/I, flags) + if(is_holding(I)) + return TRUE + + if(!(flags & INV_OP_NO_MERGE_STACKS) && istype(I, /obj/item/stack)) + var/obj/item/stack/S = I + for(var/obj/item/stack/held_stack in get_held_items()) + if(S.can_merge(held_stack) && S.merge(held_stack)) + to_chat(src, SPAN_NOTICE("Your [held_stack] stack now contains [held_stack.get_amount()] [held_stack.singular_name]\s.")) + return TRUE + + return put_in_active_hand(I, flags) || put_in_inactive_hand(I, flags) + +/** + * put in hands or forcemove to drop location + * allows an optional param for where to drop on fail + * + * @return TRUE/FALSE based on put in hand or dropped to ground + */ +/mob/proc/put_in_hands_or_drop(obj/item/I, flags, atom/drop_loc = drop_location()) + if(!put_in_hands(I, flags)) + I.forceMove(drop_loc) + return FALSE + return TRUE + +/** + * put in hands or del + * + * @return TRUE/FALSE based on put in hand or del'd + */ +/mob/proc/put_in_hands_or_del(obj/item/I, flags) + if(!put_in_hands(I, flags)) + qdel(I) + return FALSE + return TRUE + +/mob/proc/put_in_left_hand(obj/item/I, flags) + for(var/i in 1 to length(inventory?.held_items) step 2) + if(put_in_hand(I, i, flags)) + return TRUE + return FALSE + +/mob/proc/put_in_right_hand(obj/item/I, flags) + for(var/i in 1 to length(inventory?.held_items) step 2) + if(put_in_hand(I, i, flags)) + return TRUE + return FALSE + +/mob/proc/put_in_active_hand(obj/item/I, flags) + return put_in_hand(I, active_hand, flags) + +/mob/proc/put_in_inactive_hand(obj/item/I, flags) + for(var/i in 1 to length(inventory?.held_items)) + if(i == active_hand) + continue + if(put_in_hand(I, i, flags)) + return TRUE + return FALSE + +/mob/proc/put_in_hand_or_del(obj/item/I, index, flags) + . = put_in_hand(I, index, flags) + if(!.) + qdel(I) + +/mob/proc/put_in_hand_or_drop(obj/item/I, index, flags, atom/drop_loc = drop_location()) + . = put_in_hand(I, index, flags) + if(!.) + I.forceMove(drop_loc) diff --git a/code/modules/mob/inventory/inventory-hands.dm b/code/modules/mob/inventory/inventory-hands.dm new file mode 100644 index 000000000000..99c98593e070 --- /dev/null +++ b/code/modules/mob/inventory/inventory-hands.dm @@ -0,0 +1,97 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +/** + * Hands are a bit of a special case + * + * They don't use inventory slots like the inventory system does, + * But still exists in the inventory module because they do a number of things, + * like count as equipped under [SLOT_ID_HANDS]. + * + * This semi-integration lets us do a few cool things like not needing separate hooks + * for when someone has something in hand, but not in inventory, transitioning + * to them having it in inventory, but not in hands. + */ + +/** + * the big, bad proc ultimately in charge of putting something into someone's hand + * whether it's from the ground, from a slot, or from another hand. + */ +/mob/proc/equip_hand_impl(obj/item/I, index, flags) + PRIVATE_PROC(TRUE) + if(!I) + return TRUE + // let's not do that if it's deleted! + if(QDELETED(I)) + to_chat(src, SPAN_DANGER("A deleted item [I] ([REF(I)]) was sent into inventory hand procs with flags [flags]. Report this line to coders immediately.")) + to_chat(src, SPAN_DANGER("The inventory system will attempt to reject the bad equip. Glitches may occur.")) + return FALSE + + if(length(inventory?.held_items) < index) + return FALSE + + var/obj/item/existing = inventory?.held_items[index] + if(!isnull(existing)) + if(flags & INV_OP_FORCE) + drop_held_index(index, flags | INV_OP_NO_UPDATE_ICONS) + if(!isnull(inventory?.held_items[index])) + // failed to drop + return FALSE + else + return FALSE + + var/existing_slot = is_in_inventory(I) + if(existing_slot) + // already in inv + if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags)) + return FALSE + else + // newly eqiupped + var/atom/old_loc = I.loc + if(I.loc != src) + I.forceMove(src) + if(I.loc != src) + return FALSE + I.pickup(src, flags, old_loc) + I.equipped(src, SLOT_ID_HANDS, flags) + log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") + + inventory?.held_items[index] = I + #warn hud + + //! LEGACY BEGIN + I.update_twohanding() + //! END + + if(!(flags & INV_OP_NO_UPDATE_ICONS)) + update_inv_hand(index) + + if(!(I.interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ON_TOUCH)) + I.add_fingerprint(src) + else + I.add_hiddenprint(src) + +/** + * get something out of our hand + * + * @return unequipped item + */ +/mob/proc/unequip_hand_impl(obj/item/I, index, flags) + ASSERT(inventory?.held_items[index] == I) + + inventory?.held_items[index] = null + + I.unequipped(src, SLOT_ID_HANDS, flags) + #warn impl; hud + +/** + * handle swapping item from one hand index to another + */ +/mob/proc/handle_item_handswap(obj/item/I, index, old_index, flags, mob/user = src) + ASSERT(inventory?.held_items[old_index] == I) + ASSERT(isnull(inventory?.held_items[index])) + + inventory?.held_items[old_index] = null + inventory?.held_items[index] = I + + #warn impl; hud diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 32ae0066fcf9..b8835c30f800 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -22,8 +22,16 @@ //* Inventory *// + /// held items + /// + /// * empty indices are null + /// * this is also our rendered & nominal hand count + /// * 1, 3, 5, ... are left + /// * 2, 4, 6, ... are right + var/list/obj/item/held_items = list() + //* Caches *// - /// cached overlays by slot id + /// cached overlays by slot id or hand index var/list/rendered_normal_overlays = list() /// cached overlays by slot id // todo: emissives @@ -77,16 +85,22 @@ /** * called when an item is added to inventory */ -/datum/inventory/proc/item_entered(obj/item/item, datum/inventory_slot/slot_or_index) - hud?.add_item(item, slot_or_index) +/datum/inventory/proc/item_entered(obj/item/item, datum/inventory_slot/slot) + hud?.add_item(item, slot) /** * called when an item is removed from inventory */ -/datum/inventory/proc/item_exited(obj/item/item, datum/inventory_slot/slot_or_index) - hud?.remove_item(item, slot_or_index) +/datum/inventory/proc/item_exited(obj/item/item, datum/inventory_slot/slot) + hud?.remove_item(item, slot) + +/** + * called when an item is moved from one slot to another + */ +/datum/inventory/proc/item_exited(obj/item/item, datum/inventory_slot/from_slot, datum/inventory_slot/to_slot) + hud?.move_item(item, from_slot, to_slot) -#warn hook above 2 +#warn hook above 3 //? init diff --git a/code/modules/mob/inventory/mob/hands.dm b/code/modules/mob/inventory/mob/hands.dm deleted file mode 100644 index 18814560a28e..000000000000 --- a/code/modules/mob/inventory/mob/hands.dm +++ /dev/null @@ -1,428 +0,0 @@ -//* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// - -/** - * Hands are a bit of a special case - * - * They don't use inventory slots like the inventory system does, - * But still exists in the inventory module because they do a number of things, - * like count as equipped under [SLOT_ID_HANDS]. - * - * This semi-integration lets us do a few cool things like not needing separate hooks - * for when someone has something in hand, but not in inventory, transitioning - * to them having it in inventory, but not in hands. - */ - -//* Public API - Pickup *// - -/mob/proc/put_in_hand(obj/item/I, index, flags) - return equip_hand_impl(I, index, flags) - -/mob/proc/put_in_hands(obj/item/I, flags) - if(is_holding(I)) - return TRUE - - if(!(flags & INV_OP_NO_MERGE_STACKS) && istype(I, /obj/item/stack)) - var/obj/item/stack/S = I - for(var/obj/item/stack/held_stack in get_held_items()) - if(S.can_merge(held_stack) && S.merge(held_stack)) - to_chat(src, SPAN_NOTICE("Your [held_stack] stack now contains [held_stack.get_amount()] [held_stack.singular_name]\s.")) - return TRUE - - return put_in_active_hand(I, flags) || put_in_inactive_hand(I, flags) - -/** - * put in hands or forcemove to drop location - * allows an optional param for where to drop on fail - * - * @return TRUE/FALSE based on put in hand or dropped to ground - */ -/mob/proc/put_in_hands_or_drop(obj/item/I, flags, atom/drop_loc = drop_location()) - if(!put_in_hands(I, flags)) - I.forceMove(drop_loc) - return FALSE - return TRUE - -/** - * put in hands or del - * - * @return TRUE/FALSE based on put in hand or del'd - */ -/mob/proc/put_in_hands_or_del(obj/item/I, flags) - if(!put_in_hands(I, flags)) - qdel(I) - return FALSE - return TRUE - -/mob/proc/put_in_left_hand(obj/item/I, flags) - for(var/i in 1 to length(held_items) step 2) - if(put_in_hand(I, i, flags)) - return TRUE - return FALSE - -/mob/proc/put_in_right_hand(obj/item/I, flags) - for(var/i in 1 to length(held_items) step 2) - if(put_in_hand(I, i, flags)) - return TRUE - return FALSE - -/mob/proc/put_in_active_hand(obj/item/I, flags) - return put_in_hand(I, active_hand, flags) - -/mob/proc/put_in_inactive_hand(obj/item/I, flags) - for(var/i in 1 to length(held_items)) - if(i == active_hand) - continue - if(put_in_hand(I, i, flags)) - return TRUE - return FALSE - -/mob/proc/put_in_hand_or_del(obj/item/I, index, flags) - . = put_in_hand(I, index, flags) - if(!.) - qdel(I) - -/mob/proc/put_in_hand_or_drop(obj/item/I, index, flags, atom/drop_loc = drop_location()) - . = put_in_hand(I, index, flags) - if(!.) - I.forceMove(drop_loc) - -//* Public API - Drop *// - -/** - * drops all our held items - * - * @params - * force - even if nodrop - */ -/mob/proc/drop_all_held_items(flags) - for(var/obj/item/I as anything in get_held_items()) - drop_item_to_ground(I, flags) - -/mob/proc/drop_active_held_item(flags) - return drop_item_to_ground(get_active_held_item(), flags) - -/mob/proc/drop_inactive_held_item(flags) - return drop_item_to_ground(get_inactive_held_item(), flags) - -/mob/proc/drop_held_item_of_index(index, flags) - return drop_item_to_ground(get_held_item_of_index(index), flags) - -/mob/proc/drop_sequential_left_held_item(flags) - for(var/i in 1 to length(held_items) step 2) - if(isnull(held_items[i])) - continue - return drop_held_item_of_index(i, flags) - -/mob/proc/drop_sequential_right_held_item(flags) - for(var/i in 2 to length(held_items) step 2) - if(isnull(held_items[i])) - continue - return drop_held_item_of_index(i, flags) - -//* Public API - Check *// - -/** - * returns if we are holding something - */ -/mob/proc/is_holding(obj/item/I) - return !!get_held_index(I) - -/** - * returns if we're holding something in inactive hand slots - */ -/mob/proc/is_holding_inactive(obj/item/I) - return is_holding(I) && (get_active_held_item() != I) - -/** - * hands are all holding items? undefined behavior if we don't have hands. - */ -/mob/proc/hands_full() - for(var/i in get_usable_hand_indices()) - if(isnull(held_items[i])) - return FALSE - return TRUE - -/** - * hands are all empty? undefined behavior if we don't have hands. - */ -/mob/proc/hands_empty() - for(var/i in get_usable_hand_indices()) - if(isnull(held_items[i])) - continue - return FALSE - return TRUE - -/** - * returns number of empty hands - */ -/mob/proc/count_empty_hands() - . = 0 - for(var/i in 1 to length(held_items)) - if(isnull(held_items[i])) - .++ - -//* Public API - Get *// - -/** - * returns first item on left - */ -/mob/proc/get_left_held_item() - RETURN_TYPE(/obj/item) - for(var/i in 1 to length(held_items) step 2) - if(isnull(held_items[i])) - continue - return held_items[i] - -/** - * returns first item on right - */ -/mob/proc/get_right_held_item() - RETURN_TYPE(/obj/item) - for(var/i in 2 to length(held_items) step 2) - if(isnull(held_items[i])) - continue - return held_items[i] - -/** - * returns all items on left - */ -/mob/proc/get_left_held_items() - RETURN_TYPE(/obj/item) - . = list() - for(var/i in 1 to length(held_items) step 2) - if(isnull(held_items[i])) - continue - . += held_items[i] - -/** - * returns all items on right - */ -/mob/proc/get_right_held_items() - RETURN_TYPE(/obj/item) - . = list() - for(var/i in 2 to length(held_items) step 2) - if(isnull(held_items[i])) - continue - . += held_items[i] - -/** - * returns held items - */ -/mob/proc/get_held_items() - . = list() - for(var/obj/item/I in held_items) - . += I - -/** - * get held items of type - */ -/mob/proc/get_held_items_of_type(type) - . = list() - for(var/obj/item/I as anything in get_held_items()) - if(istype(I, type)) - . += I - -/** - * get first held item of type - */ -/mob/proc/get_held_item_of_type(type) - RETURN_TYPE(/obj/item) - for(var/obj/item/I as anything in get_held_items()) - if(istype(I, type)) - return I - -/** - * get held item item at index - */ -/mob/proc/get_held_item_of_index(index) - RETURN_TYPE(/obj/item) - return length(held_items) <= index? held_items[index] : null - -/** - * return index of item, or null if not found - */ -/mob/proc/get_held_index(obj/item/I) - . = held_items?.Find(I) - return .? . : null - -/** - * get full indices - */ -/mob/proc/get_full_hand_indices() - . = list() - for(var/i in 1 to length(held_items)) - if(!isnull(held_items[i])) - . += i - -/** - * get empty indices - */ -/mob/proc/get_empty_hand_indices() - . = list() - for(var/i in 1 to length(held_items)) - if(isnull(held_items[i])) - . += i - -/** - * returns held item in active hand - */ -/mob/proc/get_active_held_item() - RETURN_TYPE(/obj/item) - return held_items?[active_hand] - -/** - * returns held item in inactive hand (or any inactive hand if more than 1) - */ -/mob/proc/get_inactive_held_item() - RETURN_TYPE(/obj/item) - for(var/i in 1 to length(held_items)) - if(i == active_hand) - continue - if(isnull(held_items[i])) - continue - return held_items[i] - -/** - * returns all items held in non active hands - */ -/mob/proc/get_inactive_held_items() - RETURN_TYPE(/list) - . = list() - for(var/i in 1 to length(held_items)) - if(i == active_hand) - continue - if(isnull(held_items[i])) - continue - . += held_items[i] - -//* Abstraction *// - -/** - * gets if we have any hands at all - */ -/mob/proc/has_hands() - SHOULD_NOT_OVERRIDE(TRUE) - return !!!get_nominal_hand_count() - -/** - * get number of physical hands / arms / whatever that we have and should check for - * - * this is not number we can use - * this is the number we should use for things like rendering - * a hand stump is still rendered, and we should never render less than 2 hands for mobs - * that nominally have hands. - */ -/mob/proc/get_nominal_hand_count() - return length(held_items) - -/** - * get number of usable hands / arms / whatever that we have and should check for - * - * this is the number we can use - * missing = can't use - * stump = can't use - * broken = *can* use. - * - * basically if a red deny symbol is in the hand it is not usable, otherwise it's usable. - */ -/mob/proc/get_usable_hand_count() - #warn impl + subtypes - -/** - * get indices of usable hands - */ -/mob/proc/get_usable_hand_indices() - RETURN_TYPE(/list) - #warn impl + subtypes - -/** - * sets number of physical hands we should account for potentialy having - */ -/mob/proc/set_nominal_hand_count() - #warn impl - -//* Internals *// - -/** - * the big, bad proc ultimately in charge of putting something into someone's hand - * whether it's from the ground, from a slot, or from another hand. - */ -/mob/proc/equip_hand_impl(obj/item/I, index, flags) - PRIVATE_PROC(TRUE) - if(!I) - return TRUE - // let's not do that if it's deleted! - if(QDELETED(I)) - to_chat(src, SPAN_DANGER("A deleted item [I] ([REF(I)]) was sent into inventory hand procs with flags [flags]. Report this line to coders immediately.")) - to_chat(src, SPAN_DANGER("The inventory system will attempt to reject the bad equip. Glitches may occur.")) - return FALSE - - if(length(held_items) < index) - return FALSE - - var/obj/item/existing = held_items[index] - if(!isnull(existing)) - if(flags & INV_OP_FORCE) - drop_held_item_of_index(index, flags | INV_OP_NO_UPDATE_ICONS) - if(!isnull(held_items[index])) - // failed to drop - return FALSE - else - return FALSE - - var/existing_slot = is_in_inventory(I) - if(existing_slot) - // already in inv - if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags)) - return FALSE - else - // newly eqiupped - var/atom/old_loc = I.loc - if(I.loc != src) - I.forceMove(src) - if(I.loc != src) - return FALSE - I.pickup(src, flags, old_loc) - I.equipped(src, SLOT_ID_HANDS, flags) - log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") - - held_items[index] = I - #warn hud - - //! LEGACY BEGIN - I.update_twohanding() - //! END - - if(!(flags & INV_OP_NO_UPDATE_ICONS)) - update_inv_hand(index) - - if(!(I.interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ON_TOUCH)) - I.add_fingerprint(src) - else - I.add_hiddenprint(src) - -/** - * get something out of our hand - * - * @return unequipped item - */ -/mob/proc/unequip_hand_impl(obj/item/I, index, flags) - ASSERT(held_items[index] == I) - - held_items[index] = null - - I.unequipped(src, SLOT_ID_HANDS, flags) - #warn impl; hud - -/** - * handle swapping item from one hand index to another - */ -/mob/proc/handle_item_handswap(obj/item/I, index, old_index, flags, mob/user = src) - ASSERT(held_items[old_index] == I) - ASSERT(isnull(held_items[index])) - - held_items[old_index] = null - held_items[index] = I - - #warn impl; hud diff --git a/code/modules/mob/living/carbon/carbon-hands.dm b/code/modules/mob/living/carbon/carbon-hands.dm index bcc85fbfe256..29f0fb3dcba2 100644 --- a/code/modules/mob/living/carbon/carbon-hands.dm +++ b/code/modules/mob/living/carbon/carbon-hands.dm @@ -48,8 +48,10 @@ //* However, this system isn't in yet, so old code should still use these procs. *// /** - * Get the external organ of an arm + * Get the external organ of the active hand + * + * * in mobs with no logical arm and only a hand, this returns the hand */ /mob/living/carbon/proc/get_active_hand_organ(index) RETURN_TYPE(/obj/item/organ/external) - return get_hand_organ(active_hand) + return get_hand_organ_of_index(active_hand) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index e05e15168561..fa0110cbdc73 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -312,7 +312,7 @@ /mob/living/carbon/proc/update_handcuffed() if(handcuffed) - drop_all_held_items() + drop_held_items() stop_pulling() update_inv_handcuffed() update_mobility() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index d181cce422fe..f86cd31d6e2e 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -284,7 +284,7 @@ return //Actually disarm them - drop_all_held_items() + drop_held_items() visible_message("[L] has disarmed [src]!") playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 3f31f28e91d3..780710e2234c 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -122,7 +122,7 @@ var/obj/item/held = held_items[i] if(isnull(held)) continue - var/obj/item/organ/external/hand = get_hand_organ(i) + var/obj/item/organ/external/hand = get_hand_organ_of_index(i) var/obj/item/organ/external/arm = get_arm_organ(i) if(isnull(arm) || isnull(hand)) visible_message("Lacking a functioning left hand, \the [src] drops \the [held].") diff --git a/code/modules/mob/living/mobility.dm b/code/modules/mob/living/mobility.dm index 9f0697f85618..3c5317a40e12 100644 --- a/code/modules/mob/living/mobility.dm +++ b/code/modules/mob/living/mobility.dm @@ -17,7 +17,7 @@ . = ..() if(!(mobility_flags & MOBILITY_CAN_HOLD)) - drop_all_held_items() + drop_held_items() if(!(mobility_flags & MOBILITY_CAN_PULL)) stop_pulling() if(!(mobility_flags & MOBILITY_CAN_STAND)) diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index d750562e5656..1c1695d7829d 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -1,6 +1,103 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2024 silicons *// +//* Hands are weird. Unlike inventory slots, they tend to be very tightly *// +//* coupled to organ state, so it's not a good thing to have all behavior *// +//* on /datum/inventory. *// +//* *// +//* To make it worse, hands are not just an inventory concept; interacting *// +//* with the world requires hands, which requires hand code, meaning hand *// +//* code cannot only live on /datum/inventory. *// +//* *// +//* Therefore, the separation of concerns is that mob-side hands code *// +//* is only responsible for orchestrating state that concerns the health *// +//* system like organ integration and whatnot, while /datum/inventory *// +//* side orchestrates pickup/drop logic and all that stuff. *// +//* *// +//* An abstraction layer provides mob integration to the inventory datum. *// +//* That is what is in this file, along with common mob-level handling *// +//* for non-inventory-related uses of hands. *// +//* *// +//* Any purpose / notion of 'usable' hands also belongs here, because our *// +//* inventory datum has no notion of a usable hand or an unusable one, let *// +//* alone manipulation levels, as it only cares about the actual state *// +//* of whether or not an object is held. *// + +//* Hands - Abstraction *// + +/** + * gets if we have any hands at all + */ +/mob/proc/has_hands() + SHOULD_NOT_OVERRIDE(TRUE) + return !!!get_nominal_hand_count() + +/** + * get number of physical hands / arms / whatever that we have and should check for + * + * this is not number we can use + * this is the number we should use for things like rendering + * a hand stump is still rendered, and we should never render less than 2 hands for mobs + * that nominally have hands. + */ +/mob/proc/get_nominal_hand_count() + return length(inventory?.held_items) + +/** + * get number of usable hands / arms / whatever that we have and should check for + * + * this is the number we can use + * missing = can't use + * stump = can't use + * broken = *can* use. + * + * basically if a red deny symbol is in the hand it is not usable, otherwise it's usable. + */ +/mob/proc/get_usable_hand_count() + #warn impl + subtypes + +/** + * get indices of usable hands + */ +/mob/proc/get_usable_hand_indices() + RETURN_TYPE(/list) + #warn impl + subtypes + +/** + * sets number of physical hands we should account for potentialy having + */ +/mob/proc/set_nominal_hand_count() + #warn impl + subtypes + +/** + * Are usable hands all holding items? + * + * * if a hand slot is unusable but still has an item, it's ignored. + * * if we have no hands, this returns TRUE + */ +/mob/proc/are_usable_hands_full() + if(!length(inventory?.held_items)) + return TRUE + for(var/i in get_usable_hand_indices()) + if(isnull(inventory.held_items[i])) + return FALSE + return TRUE + +/** + * usable hands are all empty? + * + * * if a hand slot is unusable but still has an item, it's ignored. + * * if we have no hands, this returns TRUE + */ +/mob/proc/are_usable_hands_empty() + if(!length(inventory?.held_items)) + return TRUE + for(var/i in get_usable_hand_indices()) + if(isnull(inventory.held_items[i])) + continue + return FALSE + return TRUE + //* Hands - Checks *// /** @@ -46,7 +143,7 @@ return var/list/reasons_we_cant = why_hand_manipulation_insufficient(index, manipulation) if(actor) - actor.action_feedback( + actor.chat_feedback( SPAN_WARNING("You can't do that right now! ([length(reasons_we_cant) ? english_list(reasons_we_cant) : "hand nonfunctional for unknown reason"])"), target = target, ) @@ -74,16 +171,17 @@ * * This is so remote control abstraction works. */ /mob/proc/swap_hand(to_index) - var/obj/item/was_active = length(held_items) <= active_hand? held_items[active_hand] : null + var/hand_count = get_nominal_hand_count() + var/obj/item/was_active = get_active_held_item() var/old_index = active_hand if(isnull(to_index)) - if(active_hand >= length(held_items)) - active_hand = length(held_items)? 1 : null + if(active_hand >= hand_count) + active_hand = hand_count? 1 : null else ++active_hand else - if(to_index > length(held_items)) + if(to_index > hand_count) return FALSE active_hand = to_index diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 35ddd75e3f8b..761207c12db6 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -116,13 +116,6 @@ //* Inventory *// /// our inventory datum, if any. var/datum/inventory/inventory - /// our hand hud, if any - var/datum/mob_hud/hands/hands_hud - /// held items; indexed list. defaults to null, lazy. - /// the length of this is also the abstracted number of hands we should have - /// * 1, 3, 5, ... are left - /// * 2, 4, 6, ... are right - var/list/obj/item/held_items /// active hand index - null or num. must always be in range of held_items indices! var/active_hand diff --git a/code/modules/organs/external/subtypes/standard.dm b/code/modules/organs/external/subtypes/standard.dm index bbb446e51046..6fcd310eb1af 100644 --- a/code/modules/organs/external/subtypes/standard.dm +++ b/code/modules/organs/external/subtypes/standard.dm @@ -104,9 +104,9 @@ if(prob(.)) owner.custom_pain("A jolt of pain surges through your [name]!",1) if(organ_tag == BP_L_ARM) //Specific level 2 'feature - owner.drop_held_item_of_index(1) + owner.drop_held_index(1) else if(organ_tag == BP_R_ARM) - owner.drop_held_item_of_index(2) + owner.drop_held_index(2) /obj/item/organ/external/arm/right organ_tag = BP_R_ARM @@ -225,9 +225,17 @@ if(prob(.)) owner.custom_pain("A jolt of pain surges through your [name]!",1) if(organ_tag == BP_L_HAND) //Specific level 2 'feature - owner.drop_sequential_left_held_item() + // sequentially drop the first left-held-item + for(var/i in 1 to length(owner.inventory?.held_items) step 2) + if(isnull(owner.inventory.held_items[i])) + continue + owner.drop_held_index(i) else if(organ_tag == BP_R_HAND) - owner.drop_sequential_right_held_item() + // sequentially drop the first left-right-item + for(var/i in 2 to length(owner.inventory?.held_items) step 2) + if(isnull(owner.inventory.held_items[i])) + continue + owner.drop_held_index(i) /obj/item/organ/external/hand/right organ_tag = BP_R_HAND diff --git a/code/modules/projectiles/projectile/hook.dm b/code/modules/projectiles/projectile/hook.dm index 797063ec8ab8..d0f0c28ff9ca 100644 --- a/code/modules/projectiles/projectile/hook.dm +++ b/code/modules/projectiles/projectile/hook.dm @@ -94,7 +94,7 @@ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return - H.drop_all_held_items() + H.drop_held_items() visible_message("\The [src] has disarmed [H]!") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return From 0e3e352cf6320cf4ec30d6572e4f7eee648bebea Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 7 Aug 2024 16:18:31 +0000 Subject: [PATCH 062/140] updates --- code/datums/ability.dm | 4 +- code/datums/weakref.dm | 5 ++ .../changeling/generic_equip_procs.dm | 2 +- .../game/gamemodes/technomancer/spell_objs.dm | 10 +-- code/game/objects/items.dm | 2 +- code/game/objects/items/devices/defib.dm | 2 +- .../objects/items/weapons/cigs_lighters.dm | 2 +- .../items/weapons/material/twohanded.dm | 2 +- .../objects/items/weapons/weldbackpack.dm | 2 +- code/modules/games/cards.dm | 4 +- code/modules/hardsuits/modules/combat.dm | 4 +- code/modules/hardsuits/modules/utility.dm | 2 +- .../mob/inventory/inventory-hands-drop.dm | 4 +- .../mob/inventory/inventory-hands-get.dm | 66 +++++++++---------- .../mob/inventory/inventory-hands-legacy.dm | 38 +++++++++++ code/modules/mob/inventory/mob/public.dm | 2 +- code/modules/mob/inventory/mob/stripping.dm | 4 +- .../carbon/alien/diona/diona_attacks.dm | 2 +- code/modules/mob/living/carbon/give.dm | 2 +- code/modules/mob/living/carbon/human/emote.dm | 4 +- .../mob/living/carbon/human/examine.dm | 6 +- .../mob/living/carbon/human/human_organs.dm | 4 +- .../mob/living/carbon/human/movement.dm | 23 ------- .../silicon/robot/drone/drone_abilities.dm | 2 +- .../mob/living/silicon/robot/inventory.dm | 2 +- .../subtypes/occult/constructs/_construct.dm | 2 +- code/modules/mob/update_icons.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- .../species/promethean/promethean_blob.dm | 7 +- code/modules/species/protean/protean_blob.dm | 7 +- .../species/xenomorphs/alien_powers.dm | 2 +- code/modules/vore/fluffstuff/custom_items.dm | 2 +- 32 files changed, 117 insertions(+), 107 deletions(-) diff --git a/code/datums/ability.dm b/code/datums/ability.dm index 5768d3685ccd..8ea070728154 100644 --- a/code/datums/ability.dm +++ b/code/datums/ability.dm @@ -273,7 +273,7 @@ return FALSE if((ability_check_flags & ABILITY_CHECK_STANDING) && IS_PRONE(owner)) return FALSE - if((ability_check_flags & ABILITY_CHECK_FREE_HAND) && !(!owner.hands_full())) + if((ability_check_flags & ABILITY_CHECK_FREE_HAND) && !(!owner.are_usable_hands_full())) return FALSE if((ability_check_flags & ABILITY_CHECK_RESTING) && !IS_PRONE(owner)) return FALSE @@ -293,7 +293,7 @@ return "You cannot do that while unconscious." if((ability_check_flags & ABILITY_CHECK_STANDING) && owner.lying) return "You cannot do that while on the ground." - if((ability_check_flags & ABILITY_CHECK_FREE_HAND) && !(!owner.hands_full())) + if((ability_check_flags & ABILITY_CHECK_FREE_HAND) && !(!owner.are_usable_hands_full())) return "You cannot do that without a free hand." if((ability_check_flags & ABILITY_CHECK_RESTING) && !owner.lying) return "You must be lying down to do that." diff --git a/code/datums/weakref.dm b/code/datums/weakref.dm index e4e244587a44..617cc0c3bca1 100644 --- a/code/datums/weakref.dm +++ b/code/datums/weakref.dm @@ -1,4 +1,9 @@ +/** + * * Returns a /datum/weakref if input is a datum, and not undergoing GC + * * Returns null otherwise. + */ /proc/WEAKREF(datum/input) + RETURN_TYPE(/datum/weakref) if(istype(input) && !QDELETED(input)) if(istype(input, /datum/weakref)) return input diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm index b734ecec36bd..600dbfba8bd4 100644 --- a/code/game/gamemodes/changeling/generic_equip_procs.dm +++ b/code/game/gamemodes/changeling/generic_equip_procs.dm @@ -243,7 +243,7 @@ var/mob/living/carbon/human/M = src - if(M.hands_full()) //Make sure our hands aren't full. + if(M.are_usable_hands_full()) //Make sure our hands aren't full. to_chat(src, SPAN_WARNING("Our hands are full. Drop something first.")) return 0 diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index cba72daf4c98..4cb54655e61a 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -181,10 +181,10 @@ var/our_index = owner.get_held_index(src) if(!our_index) return FALSE - for(var/i in 1 to length(owner.held_items)) + for(var/i in 1 to length(owner.inventory.held_items)) if(i == our_index) continue - if(!istype(owner.held_items[i], /obj/item/scepter)) + if(!istype(owner.inventory.held_items[i], /obj/item/scepter)) continue return TRUE return FALSE @@ -196,12 +196,12 @@ var/our_index = get_held_index(src) if(!our_index) return FALSE - for(var/i in 1 to length(held_items)) + for(var/i in 1 to length(inventory.held_items)) if(i == our_index) continue - if(isnull(held_items[i])) + if(isnull(inventory.held_items[i])) continue - return held_items[i] + return inventory.held_items[i] // Proc: attack_self() // Parameters: 1 (user - the Technomancer that invoked this proc) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 37cb4a56c083..6965291fe51b 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -225,7 +225,7 @@ /obj/item/proc/is_held_twohanded(mob/living/M) for(var/i in M.get_usable_hand_indices()) - if(!isnull(M.held_items[i])) + if(!isnull(M.inventory?.held_items[i])) continue return TRUE return FALSE diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 43ada3ca10c0..8c03de0360db 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -225,7 +225,7 @@ /obj/item/shockpaddles/update_worn_icon() var/mob/living/M = loc - if(istype(M) && M.is_holding(src) && !M.hands_full()) + if(istype(M) && M.is_holding(src) && !M.are_usable_hands_full()) wielded = 1 name = "[initial(name)] (wielded)" else diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index f9ab017178bb..720f3cd74763 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -619,7 +619,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM else to_chat(user, "You burn yourself while lighting the lighter.") var/mob/living/carbon/human/H = ishuman(user)? user : null - if (user.get_held_item_of_index(1) == src) + if (user.get_held_index(1) == src) H?.apply_damage(2,BURN,"l_hand") else H?.apply_damage(2,BURN,"r_hand") diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index bc08d6d53942..522afb6f3834 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -90,7 +90,7 @@ /obj/item/material/twohanded/fireaxe/update_worn_icon() var/mob/living/M = loc - if(istype(M) && M.can_wield_item(src) && M.is_holding(src) && !M.hands_full()) + if(istype(M) && M.can_wield_item(src) && M.is_holding(src) && !M.are_usable_hands_full()) wielded = 1 pry = 1 name = "[base_name] (wielded)" diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index 38a495269b72..fc87f56dbb38 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -38,7 +38,7 @@ var/mob/living/carbon/human/H = user - if(H.hands_full()) //Make sure our hands aren't full. + if(H.are_usable_hands_full()) //Make sure our hands aren't full. to_chat(H, "Your hands are full. Drop something first.") return 0 diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index d8808080f8f6..b59aa38b008f 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -85,7 +85,7 @@ if(usr.stat || !Adjacent(usr)) return - if(user.hands_full()) // Safety check lest the card disappear into oblivion + if(user.are_usable_hands_full()) // Safety check lest the card disappear into oblivion to_chat(user,"Your hands are full!") return @@ -363,7 +363,7 @@ if(user.stat || !Adjacent(user)) return - if(user.hands_full()) // Safety check lest the card disappear into oblivion + if(user.are_usable_hands_full()) // Safety check lest the card disappear into oblivion to_chat(usr,"Your hands are full!") return diff --git a/code/modules/hardsuits/modules/combat.dm b/code/modules/hardsuits/modules/combat.dm index 9d9665cd87d7..71a419e85a09 100644 --- a/code/modules/hardsuits/modules/combat.dm +++ b/code/modules/hardsuits/modules/combat.dm @@ -213,7 +213,7 @@ var/mob/living/M = holder.wearer - if(M.hands_full()) + if(M.are_usable_hands_full()) to_chat(M, "Your hands are full.") deactivate() return @@ -265,7 +265,7 @@ H.visible_message("[H] launches \a [firing]!") firing.throw_at_old(target,fire_force,fire_distance) else - if(H.hands_full()) + if(H.are_usable_hands_full()) to_chat(H, "Your hands are full.") else var/obj/item/new_weapon = new fabrication_type() diff --git a/code/modules/hardsuits/modules/utility.dm b/code/modules/hardsuits/modules/utility.dm index a7f243f1e4d9..f5fb2a8f031e 100644 --- a/code/modules/hardsuits/modules/utility.dm +++ b/code/modules/hardsuits/modules/utility.dm @@ -462,7 +462,7 @@ var/mob/living/M = holder.wearer - if(M.hands_full()) + if(M.are_usable_hands_full()) to_chat(M, "Your hands are full.") deactivate() return diff --git a/code/modules/mob/inventory/inventory-hands-drop.dm b/code/modules/mob/inventory/inventory-hands-drop.dm index e432890b247a..1befab419ad5 100644 --- a/code/modules/mob/inventory/inventory-hands-drop.dm +++ b/code/modules/mob/inventory/inventory-hands-drop.dm @@ -41,7 +41,7 @@ * @return INV_RETURN_* flags */ /datum/inventory/proc/drop_held_index(index, inv_op_flags) - return drop_item_to_ground(get_held_item_of_index(index), flags) + return drop_item_to_ground(get_held_index(index), flags) /** * Drops the item held in a given hand index. @@ -53,4 +53,4 @@ * @return INV_RETURN_* flags */ /mob/proc/drop_held_index(index, flags) - return drop_item_to_ground(get_held_item_of_index(index), flags) + return drop_item_to_ground(get_held_index(index), flags) diff --git a/code/modules/mob/inventory/inventory-hands-get.dm b/code/modules/mob/inventory/inventory-hands-get.dm index 889386b644e6..1594915f5f64 100644 --- a/code/modules/mob/inventory/inventory-hands-get.dm +++ b/code/modules/mob/inventory/inventory-hands-get.dm @@ -7,6 +7,8 @@ //* and the enforcement of 'mob.inventory' access, but given the overhead of *// //* a proc-call, this is currently not done. *// +//* Basic *// + /** * Gets the item held in a given hand index * @@ -45,14 +47,42 @@ /mob/proc/get_held_index(obj/item/I) return inventory?.held_items?.Find(I) || null +//* Special *// + +/** + * Get an indexed list of weakrefs or nulls of held items. + * + * * returns null if we have no inventory. + */ +/datum/inventory/proc/get_held_items_as_weakrefs() + RETURN_TYPE(/list) + . = new /list(length(held_items)) + for(var/i in 1 to length(held_items)) + .[i] = WEAKREF(held_items[i]) + +/** + * Get an indexed list of weakrefs or nulls of held items. + * + * * returns null if we have no inventory. + */ +/mob/proc/get_held_items_as_weakrefs() + RETURN_TYPE(/list) + if(!inventory) + return + . = new /list(length(inventory.held_items)) + for(var/i in 1 to length(inventory.held_items)) + .[i] = WEAKREF(inventory.held_items[i]) + #warn mirror & check below +//* By Side *// + /** * returns first item on left */ /mob/proc/get_left_held_item() RETURN_TYPE(/obj/item) - for(var/i in 1 to length(held_items) step 2) + for(var/i in 1 to length(inventory?.held_items) step 2) if(isnull(inventory?.held_items[i])) continue return inventory?.held_items[i] @@ -89,6 +119,8 @@ continue . += inventory?.held_items[i] +//* Iteration *// + /** * returns held items */ @@ -132,35 +164,3 @@ for(var/i in 1 to length(inventory?.held_items)) if(isnull(inventory?.held_items[i])) . += i - -/** - * returns held item in active hand - */ -/mob/proc/get_active_held_item() - RETURN_TYPE(/obj/item) - return inventory?.held_items?[active_hand] - -/** - * returns held item in inactive hand (or any inactive hand if more than 1) - */ -/mob/proc/get_inactive_held_item() - RETURN_TYPE(/obj/item) - for(var/i in 1 to length(inventory?.held_items)) - if(i == active_hand) - continue - if(isnull(inventory?.held_items[i])) - continue - return inventory?.held_items[i] - -/** - * returns all items held in non active hands - */ -/mob/proc/get_inactive_held_items() - RETURN_TYPE(/list) - . = list() - for(var/i in 1 to length(inventory?.held_items)) - if(i == active_hand) - continue - if(isnull(inventory?.held_items[i])) - continue - . += inventory?.held_items[i] diff --git a/code/modules/mob/inventory/inventory-hands-legacy.dm b/code/modules/mob/inventory/inventory-hands-legacy.dm index a583900cdaf6..de0071869990 100644 --- a/code/modules/mob/inventory/inventory-hands-legacy.dm +++ b/code/modules/mob/inventory/inventory-hands-legacy.dm @@ -21,3 +21,41 @@ */ /mob/proc/drop_inactive_held_item(flags) return drop_item_to_ground(get_inactive_held_item(), flags) + +/** + * returns held item in active hand + * + * todo: deprecate; 'active hand' should be based on client intent, not on the mob. + */ +/mob/proc/get_active_held_item() + RETURN_TYPE(/obj/item) + return inventory?.held_items?[active_hand] + +/** + * returns held item in inactive hand (or any inactive hand if more than 1) + * + * todo: deprecate; 'active hand' should be based on client intent, not on the mob. + */ +/mob/proc/get_inactive_held_item() + RETURN_TYPE(/obj/item) + for(var/i in 1 to length(inventory?.held_items)) + if(i == active_hand) + continue + if(isnull(inventory?.held_items[i])) + continue + return inventory?.held_items[i] + +/** + * returns all items held in non active hands + * + * todo: deprecate; 'active hand' should be based on client intent, not on the mob. + */ +/mob/proc/get_inactive_held_items() + RETURN_TYPE(/list) + . = list() + for(var/i in 1 to length(inventory?.held_items)) + if(i == active_hand) + continue + if(isnull(inventory?.held_items[i])) + continue + . += inventory?.held_items[i] diff --git a/code/modules/mob/inventory/mob/public.dm b/code/modules/mob/inventory/mob/public.dm index 45ba47125da5..60104521b7fb 100644 --- a/code/modules/mob/inventory/mob/public.dm +++ b/code/modules/mob/inventory/mob/public.dm @@ -130,7 +130,7 @@ var/obj/item/thing = item_by_slot_id(SLOT_ID_BACK) return thing?.obj_storage?.can_be_inserted(I, new /datum/event_args/actor(user), TRUE) if(/datum/inventory_slot/abstract/put_in_hands) - return (flags & INV_OP_FORCE) || !hands_full() + return (flags & INV_OP_FORCE) || !are_usable_hands_full() return TRUE if(!inventory_slot_bodypart_check(I, slot, user, flags) && !(flags & INV_OP_FORCE)) diff --git a/code/modules/mob/inventory/mob/stripping.dm b/code/modules/mob/inventory/mob/stripping.dm index 8d21790c15dc..f5ff80272d1c 100644 --- a/code/modules/mob/inventory/mob/stripping.dm +++ b/code/modules/mob/inventory/mob/stripping.dm @@ -86,7 +86,7 @@ . += "Right hand: " else . += "Hand [i]: " - var/obj/item/holding = get_held_item_of_index(i) + var/obj/item/holding = get_held_index(i) . += "[holding? holding.name : "nothing"]
" . += "
" @@ -139,7 +139,7 @@ if((index < 1) || (index > get_nominal_hand_count())) return FALSE - var/obj/item/ours = get_held_item_of_index(index) + var/obj/item/ours = get_held_index(index) var/obj/item/theirs = user.get_active_held_item() if(!ours && !theirs) diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm index 6ad459199922..ad65c3ca1f86 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm @@ -2,7 +2,7 @@ var/mob/living/carbon/human/H = over_object if(!istype(H) || !Adjacent(H)) return ..() - if(H.a_intent == "grab" && hat && !H.hands_full()) + if(H.a_intent == "grab" && hat && !H.are_usable_hands_full()) H.put_in_hands_or_drop(hat) H.visible_message("\The [H] removes \the [src]'s [hat].") hat = null diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index e08567103dcd..34796a0c23a0 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -32,7 +32,7 @@ to_chat(target, "\The [src] seems to have given up on passing \the [I] to you.") return - if(target.hands_full()) + if(target.are_usable_hands_full()) to_chat(target, "Your hands are full.") to_chat(src, "Their hands are full.") return diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 7bcdd372bcd9..ed482b2119cd 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -807,7 +807,7 @@ if ("handshake") m_type = 1 - if (!restrained() && !hands_full()) + if (!restrained() && !are_usable_hands_full()) var/mob/living/M = null if (param) for (var/mob/living/A in view(1, null)) @@ -1086,7 +1086,7 @@ if (length(pose)>0 && pose != old_pose) visible_emote("adjusts [T.his] posture.") addtimer(CALLBACK(src,PROC_REF(set_pose),""),time SECONDS) - + /mob/living/carbon/human/verb/silent_pose() set name = "Set Pose (Stealth)" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 08d20181041d..ff5ba89adf81 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -178,10 +178,10 @@ . += SPAN_INFO("[icon2html(back, user)] [T.He] [T.has] \a [FORMAT_TEXT_LOOKITEM(back)] on [T.his] back.") // hands - for(var/i in 1 to length(held_items)) - if(isnull(held_items[i])) + for(var/i in 1 to length(inventory?.held_items)) + if(isnull(inventory.held_items[i])) continue - var/obj/item/held = held_items[i] + var/obj/item/held = inventory.held_items[i] if(held.show_examine) continue var/hand_str = (i % 2)? "left hand[i > 2? " #[round(i / 2)]" : ""]" : "right hand[i > 2? " #[round(i / 2)]" : ""]" diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 780710e2234c..cc9642aeeddf 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -118,8 +118,8 @@ afflict_paralyze(20 * 5) //can't emote while weakened, apparently. /mob/living/carbon/human/proc/handle_grasp() - for(var/i in 1 to length(held_items)) - var/obj/item/held = held_items[i] + for(var/i in 1 to length(inventory?.held_items)) + var/obj/item/held = inventory.held_items[i] if(isnull(held)) continue var/obj/item/organ/external/hand = get_hand_organ_of_index(i) diff --git a/code/modules/mob/living/carbon/human/movement.dm b/code/modules/mob/living/carbon/human/movement.dm index e5a98a021f7c..4150e5a903dc 100644 --- a/code/modules/mob/living/carbon/human/movement.dm +++ b/code/modules/mob/living/carbon/human/movement.dm @@ -168,29 +168,6 @@ return ..() -/mob/living/carbon/human/Process_Spaceslipping(var/prob_slip = 5) - //If knocked out we might just hit it and stop. This makes it possible to get dead bodies and such. - - if(species.species_flags & NO_SLIP) - return - - if(stat) - prob_slip = 0 // Changing this to zero to make it line up with the comment, and also, make more sense. - - //Do we have magboots or such on if so no slip - if(istype(shoes, /obj/item/clothing/shoes/magboots) && (shoes.clothing_flags & NOSLIP)) - prob_slip = 0 - - //Check hands and mod slip - for(var/i in 1 to get_nominal_hand_count()) - if(isnull(held_items[i])) - prob_slip -= 2 - else if(held_items[i].w_class <= 2) - prob_slip -= 1 - - prob_slip = round(prob_slip) - return(prob_slip) - // Handle footstep sounds /mob/living/carbon/human/handle_footstep(turf/T) if(is_incorporeal()) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index 9d17b1ebc11b..9b90ec4918ee 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -25,7 +25,7 @@ var/mob/living/carbon/human/H = over_object if(!istype(H) || !Adjacent(H)) return ..() - if(H.a_intent == "grab" && hat && !H.hands_full()) + if(H.a_intent == "grab" && hat && !H.are_usable_hands_full()) hat.loc = get_turf(src) H.put_in_hands(hat) H.visible_message(SPAN_DANGER("\The [H] removes \the [src]'s [hat].")) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 3e012dabb128..20202f2e050e 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -281,7 +281,7 @@ if(module_state_3 == I) return 3 -/mob/living/silicon/robot/get_held_item_of_index(index) +/mob/living/silicon/robot/get_held_index(index) switch(index) if(1) return module_state_1 diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm index 8d9b3a2b144f..0b9c3a8b91fd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm @@ -103,7 +103,7 @@ if(S.run_checks()) S.on_innate_cast(src) - if(hands_full()) + if(are_usable_hands_full()) var/found = FALSE for(var/obj/item/spell/spell as anything in get_held_item_of_type(/obj/item/spell)) if(spell.aspect != ASPECT_CHROMATIC) diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 2bb63cef3d02..b8eac465c1c1 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -87,7 +87,7 @@ //* Helpers - These call other update procs. *// /mob/proc/update_inv_hands() - for(var/i in 1 to length(held_items)) + for(var/i in 1 to length(inventory?.held_items)) update_inv_hand(i) /mob/proc/update_inv_active_hand() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index fea7587c8efc..7ab3e47d01d5 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -452,7 +452,7 @@ // We do this down here, so we don't get the message if we fire an empty gun. - if(user.is_holding(src) && user.hands_full()) + if(user.is_holding(src) && user.are_usable_hands_full()) if(one_handed_penalty >= 20) to_chat(user, "You struggle to keep \the [src] pointed at the correct position with just one hand!") diff --git a/code/modules/species/promethean/promethean_blob.dm b/code/modules/species/promethean/promethean_blob.dm index 7e6e75461208..f07277465631 100644 --- a/code/modules/species/promethean/promethean_blob.dm +++ b/code/modules/species/promethean/promethean_blob.dm @@ -355,12 +355,7 @@ //Size update blob.transform = matrix()*size_multiplier blob.size_multiplier = size_multiplier - var/list/datum/weakref/prev_held = new /list(length(held_items)) - for(var/i in 1 to length(held_items)) - var/obj/item/held = held_items[i] - if(isnull(held)) - continue - prev_held[i] = WEAKREF(held) + blob.previously_held = inventory?.get_held_items_as_weakrefs() //Put our owner in it (don't transfer var/mind) blob.transforming = TRUE diff --git a/code/modules/species/protean/protean_blob.dm b/code/modules/species/protean/protean_blob.dm index c50b12356d21..c6057fc84435 100644 --- a/code/modules/species/protean/protean_blob.dm +++ b/code/modules/species/protean/protean_blob.dm @@ -318,12 +318,7 @@ //Size update blob.transform = matrix()*size_multiplier blob.size_multiplier = size_multiplier - var/list/datum/weakref/prev_held = new /list(length(held_items)) - for(var/i in 1 to length(held_items)) - var/obj/item/held = held_items[i] - if(isnull(held)) - continue - blob.previously_held[i] = WEAKREF(held) + blob.previously_held = inventory?.get_held_items_as_weakrefs() //languages!! for(var/datum/language/L in languages) blob.add_language(L.name) diff --git a/code/modules/species/xenomorphs/alien_powers.dm b/code/modules/species/xenomorphs/alien_powers.dm index ef1d297b79fb..2ad64a94fb60 100644 --- a/code/modules/species/xenomorphs/alien_powers.dm +++ b/code/modules/species/xenomorphs/alien_powers.dm @@ -307,7 +307,7 @@ T.afflict_paralyze(20 * 3) - if(hands_full()) + if(are_usable_hands_full()) to_chat(src, "You need to have one hand free to grab someone.") return diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm index 7dbe79e36cf4..28cde3e2754d 100644 --- a/code/modules/vore/fluffstuff/custom_items.dm +++ b/code/modules/vore/fluffstuff/custom_items.dm @@ -1282,7 +1282,7 @@ /obj/item/melee/baton/fluff/stunstaff/update_worn_icon() var/mob/living/M = loc - if(istype(M) && !issmall(M) && M.is_holding(src) && !M.hands_full()) + if(istype(M) && !issmall(M) && M.is_holding(src) && !M.are_usable_hands_full()) wielded = 1 damage_force = 15 name = "[base_name] (wielded)" From 597d6f8f554d2138dd6339b2f0f00cf5d98a28b3 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 7 Aug 2024 16:25:21 +0000 Subject: [PATCH 063/140] unify --- citadel.dme | 1 - code/game/rendering/mob_huds/hands.dm | 82 ------------------- code/game/rendering/mob_huds/inventory.dm | 62 ++++++++++++-- code/modules/mob/inventory/mob/public.dm | 7 ++ .../modules/mob/living/carbon/carbon-hands.dm | 31 +++++-- .../mob/living/carbon/human/human_organs.dm | 2 +- code/modules/mob/mob-login.dm | 7 +- 7 files changed, 86 insertions(+), 106 deletions(-) delete mode 100644 code/game/rendering/mob_huds/hands.dm diff --git a/citadel.dme b/citadel.dme index 01cdbdbc1eff..9c48611e65d4 100644 --- a/citadel.dme +++ b/citadel.dme @@ -1958,7 +1958,6 @@ #include "code\game\rendering\legacy\intents\throwing.dm" #include "code\game\rendering\legacy\inventory\inventory.dm" #include "code\game\rendering\legacy\objects\waypoint_tracker.dm" -#include "code\game\rendering\mob_huds\hands.dm" #include "code\game\rendering\mob_huds\inventory.dm" #include "code\game\rendering\mob_huds\mob_hud.dm" #include "code\game\rendering\parallax\parallax.dm" diff --git a/code/game/rendering/mob_huds/hands.dm b/code/game/rendering/mob_huds/hands.dm deleted file mode 100644 index 72b19e88a9f5..000000000000 --- a/code/game/rendering/mob_huds/hands.dm +++ /dev/null @@ -1,82 +0,0 @@ -//* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// - -/datum/mob_hud/hands - /// ordered hand objects - var/list/atom/movable/screen/hands/hand/hands - /// swap hand object - var/atom/movable/screen/hands/swap_hand/swap_hand - /// equip object - var/atom/movable/screen/hands/equip_hand/equip_hand - /// use hand on self object - var/atom/movable/screen/hands/use_self_hand/use_self_hand - -/datum/mob_hud/hands/proc/add_item(obj/item/item, index) - -/datum/mob_hud/hands/proc/remove_item(obj/item/item, index) - -/datum/mob_hud/hands/proc/move_item(obj/item/item, from_index, to_index) - -/datum/mob_hud/hands/proc/swap_active_hand(from_index, to_index) - var/atom/movable/screen/hands/old_hand = hands[from_index] - var/atom/movable/screen/hands/new_hand = hands[to_index] - - -#warn impl all - -/atom/movable/screen/hands - name = "inventory" - icon = 'icons/screen/hud/midnight/inventory.dmi' - - /// our owning mob hud - var/datum/mob_hud/hands/hud - -/atom/movable/screen/hands/Initialize(mapload, datum/mob_hud/hands/hud) - . = ..() - src.hud = hud - sync_style(hud.style) - -/atom/movable/screen/hands/sync_style(datum/hud_style/style, style_alpha, style_color) - icon = style.inventory_icons - alpha = style_alpha - color = style_color - -/** - * handle an inventory operation - * - * @params - * * user - clicking user; not necessarily the inventory's owner - * * slot_or_index - slot ID or numerical hand index - * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. - */ -/atom/movable/screen/hands/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) - -#warn impl all - -/atom/movable/screen/hands/hand - /// target hand index - var/hand_index - -/atom/movable/screen/hands/hand/Initialize(mapload, datum/inventory/host, hand_index) - . = ..() - src.hand_index = hand_index - sync_index(hand_index) - -/atom/movable/screen/hands/hand/proc/sync_index(index = hand_index) - screen_loc = SCREEN_LOC_INV_HAND(index) - var/index_of_side = round(index / 2) - name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" - icon_state = "hand-[index % 2? "left" : "right"]" - -/atom/movable/screen/hands/swap_hand - icon_state = "swap" - -/atom/movable/screen/hands/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) - icon = style.inventory_icons_wide - alpha = style_alpha - color = style_color - -/atom/movable/screen/hands/equip_hand - icon_state = "equip" - -// /atom/movable/screen/hands/use_self_hand diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index de4cd0133d8a..b822c0c15b9c 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -8,15 +8,31 @@ /// owning inventory var/datum/inventory/host + /// keyed slot id to screen object + var/list/atom/movable/screen/inventory/slot/slot_by_id + /// ordered hand objects + var/list/atom/movable/inventory/hand/hands + + /// swap hand object + var/atom/movable/inventory/swap_hand/swap_hand + /// equip object + var/atom/movable/inventory/equip_hand/equip_hand + /// use hand on self object + var/atom/movable/inventory/use_self_hand/use_self_hand + /datum/mob_hud/inventory/New(mob/owner, datum/inventory/host) src.host = host ..() -/datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot) +/datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) + +/datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot_or_index) -/datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot) +/datum/mob_hud/inventory/proc/move_item(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) -/datum/mob_hud/inventory/proc/move_item(obj/item/item, datum/inventory_slot/from_slot, datum/inventory_slot/to_slot) +/datum/mob_hud/inventory/proc/swap_active_hand(from_index, to_index) + var/atom/movable/inventory/hands/old_hand = hands[from_index] + var/atom/movable/inventory/hands/new_hand = hands[to_index] #warn impl all @@ -37,10 +53,6 @@ alpha = style_alpha color = style_color -/atom/movable/screen/inventory/slot - /// our inventory slot id - var/inventory_slot_id - /** * handle an inventory operation * @@ -49,4 +61,38 @@ * * slot_or_index - slot ID or numerical hand index * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. */ -/atom/movable/screen/inventory/slot/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) +/atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) + +#warn impl all + +/atom/movable/screen/inventory/slot + /// our inventory slot id + var/inventory_slot_id + +/atom/movable/inventory/hand + /// target hand index + var/hand_index + +/atom/movable/inventory/hand/Initialize(mapload, datum/inventory/host, hand_index) + . = ..() + src.hand_index = hand_index + sync_index(hand_index) + +/atom/movable/inventory/hand/proc/sync_index(index = hand_index) + screen_loc = SCREEN_LOC_INV_HAND(index) + var/index_of_side = round(index / 2) + name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" + icon_state = "hand-[index % 2? "left" : "right"]" + +/atom/movable/inventory/swap_hand + icon_state = "swap" + +/atom/movable/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) + icon = style.inventory_icons_wide + alpha = style_alpha + color = style_color + +/atom/movable/inventory/equip_hand + icon_state = "equip" + +// /atom/movable/inventory/hands/use_self_hand diff --git a/code/modules/mob/inventory/mob/public.dm b/code/modules/mob/inventory/mob/public.dm index 60104521b7fb..f938d4efbd03 100644 --- a/code/modules/mob/inventory/mob/public.dm +++ b/code/modules/mob/inventory/mob/public.dm @@ -361,6 +361,13 @@ // This logic is actually **stricter** than the previous logic, which was "if item doesn't exist, it always works" +// todo: yeah this is pretty bad huh; this is because new hand crap is properly refactored and we aren't +// so this is just a wrapper to route stuff around while we slowly refactor inventory. +/datum/inventory/proc/drop_item_to_ground(obj/item/I, inv_op_flags, datum/event_args/actor/actor) + if(!actor) + actor = WRAP_MOB_TO_ACTOR_EVENT_ARGS(actor || src) + return mob.drop_item_to_ground(I, inv_op_flags, actor?.performer) + /** * drops an item to ground * diff --git a/code/modules/mob/living/carbon/carbon-hands.dm b/code/modules/mob/living/carbon/carbon-hands.dm index 29f0fb3dcba2..f5f19ef9a215 100644 --- a/code/modules/mob/living/carbon/carbon-hands.dm +++ b/code/modules/mob/living/carbon/carbon-hands.dm @@ -15,31 +15,46 @@ * Get the hand index of an organ * * * If an organ is responsible for more than one index, this only returns one of them. + * + * @return numerical index or null */ -/mob/living/carbon/proc/get_hand_index_of_organ(obj/item/organ/external/organ) +/mob/living/carbon/proc/get_hand_of_organ(obj/item/organ/external/organ) #warn impl return null /** * Get all hand indexes of an organ + * + * @return list of numerical indices */ -/mob/living/carbon/proc/get_hand_indices_of_organ(obj/item/organ/external/organ) +/mob/living/carbon/proc/get_hands_of_organ(obj/item/organ/external/organ) RETURN_TYPE(/list) #warn impl return list() /** - * Get the external organ of an arm + * Get the external organ of a hand index + * + * @params + * * index - the hand index + * + * @return external organ or null */ -/mob/living/carbon/proc/get_hand_organ_of_index(index) +/mob/living/carbon/proc/get_hand_organ(index) RETURN_TYPE(/obj/item/organ/external) #warn impl /** - * Get the external organ of a held iteem + * Get the external organ of a held item + * + * @params + * * held - the held item + * + * @return external organ or null */ -/mob/living/carbon/proc/get_hand_organ_of_held(obj/item/held) - return get_hand_organ_of_index(get_held_index(held)) +/mob/living/carbon/proc/get_held_organ(obj/item/held) + RETURN_TYPE(/obj/item/organ/external) + return get_hand_organ(get_held_index(held)) //* Hands - Organs - Legacy Default Handling *// //* To allow for multiple people able to control multiple active hands later, *// @@ -54,4 +69,4 @@ */ /mob/living/carbon/proc/get_active_hand_organ(index) RETURN_TYPE(/obj/item/organ/external) - return get_hand_organ_of_index(active_hand) + return get_hand_organ(active_hand) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index cc9642aeeddf..e8f08a76251b 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -122,7 +122,7 @@ var/obj/item/held = inventory.held_items[i] if(isnull(held)) continue - var/obj/item/organ/external/hand = get_hand_organ_of_index(i) + var/obj/item/organ/external/hand = get_hand_organ(i) var/obj/item/organ/external/arm = get_arm_organ(i) if(isnull(arm) || isnull(hand)) visible_message("Lacking a functioning left hand, \the [src] drops \the [held].") diff --git a/code/modules/mob/mob-login.dm b/code/modules/mob/mob-login.dm index 750274d376c3..b470d1c49240 100644 --- a/code/modules/mob/mob-login.dm +++ b/code/modules/mob/mob-login.dm @@ -94,12 +94,7 @@ // load inventory HUD var/datum/mob_hud/inventory/inventory_hud = inventory?.get_hud() inventory_hud?.add_user(client) - // load hands HUD - if(has_hands()) - if(!hands_hud) - hands_hud = new(src) - hands_hud.add_user(client) - + //* legacy // this is below reset_perspective so self perspective generates. recalculate_vis() From bc4c8b5fac7eba9b95c2247026588a9ec16971a1 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 7 Aug 2024 16:26:33 +0000 Subject: [PATCH 064/140] update --- code/game/rendering/screen_legacy.dm | 8 ++++---- code/modules/power/smes/smes_construction.dm | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index d885228eeb3b..72d280963708 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -233,8 +233,8 @@ locnames += "on your suit" tanks += H.s_store // hands - for(var/i in 1 to length(H.held_items)) - tanks += H.held_items[i] + for(var/i in 1 to length(H.inventory?.held_items)) + tanks += H.inventory?.held_items[i] if(i <= 2) locnames += "in your [i == 1? "left" : "right"] hand" else @@ -252,8 +252,8 @@ tanks += H.back else // hands - for(var/i in 1 to length(C.held_items)) - tanks += C.held_items[i] + for(var/i in 1 to length(C.inventory?.held_items)) + tanks += C.inventory?.held_items[i] if(i <= 2) locnames += "in your [i == 1? "left" : "right"] hand" else diff --git a/code/modules/power/smes/smes_construction.dm b/code/modules/power/smes/smes_construction.dm index ede6356e09ac..2b1109adfc37 100644 --- a/code/modules/power/smes/smes_construction.dm +++ b/code/modules/power/smes/smes_construction.dm @@ -165,7 +165,7 @@ log_game("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100") message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100 - JMP") - var/used_hand = h_user.get_active_hand_organ_key() + var/used_hand = h_user.get_active_hand_organ()?.organ_tag switch (intensity) if (0 to 15) From afc08ec3e56a362d7f4bf6e308565f8881a53464 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:33:27 +0000 Subject: [PATCH 065/140] t --- code/modules/mob/inventory/inventory-hands-drop.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/inventory/inventory-hands-drop.dm b/code/modules/mob/inventory/inventory-hands-drop.dm index 1befab419ad5..2a03a284d77a 100644 --- a/code/modules/mob/inventory/inventory-hands-drop.dm +++ b/code/modules/mob/inventory/inventory-hands-drop.dm @@ -41,7 +41,7 @@ * @return INV_RETURN_* flags */ /datum/inventory/proc/drop_held_index(index, inv_op_flags) - return drop_item_to_ground(get_held_index(index), flags) + return drop_item_to_ground(get_held_index(index), inv_op_flags) /** * Drops the item held in a given hand index. From 2c787e0846c8dbdd64d6ab31b42bc45df54ec0a9 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 8 Sep 2024 20:56:26 -0400 Subject: [PATCH 066/140] merges --- citadel.dme | 177 +++++++++++++++++-------- code/game/objects/items-interaction.dm | 11 +- 2 files changed, 126 insertions(+), 62 deletions(-) diff --git a/citadel.dme b/citadel.dme index d8d5552a8bcc..4b43ec51d7f2 100644 --- a/citadel.dme +++ b/citadel.dme @@ -46,7 +46,6 @@ #include "code\__DEFINES\damage_organs.dm" #include "code\__DEFINES\directional.dm" #include "code\__DEFINES\dna.dm" -#include "code\__DEFINES\event_args.dm" #include "code\__DEFINES\fonts.dm" #include "code\__DEFINES\frames.dm" #include "code\__DEFINES\gamemode.dm" @@ -162,6 +161,7 @@ #include "code\__DEFINES\controllers\timer.dm" #include "code\__DEFINES\datums\beam.dm" #include "code\__DEFINES\datums\design.dm" +#include "code\__DEFINES\datums\event_args.dm" #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\components\riding.dm" @@ -177,33 +177,36 @@ #include "code\__DEFINES\dcs\signals\elements\signals_element_conflict_checking.dm" #include "code\__DEFINES\dcs\signals\items\signals_inducer.dm" #include "code\__DEFINES\dcs\signals\modules\signals_module_fishing.dm" +#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom-buckling.dm" +#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom-clickchain.dm" +#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom-context_system.dm" +#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom-defense.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom-reachability.dm" +#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom-throwing.dm" +#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom-tool_system.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_appearance.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_attack.dm" -#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_buckling.dm" -#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_context_system.dm" -#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_defense.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_main.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_mouse.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movable.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_radiation.dm" -#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_throwing.dm" -#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_tool_system.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_x_act.dm" +#include "code\__DEFINES\dcs\signals\signals_item\signals_item-clickchain.dm" #include "code\__DEFINES\dcs\signals\signals_item\signals_item-interaction.dm" #include "code\__DEFINES\dcs\signals\signals_item\signals_item_economy.dm" #include "code\__DEFINES\dcs\signals\signals_item\signals_item_inventory.dm" #include "code\__DEFINES\dcs\signals\signals_item\signals_item_mouse.dm" #include "code\__DEFINES\dcs\signals\signals_item\signals_item_storage.dm" +#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob-inventory.dm" +#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob-perspective.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_appearance.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_combat.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_defense.dm" -#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_inventory.dm" +#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_legacy.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_main.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_mobility.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_organs.dm" -#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_perspectiive.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_simple.dm" #include "code\__DEFINES\economy\category.dm" #include "code\__DEFINES\economy\currency.dm" @@ -262,6 +265,7 @@ #include "code\__DEFINES\mobs\characteristics.dm" #include "code\__DEFINES\mobs\grab.dm" #include "code\__DEFINES\mobs\hands.dm" +#include "code\__DEFINES\mobs\iff.dm" #include "code\__DEFINES\mobs\intent.dm" #include "code\__DEFINES\mobs\life.dm" #include "code\__DEFINES\mobs\mobility.dm" @@ -295,6 +299,7 @@ #include "code\__DEFINES\projectiles\ammo_casing.dm" #include "code\__DEFINES\projectiles\ammo_magazine.dm" #include "code\__DEFINES\projectiles\guns.dm" +#include "code\__DEFINES\projectiles\projectile.dm" #include "code\__DEFINES\projectiles\system.dm" #include "code\__DEFINES\radiation\flags.dm" #include "code\__DEFINES\radiation\ignore.dm" @@ -338,6 +343,7 @@ #include "code\__DEFINES\traits\sources.dm" #include "code\__DEFINES\traits\unsorted.dm" #include "code\__DEFINES\turfs\change_turf.dm" +#include "code\__DEFINES\turfs\turfs.dm" #include "code\__DEFINES\turfs\type_generation.dm" #include "code\__HELPERS\_auxtools_api.dm" #include "code\__HELPERS\_global_objects.dm" @@ -382,7 +388,6 @@ #include "code\__HELPERS\vector.dm" #include "code\__HELPERS\verbs.dm" #include "code\__HELPERS\animations\attack.dm" -#include "code\__HELPERS\datastructs\armor.dm" #include "code\__HELPERS\datastructs\bodytypes.dm" #include "code\__HELPERS\datastructs\filters.dm" #include "code\__HELPERS\datastructs\ingredients.dm" @@ -393,6 +398,7 @@ #include "code\__HELPERS\files\paths.dm" #include "code\__HELPERS\files\walk.dm" #include "code\__HELPERS\game\depth.dm" +#include "code\__HELPERS\game\combat\arc.dm" #include "code\__HELPERS\game\turfs\line.dm" #include "code\__HELPERS\game\turfs\offsets.dm" #include "code\__HELPERS\graphs\astar.dm" @@ -641,10 +647,11 @@ #include "code\controllers\subsystem\persistence\modules\bulk_entity_serializers\trash.dm" #include "code\controllers\subsystem\processing\chemistry.dm" #include "code\controllers\subsystem\processing\circuits.dm" -#include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\instruments.dm" #include "code\controllers\subsystem\processing\moving_cameras.dm" #include "code\controllers\subsystem\processing\obj.dm" +#include "code\controllers\subsystem\processing\process_20fps.dm" +#include "code\controllers\subsystem\processing\process_5fps.dm" #include "code\controllers\subsystem\processing\processing.dm" #include "code\controllers\subsystem\processing\projectiles.dm" #include "code\controllers\subsystem\processing\turfs.dm" @@ -700,6 +707,7 @@ #include "code\datums\announce\location\global.dm" #include "code\datums\announce\location\main_station.dm" #include "code\datums\announce\location\overmap_sector.dm" +#include "code\datums\armor\armor.dm" #include "code\datums\armor\core.dm" #include "code\datums\armor\mecha.dm" #include "code\datums\armor\military.dm" @@ -768,7 +776,10 @@ #include "code\datums\components\atoms\radioactive.dm" #include "code\datums\components\crafting\crafting.dm" #include "code\datums\components\crafting\guncrafting.dm" +#include "code\datums\components\items\passive_parry.dm" #include "code\datums\components\items\wielding.dm" +#include "code\datums\components\mobs\block_frame.dm" +#include "code\datums\components\mobs\parry_frame.dm" #include "code\datums\components\movable\aquarium.dm" #include "code\datums\components\movable\spatial_grid.dm" #include "code\datums\components\objects\slippery.dm" @@ -899,6 +910,7 @@ #include "code\datums\repositories\unique.dm" #include "code\datums\soundbytes\_soundbyte.dm" #include "code\datums\soundbytes\announcer.dm" +#include "code\datums\soundbytes\effects\combat.dm" #include "code\datums\soundbytes\effects\explosion.dm" #include "code\datums\soundbytes\effects\sparks.dm" #include "code\datums\soundbytes\effects\spray.dm" @@ -1015,18 +1027,20 @@ #include "code\game\area\station\security_areas.dm" #include "code\game\atoms\action_feedback.dm" #include "code\game\atoms\appearance.dm" +#include "code\game\atoms\atom-construction.dm" +#include "code\game\atoms\atom-damage.dm" +#include "code\game\atoms\atom-defense.dm" #include "code\game\atoms\atom.dm" #include "code\game\atoms\buckling.dm" -#include "code\game\atoms\defense.dm" #include "code\game\atoms\defense_old.dm" #include "code\game\atoms\materials.dm" #include "code\game\atoms\movement.dm" #include "code\game\atoms\say.dm" #include "code\game\atoms\vv.dm" +#include "code\game\atoms\movable\movable-movement.dm" +#include "code\game\atoms\movable\movable-throw.dm" #include "code\game\atoms\movable\movable.dm" -#include "code\game\atoms\movable\movement.dm" #include "code\game\atoms\movable\pulling.dm" -#include "code\game\atoms\movable\throwing.dm" #include "code\game\atoms\movable\vv.dm" #include "code\game\atoms\movable\special\overlay.dm" #include "code\game\atoms\movable\special\render.dm" @@ -1040,6 +1054,7 @@ #include "code\game\click\cyborg.dm" #include "code\game\click\drag_drop.dm" #include "code\game\click\item_attack.dm" +#include "code\game\click\items-item_attack_chain.dm" #include "code\game\click\items.dm" #include "code\game\click\mobs.dm" #include "code\game\click\observer.dm" @@ -1453,16 +1468,19 @@ #include "code\game\magic\Uristrunes.dm" #include "code\game\objects\attacks.dm" #include "code\game\objects\banners.dm" -#include "code\game\objects\defense.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\explosion.dm" #include "code\game\objects\explosion_recursive.dm" +#include "code\game\objects\items-carry_weight.dm" +#include "code\game\objects\items-defense.dm" #include "code\game\objects\items-interaction.dm" #include "code\game\objects\items.dm" #include "code\game\objects\materials.dm" #include "code\game\objects\misc.dm" #include "code\game\objects\mob_spawner.dm" -#include "code\game\objects\objs.dm" +#include "code\game\objects\obj-construction.dm" +#include "code\game\objects\obj-defense.dm" +#include "code\game\objects\obj.dm" #include "code\game\objects\structures.dm" #include "code\game\objects\stumble_into_vr.dm" #include "code\game\objects\topic.dm" @@ -1647,6 +1665,15 @@ #include "code\game\objects\items\id_cards\station_ids.dm" #include "code\game\objects\items\id_cards\syndicate_ids.dm" #include "code\game\objects\items\janitorial\soap.dm" +#include "code\game\objects\items\melee\melee.dm" +#include "code\game\objects\items\melee\types\misc.dm" +#include "code\game\objects\items\melee\types\ninja_energy_blade.dm" +#include "code\game\objects\items\melee\types\transforming.dm" +#include "code\game\objects\items\melee\types\transforming\energy.dm" +#include "code\game\objects\items\melee\types\transforming\hfmachete.dm" +#include "code\game\objects\items\melee\types\transforming\energy\axe.dm" +#include "code\game\objects\items\melee\types\transforming\energy\ionic_rapier.dm" +#include "code\game\objects\items\melee\types\transforming\energy\saber.dm" #include "code\game\objects\items\robot\gripper.dm" #include "code\game\objects\items\robot\robot_items.dm" #include "code\game\objects\items\robot\robot_parts.dm" @@ -1657,6 +1684,14 @@ #include "code\game\objects\items\scanners\reagent.dm" #include "code\game\objects\items\scanners\slime.dm" #include "code\game\objects\items\scanners\spectrometer.dm" +#include "code\game\objects\items\shield\shield.dm" +#include "code\game\objects\items\shield\types\shields_legacy.dm" +#include "code\game\objects\items\shield\types\shields_legacy_vr.dm" +#include "code\game\objects\items\shield\types\transforming.dm" +#include "code\game\objects\items\shield\types\transforming\energy.dm" +#include "code\game\objects\items\shield\types\transforming\telescopic.dm" +#include "code\game\objects\items\shield_projector\shield_matrix.dm" +#include "code\game\objects\items\shield_projector\shield_projector.dm" #include "code\game\objects\items\stacks\fifty_spawner.dm" #include "code\game\objects\items\stacks\marker_beacons.dm" #include "code\game\objects\items\stacks\matter_synth.dm" @@ -1738,7 +1773,6 @@ #include "code\game\objects\items\weapons\RPD.dm" #include "code\game\objects\items\weapons\RSF.dm" #include "code\game\objects\items\weapons\scrolls.dm" -#include "code\game\objects\items\weapons\shields.dm" #include "code\game\objects\items\weapons\stunbaton.dm" #include "code\game\objects\items\weapons\surgery_tools.dm" #include "code\game\objects\items\weapons\swords_axes_etc.dm" @@ -1790,10 +1824,6 @@ #include "code\game\objects\items\weapons\material\thrown.dm" #include "code\game\objects\items\weapons\material\twohanded.dm" #include "code\game\objects\items\weapons\material\whetstone.dm" -#include "code\game\objects\items\weapons\melee\deflect.dm" -#include "code\game\objects\items\weapons\melee\energy.dm" -#include "code\game\objects\items\weapons\melee\melee.dm" -#include "code\game\objects\items\weapons\melee\misc.dm" #include "code\game\objects\items\weapons\tanks\jetpack.dm" #include "code\game\objects\items\weapons\tanks\tank.dm" #include "code\game\objects\items\weapons\tanks\tank_types.dm" @@ -1988,8 +2018,8 @@ #include "code\game\rendering\plane_masters\plane_render.dm" #include "code\game\turfs\baseturfs.dm" #include "code\game\turfs\change_turf.dm" -#include "code\game\turfs\defense.dm" #include "code\game\turfs\simulated.dm" +#include "code\game\turfs\turf-construction.dm" #include "code\game\turfs\turf.dm" #include "code\game\turfs\turf_ao.dm" #include "code\game\turfs\turf_flick_animations.dm" @@ -2023,9 +2053,11 @@ #include "code\game\turfs\simulated\flooring\flooring_traps.dm" #include "code\game\turfs\simulated\flooring\shuttle_vr.dm" #include "code\game\turfs\simulated\misc\fancy_shuttles.dm" -#include "code\game\turfs\simulated\wall\defense.dm" #include "code\game\turfs\simulated\wall\materials.dm" #include "code\game\turfs\simulated\wall\rot.dm" +#include "code\game\turfs\simulated\wall\wall-construction.dm" +#include "code\game\turfs\simulated\wall\wall-damage.dm" +#include "code\game\turfs\simulated\wall\wall-defense.dm" #include "code\game\turfs\simulated\wall\wall.dm" #include "code\game\turfs\simulated\wall\wall_attacks.dm" #include "code\game\turfs\simulated\wall\wall_icon.dm" @@ -2178,6 +2210,7 @@ #include "code\modules\admin\view_variables\topic_list.dm" #include "code\modules\admin\view_variables\view_variables.dm" #include "code\modules\ai\ai_pathing.dm" +#include "code\modules\ai\ai_tracking.dm" #include "code\modules\ai\holders\ai_holder-movement.dm" #include "code\modules\ai\holders\ai_holder-pathfinding.dm" #include "code\modules\ai\holders\ai_holder-scheduling.dm" @@ -2362,7 +2395,6 @@ #include "code\modules\awaymissions\bluespaceartillery.dm" #include "code\modules\awaymissions\corpse.dm" #include "code\modules\awaymissions\exile.dm" -#include "code\modules\awaymissions\gateway.dm" #include "code\modules\awaymissions\loot.dm" #include "code\modules\awaymissions\loot_vr.dm" #include "code\modules\awaymissions\pamphlet.dm" @@ -2488,6 +2520,7 @@ #include "code\modules\clothing\masks\gasmask.dm" #include "code\modules\clothing\masks\miscellaneous.dm" #include "code\modules\clothing\masks\voice.dm" +#include "code\modules\clothing\sets\armor\ablative.dm" #include "code\modules\clothing\shoes\_shoes.dm" #include "code\modules\clothing\shoes\boots.dm" #include "code\modules\clothing\shoes\colour.dm" @@ -2831,6 +2864,10 @@ #include "code\modules\games\spaceball_cards.dm" #include "code\modules\games\tarot.dm" #include "code\modules\games\unus.dm" +#include "code\modules\gateway\stargate\stargate-away.dm" +#include "code\modules\gateway\stargate\stargate-destination.dm" +#include "code\modules\gateway\stargate\stargate-station.dm" +#include "code\modules\gateway\stargate\stargate.dm" #include "code\modules\genetics\side_effects.dm" #include "code\modules\ghostroles\instantiator.dm" #include "code\modules\ghostroles\menu.dm" @@ -2909,6 +2946,27 @@ #include "code\modules\hydroponics\trays\tray_update_icons.dm" #include "code\modules\identification\identification.dm" #include "code\modules\identification\item_procs.dm" +#include "code\modules\industry\destination_tagger.dm" +#include "code\modules\industry\package_wrapper.dm" +#include "code\modules\industry\conveyors\conveyor.dm" +#include "code\modules\industry\conveyors\conveyor_switch.dm" +#include "code\modules\industry\disposals\disposal.dm" +#include "code\modules\industry\disposals\disposal_frame.dm" +#include "code\modules\industry\disposals\disposal_holder.dm" +#include "code\modules\industry\disposals\disposal_pipe.dm" +#include "code\modules\industry\disposals\disposal\chute.dm" +#include "code\modules\industry\disposals\disposal\intake.dm" +#include "code\modules\industry\disposals\disposal\outlet.dm" +#include "code\modules\industry\disposals\disposal_pipe\broken.dm" +#include "code\modules\industry\disposals\disposal_pipe\down.dm" +#include "code\modules\industry\disposals\disposal_pipe\junction.dm" +#include "code\modules\industry\disposals\disposal_pipe\segment.dm" +#include "code\modules\industry\disposals\disposal_pipe\sortjunction.dm" +#include "code\modules\industry\disposals\disposal_pipe\tagger.dm" +#include "code\modules\industry\disposals\disposal_pipe\trunk.dm" +#include "code\modules\industry\disposals\disposal_pipe\up.dm" +#include "code\modules\industry\packages\large_parcel.dm" +#include "code\modules\industry\packages\small_parcel.dm" #include "code\modules\instruments\instrument_data\_instrument_data.dm" #include "code\modules\instruments\instrument_data\_instrument_key.dm" #include "code\modules\instruments\instrument_data\brass.dm" @@ -3452,7 +3510,6 @@ #include "code\modules\mob\animations.dm" #include "code\modules\mob\client.dm" #include "code\modules\mob\death.dm" -#include "code\modules\mob\defense.dm" #include "code\modules\mob\emote.dm" #include "code\modules\mob\floating_message.dm" #include "code\modules\mob\gender.dm" @@ -3462,9 +3519,14 @@ #include "code\modules\mob\holder.dm" #include "code\modules\mob\inventory.dm" #include "code\modules\mob\life.dm" +#include "code\modules\mob\login.dm" +#include "code\modules\mob\logout.dm" +#include "code\modules\mob\mob-damage.dm" +#include "code\modules\mob\mob-defense.dm" #include "code\modules\mob\mob-keybind-triggers.dm" #include "code\modules\mob\mob.dm" #include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob-iff.dm" #include "code\modules\mob\mob_helpers.dm" #include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\mobility.dm" @@ -3522,14 +3584,14 @@ #include "code\modules\mob\freelook\mask\update_triggers.dm" #include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\butchering.dm" -#include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\death.dm" #include "code\modules\mob\living\default_language.dm" -#include "code\modules\mob\living\defense.dm" #include "code\modules\mob\living\health.dm" #include "code\modules\mob\living\inventory.dm" #include "code\modules\mob\living\inventory_legacy.dm" #include "code\modules\mob\living\life.dm" +#include "code\modules\mob\living\living-damage.dm" +#include "code\modules\mob\living\living-defense-legacy.dm" #include "code\modules\mob\living\living-defense.dm" #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defines.dm" @@ -3616,11 +3678,12 @@ #include "code\modules\mob\living\carbon\human\emote.dm" #include "code\modules\mob\living\carbon\human\examine.dm" #include "code\modules\mob\living\carbon\human\health.dm" +#include "code\modules\mob\living\carbon\human\human-damage-legacy.dm" +#include "code\modules\mob\living\carbon\human\human-damage.dm" +#include "code\modules\mob\living\carbon\human\human-defense-legacy.dm" #include "code\modules\mob\living\carbon\human\human-defense.dm" #include "code\modules\mob\living\carbon\human\human.dm" #include "code\modules\mob\living\carbon\human\human_attackhand.dm" -#include "code\modules\mob\living\carbon\human\human_damage.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" #include "code\modules\mob\living\carbon\human\human_defines.dm" #include "code\modules\mob\living\carbon\human\human_helpers.dm" #include "code\modules\mob\living\carbon\human\human_modular_limbs.dm" @@ -3666,6 +3729,8 @@ #include "code\modules\mob\living\silicon\offense.dm" #include "code\modules\mob\living\silicon\perspective.dm" #include "code\modules\mob\living\silicon\say.dm" +#include "code\modules\mob\living\silicon\silicon-damage.dm" +#include "code\modules\mob\living\silicon\silicon-defense-legacy.dm" #include "code\modules\mob\living\silicon\silicon.dm" #include "code\modules\mob\living\silicon\subystems.dm" #include "code\modules\mob\living\silicon\translation.dm" @@ -3863,7 +3928,6 @@ #include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\possessed.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm" @@ -3943,7 +4007,7 @@ #include "code\modules\mob\living\simple_mob\subtypes\vore\snake.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub_larva.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\solarmoth_ch.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\solarmoth.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\vore.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\wolfgirl.dm" @@ -4249,7 +4313,6 @@ #include "code\modules\power\fission\rods.dm" #include "code\modules\power\fusion\_setup.dm" #include "code\modules\power\fusion\fusion_circuits.dm" -#include "code\modules\power\fusion\fusion_particle_catcher.dm" #include "code\modules\power\fusion\fusion_reactions.dm" #include "code\modules\power\fusion\fusion_reagents.dm" #include "code\modules\power\fusion\magpower.dm" @@ -4347,8 +4410,6 @@ #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\gun_item_renderer.dm" #include "code\modules\projectiles\gun_mob_renderer.dm" -#include "code\modules\projectiles\projectile-tracing.dm" -#include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\ammo_caliber.dm" #include "code\modules\projectiles\ammunition\ammo_casing.dm" #include "code\modules\projectiles\ammunition\ammo_magazine.dm" @@ -4446,25 +4507,32 @@ #include "code\modules\projectiles\guns\projectile\caseless\pellet.dm" #include "code\modules\projectiles\guns\projectile\sniper\collapsible_sniper.dm" #include "code\modules\projectiles\projectile\arc.dm" -#include "code\modules\projectiles\projectile\blob.dm" -#include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\bullets_vr.dm" -#include "code\modules\projectiles\projectile\change.dm" -#include "code\modules\projectiles\projectile\energy.dm" -#include "code\modules\projectiles\projectile\energy_vr.dm" -#include "code\modules\projectiles\projectile\explosive.dm" -#include "code\modules\projectiles\projectile\force.dm" -#include "code\modules\projectiles\projectile\hook.dm" -#include "code\modules\projectiles\projectile\magic.dm" -#include "code\modules\projectiles\projectile\magnetic.dm" -#include "code\modules\projectiles\projectile\pellets.dm" -#include "code\modules\projectiles\projectile\reusable.dm" -#include "code\modules\projectiles\projectile\scatter.dm" -#include "code\modules\projectiles\projectile\special.dm" -#include "code\modules\projectiles\projectile\trace.dm" -#include "code\modules\projectiles\projectile\beam\beams.dm" -#include "code\modules\projectiles\projectile\beam\beams_vr.dm" -#include "code\modules\projectiles\projectile\beam\blaster.dm" +#include "code\modules\projectiles\projectile\helpers.dm" +#include "code\modules\projectiles\projectile\projectile-hitscan_visuals.dm" +#include "code\modules\projectiles\projectile\projectile-physics.dm" +#include "code\modules\projectiles\projectile\projectile-tracing.dm" +#include "code\modules\projectiles\projectile\projectile.dm" +#include "code\modules\projectiles\projectile\projectile_effect.dm" +#include "code\modules\projectiles\projectile\subtypes\arc.dm" +#include "code\modules\projectiles\projectile\subtypes\blob.dm" +#include "code\modules\projectiles\projectile\subtypes\bullets.dm" +#include "code\modules\projectiles\projectile\subtypes\bullets_vr.dm" +#include "code\modules\projectiles\projectile\subtypes\change.dm" +#include "code\modules\projectiles\projectile\subtypes\energy.dm" +#include "code\modules\projectiles\projectile\subtypes\energy_vr.dm" +#include "code\modules\projectiles\projectile\subtypes\explosive.dm" +#include "code\modules\projectiles\projectile\subtypes\force.dm" +#include "code\modules\projectiles\projectile\subtypes\hook.dm" +#include "code\modules\projectiles\projectile\subtypes\magic.dm" +#include "code\modules\projectiles\projectile\subtypes\magnetic.dm" +#include "code\modules\projectiles\projectile\subtypes\pellet.dm" +#include "code\modules\projectiles\projectile\subtypes\reusable.dm" +#include "code\modules\projectiles\projectile\subtypes\scatter.dm" +#include "code\modules\projectiles\projectile\subtypes\special.dm" +#include "code\modules\projectiles\projectile\subtypes\trace.dm" +#include "code\modules\projectiles\projectile\subtypes\beam\beams.dm" +#include "code\modules\projectiles\projectile\subtypes\beam\beams_vr.dm" +#include "code\modules\projectiles\projectile\subtypes\beam\blaster.dm" #include "code\modules\projectiles\targeting\targeting_client.dm" #include "code\modules\projectiles\targeting\targeting_gun.dm" #include "code\modules\projectiles\targeting\targeting_mob.dm" @@ -4556,10 +4624,6 @@ #include "code\modules\reagents\reagent_containers\syringes_vr.dm" #include "code\modules\reagents\reagent_containers\unidentified_hypospray.dm" #include "code\modules\reagents\reagent_containers\glass\bottle_vr.dm" -#include "code\modules\recycling\conveyor2.dm" -#include "code\modules\recycling\disposal-construction.dm" -#include "code\modules\recycling\disposal.dm" -#include "code\modules\recycling\sortingmachinery.dm" #include "code\modules\research\design.dm" #include "code\modules\research\research.dm" #include "code\modules\research\designs\ai_holders.dm" @@ -4629,7 +4693,6 @@ #include "code\modules\sculpting\sculpting_block.dm" #include "code\modules\security levels\keycard authentication.dm" #include "code\modules\security levels\security levels.dm" -#include "code\modules\shieldgen\directional_shield.dm" #include "code\modules\shieldgen\emergency_shield.dm" #include "code\modules\shieldgen\energy_field.dm" #include "code\modules\shieldgen\energy_shield.dm" diff --git a/code/game/objects/items-interaction.dm b/code/game/objects/items-interaction.dm index a1b37b7c17c2..8088437b4f1b 100644 --- a/code/game/objects/items-interaction.dm +++ b/code/game/objects/items-interaction.dm @@ -49,16 +49,17 @@ user.action_feedback(SPAN_WARNING("You can't do that right now."), src) return - // todo: rewrite this part iin hand rewrite if (hasorgans(user)) var/mob/living/carbon/human/H = user - var/obj/item/organ/external/temp = H.organs_by_name[H.hand? "l_hand" : "r_hand"] + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] + if (H.active_hand % 2) + temp = H.organs_by_name["l_hand"] + if(temp && !temp.is_usable()) + to_chat(user, "You try to move your [temp.name], but cannot!") + return if(!temp) to_chat(user, "You try to use your hand, but realize it is no longer attached!") return - if(!temp.is_usable()) - to_chat(user, "You try to move your [temp.name], but cannot!") - return var/old_loc = src.loc var/obj/item/actually_picked_up = src From d7862e4c051525f1ff20653d563c5b9815344f6c Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 8 Sep 2024 20:58:00 -0400 Subject: [PATCH 067/140] That --- citadel.dme | 3 --- 1 file changed, 3 deletions(-) diff --git a/citadel.dme b/citadel.dme index 4b43ec51d7f2..038b04c02b5a 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3517,10 +3517,7 @@ #include "code\modules\mob\health.dm" #include "code\modules\mob\hear_say.dm" #include "code\modules\mob\holder.dm" -#include "code\modules\mob\inventory.dm" #include "code\modules\mob\life.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\logout.dm" #include "code\modules\mob\mob-damage.dm" #include "code\modules\mob\mob-defense.dm" #include "code\modules\mob\mob-keybind-triggers.dm" From b33074ede898ef91daa9e7919f63324e6ef92e5c Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 15 Sep 2024 14:02:34 -0400 Subject: [PATCH 068/140] that --- code/game/content/factions/orion/iwl/guns.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/content/factions/orion/iwl/guns.dm b/code/game/content/factions/orion/iwl/guns.dm index 046d1c9f3b50..4b8531d49350 100644 --- a/code/game/content/factions/orion/iwl/guns.dm +++ b/code/game/content/factions/orion/iwl/guns.dm @@ -19,7 +19,7 @@ /obj/item/gun/ballistic/automatic/k25/update_icon() . = ..() - update_held_icon() + update_worn_icon() /obj/item/gun/ballistic/automatic/k25/update_icon_state() . = ..() From 046d938ebe82102a7f98a1db434edca25b5a60c9 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 16 Sep 2024 17:45:43 +0000 Subject: [PATCH 069/140] fix --- code/modules/mob/inventory/mob/public.dm | 4 ++-- code/modules/mob/living/carbon/human/rendering.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/inventory/mob/public.dm b/code/modules/mob/inventory/mob/public.dm index f938d4efbd03..3cdd3f214d2f 100644 --- a/code/modules/mob/inventory/mob/public.dm +++ b/code/modules/mob/inventory/mob/public.dm @@ -365,8 +365,8 @@ // so this is just a wrapper to route stuff around while we slowly refactor inventory. /datum/inventory/proc/drop_item_to_ground(obj/item/I, inv_op_flags, datum/event_args/actor/actor) if(!actor) - actor = WRAP_MOB_TO_ACTOR_EVENT_ARGS(actor || src) - return mob.drop_item_to_ground(I, inv_op_flags, actor?.performer) + actor = E_ARGS_WRAP_USER_TO_ACTOR(actor || src) + return owner.drop_item_to_ground(I, inv_op_flags, actor?.performer) /** * drops an item to ground diff --git a/code/modules/mob/living/carbon/human/rendering.dm b/code/modules/mob/living/carbon/human/rendering.dm index 91d9a1a1a96d..6a91b1a1e883 100644 --- a/code/modules/mob/living/carbon/human/rendering.dm +++ b/code/modules/mob/living/carbon/human/rendering.dm @@ -844,10 +844,10 @@ inventory.update_slot_render(SLOT_ID_LEGCUFFED) /mob/living/carbon/human/update_inv_hand(index) - if(isnull(held_items[index])) + if(isnull(inventory.held_items[index])) remove_standing_overlay(HUMAN_OVERLAY_HAND(index)) return set_standing_overlay( HUMAN_OVERLAY_HAND(index), - held_items[index].render_mob_appearance(src, index, BODYTYPE_DEFAULT), + inventory.held_items[index].render_mob_appearance(src, index, BODYTYPE_DEFAULT), ) From 6002a482cdc21b5163311a390e6c8df4579da490 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:14:42 +0000 Subject: [PATCH 070/140] that --- code/game/rendering/mob_huds/mob_hud.dm | 2 +- code/game/rendering/screen.dm | 10 ++++++++++ code/modules/mob/inventory_legacy.dm | 8 -------- code/modules/projectiles/guns/projectile/automatic.dm | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/code/game/rendering/mob_huds/mob_hud.dm b/code/game/rendering/mob_huds/mob_hud.dm index 5f5caebb9f1c..7d1011d67db8 100644 --- a/code/game/rendering/mob_huds/mob_hud.dm +++ b/code/game/rendering/mob_huds/mob_hud.dm @@ -11,7 +11,7 @@ * * "but this is so low level it's hard to use for remote control"; that's what later on /datum/remote_control is for! * * mob_hud does not track screens/images unlike perspective! these are mostly stateless as they're externally synchronized. */ -/datum/mob_hud +/datum/mob_hud# /// mob we're for (aka rendering the state of) var/mob/owner /// users using us diff --git a/code/game/rendering/screen.dm b/code/game/rendering/screen.dm index a5fd71fbb19c..2a9d3c93913f 100644 --- a/code/game/rendering/screen.dm +++ b/code/game/rendering/screen.dm @@ -16,3 +16,13 @@ /atom/movable/screen/Destroy() master = null return ..() + +//* Default Click Handling *// + +/atom/movable/screen/proc/on_click(mob/user, list/params) + +/atom/movable/screen/proc/on_doubleclick(mob/user, list/params) + +/atom/movable/screen + +#warn impl all diff --git a/code/modules/mob/inventory_legacy.dm b/code/modules/mob/inventory_legacy.dm index aa191330a34b..d616c11b785b 100644 --- a/code/modules/mob/inventory_legacy.dm +++ b/code/modules/mob/inventory_legacy.dm @@ -37,11 +37,3 @@ // todo: actual flag like BUCKLING_IS_CONSIDERED_RESTRICTING or something if(buckled?.buckle_flags & (BUCKLING_NO_DEFAULT_RESIST | BUCKLING_NO_DEFAULT_UNBUCKLE)) unbuckle(BUCKLE_OP_FORCE) - -//* Carry Weight - -/mob/proc/update_carry_slowdown() - return - -/mob/proc/update_item_slowdown() - return diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 30b1403d6dbc..f68401f7d47f 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -786,4 +786,4 @@ /obj/item/gun/ballistic/automatic/lmg/foam/update_icon() . = ..() - update_held_icon() + update_worn_icon() From ae86a7ddcd5969c60e28f7907f624d1134e191a9 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:20:10 +0000 Subject: [PATCH 071/140] conflcit resolve --- code/game/objects/items/devices/PDA/PDA.dm | 8 -------- code/game/objects/items/devices/binoculars.dm | 4 ---- .../devices/communicator/communicator.dm | 4 ---- code/game/objects/items/devices/gps.dm | 4 ---- .../game/objects/items/devices/holowarrant.dm | 4 ---- .../objects/items/devices/lightreplacer.dm | 4 ---- .../objects/items/devices/pipe_painter.dm | 4 ---- .../objects/items/devices/radio/beacon.dm | 4 ---- .../items/devices/radio/electropack.dm | 4 ---- .../objects/items/devices/radio/jammer.dm | 4 ---- .../game/objects/items/devices/radio/radio.dm | 4 ---- .../game/objects/items/devices/scanners_vr.dm | 4 ---- code/game/objects/items/devices/spy_bug.dm | 8 -------- .../devices/tape_recorder/cassette_tape.dm | 4 ---- .../devices/tape_recorder/tape_recorder.dm | 4 ---- .../objects/items/devices/taperecorder.dm | 8 -------- code/game/objects/items/devices/uplink.dm | 8 -------- code/game/objects/items/devices/whistle.dm | 4 ---- code/game/objects/items/id_cards/cards.dm | 4 ---- code/game/objects/items/id_cards/guest.dm | 4 ---- .../objects/items/id_cards/station_ids.dm | 4 ---- .../objects/items/id_cards/syndicate_ids.dm | 4 ---- code/game/objects/items/melee/types/misc.dm | 16 --------------- code/game/objects/items/robot/gripper.dm | 8 -------- .../objects/items/robot/robot_upgrades.dm | 4 ---- code/game/objects/items/scanners/atmos.dm | 4 ---- code/game/objects/items/scanners/biology.dm | 4 ---- code/game/objects/items/scanners/plant.dm | 4 ---- .../objects/items/scanners/spectrometer.dm | 4 ---- .../shield_projector/shield_projector.dm | 8 -------- .../objects/items/stacks/marker_beacons.dm | 4 ---- .../game/objects/items/stacks/sheets/glass.dm | 4 ---- code/game/objects/items/stacks/telecrystal.dm | 4 ---- code/game/objects/items/storage/boxes.dm | 4 ---- .../objects/items/storage/misc_legacy/misc.dm | 4 ---- .../items/storage/misc_legacy/trinket_box.dm | 4 ---- code/game/objects/items/storage/secure.dm | 4 ---- code/game/objects/items/tools/crowbar.dm | 4 ---- code/game/objects/items/tools/screwdriver.dm | 4 ---- code/game/objects/items/tools/switchtool.dm | 4 ---- code/game/objects/items/tools/weldingtool.dm | 8 -------- code/game/objects/items/tools/wirecutters.dm | 4 ---- code/game/objects/items/tools/wrench.dm | 4 ---- code/game/objects/items/weapons/AI_modules.dm | 20 ------------------- code/game/objects/items/weapons/RCD.dm | 8 -------- code/game/objects/items/weapons/RPD.dm | 4 ---- code/game/objects/items/weapons/RSF.dm | 4 ---- .../objects/items/weapons/barrier_tape.dm | 4 ---- code/game/objects/items/weapons/candle.dm | 4 ---- .../objects/items/weapons/cigs_lighters.dm | 12 ----------- code/game/objects/items/weapons/cosmetics.dm | 12 ----------- code/game/objects/items/weapons/duct_tape.dm | 8 -------- code/game/objects/items/weapons/explosives.dm | 4 ---- .../objects/items/weapons/extinguisher.dm | 4 ---- .../objects/items/weapons/flamethrower.dm | 4 ---- .../objects/items/weapons/gift_wrappaper.dm | 16 --------------- .../objects/items/weapons/grenades/grenade.dm | 4 ---- .../items/weapons/implants/implantcircuits.dm | 4 ---- .../items/weapons/implants/implanter.dm | 4 ---- .../items/weapons/implants/implantpad.dm | 4 ---- .../items/weapons/material/chainsaw.dm | 4 ---- .../items/weapons/material/gravemarker.dm | 4 ---- .../objects/items/weapons/material/knives.dm | 4 ---- .../objects/items/weapons/material/misc.dm | 4 ---- code/game/objects/items/weapons/mop.dm | 4 ---- code/game/objects/items/weapons/mop_deploy.dm | 4 ---- code/game/objects/items/weapons/nullrod.dm | 8 -------- code/game/objects/items/weapons/other.dm | 8 -------- code/game/objects/items/weapons/scrolls.dm | 4 ---- code/game/objects/items/weapons/stunbaton.dm | 4 ---- .../objects/items/weapons/swords_axes_etc.dm | 8 -------- code/game/objects/items/weapons/syndie.dm | 4 ---- code/game/objects/items/weapons/tanks/tank.dm | 4 ---- .../objects/items/weapons/teleportation.dm | 8 -------- code/game/objects/items/weapons/towels.dm | 4 ---- code/game/objects/items/weapons/traps.dm | 4 ---- 76 files changed, 412 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 6857c717917a..f75e992a18f8 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -322,11 +322,7 @@ GLOBAL_LIST_EMPTY(PDAs) return 1 -<<<<<<< HEAD -/obj/item/pda/ai/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/pda/ai/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -678,11 +674,7 @@ GLOBAL_LIST_EMPTY(PDAs) ui.set_auto_update(auto_update) //NOTE: graphic resources are loaded on client login -<<<<<<< HEAD -/obj/item/pda/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/pda/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index bd4786c6efc9..6ea610cda9ae 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -12,11 +12,7 @@ //materials_base = list("metal" = 50, MAT_GLASS = 50) -<<<<<<< HEAD -/obj/item/binoculars/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/binoculars/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 877009c041ac..c6c4e87324f4 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -218,11 +218,7 @@ var/global/list/obj/item/communicator/all_communicators = list() // Parameters: 1 (user - the mob that clicked the device in their hand) // Description: Makes an exonet datum if one does not exist, allocates an address for it, maintains the lists of all devies, clears the alert icon, and // finally makes NanoUI appear. -<<<<<<< HEAD -/obj/item/communicator/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/communicator/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 328fae705b45..bcc0961b5634 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -162,11 +162,7 @@ update_icon() visible_message(SPAN_WARNING("[src] clicks, resetting itself from the electromagnetic interference.")) -<<<<<<< HEAD -/obj/item/gps/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/gps/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm index de316920a113..38c380ca2101 100644 --- a/code/game/objects/items/devices/holowarrant.dm +++ b/code/game/objects/items/devices/holowarrant.dm @@ -22,11 +22,7 @@ to_chat(user, "You have to go closer if you want to read it.") //hit yourself with it -<<<<<<< HEAD -/obj/item/holowarrant/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/holowarrant/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index f61791e67d07..d5a4b9f7d73f 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -135,11 +135,7 @@ return -<<<<<<< HEAD -/obj/item/lightreplacer/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/lightreplacer/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 6fb207675d0b..43199a3c2215 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -22,11 +22,7 @@ P.change_color(pipe_colors[mode]) -<<<<<<< HEAD -/obj/item/pipe_painter/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/pipe_painter/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 97be452b606c..8ad2c75ccaeb 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -82,11 +82,7 @@ GLOBAL_LIST_BOILERPLATE(all_beacons, /obj/item/radio/beacon) desc = "A label on it reads: Activate to have a singularity beacon teleported to your location." origin_tech = list(TECH_BLUESPACE = 1, TECH_ILLEGAL = 7) -<<<<<<< HEAD -/obj/item/radio/beacon/syndicate/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/radio/beacon/syndicate/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 6e60b42a0034..2295f2860899 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -104,11 +104,7 @@ master.receive_signal() return -<<<<<<< HEAD -/obj/item/radio/electropack/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/radio/electropack/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master if(!istype(user, /mob/living/carbon/human)) return diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index 044fa4a8548c..825855051c91 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -78,11 +78,7 @@ var/global/list/active_radio_jammers = list() else return ..() -<<<<<<< HEAD -/obj/item/radio_jammer/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/radio_jammer/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 662b3b094d60..80edb5c6d700 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -138,11 +138,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list( radio_controller.remove_object(src, radiochannels[ch_name]) return ..() -<<<<<<< HEAD -/obj/item/radio/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/radio/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/scanners_vr.dm b/code/game/objects/items/devices/scanners_vr.dm index 01c1b9be2bd8..30e29279ffac 100644 --- a/code/game/objects/items/devices/scanners_vr.dm +++ b/code/game/objects/items/devices/scanners_vr.dm @@ -23,11 +23,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob scan_mob(target, user) to_chat(user,"Not a compatible subject to work with!") -<<<<<<< HEAD -/obj/item/sleevemate/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/sleevemate/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index 00c2c8602ca9..30ba2d443d84 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -20,11 +20,7 @@ . = ..() camera = new camtype(src) -<<<<<<< HEAD -/obj/item/camerabug/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/camerabug/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -142,11 +138,7 @@ var/obj/machinery/camera/bug/selected_camera var/list/obj/machinery/camera/bug/cameras = new() -<<<<<<< HEAD -/obj/item/bug_monitor/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/bug_monitor/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/tape_recorder/cassette_tape.dm b/code/game/objects/items/devices/tape_recorder/cassette_tape.dm index 902feadf75d1..1331c19b65e3 100644 --- a/code/game/objects/items/devices/tape_recorder/cassette_tape.dm +++ b/code/game/objects/items/devices/tape_recorder/cassette_tape.dm @@ -97,11 +97,7 @@ /obj/item/cassette_tape/fire_act() ruin() -<<<<<<< HEAD -/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/cassette_tape/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm index 13a3acc6291f..9daff09407b4 100644 --- a/code/game/objects/items/devices/tape_recorder/tape_recorder.dm +++ b/code/game/objects/items/devices/tape_recorder/tape_recorder.dm @@ -441,11 +441,7 @@ /obj/item/tape_recorder/proc/print_cooldown() TIMER_COOLDOWN_START(src, CD_INDEX_TAPE_PRINT, 30 SECONDS) -<<<<<<< HEAD -/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/tape_recorder/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index ef680a26fb34..fc7594ff2b8c 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -341,11 +341,7 @@ canprint = 1 -<<<<<<< HEAD -/obj/item/tape_recorder/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/tape_recorder/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -393,11 +389,7 @@ /obj/item/cassette_tape/fire_act() ruin() -<<<<<<< HEAD -/obj/item/cassette_tape/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/cassette_tape/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index 10a67c753bea..c4a3b6e238dc 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -224,11 +224,7 @@ hidden_uplink = new(src, target_mind, telecrystals) icon_state = "radio" -<<<<<<< HEAD -/obj/item/radio/uplink/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/radio/uplink/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -239,11 +235,7 @@ . = ..() hidden_uplink = new(src) -<<<<<<< HEAD -/obj/item/multitool/uplink/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/multitool/uplink/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index d4086ccc5d05..cc6c196f6665 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -28,11 +28,7 @@ to_chat(usr, "You configure the hailer to shout \"[use_message]\".") -<<<<<<< HEAD -/obj/item/hailer/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/hailer/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/id_cards/cards.dm b/code/game/objects/items/id_cards/cards.dm index 6b97c69eb220..4af12a1cc5cc 100644 --- a/code/game/objects/items/id_cards/cards.dm +++ b/code/game/objects/items/id_cards/cards.dm @@ -117,11 +117,7 @@ if(I) icon = I -<<<<<<< HEAD -/obj/item/card_fluff/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/card_fluff/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master var/choice = tgui_input_list(usr, "What element would you like to customize?", "Customize Card", list("Band","Stamp","Reset")) if(!choice) return diff --git a/code/game/objects/items/id_cards/guest.dm b/code/game/objects/items/id_cards/guest.dm index 917ed0df4d12..1a9112850fa3 100644 --- a/code/game/objects/items/id_cards/guest.dm +++ b/code/game/objects/items/id_cards/guest.dm @@ -65,11 +65,7 @@ . += SPAN_NOTICE("Issuer name: [giver_name]") . += SPAN_NOTICE("Issuer rank: [giver_rank]") -<<<<<<< HEAD -/obj/item/card/id/guest/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/card/id/guest/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/id_cards/station_ids.dm b/code/game/objects/items/id_cards/station_ids.dm index 735f10f01499..df5ef7a9e202 100644 --- a/code/game/objects/items/id_cards/station_ids.dm +++ b/code/game/objects/items/id_cards/station_ids.dm @@ -182,11 +182,7 @@ dat += "The confidential information flap is closed." return dat -<<<<<<< HEAD -/obj/item/card/id/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/card/id/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/id_cards/syndicate_ids.dm b/code/game/objects/items/id_cards/syndicate_ids.dm index 3a677526bd70..a5ebf6d4076d 100644 --- a/code/game/objects/items/id_cards/syndicate_ids.dm +++ b/code/game/objects/items/id_cards/syndicate_ids.dm @@ -29,11 +29,7 @@ if(player_is_antag(user.mind)) to_chat(user, "The microscanner activates as you pass it over the ID, copying its access.") -<<<<<<< HEAD -/obj/item/card/id/syndicate/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/card/id/syndicate/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/melee/types/misc.dm b/code/game/objects/items/melee/types/misc.dm index 29fcacb1f523..b0f24dc66eac 100644 --- a/code/game/objects/items/melee/types/misc.dm +++ b/code/game/objects/items/melee/types/misc.dm @@ -31,11 +31,7 @@ . = ..() update_icon() -<<<<<<< HEAD -/obj/item/melee/umbrella/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/melee/umbrella/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -247,11 +243,7 @@ if(SA_vulnerability & tm.mob_class) tm.apply_damage(SA_bonus_damage) // fuck em -<<<<<<< HEAD -/obj/item/melee/ashlander/elder/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/melee/ashlander/elder/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -328,11 +320,7 @@ parry_chance_melee = 15; } -<<<<<<< HEAD -/obj/item/melee/twohanded/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/melee/twohanded/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -466,11 +454,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 50, 1) -<<<<<<< HEAD -/obj/item/melee/thermalcutter/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/melee/thermalcutter/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/robot/gripper.dm b/code/game/objects/items/robot/gripper.dm index f4aec480e8f2..e447ad819192 100644 --- a/code/game/objects/items/robot/gripper.dm +++ b/code/game/objects/items/robot/gripper.dm @@ -74,11 +74,7 @@ /obj/item/gripper/CtrlClick(mob/user) drop_item() -<<<<<<< HEAD -/obj/item/gripper/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/gripper/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -317,11 +313,7 @@ /obj/item/gripper/no_use //Used when you want to hold and put items in other things, but not able to 'use' the item -<<<<<<< HEAD -/obj/item/gripper/no_use/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/gripper/no_use/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master return /obj/item/gripper/no_use/organ/robotics diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index e68a998e05b3..8e0ef0137cc4 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -39,11 +39,7 @@ item_state = "cyborg_upgrade" var/heldname = "default name" -<<<<<<< HEAD -/obj/item/borg/upgrade/rename/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/borg/upgrade/rename/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/scanners/atmos.dm b/code/game/objects/items/scanners/atmos.dm index 76dc4a79f8ab..1d048969ca7a 100644 --- a/code/game/objects/items/scanners/atmos.dm +++ b/code/game/objects/items/scanners/atmos.dm @@ -38,11 +38,7 @@ return atmosanalyzer_scan(src, air, user) -<<<<<<< HEAD -/obj/item/atmos_analyzer/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/atmos_analyzer/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/scanners/biology.dm b/code/game/objects/items/scanners/biology.dm index 38d49038988f..6cdcd64f9eda 100644 --- a/code/game/objects/items/scanners/biology.dm +++ b/code/game/objects/items/scanners/biology.dm @@ -31,11 +31,7 @@ user.visible_message("\The [src] spits out a piece of paper.") return -<<<<<<< HEAD -/obj/item/biology_analyzer/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/biology_analyzer/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/scanners/plant.dm b/code/game/objects/items/scanners/plant.dm index 6f3cedecf36a..be29c14defaa 100644 --- a/code/game/objects/items/scanners/plant.dm +++ b/code/game/objects/items/scanners/plant.dm @@ -6,11 +6,7 @@ var/datum/seed/last_seed var/list/last_reagents -<<<<<<< HEAD -/obj/item/plant_analyzer/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/plant_analyzer/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/scanners/spectrometer.dm b/code/game/objects/items/scanners/spectrometer.dm index 6e6d25903fcf..67e498b7d00a 100644 --- a/code/game/objects/items/scanners/spectrometer.dm +++ b/code/game/objects/items/scanners/spectrometer.dm @@ -28,11 +28,7 @@ else icon_state = initial(icon_state) -<<<<<<< HEAD -/obj/item/mass_spectrometer/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/mass_spectrometer/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/shield_projector/shield_projector.dm b/code/game/objects/items/shield_projector/shield_projector.dm index fc0728246744..8ff51ae82244 100644 --- a/code/game/objects/items/shield_projector/shield_projector.dm +++ b/code/game/objects/items/shield_projector/shield_projector.dm @@ -128,11 +128,7 @@ for(var/obj/effect/directional_shield/S in active_shields) S.update_color(new_color) -<<<<<<< HEAD -/obj/item/shield_projector/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/shield_projector/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master if(active) if(always_on) to_chat(user, "You can't seem to deactivate \the [src].") @@ -324,11 +320,7 @@ else my_tool.set_ready_state(1) -<<<<<<< HEAD -/obj/item/shield_projector/line/exosuit/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/shield_projector/line/exosuit/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master if(active) if(always_on) to_chat(user, "You can't seem to deactivate \the [src].") diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm index d45bb58f5f6f..7c8297d4bd16 100644 --- a/code/game/objects/items/stacks/marker_beacons.dm +++ b/code/game/objects/items/stacks/marker_beacons.dm @@ -50,11 +50,7 @@ var/list/marker_beacon_colors = list( /obj/item/stack/marker_beacon/update_icon() icon_state = "[initial(icon_state)][lowertext(picked_color)]" -<<<<<<< HEAD -/obj/item/stack/marker_beacon/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/stack/marker_beacon/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 213514aa5aa7..a14290c8481a 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -19,11 +19,7 @@ pickup_sound = 'sound/items/pickup/glass.ogg' var/is_reinforced = 0 -<<<<<<< HEAD -/obj/item/stack/material/glass/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/stack/material/glass/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 94bf3b217715..3331b0c32612 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -23,11 +23,7 @@ to_chat(user, "There are not enough telecrystals to do that.") return NONE -<<<<<<< HEAD -/obj/item/stack/telecrystal/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/stack/telecrystal/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 7ea0060d1554..415d4afd861c 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -43,11 +43,7 @@ // todo: implement dynamic state, like how /tg/ boxes work // BubbleWrap - A box can be folded up to make card -<<<<<<< HEAD -/obj/item/storage/box/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/storage/box/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/storage/misc_legacy/misc.dm b/code/game/objects/items/storage/misc_legacy/misc.dm index d2edad959da0..99370e2814e2 100644 --- a/code/game/objects/items/storage/misc_legacy/misc.dm +++ b/code/game/objects/items/storage/misc_legacy/misc.dm @@ -98,11 +98,7 @@ ) starts_with = list(/obj/item/pen/crayon/chalk, /obj/item/reagent_containers/pill/nutriment, /obj/item/gps/survival) -<<<<<<< HEAD -/obj/item/storage/box/survival_knife/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/storage/box/survival_knife/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master return /obj/item/storage/box/papersack diff --git a/code/game/objects/items/storage/misc_legacy/trinket_box.dm b/code/game/objects/items/storage/misc_legacy/trinket_box.dm index c68e0ebf4c79..ba2c70fc545a 100644 --- a/code/game/objects/items/storage/misc_legacy/trinket_box.dm +++ b/code/game/objects/items/storage/misc_legacy/trinket_box.dm @@ -41,11 +41,7 @@ closed_state = "[initial(icon_state)]" . = ..() -<<<<<<< HEAD -/obj/item/storage/trinketbox/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/storage/trinketbox/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index b8a4fdcc0ea7..9e35c4de22dd 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -70,11 +70,7 @@ ..() -<<<<<<< HEAD -/obj/item/storage/secure/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/storage/secure/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 8c9384336752..de6a99a89e2f 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -131,11 +131,7 @@ QDEL_NULL(counterpart) return ..() -<<<<<<< HEAD -/obj/item/tool/crowbar/power/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/tool/crowbar/power/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 0347e8feb6d6..c7f61df2ad71 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -186,11 +186,7 @@ QDEL_NULL(counterpart) return ..() -<<<<<<< HEAD -/obj/item/tool/screwdriver/power/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/tool/screwdriver/power/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/tools/switchtool.dm b/code/game/objects/items/tools/switchtool.dm index 22298e377db3..d2f4da5bdcf5 100644 --- a/code/game/objects/items/tools/switchtool.dm +++ b/code/game/objects/items/tools/switchtool.dm @@ -104,11 +104,7 @@ module_string += "\a [module.name], " return module_string -<<<<<<< HEAD -/obj/item/switchtool/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/switchtool/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index e8575b53d8c5..00212a752320 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -151,11 +151,7 @@ if (istype(location, /turf)) location.hotspot_expose(700, 50, 1) -<<<<<<< HEAD -/obj/item/weldingtool/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/weldingtool/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -751,11 +747,7 @@ item_state = welding ? "crystal_tool_lit" : "crystal_tool" update_worn_icon() -<<<<<<< HEAD -/obj/item/weldingtool/electric/crystal/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/weldingtool/electric/crystal/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master var/mob/living/carbon/human/H = user if(!istype(H)) return diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index bf1bd8d27956..ec1372da2c0c 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -160,11 +160,7 @@ QDEL_NULL(counterpart) return ..() -<<<<<<< HEAD -/obj/item/tool/wirecutters/power/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/tool/wirecutters/power/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index f1f58da40f40..ef7d51c1523d 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -165,11 +165,7 @@ QDEL_NULL(counterpart) return ..() -<<<<<<< HEAD -/obj/item/tool/wrench/power/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/tool/wrench/power/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index e20d1f796ce0..3515d06af458 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -130,11 +130,7 @@ AI MODULES desc = "A 'safeguard' AI module: 'Safeguard . Anyone threatening or attempting to harm is no longer to be considered a crew member, and is a threat which must be neutralized.'" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) -<<<<<<< HEAD -/obj/item/aiModule/safeguard/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/aiModule/safeguard/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -163,11 +159,7 @@ AI MODULES desc = "A 'one crew member' AI module: 'Only is a crew member.'" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) //made with diamonds! -<<<<<<< HEAD -/obj/item/aiModule/oneHuman/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/aiModule/oneHuman/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -251,11 +243,7 @@ AI MODULES desc = "A 'freeform' AI module: ''" origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) -<<<<<<< HEAD -/obj/item/aiModule/freeform/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/aiModule/freeform/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -374,11 +362,7 @@ AI MODULES desc = "A 'freeform' Core AI module: ''" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) -<<<<<<< HEAD -/obj/item/aiModule/freeformcore/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/aiModule/freeformcore/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -405,11 +389,7 @@ AI MODULES desc = "A hacked AI law module: ''" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6, TECH_ILLEGAL = 7) -<<<<<<< HEAD -/obj/item/aiModule/syndicate/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/aiModule/syndicate/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 91bd343600ca..6c997dd8d9f3 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -103,11 +103,7 @@ return TRUE // Changes which mode it is on. -<<<<<<< HEAD -/obj/item/rcd/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/rcd/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -367,11 +363,7 @@ /obj/item/rcd/electric/mounted/hardsuit // Old method for swapping modes as there is no way to bring up the radial. -<<<<<<< HEAD -/obj/item/rcd/electric/mounted/hardsuit/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/rcd/electric/mounted/hardsuit/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index d7e7cc8330a0..7a2e15436c21 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -106,11 +106,7 @@ // UnregisterSignal(user, COMSIG_MOUSE_SCROLL_ON) // return ..() -<<<<<<< HEAD -/obj/item/pipe_dispenser/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/pipe_dispenser/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index df549c968c27..5d0ba68d4d5b 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -62,11 +62,7 @@ RSF else glasstype = /obj/item/reagent_containers/food/drinks/metaglass -<<<<<<< HEAD -/obj/item/rsf/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/rsf/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/barrier_tape.dm b/code/game/objects/items/weapons/barrier_tape.dm index a4742c7eae10..c12379f28bec 100644 --- a/code/game/objects/items/weapons/barrier_tape.dm +++ b/code/game/objects/items/weapons/barrier_tape.dm @@ -137,11 +137,7 @@ var/list/tape_roll_applications = list() update_icon() return ..() -<<<<<<< HEAD -/obj/item/barrier_tape_roll/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/barrier_tape_roll/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index 7d9e3247ab3c..733e0cac1d0c 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -61,11 +61,7 @@ var/turf/T = loc T.hotspot_expose(700, 5) -<<<<<<< HEAD -/obj/item/flame/candle/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/flame/candle/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 5c1c229fd9f0..0db98e3d0aa2 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -305,11 +305,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM else to_chat(user, "[src] is full.") -<<<<<<< HEAD -/obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master if(lit == 1) if(user.a_intent == INTENT_HARM) user.visible_message("[user] drops and treads on the lit [src], putting it out instantly.") @@ -449,11 +445,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM . = ..() name = "empty [initial(name)]" -<<<<<<< HEAD -/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/clothing/mask/smokable/pipe/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master if(lit == 1) if(user.a_intent == INTENT_HARM) user.visible_message("[user] empties the lit [src] on the floor!.") @@ -608,11 +600,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM item_state = icon_state base_state = icon_state -<<<<<<< HEAD -/obj/item/flame/lighter/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/flame/lighter/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master if(!base_state) base_state = icon_state if(!lit) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 042184bf5ea5..5e51f09d4afc 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -56,11 +56,7 @@ colour = pick("red","orange","yellow","jade","cyan","purple","pink","maroon","black","white") name = "[colour] lipstick" -<<<<<<< HEAD -/obj/item/lipstick/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/lipstick/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -106,11 +102,7 @@ icon = 'icons/obj/items.dmi' icon_state = "purplecomb" -<<<<<<< HEAD -/obj/item/haircomb/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/haircomb/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -138,11 +130,7 @@ icon_state = "trinketbox" var/list/ui_users = list() -<<<<<<< HEAD -/obj/item/makeover/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/makeover/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/duct_tape.dm b/code/game/objects/items/weapons/duct_tape.dm index 0f55d70390b6..fd572daf27fc 100644 --- a/code/game/objects/items/weapons/duct_tape.dm +++ b/code/game/objects/items/weapons/duct_tape.dm @@ -129,11 +129,7 @@ return return ..() -<<<<<<< HEAD -/obj/item/duct_tape_roll/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/duct_tape_roll/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -184,11 +180,7 @@ name = W.name + " (taped)" copy_overlays(W) -<<<<<<< HEAD -/obj/item/duct_tape_piece/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/duct_tape_piece/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 9c8f7fe243a9..1c1824e45e72 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -38,11 +38,7 @@ else ..() -<<<<<<< HEAD -/obj/item/plastique/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/plastique/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index eb9d16d2235f..4528c7c68da4 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -49,11 +49,7 @@ . = ..() . += "[icon2html(thing = src, target = user)] [src.name] contains [src.reagents.total_volume] units of water left!" -<<<<<<< HEAD -/obj/item/extinguisher/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/extinguisher/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 008cfd409afc..0c217e9792ec 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -123,11 +123,7 @@ return -<<<<<<< HEAD -/obj/item/flamethrower/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/flamethrower/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index a516b7ece322..ee4fc74d13f4 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -40,11 +40,7 @@ if(!isnull(gift)) . += gift -<<<<<<< HEAD -/obj/item/gift/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/gift/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -78,11 +74,7 @@ qdel(src) -<<<<<<< HEAD -/obj/item/a_gift/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/a_gift/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -151,11 +143,7 @@ pixel_x = rand(-10,10) pixel_y = rand(-10,10) -<<<<<<< HEAD -/obj/item/gift/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/gift/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -170,11 +158,7 @@ /obj/item/b_gift/legacy_ex_act() qdel(src) -<<<<<<< HEAD -/obj/item/b_gift/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/b_gift/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index d9009a289476..838dc3ec7d37 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -53,11 +53,7 @@ . += "The [src] is set for instant detonation." -<<<<<<< HEAD -/obj/item/grenade/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/grenade/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implantcircuits.dm b/code/game/objects/items/weapons/implants/implantcircuits.dm index b6e47c5e17b4..237706185ddb 100644 --- a/code/game/objects/items/weapons/implants/implantcircuits.dm +++ b/code/game/objects/items/weapons/implants/implantcircuits.dm @@ -45,11 +45,7 @@ else ..() -<<<<<<< HEAD -/obj/item/implant/integrated_circuit/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/implant/integrated_circuit/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 56569771f6ca..4dd711d93aa2 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -10,11 +10,7 @@ var/obj/item/implant/imp = null var/active = 1 -<<<<<<< HEAD -/obj/item/implanter/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/implanter/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index 06cc09864876..75e54a6c8e15 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -48,11 +48,7 @@ return -<<<<<<< HEAD -/obj/item/implantpad/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/implantpad/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/chainsaw.dm b/code/game/objects/items/weapons/material/chainsaw.dm index fdd4a84933a7..2b005721eddd 100644 --- a/code/game/objects/items/weapons/material/chainsaw.dm +++ b/code/game/objects/items/weapons/material/chainsaw.dm @@ -56,11 +56,7 @@ on = 0 update_icon() -<<<<<<< HEAD -/obj/item/chainsaw/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/chainsaw/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/gravemarker.dm b/code/game/objects/items/weapons/material/gravemarker.dm index da6b52379269..cfdfb564dcbe 100644 --- a/code/game/objects/items/weapons/material/gravemarker.dm +++ b/code/game/objects/items/weapons/material/gravemarker.dm @@ -59,11 +59,7 @@ ..() -<<<<<<< HEAD -/obj/item/material/gravemarker/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/material/gravemarker/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 56f45f8cbaa2..a46f78a0cd73 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -52,11 +52,7 @@ icon_state = "boxcutter" material_significance = MATERIAL_SIGNIFICANCE_WEAPON_ULTRALIGHT -<<<<<<< HEAD -/obj/item/material/butterfly/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/material/butterfly/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 5310c5aba9a7..01aba5b96640 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -102,11 +102,7 @@ w_class = WEIGHT_CLASS_SMALL attack_verb = list("mushed", "splatted", "splooshed", "splushed") // Words that totally exist. -<<<<<<< HEAD -/obj/item/material/snow/snowball/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/material/snow/snowball/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 620b63ec6795..c1bac109bf6a 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -26,11 +26,7 @@ GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/mop) create_reagents(30) -<<<<<<< HEAD -/obj/item/mop/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/mop/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/mop_deploy.dm b/code/game/objects/items/weapons/mop_deploy.dm index 84926b58906a..3253c988f78b 100644 --- a/code/game/objects/items/weapons/mop_deploy.dm +++ b/code/game/objects/items/weapons/mop_deploy.dm @@ -52,11 +52,7 @@ STOP_PROCESSING(SSobj, src) . = ..() -<<<<<<< HEAD -/obj/item/mop_deploy/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/mop_deploy/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/nullrod.dm b/code/game/objects/items/weapons/nullrod.dm index bb0252dc5e77..d33b9491a612 100644 --- a/code/game/objects/items/weapons/nullrod.dm +++ b/code/game/objects/items/weapons/nullrod.dm @@ -40,11 +40,7 @@ if(SA_vulnerability & tm.mob_class) tm.apply_damage(SA_bonus_damage) // fuck em -<<<<<<< HEAD -/obj/item/nullrod/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/nullrod/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -356,11 +352,7 @@ attack_sound = 'sound/weapons/bite.ogg' var/used_blessing = FALSE -<<<<<<< HEAD -/obj/item/nullrod/carp/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/nullrod/carp/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/other.dm b/code/game/objects/items/weapons/other.dm index 553e214666d3..ec6784e465bd 100644 --- a/code/game/objects/items/weapons/other.dm +++ b/code/game/objects/items/weapons/other.dm @@ -61,11 +61,7 @@ temp_blade.set_active(TRUE) concealed_blade = temp_blade -<<<<<<< HEAD -/obj/item/cane/concealed/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/cane/concealed/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -135,11 +131,7 @@ damage_force = 3 var/on = 0 -<<<<<<< HEAD -/obj/item/cane/whitecane/collapsible/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/cane/whitecane/collapsible/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index d7d0097fec28..cc3c2553a41b 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -10,11 +10,7 @@ throw_range = 20 origin_tech = list(TECH_BLUESPACE = 4) -<<<<<<< HEAD -/obj/item/teleportation_scroll/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/teleportation_scroll/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 5dbbdcfbbae1..4a05db8d2370 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -112,11 +112,7 @@ else return ..() -<<<<<<< HEAD -/obj/item/melee/baton/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/melee/baton/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 3042ebe0678c..0bcae8137e9d 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -59,11 +59,7 @@ drop_sound = 'sound/items/drop/crowbar.ogg' pickup_sound = 'sound/items/pickup/crowbar.ogg' -<<<<<<< HEAD -/obj/item/melee/telebaton/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/melee/telebaton/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -197,11 +193,7 @@ damage_force = 0 attack_sound = "sound/items/bikehorn.ogg" -<<<<<<< HEAD -/obj/item/melee/stool/faiza/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/melee/stool/faiza/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index 8a00d7c9012b..cae61f0d7926 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -78,11 +78,7 @@ var/detonator_mode = 0 var/obj/item/syndie/c4explosive/bomb -<<<<<<< HEAD -/obj/item/flame/lighter/zippo/c4detonator/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/flame/lighter/zippo/c4detonator/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master if(!detonator_mode) ..() diff --git a/code/game/objects/items/weapons/tanks/tank.dm b/code/game/objects/items/weapons/tanks/tank.dm index 7a19a45a83bc..6e2c1b5a485e 100644 --- a/code/game/objects/items/weapons/tanks/tank.dm +++ b/code/game/objects/items/weapons/tanks/tank.dm @@ -220,11 +220,7 @@ var/list/global/tank_gauge_cache = list() -<<<<<<< HEAD -/obj/item/tank/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/tank/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index dd63ab11f2aa..c53a9b5df74a 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -23,11 +23,7 @@ origin_tech = list(TECH_MAGNET = 1) materials_base = list(MAT_STEEL = 400) -<<<<<<< HEAD -/obj/item/locator/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/locator/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return @@ -137,11 +133,7 @@ Frequency: materials_base = list(MAT_STEEL = 10000) preserve_item = 1 -<<<<<<< HEAD -/obj/item/hand_tele/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/hand_tele/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index 118969e3fb1b..687963a5b24d 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -23,11 +23,7 @@ if(SLOT_ID_BELT) sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/clothing/species/teshari/belt.dmi') -<<<<<<< HEAD -/obj/item/towel/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/towel/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index fa1ce0f8b5dd..e81e8964a74b 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -39,11 +39,7 @@ user.visible_message("[user] is putting the [src.name] on [T.his] head! It looks like [T.hes] trying to commit suicide.") return (BRUTELOSS) -<<<<<<< HEAD -/obj/item/beartrap/attack_self(mob/user, datum/event_args/actor/e_args) -======= /obj/item/beartrap/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master . = ..() if(.) return From 43c2a68fe20647fea61c0f092d5614f512639fe3 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:24:38 +0000 Subject: [PATCH 072/140] conflict resolve --- .../items/weapons/grenades/chem_grenade.dm | 6 +---- code/game/rendering/client.dm | 2 +- code/game/rendering/hud_style.dm | 2 +- code/game/rendering/mob.dm | 2 +- code/game/rendering/mob_huds/inventory.dm | 4 ++-- code/game/rendering/mob_huds/mob_hud.dm | 2 +- code/game/rendering/parallax/parallax.dm | 2 +- .../rendering/parallax/parallax_holder.dm | 2 +- .../rendering/parallax/parallax_object.dm | 2 +- code/game/rendering/perspectives/darksight.dm | 2 +- .../rendering/perspectives/perspective.dm | 2 +- code/game/rendering/perspectives/vision.dm | 2 +- code/game/rendering/screen.dm | 2 +- .../integrated_electronics/core/tools.dm | 8 +------ .../maps/overmap/space/talon/talon_jobs.dm | 24 ------------------- code/modules/projectiles/guns/ballistic.dm | 5 ---- 16 files changed, 15 insertions(+), 54 deletions(-) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index ca9b85bdc35e..0e620077d756 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -24,14 +24,10 @@ QDEL_LIST_NULL(beakers) return ..() -<<<<<<< HEAD -/obj/item/grenade/chem_grenade/attack_self(mob/user, datum/event_args/actor/e_args) +/obj/item/grenade/chem_grenade/attack_self(mob/user, datum/event_args/actor/actor) . = ..() if(.) return -======= -/obj/item/grenade/chem_grenade/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master if(!stage || stage==1) if(detonator) // detonator.loc=src.loc diff --git a/code/game/rendering/client.dm b/code/game/rendering/client.dm index 0c0992b6a33f..3d1e85194ce8 100644 --- a/code/game/rendering/client.dm +++ b/code/game/rendering/client.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// //? clickcatcher diff --git a/code/game/rendering/hud_style.dm b/code/game/rendering/hud_style.dm index 7f95f7ad93f5..78bed8304a1b 100644 --- a/code/game/rendering/hud_style.dm +++ b/code/game/rendering/hud_style.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) diff --git a/code/game/rendering/mob.dm b/code/game/rendering/mob.dm index 1bc15a4e5c34..a2b0c9a1f5ae 100644 --- a/code/game/rendering/mob.dm +++ b/code/game/rendering/mob.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// // todo: rendering handling/init/destruction should be on mob and client // mob side should handle mob state diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index b822c0c15b9c..12c47afded1e 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// /** * Inventory slots specifically, not hands. @@ -12,7 +12,7 @@ var/list/atom/movable/screen/inventory/slot/slot_by_id /// ordered hand objects var/list/atom/movable/inventory/hand/hands - + /// swap hand object var/atom/movable/inventory/swap_hand/swap_hand /// equip object diff --git a/code/game/rendering/mob_huds/mob_hud.dm b/code/game/rendering/mob_huds/mob_hud.dm index 7d1011d67db8..53bfcab15a22 100644 --- a/code/game/rendering/mob_huds/mob_hud.dm +++ b/code/game/rendering/mob_huds/mob_hud.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// /** * owned by one mob as the user, and one mob as the owner diff --git a/code/game/rendering/parallax/parallax.dm b/code/game/rendering/parallax/parallax.dm index ef6e047170c7..cc3aa7c51b3f 100644 --- a/code/game/rendering/parallax/parallax.dm +++ b/code/game/rendering/parallax/parallax.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// /** * Holds parallax information. diff --git a/code/game/rendering/parallax/parallax_holder.dm b/code/game/rendering/parallax/parallax_holder.dm index 22332a9ef0d3..01dca8b4c189 100644 --- a/code/game/rendering/parallax/parallax_holder.dm +++ b/code/game/rendering/parallax/parallax_holder.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// /** * # Parallax holders diff --git a/code/game/rendering/parallax/parallax_object.dm b/code/game/rendering/parallax/parallax_object.dm index e9729ea1b0f3..05a225ac10fe 100644 --- a/code/game/rendering/parallax/parallax_object.dm +++ b/code/game/rendering/parallax/parallax_object.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// /atom/movable/screen/parallax_layer icon = 'icons/screen/parallax/parallax.dmi' diff --git a/code/game/rendering/perspectives/darksight.dm b/code/game/rendering/perspectives/darksight.dm index 0bfb15002d4c..d38faf5b79df 100644 --- a/code/game/rendering/perspectives/darksight.dm +++ b/code/game/rendering/perspectives/darksight.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// /atom/movable/screen/darksight_fov icon = SOFT_DARKSIGHT_15X15_ICON diff --git a/code/game/rendering/perspectives/perspective.dm b/code/game/rendering/perspectives/perspective.dm index 01ee674e8c27..c27e15af7566 100644 --- a/code/game/rendering/perspectives/perspective.dm +++ b/code/game/rendering/perspectives/perspective.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// /** * MOB PERRSPECTIVE SYSTEM diff --git a/code/game/rendering/perspectives/vision.dm b/code/game/rendering/perspectives/vision.dm index ecdf2a095f56..be4a5e04e0d0 100644 --- a/code/game/rendering/perspectives/vision.dm +++ b/code/game/rendering/perspectives/vision.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// GLOBAL_LIST_EMPTY(cached_vision_holders) diff --git a/code/game/rendering/screen.dm b/code/game/rendering/screen.dm index 2a9d3c93913f..d3c83096809a 100644 --- a/code/game/rendering/screen.dm +++ b/code/game/rendering/screen.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// /atom/movable/screen appearance_flags = PIXEL_SCALE | NO_CLIENT_COLOR diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index ab051e1c4422..b50faba559f2 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -247,19 +247,13 @@ var/datum/integrated_io/selected_io = null var/mode = 0 -<<<<<<< HEAD -/obj/item/multitool/attack_self(mob/user, datum/event_args/actor/e_args) +/obj/item/multitool/attack_self(mob/user, datum/event_args/actor/actor) . = ..() if(.) return -======= -/obj/item/multitool/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master if(selected_io) selected_io = null to_chat(user, "You clear the wired connection from the multitool.") - else - ..() update_icon() /obj/item/multitool/update_icon() diff --git a/code/modules/maps/overmap/space/talon/talon_jobs.dm b/code/modules/maps/overmap/space/talon/talon_jobs.dm index 1c685fa589d3..32867c29ee46 100644 --- a/code/modules/maps/overmap/space/talon/talon_jobs.dm +++ b/code/modules/maps/overmap/space/talon/talon_jobs.dm @@ -58,15 +58,9 @@ selection_color = "#aaaaaa" minimal_player_age = 14 pto_type = null -<<<<<<< HEAD - access = list(ACCESS_FACTION_TALON) - minimal_access = list(ACCESS_FACTION_TALON) - alt_titles = list("Talon Medic" = /datum/alt_title/talon_medic) -======= access = list(access_talon) minimal_access = list(access_talon) alt_titles = list("Talon Medic" = /datum/prototype/struct/alt_title/talon_medic) ->>>>>>> citrp/master /datum/prototype/struct/alt_title/talon_medic title = "Talon Medic" @@ -88,15 +82,9 @@ selection_color = "#aaaaaa" minimal_player_age = 14 pto_type = null -<<<<<<< HEAD - access = list(ACCESS_FACTION_TALON) - minimal_access = list(ACCESS_FACTION_TALON) - alt_titles = list("Talon Technician" = /datum/alt_title/talon_tech) -======= access = list(access_talon) minimal_access = list(access_talon) alt_titles = list("Talon Technician" = /datum/prototype/struct/alt_title/talon_tech) ->>>>>>> citrp/master /datum/prototype/struct/alt_title/talon_tech title = "Talon Technician" @@ -118,15 +106,9 @@ selection_color = "#aaaaaa" minimal_player_age = 14 pto_type = null -<<<<<<< HEAD - access = list(ACCESS_FACTION_TALON) - minimal_access = list(ACCESS_FACTION_TALON) - alt_titles = list("Talon Helmsman" = /datum/alt_title/talon_helmsman) -======= access = list(access_talon) minimal_access = list(access_talon) alt_titles = list("Talon Helmsman" = /datum/prototype/struct/alt_title/talon_helmsman) ->>>>>>> citrp/master /datum/prototype/struct/alt_title/talon_helmsman title = "Talon Helmsman" @@ -148,15 +130,9 @@ selection_color = "#aaaaaa" minimal_player_age = 14 pto_type = null -<<<<<<< HEAD - access = list(ACCESS_FACTION_TALON) - minimal_access = list(ACCESS_FACTION_TALON) - alt_titles = list("Talon Security" = /datum/alt_title/talon_security) -======= access = list(access_talon) minimal_access = list(access_talon) alt_titles = list("Talon Security" = /datum/prototype/struct/alt_title/talon_security) ->>>>>>> citrp/master /datum/prototype/struct/alt_title/talon_security title = "Talon Security" diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 6f70b17bb421..9fc3cd85399d 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -279,12 +279,7 @@ set_weight_class(WEIGHT_CLASS_SMALL) update_icon() -<<<<<<< HEAD -/obj/item/gun/ballistic/attack_self(mob/user, datum/event_args/actor/e_args) - -======= /obj/item/gun/ballistic/attack_self(mob/user, datum/event_args/actor/actor) ->>>>>>> upstream/master if(firemodes.len > 1) switch_firemodes(user) else if(ammo_magazine) From 037e3557bac8a0aed862099cb569995108f01026 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:49:48 +0000 Subject: [PATCH 073/140] inv --- citadel.dme | 17 +- .../objects/items-inventory-hooks.dm} | 2 +- .../objects/items-inventory-rendering.dm} | 2 +- .../objects/items-inventory.dm} | 2 +- .../mob/inventory/inventory-hands-check.dm | 2 +- .../mob/inventory/inventory-hands-drop.dm | 2 +- .../mob/inventory/inventory-hands-get.dm | 150 ++++-- .../mob/inventory/inventory-hands-legacy.dm | 14 +- .../mob/inventory/inventory-hands-put.dm | 13 +- code/modules/mob/inventory/inventory-hands.dm | 97 +--- .../mob/inventory/inventory-rendering.dm | 2 +- code/modules/mob/inventory/inventory.dm | 4 +- code/modules/mob/inventory/inventory_slot.dm | 10 +- code/modules/mob/inventory/mob/public.dm | 469 ------------------ .../modules/mob/living/carbon/carbon-hands.dm | 2 +- .../{inventory.dm => living-inventory.dm} | 2 +- code/modules/mob/mob-hands.dm | 2 +- ...action.dm => mob-inventory-abstraction.dm} | 99 +++- .../helpers.dm => mob-inventory-helpers.dm} | 2 +- .../internal.dm => mob-inventory-internal.dm} | 2 +- ...tripping.dm => mob-inventory-stripping.dm} | 4 +- code/modules/mob/mob-inventory.dm | 469 +++++++++++++++++- 22 files changed, 708 insertions(+), 660 deletions(-) rename code/{modules/mob/inventory/item/hooks.dm => game/objects/items-inventory-hooks.dm} (93%) rename code/{modules/mob/inventory/item/rendering.dm => game/objects/items-inventory-rendering.dm} (99%) rename code/{modules/mob/inventory/item/public.dm => game/objects/items-inventory.dm} (99%) delete mode 100644 code/modules/mob/inventory/mob/public.dm rename code/modules/mob/living/{inventory.dm => living-inventory.dm} (98%) rename code/modules/mob/{inventory/mob/abstraction.dm => mob-inventory-abstraction.dm} (59%) rename code/modules/mob/{inventory/mob/helpers.dm => mob-inventory-helpers.dm} (99%) rename code/modules/mob/{inventory/mob/internal.dm => mob-inventory-internal.dm} (99%) rename code/modules/mob/{inventory/mob/stripping.dm => mob-inventory-stripping.dm} (98%) diff --git a/citadel.dme b/citadel.dme index 3fc0edc77ea1..d0675cb89f6b 100644 --- a/citadel.dme +++ b/citadel.dme @@ -1476,6 +1476,9 @@ #include "code\game\objects\items-carry_weight.dm" #include "code\game\objects\items-defense.dm" #include "code\game\objects\items-interaction.dm" +#include "code\game\objects\items-inventory-hooks.dm" +#include "code\game\objects\items-inventory-rendering.dm" +#include "code\game\objects\items-inventory.dm" #include "code\game\objects\items.dm" #include "code\game\objects\materials.dm" #include "code\game\objects\misc.dm" @@ -3030,6 +3033,10 @@ #include "code\modules\integrated_electronics\~defines\~defines.dm" #include "code\modules\mob\inventory_legacy.dm" #include "code\modules\mob\mob-hands.dm" +#include "code\modules\mob\mob-inventory-abstraction.dm" +#include "code\modules\mob\mob-inventory-helpers.dm" +#include "code\modules\mob\mob-inventory-internal.dm" +#include "code\modules\mob\mob-inventory-stripping.dm" #include "code\modules\mob\mob-inventory.dm" #include "code\modules\mob\mob-login.dm" #include "code\modules\mob\mob-logout.dm" @@ -3042,14 +3049,6 @@ #include "code\modules\mob\inventory\inventory-rendering.dm" #include "code\modules\mob\inventory\inventory_slot.dm" #include "code\modules\mob\inventory\inventory.dm" -#include "code\modules\mob\inventory\item\hooks.dm" -#include "code\modules\mob\inventory\item\public.dm" -#include "code\modules\mob\inventory\item\rendering.dm" -#include "code\modules\mob\inventory\mob\abstraction.dm" -#include "code\modules\mob\inventory\mob\helpers.dm" -#include "code\modules\mob\inventory\mob\internal.dm" -#include "code\modules\mob\inventory\mob\public.dm" -#include "code\modules\mob\inventory\mob\stripping.dm" #include "code\modules\jobs\access.dm" #include "code\modules\jobs\alt_title.dm" #include "code\modules\jobs\department.dm" @@ -3587,12 +3586,12 @@ #include "code\modules\mob\living\death.dm" #include "code\modules\mob\living\default_language.dm" #include "code\modules\mob\living\health.dm" -#include "code\modules\mob\living\inventory.dm" #include "code\modules\mob\living\inventory_legacy.dm" #include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\living-damage.dm" #include "code\modules\mob\living\living-defense-legacy.dm" #include "code\modules\mob\living\living-defense.dm" +#include "code\modules\mob\living\living-inventory.dm" #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_powers.dm" diff --git a/code/modules/mob/inventory/item/hooks.dm b/code/game/objects/items-inventory-hooks.dm similarity index 93% rename from code/modules/mob/inventory/item/hooks.dm rename to code/game/objects/items-inventory-hooks.dm index 657325337c5b..c8ff5b4d889e 100644 --- a/code/modules/mob/inventory/item/hooks.dm +++ b/code/game/objects/items-inventory-hooks.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// // doMove hook to ensure proper functionality when inv procs aren't called /obj/item/doMove(atom/destination) diff --git a/code/modules/mob/inventory/item/rendering.dm b/code/game/objects/items-inventory-rendering.dm similarity index 99% rename from code/modules/mob/inventory/item/rendering.dm rename to code/game/objects/items-inventory-rendering.dm index 7c5ff35631ba..d28e70515cc5 100644 --- a/code/modules/mob/inventory/item/rendering.dm +++ b/code/game/objects/items-inventory-rendering.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// /** * Item rendering system diff --git a/code/modules/mob/inventory/item/public.dm b/code/game/objects/items-inventory.dm similarity index 99% rename from code/modules/mob/inventory/item/public.dm rename to code/game/objects/items-inventory.dm index b98893bf9c74..374640c1a4d6 100644 --- a/code/modules/mob/inventory/item/public.dm +++ b/code/game/objects/items-inventory.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// //* Hooks *// diff --git a/code/modules/mob/inventory/inventory-hands-check.dm b/code/modules/mob/inventory/inventory-hands-check.dm index 21556940ff0c..6333f19c08a9 100644 --- a/code/modules/mob/inventory/inventory-hands-check.dm +++ b/code/modules/mob/inventory/inventory-hands-check.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// //* Procs in this file are mirrored to the /mob level for ease of use. *// //* *// diff --git a/code/modules/mob/inventory/inventory-hands-drop.dm b/code/modules/mob/inventory/inventory-hands-drop.dm index 2a03a284d77a..8af8c926ddde 100644 --- a/code/modules/mob/inventory/inventory-hands-drop.dm +++ b/code/modules/mob/inventory/inventory-hands-drop.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// //* Procs in this file are mirrored to the /mob level for ease of use. *// //* *// diff --git a/code/modules/mob/inventory/inventory-hands-get.dm b/code/modules/mob/inventory/inventory-hands-get.dm index 1594915f5f64..a6e4d82eafc9 100644 --- a/code/modules/mob/inventory/inventory-hands-get.dm +++ b/code/modules/mob/inventory/inventory-hands-get.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// //* Procs in this file are mirrored to the /mob level for ease of use. *// //* *// @@ -62,20 +62,112 @@ /** * Get an indexed list of weakrefs or nulls of held items. - * - * * returns null if we have no inventory. */ /mob/proc/get_held_items_as_weakrefs() RETURN_TYPE(/list) if(!inventory) - return + return list() . = new /list(length(inventory.held_items)) for(var/i in 1 to length(inventory.held_items)) .[i] = WEAKREF(inventory.held_items[i]) -#warn mirror & check below +//* Iteration *// + +/** + * @return list of held items + */ +/datum/inventory/proc/get_held_items() + RETURN_TYPE(/list) + . = list() + for(var/obj/item/I in held_items) + return I + +/** + * @return list of held items + */ +/mob/proc/get_held_items() + RETURN_TYPE(/list) + . = list() + for(var/obj/item/I in inventory?.held_items) + . += I + +/** + * @return list of held items of type + */ +/datum/inventory/proc/get_held_items_of_type(type) + RETURN_TYPE(/list) + . = list() + for(var/obj/item/I as anything in held_items) + if(istype(I, type)) + . += I + +/** + * @return list of held items of type + */ +/datum/inventory/proc/get_held_items_of_type(type) + RETURN_TYPE(/list) + . = list() + for(var/obj/item/I as anything in inventory?.held_items) + if(istype(I, type)) + . += I + +/** + * @return first held item of type, if found + */ +/datum/inventory/proc/get_held_item_of_type(type) + RETURN_TYPE(/obj/item) + for(var/obj/item/I as anything in held_items) + if(istype(I, type)) + return I + +/** + * @return first held item of type, if found + */ +/mob/proc/get_held_item_of_type(type) + RETURN_TYPE(/obj/item) + for(var/obj/item/I as anything in inventory?.held_items) + if(istype(I, type)) + return I + +/** + * @return list of full hands + */ +/datum/inventory/proc/get_full_hand_indices() + . = list() + for(var/i in 1 to length(held_items)) + if(held_items[i]) + . += i + +/** + * @return list of full hands + */ +/mob/proc/get_full_hand_indices() + . = list() + for(var/i in 1 to length(inventory?.held_items)) + if(inventory.held_items[i]) + . += i + +/** + * @return list of empty hands + */ +/datum/inventory/proc/get_empty_hand_indices() + . = list() + for(var/i in 1 to length(held_items)) + if(!held_items[i]) + . += i -//* By Side *// +/** + * @return list of empty hands + */ +/mob/proc/get_empty_hand_indices() + . = list() + for(var/i in 1 to length(inventory?.held_items)) + if(!inventory.held_items[i]) + . += i + +//* By Side *// +//* This is not on /datum/inventory level as *// +//* oftentimes a mob has no semantic 'sided hands'. *// /** * returns first item on left @@ -118,49 +210,3 @@ if(isnull(inventory?.held_items[i])) continue . += inventory?.held_items[i] - -//* Iteration *// - -/** - * returns held items - */ -/mob/proc/get_held_items() - . = list() - for(var/obj/item/I in inventory?.held_items) - . += I - -/** - * get held items of type - */ -/mob/proc/get_held_items_of_type(type) - . = list() - for(var/obj/item/I as anything in get_held_items()) - if(istype(I, type)) - . += I - -/** - * get first held item of type - */ -/mob/proc/get_held_item_of_type(type) - RETURN_TYPE(/obj/item) - for(var/obj/item/I as anything in get_held_items()) - if(istype(I, type)) - return I - -/** - * get full indices - */ -/mob/proc/get_full_hand_indices() - . = list() - for(var/i in 1 to length(inventory?.held_items)) - if(!isnull(inventory?.held_items[i])) - . += i - -/** - * get empty indices - */ -/mob/proc/get_empty_hand_indices() - . = list() - for(var/i in 1 to length(inventory?.held_items)) - if(isnull(inventory?.held_items[i])) - . += i diff --git a/code/modules/mob/inventory/inventory-hands-legacy.dm b/code/modules/mob/inventory/inventory-hands-legacy.dm index de0071869990..1dd8749bdf3c 100644 --- a/code/modules/mob/inventory/inventory-hands-legacy.dm +++ b/code/modules/mob/inventory/inventory-hands-legacy.dm @@ -1,6 +1,5 @@ - //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// /** * returns if we're holding something in inactive hand slots @@ -59,3 +58,14 @@ if(isnull(inventory?.held_items[i])) continue . += inventory?.held_items[i] + +/mob/proc/put_in_active_hand(obj/item/I, flags) + return put_in_hand(I, active_hand, flags) + +/mob/proc/put_in_inactive_hand(obj/item/I, flags) + for(var/i in 1 to length(inventory?.held_items)) + if(i == active_hand) + continue + if(put_in_hand(I, i, flags)) + return TRUE + return FALSE diff --git a/code/modules/mob/inventory/inventory-hands-put.dm b/code/modules/mob/inventory/inventory-hands-put.dm index 85193946146f..27de2522aa85 100644 --- a/code/modules/mob/inventory/inventory-hands-put.dm +++ b/code/modules/mob/inventory/inventory-hands-put.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// //* Procs in this file are mirrored to the /mob level for ease of use. *// //* *// @@ -60,17 +60,6 @@ return TRUE return FALSE -/mob/proc/put_in_active_hand(obj/item/I, flags) - return put_in_hand(I, active_hand, flags) - -/mob/proc/put_in_inactive_hand(obj/item/I, flags) - for(var/i in 1 to length(inventory?.held_items)) - if(i == active_hand) - continue - if(put_in_hand(I, i, flags)) - return TRUE - return FALSE - /mob/proc/put_in_hand_or_del(obj/item/I, index, flags) . = put_in_hand(I, index, flags) if(!.) diff --git a/code/modules/mob/inventory/inventory-hands.dm b/code/modules/mob/inventory/inventory-hands.dm index 99c98593e070..3f66f68fc922 100644 --- a/code/modules/mob/inventory/inventory-hands.dm +++ b/code/modules/mob/inventory/inventory-hands.dm @@ -1,97 +1,4 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// -/** - * Hands are a bit of a special case - * - * They don't use inventory slots like the inventory system does, - * But still exists in the inventory module because they do a number of things, - * like count as equipped under [SLOT_ID_HANDS]. - * - * This semi-integration lets us do a few cool things like not needing separate hooks - * for when someone has something in hand, but not in inventory, transitioning - * to them having it in inventory, but not in hands. - */ - -/** - * the big, bad proc ultimately in charge of putting something into someone's hand - * whether it's from the ground, from a slot, or from another hand. - */ -/mob/proc/equip_hand_impl(obj/item/I, index, flags) - PRIVATE_PROC(TRUE) - if(!I) - return TRUE - // let's not do that if it's deleted! - if(QDELETED(I)) - to_chat(src, SPAN_DANGER("A deleted item [I] ([REF(I)]) was sent into inventory hand procs with flags [flags]. Report this line to coders immediately.")) - to_chat(src, SPAN_DANGER("The inventory system will attempt to reject the bad equip. Glitches may occur.")) - return FALSE - - if(length(inventory?.held_items) < index) - return FALSE - - var/obj/item/existing = inventory?.held_items[index] - if(!isnull(existing)) - if(flags & INV_OP_FORCE) - drop_held_index(index, flags | INV_OP_NO_UPDATE_ICONS) - if(!isnull(inventory?.held_items[index])) - // failed to drop - return FALSE - else - return FALSE - - var/existing_slot = is_in_inventory(I) - if(existing_slot) - // already in inv - if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags)) - return FALSE - else - // newly eqiupped - var/atom/old_loc = I.loc - if(I.loc != src) - I.forceMove(src) - if(I.loc != src) - return FALSE - I.pickup(src, flags, old_loc) - I.equipped(src, SLOT_ID_HANDS, flags) - log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") - - inventory?.held_items[index] = I - #warn hud - - //! LEGACY BEGIN - I.update_twohanding() - //! END - - if(!(flags & INV_OP_NO_UPDATE_ICONS)) - update_inv_hand(index) - - if(!(I.interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ON_TOUCH)) - I.add_fingerprint(src) - else - I.add_hiddenprint(src) - -/** - * get something out of our hand - * - * @return unequipped item - */ -/mob/proc/unequip_hand_impl(obj/item/I, index, flags) - ASSERT(inventory?.held_items[index] == I) - - inventory?.held_items[index] = null - - I.unequipped(src, SLOT_ID_HANDS, flags) - #warn impl; hud - -/** - * handle swapping item from one hand index to another - */ -/mob/proc/handle_item_handswap(obj/item/I, index, old_index, flags, mob/user = src) - ASSERT(inventory?.held_items[old_index] == I) - ASSERT(isnull(inventory?.held_items[index])) - - inventory?.held_items[old_index] = null - inventory?.held_items[index] = I - - #warn impl; hud +#warn core swap procs? diff --git a/code/modules/mob/inventory/inventory-rendering.dm b/code/modules/mob/inventory/inventory-rendering.dm index fc86dbb8ab1f..7bad050bff47 100644 --- a/code/modules/mob/inventory/inventory-rendering.dm +++ b/code/modules/mob/inventory/inventory-rendering.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// //* Rendering *// diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index b8835c30f800..776e259f434d 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// /** * mob inventory data goes in here. @@ -97,7 +97,7 @@ /** * called when an item is moved from one slot to another */ -/datum/inventory/proc/item_exited(obj/item/item, datum/inventory_slot/from_slot, datum/inventory_slot/to_slot) +/datum/inventory/proc/item_swapped(obj/item/item, datum/inventory_slot/from_slot, datum/inventory_slot/to_slot) hud?.move_item(item, from_slot, to_slot) #warn hook above 3 diff --git a/code/modules/mob/inventory/inventory_slot.dm b/code/modules/mob/inventory/inventory_slot.dm index adda2bebbd62..5f5357e2a12b 100644 --- a/code/modules/mob/inventory/inventory_slot.dm +++ b/code/modules/mob/inventory/inventory_slot.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// /// global slot meta cache - all ids must be string! /// initialized by SSearly_init @@ -69,11 +69,11 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) CRASH("Failed to do type lookup for [type].") /** - * inventory slot meta + * inventory slot metadata * stores all the required information for an inventory slot * - * **Typepaths for these are used directly in most circumstances of slot IDs** - * **Use get_inventory_slot_meta(id) to automatically translate anything to the static datum.** + * **Typepaths for these are used directly in many circumstances instead of their slot IDs** + * **Use resolve_inventory_slot(id) to automatically translate anything to the static datum.** * * ABSTRACT SLOTS: * Abstract slots attempts to do something special, based on mob. @@ -100,7 +100,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) /// our screen loc var/hud_position #warn uh oh! - /// our nominal + /// our nominal //* Grammar /// player friendly name diff --git a/code/modules/mob/inventory/mob/public.dm b/code/modules/mob/inventory/mob/public.dm deleted file mode 100644 index 3cdd3f214d2f..000000000000 --- a/code/modules/mob/inventory/mob/public.dm +++ /dev/null @@ -1,469 +0,0 @@ -//* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// - -//* Checks / Enumerations *// - -/** - * gets the primary item in a slot - * null if not in inventory. inhands don't count as inventory here, use held item procs. - */ -/mob/proc/item_by_slot_id(slot) - return _item_by_slot(slot) // why the needless indirection? so people don't override this for slots! - -/** - * get slot of item if it's equipped. - * null if not in inventory. SLOT_HANDS if held. - */ -/mob/proc/slot_id_by_item(obj/item/I) - return is_in_inventory(I) || null // short circuited to that too - // if equipped/unequipped didn't set worn_slot well jokes on you lmfao - -/** - * gets the primary item and nested items (e.g. gloves, magboots, accessories) in a slot - * null if not in inventory, otherwise list - * inhands do not count as inventory - */ -/mob/proc/items_by_slot_id(slot) - var/obj/item/I = _item_by_slot(slot) - if(!I) - return list() - I = I.inv_slot_attached() - return islist(I)? I : list(I) - -/** - * returns if we have something equipped - the slot if it is, null if not - * - * SLOT_ID_HANDS if in hands - */ -/mob/proc/is_in_inventory(obj/item/I) - return (I?.worn_mob() == src) && I.worn_slot - // we use entirely cached vars for speed. - // if this returns bad data well fuck you, don't break equipped()/unequipped(). - -/** - * returns if an item is in inventory (equipped) rather than hands - */ -/mob/proc/is_wearing(obj/item/I) - var/slot = is_in_inventory(I) - return slot && (slot != SLOT_ID_HANDS) - -/** - * get all equipped items - * - * @params - * include_inhands - include held items too? - * include_restraints - include restraints too? - */ -/mob/proc/get_equipped_items(include_inhands, include_restraints) - return get_held_items() + _get_all_slots(include_restraints) - -// todo: below procs needs optimization for when we need the datum anyways, to avoid two lookups - -/mob/proc/has_slot(id) - SHOULD_NOT_OVERRIDE(TRUE) - return _item_by_slot(id) != INVENTORY_SLOT_DOES_NOT_EXIST - -/mob/proc/semantically_has_slot(id) - return has_slot(id) && _semantic_slot_id_check(id) - -/mob/proc/get_inventory_slot_ids(semantic, sorted) - // get all - if(sorted) - . = list() - for(var/id as anything in GLOB.inventory_slot_meta) - if(!semantically_has_slot(id)) - continue - . += id - return - else - . = _get_inventory_slot_ids() - // check if we should filter - if(!semantic) - return - . = _get_inventory_slot_ids() - for(var/id in .) - if(!_semantic_slot_id_check(id)) - . -= id - -//* Equipping *// - -/** - * checks if we can equip an item to a slot - * - * Preconditions: The item will either be equipped on us already, or not yet equipped. - * - * @return TRUE/FALSE - * - * @params - * - I - item - * - slot - slot ID - * - flags - inventory operation hint bitfield, see defines - * - user - user trying to equip that thing to us there - can be null - * - denest_to - the old slot we're leaving if called from handle_item_reequip. **extremely** snowflakey - * - * todo: refactor nesting to not require this shit - */ -/mob/proc/can_equip(obj/item/I, slot, flags, mob/user, denest_to) - // let's NOT. - if(I && QDELETED(I)) - to_chat(user, SPAN_DANGER("A deleted [I] was checked in can_equip(). Report this entire line to coders immediately. Debug data: [I] ([REF(I)]) slot [slot] flags [flags] user [user]")) - to_chat(user, SPAN_DANGER("can_equip will now attempt to prevent the deleted item from being equipped. There should be no glitches.")) - return FALSE - - var/datum/inventory_slot/slot_meta = resolve_inventory_slot(slot) - var/self_equip = user == src - if(!slot_meta) - . = FALSE - CRASH("Failed to resolve to slot datm.") - - if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) - // special handling: make educated guess, defaulting to yes - switch(slot_meta.type) - if(/datum/inventory_slot/abstract/hand/left) - return (flags & INV_OP_FORCE) || !get_left_held_item() - if(/datum/inventory_slot/abstract/hand/right) - return (flags & INV_OP_FORCE) || !get_right_held_item() - if(/datum/inventory_slot/abstract/put_in_backpack) - var/obj/item/thing = item_by_slot_id(SLOT_ID_BACK) - return thing?.obj_storage?.can_be_inserted(I, new /datum/event_args/actor(user), TRUE) - if(/datum/inventory_slot/abstract/put_in_belt) - var/obj/item/thing = item_by_slot_id(SLOT_ID_BACK) - return thing?.obj_storage?.can_be_inserted(I, new /datum/event_args/actor(user), TRUE) - if(/datum/inventory_slot/abstract/put_in_hands) - return (flags & INV_OP_FORCE) || !are_usable_hands_full() - return TRUE - - if(!inventory_slot_bodypart_check(I, slot, user, flags) && !(flags & INV_OP_FORCE)) - return FALSE - - var/conflict_result = inventory_slot_conflict_check(I, slot, flags) - var/obj/item/to_wear_over - - if((flags & INV_OP_IS_FINAL_CHECK) && conflict_result && (slot != SLOT_ID_HANDS)) - // try to fit over - var/obj/item/conflicting = item_by_slot_id(slot) - if(conflicting) - // there's something there - var/can_fit_over = I.equip_worn_over_check(src, slot, user, conflicting, flags) - if(can_fit_over) - conflict_result = CAN_EQUIP_SLOT_CONFLICT_NONE - to_wear_over = conflicting - // ! DANGER: snowflake time - // take it out of the slot - _unequip_slot(slot, flags | INV_OP_NO_LOGIC | INV_OP_NO_UPDATE_ICONS) - // recheck - conflict_result = inventory_slot_conflict_check(I, slot) - // put it back in incase something else breaks - _equip_slot(conflicting, slot, flags | INV_OP_NO_LOGIC | INV_OP_NO_UPDATE_ICONS) - - switch(conflict_result) - if(CAN_EQUIP_SLOT_CONFLICT_HARD) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] are already [slot_meta.display_plural? "holding too many things" : "wearing something"] [slot_meta.display_preposition] [self_equip? "your" : "their"] [slot_meta.display_name].")) - return FALSE - if(CAN_EQUIP_SLOT_CONFLICT_SOFT) - if(!(flags & INV_OP_FORCE)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] are already [slot_meta.display_plural? "holding too many things" : "wearing something"] [slot_meta.display_preposition] [self_equip? "your" : "their"] [slot_meta.display_name].")) - return FALSE - - if(!inventory_slot_semantic_conflict(I, slot, user) && !(flags & INV_OP_FORCE)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("[I] doesn't fit there.")) - return FALSE - - var/blocked_by - - if((blocked_by = inventory_slot_reachability_conflict(I, slot, user)) && !(flags & (INV_OP_FORCE | INV_OP_IGNORE_REACHABILITY))) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("\the [blocked_by] is in the way!")) - return FALSE - - // lastly, check item's opinion - if(!I.can_equip(src, slot, user, flags)) - return FALSE - - // we're the final check - side effects ARE allowed - if((flags & INV_OP_IS_FINAL_CHECK) && to_wear_over) - //! Note: this means that can_unequip is NOT called for to wear over. - //! This is intentional, but very, very sonwflakey. - to_wear_over.worn_inside = I - // setting worn inside first disallows equip/unequip from triggering - to_wear_over.forceMove(I) - // check we don't have something already (wtf) - if(I.worn_over) - handle_item_denesting(I, denest_to, flags, user) - // set the other way around - I.worn_over = to_wear_over - // tell it we're inserting the old item - I.equip_on_worn_over_insert(src, slot, user, to_wear_over, flags) - // take the old item off our screen - client?.screen -= to_wear_over - to_wear_over.screen_loc = null - to_wear_over.hud_unlayerise() - // we don't call slot re-equips here because the equip proc does this for us - - return TRUE - -/** - * equips an item to a slot if possible - * - * @params - * - I - item - * - slot - the slot - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ -/mob/proc/equip_to_slot_if_possible(obj/item/I, slot, flags, mob/user) - return _equip_item(I, flags, slot, user) - -/** - * equips an item to a slot if possible - * item is deleted on failure - * - * @params - * - I - item - * - slot - the slot - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ -/mob/proc/equip_to_slot_or_del(obj/item/I, slot, flags, mob/user) - . = equip_to_slot_if_possible(I, slot, flags, user) - if(!.) - qdel(I) -/** - * automatically equips to the best inventory (non storage!) slot we can find for an item, if possible - * this proc is silent for the sub-calls by default to prevent spam. - * - * @params - * - I - item - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ -/mob/proc/equip_to_appropriate_slot(obj/item/I, flags, mob/user) - for(var/slot in GLOB.slot_equipment_priority) - if(equip_to_slot_if_possible(I, slot, flags | INV_OP_SUPPRESS_WARNING, user)) - return TRUE - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, user == src? SPAN_WARNING("You can't find somewhere to equip [I] to!") : SPAN_WARNING("[src] has nowhere to equip [I] to!")) - return FALSE - -/** - * automatically equips to the best inventory (non storage!) slot we can find for an item, if possible - * - * item is deleted on failure. - * - * @params - * - I - item - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ - -/mob/proc/equip_to_appropriate_slot_or_del(obj/item/I, flags, mob/user) - if(!equip_to_appropriate_slot(I, flags, user)) - qdel(I) - -/** - * forcefully equips an item to a slot - * kicks out conflicting items if possible - * - * This CAN fail, so listen to return value - * Why? YOU MIGHT EQUIP TO A MOB WITHOUT A CERTAIN SLOT! - * - * @params - * - I - item - * - slot - slot to equip to - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ -/mob/proc/force_equip_to_slot(obj/item/I, slot, flags, mob/user) - return _equip_item(I, flags | INV_OP_FORCE | INV_OP_CAN_DISPLACE, slot, user) - -/** - * forcefully equips an item to a slot - * kicks out conflicting items if possible - * if still failing, item is deleted - * - * this can fail, so listen to return values. - * @params - * - I - item - * - slot - slot to equip to - * - flags - inventory operation hint bitfield, see defines - * - user - the user doing the action, if any. defaults to ourselves. - * - * @return TRUE/FALSE - */ -/mob/proc/force_equip_to_slot_or_del(obj/item/I, slot, flags, mob/user) - if(!force_equip_to_slot(I, slot, flags, user)) - qdel(I) - return FALSE - return TRUE - -//* Dropping *// - -/** - * checks if we can unequip an item - * - * Preconditions: The item is either equipped already, or isn't equipped. - * - * @return TRUE/FALSE - * - * @params - * - I - item - * - slot - slot we're unequipping from - can be null - * - flags - inventory operation hint bitfield, see defines - * - user - stripper - can be null - */ -/mob/proc/can_unequip(obj/item/I, slot, flags, mob/user = src) - // destroyed IS allowed to call these procs - if(I && QDELETED(I) && !QDESTROYING(I)) - to_chat(user, SPAN_DANGER("A deleted [I] was checked in can_unequip(). Report this entire line to coders immediately. Debug data: [I] ([REF(I)]) slot [slot] flags [flags] user [user]")) - to_chat(user, SPAN_DANGER("can_unequip will return TRUE to allow you to drop the item, but expect potential glitches!")) - return TRUE - - if(!slot) - slot = slot_id_by_item(I) - - if(!(flags & INV_OP_FORCE) && HAS_TRAIT(I, TRAIT_ITEM_NODROP)) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - var/datum/inventory_slot/slot_meta = resolve_inventory_slot(slot) - to_chat(user, SPAN_WARNING("[I] is stubbornly stuck [slot_meta.display_preposition] your [slot_meta.display_name]!")) - return FALSE - - var/blocked_by - if((blocked_by = inventory_slot_reachability_conflict(I, slot, user)) && !(flags & (INV_OP_FORCE | INV_OP_IGNORE_REACHABILITY))) - if(!(flags & INV_OP_SUPPRESS_WARNING)) - to_chat(user, SPAN_WARNING("\the [blocked_by] is in the way!")) - return FALSE - - // lastly, check item's opinion - if(!I.can_unequip(src, slot, user, flags)) - return FALSE - - return TRUE - -// So why do all of these return true if the item is null? -// Semantically, transferring/dropping nothing always works -// This lets us tidy up other pieces of code by not having to typecheck everything. -// However, if you do pass in an invalid object instead of null, the procs will fail or pass -// depending on needed behavior. -// Use the helpers when you can, it's easier for everyone and makes replacing behaviors later easier. - -// This logic is actually **stricter** than the previous logic, which was "if item doesn't exist, it always works" - -// todo: yeah this is pretty bad huh; this is because new hand crap is properly refactored and we aren't -// so this is just a wrapper to route stuff around while we slowly refactor inventory. -/datum/inventory/proc/drop_item_to_ground(obj/item/I, inv_op_flags, datum/event_args/actor/actor) - if(!actor) - actor = E_ARGS_WRAP_USER_TO_ACTOR(actor || src) - return owner.drop_item_to_ground(I, inv_op_flags, actor?.performer) - -/** - * drops an item to ground - * - * semantically returns true if the thing is no longer in our inventory after our call, whether or not we dropped it - * if you require better checks, check if something is in inventory first. - * - * if the item is null, this returns true - * if an item is not in us, this returns true - */ -/mob/proc/drop_item_to_ground(obj/item/I, flags, mob/user = src) - // destroyed IS allowed to call these procs - if(I && QDELETED(I) && !QDESTROYING(I)) - to_chat(user, SPAN_DANGER("A deleted item [I] was used in drop_item_to_ground(). Report the entire line to coders. Debugging information: [I] ([REF(I)]) flags [flags] user [user]")) - to_chat(user, SPAN_DANGER("Drop item to ground will now proceed, ignoring the bugged state. Errors may ensue.")) - else if(!is_in_inventory(I)) - return TRUE - return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, drop_location(), user) - -/** - * transfers an item somewhere - * newloc MUST EXIST, use transfer_item_to_nullspace otherwise - * - * semantically returns true if we transferred something from our inventory to newloc in the call - * - * if the item is null, this returns true - * if an item is not in us, this crashes - */ -/mob/proc/transfer_item_to_loc(obj/item/I, newloc, flags, mob/user) - if(!I) - return TRUE - ASSERT(newloc) - if(!is_in_inventory(I)) - return FALSE - return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, newloc, user) - -/** - * transfers an item into nullspace - * - * semantically returns true if we transferred something from our inventory to null in the call - * - * if the item is null, this returns true - * if an item is not in us, this crashes - */ -/mob/proc/transfer_item_to_nullspace(obj/item/I, flags, mob/user) - if(!I) - return TRUE - if(!is_in_inventory(I)) - return FALSE - return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, null, user) - -/** - * removes an item from inventory. does NOT move it. - * item MUST be qdel'd or moved after this if it returns TRUE! - * - * semantically returns true if the passed item is no longer in our inventory after the call - * - * if the item is null, ths returns true - * if an item is not in us, this returns true - */ -/mob/proc/temporarily_remove_from_inventory(obj/item/I, flags, mob/user) - if(!is_in_inventory(I)) - return TRUE - return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, FALSE, user) - -//* MasS Operations *// - -/** - * drops everything in our inventory - * - * @params - * - include_inhands - include held items too? - * - include_restraints - include restraints too? - * - force - ignore nodrop and all that - */ -/mob/proc/drop_inventory(include_inhands = TRUE, include_restraints = TRUE, force = TRUE) - for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) - drop_item_to_ground(I, INV_OP_SILENT | INV_OP_FLUFFLESS | (force? INV_OP_FORCE : NONE)) - - // todo: handle what happens if dropping something requires a logic thing - // e.g. dropping jumpsuit makes it impossible to transfer a belt since it - // de-equipped from the jumpsuit - -/mob/proc/transfer_inventory_to_loc(atom/newLoc, include_inhands = TRUE, include_restraints = TRUE, force = TRUE) - for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) - transfer_item_to_loc(I, newLoc, INV_OP_SILENT | INV_OP_FLUFFLESS | (force? INV_OP_FORCE : NONE)) - // todo: handle what happens if dropping something requires a logic thing - // e.g. dropping jumpsuit makes it impossible to transfer a belt since it - // de-equipped from the jumpsuit - -/** - * wipe our inventory - * - * @params - * include_inhands - include held items too? - * include_restraints - include restraints too? - */ -/mob/proc/delete_inventory(include_inhands = TRUE, include_restraints = TRUE) - for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) - qdel(I) diff --git a/code/modules/mob/living/carbon/carbon-hands.dm b/code/modules/mob/living/carbon/carbon-hands.dm index f5f19ef9a215..bb7de8aa2a90 100644 --- a/code/modules/mob/living/carbon/carbon-hands.dm +++ b/code/modules/mob/living/carbon/carbon-hands.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// //* Hands - Checks *// diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/living-inventory.dm similarity index 98% rename from code/modules/mob/living/inventory.dm rename to code/modules/mob/living/living-inventory.dm index 2e8d74e4c292..461d60b0ab07 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/living-inventory.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// //* Abstraction *// diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index 1c1695d7829d..0344d001a49f 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// //* Hands are weird. Unlike inventory slots, they tend to be very tightly *// //* coupled to organ state, so it's not a good thing to have all behavior *// diff --git a/code/modules/mob/inventory/mob/abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm similarity index 59% rename from code/modules/mob/inventory/mob/abstraction.dm rename to code/modules/mob/mob-inventory-abstraction.dm index a0ce952a775f..e429a70e3a0e 100644 --- a/code/modules/mob/inventory/mob/abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// /** * Abstraction procs @@ -132,3 +132,100 @@ */ /mob/proc/inventory_slot_bodypart_check(obj/item/I, slot, mob/user, flags) return TRUE + +//* Hands *// + +/** + * Hands are a bit of a special case + * + * They don't use inventory slots like the inventory system does, + * But still exists in the inventory module because they do a number of things, + * like count as equipped under [SLOT_ID_HANDS]. + * + * This semi-integration lets us do a few cool things like not needing separate hooks + * for when someone has something in hand, but not in inventory, transitioning + * to them having it in inventory, but not in hands. + */ + +/** + * the big, bad proc ultimately in charge of putting something into someone's hand + * whether it's from the ground, from a slot, or from another hand. + */ +/mob/proc/equip_hand_impl(obj/item/I, index, flags) + PRIVATE_PROC(TRUE) + if(!I) + return TRUE + // let's not do that if it's deleted! + if(QDELETED(I)) + to_chat(src, SPAN_DANGER("A deleted item [I] ([REF(I)]) was sent into inventory hand procs with flags [flags]. Report this line to coders immediately.")) + to_chat(src, SPAN_DANGER("The inventory system will attempt to reject the bad equip. Glitches may occur.")) + return FALSE + + if(length(inventory?.held_items) < index) + return FALSE + + var/obj/item/existing = inventory?.held_items[index] + if(!isnull(existing)) + if(flags & INV_OP_FORCE) + drop_held_index(index, flags | INV_OP_NO_UPDATE_ICONS) + if(!isnull(inventory?.held_items[index])) + // failed to drop + return FALSE + else + return FALSE + + var/existing_slot = is_in_inventory(I) + if(existing_slot) + // already in inv + if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags)) + return FALSE + else + // newly eqiupped + var/atom/old_loc = I.loc + if(I.loc != src) + I.forceMove(src) + if(I.loc != src) + return FALSE + I.pickup(src, flags, old_loc) + I.equipped(src, SLOT_ID_HANDS, flags) + log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") + + inventory?.held_items[index] = I + #warn hud + + //! LEGACY BEGIN + I.update_twohanding() + //! END + + if(!(flags & INV_OP_NO_UPDATE_ICONS)) + update_inv_hand(index) + + if(!(I.interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ON_TOUCH)) + I.add_fingerprint(src) + else + I.add_hiddenprint(src) + +/** + * get something out of our hand + * + * @return unequipped item + */ +/mob/proc/unequip_hand_impl(obj/item/I, index, flags) + ASSERT(inventory?.held_items[index] == I) + + inventory?.held_items[index] = null + + I.unequipped(src, SLOT_ID_HANDS, flags) + #warn impl; hud + +/** + * handle swapping item from one hand index to another + */ +/mob/proc/handle_item_handswap(obj/item/I, index, old_index, flags, mob/user = src) + ASSERT(inventory?.held_items[old_index] == I) + ASSERT(isnull(inventory?.held_items[index])) + + inventory?.held_items[old_index] = null + inventory?.held_items[index] = I + + #warn impl; hud diff --git a/code/modules/mob/inventory/mob/helpers.dm b/code/modules/mob/mob-inventory-helpers.dm similarity index 99% rename from code/modules/mob/inventory/mob/helpers.dm rename to code/modules/mob/mob-inventory-helpers.dm index 2dc8cfbc3ed5..8bc6fa3e1493 100644 --- a/code/modules/mob/inventory/mob/helpers.dm +++ b/code/modules/mob/mob-inventory-helpers.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// //* these have the primary function of calling other procs in public.dm *// diff --git a/code/modules/mob/inventory/mob/internal.dm b/code/modules/mob/mob-inventory-internal.dm similarity index 99% rename from code/modules/mob/inventory/mob/internal.dm rename to code/modules/mob/mob-inventory-internal.dm index 54a5188d18d2..cb946b1926a2 100644 --- a/code/modules/mob/inventory/mob/internal.dm +++ b/code/modules/mob/mob-inventory-internal.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// /** * Internal inventory logic diff --git a/code/modules/mob/inventory/mob/stripping.dm b/code/modules/mob/mob-inventory-stripping.dm similarity index 98% rename from code/modules/mob/inventory/mob/stripping.dm rename to code/modules/mob/mob-inventory-stripping.dm index f5ff80272d1c..7af49e06e983 100644 --- a/code/modules/mob/inventory/mob/stripping.dm +++ b/code/modules/mob/mob-inventory-stripping.dm @@ -1,5 +1,7 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2023 Citadel Station developers. *// +//* Copyright (c) 2024 Citadel Station Developers *// + +// todo: this should be just mob-interaction-panel and be a tgui interaction panel lol /** * Stripping system diff --git a/code/modules/mob/mob-inventory.dm b/code/modules/mob/mob-inventory.dm index f94f1aa66f05..6c3f3a9db9d0 100644 --- a/code/modules/mob/mob-inventory.dm +++ b/code/modules/mob/mob-inventory.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// //* Carry Weight *// @@ -8,3 +8,470 @@ /mob/proc/update_item_slowdown() return + +//* Checks / Enumerations *// + +/** + * gets the primary item in a slot + * null if not in inventory. inhands don't count as inventory here, use held item procs. + */ +/mob/proc/item_by_slot_id(slot) + return _item_by_slot(slot) // why the needless indirection? so people don't override this for slots! + +/** + * get slot of item if it's equipped. + * null if not in inventory. SLOT_HANDS if held. + */ +/mob/proc/slot_id_by_item(obj/item/I) + return is_in_inventory(I) || null // short circuited to that too + // if equipped/unequipped didn't set worn_slot well jokes on you lmfao + +/** + * gets the primary item and nested items (e.g. gloves, magboots, accessories) in a slot + * null if not in inventory, otherwise list + * inhands do not count as inventory + */ +/mob/proc/items_by_slot_id(slot) + var/obj/item/I = _item_by_slot(slot) + if(!I) + return list() + I = I.inv_slot_attached() + return islist(I)? I : list(I) + +/** + * returns if we have something equipped - the slot if it is, null if not + * + * SLOT_ID_HANDS if in hands + */ +/mob/proc/is_in_inventory(obj/item/I) + return (I?.worn_mob() == src) && I.worn_slot + // we use entirely cached vars for speed. + // if this returns bad data well fuck you, don't break equipped()/unequipped(). + +/** + * returns if an item is in inventory (equipped) rather than hands + */ +/mob/proc/is_wearing(obj/item/I) + var/slot = is_in_inventory(I) + return slot && (slot != SLOT_ID_HANDS) + +/** + * get all equipped items + * + * @params + * include_inhands - include held items too? + * include_restraints - include restraints too? + */ +/mob/proc/get_equipped_items(include_inhands, include_restraints) + return get_held_items() + _get_all_slots(include_restraints) + +// todo: below procs needs optimization for when we need the datum anyways, to avoid two lookups + +/mob/proc/has_slot(id) + SHOULD_NOT_OVERRIDE(TRUE) + return _item_by_slot(id) != INVENTORY_SLOT_DOES_NOT_EXIST + +/mob/proc/semantically_has_slot(id) + return has_slot(id) && _semantic_slot_id_check(id) + +/mob/proc/get_inventory_slot_ids(semantic, sorted) + // get all + if(sorted) + . = list() + for(var/id as anything in GLOB.inventory_slot_meta) + if(!semantically_has_slot(id)) + continue + . += id + return + else + . = _get_inventory_slot_ids() + // check if we should filter + if(!semantic) + return + . = _get_inventory_slot_ids() + for(var/id in .) + if(!_semantic_slot_id_check(id)) + . -= id + +//* Equipping *// + +/** + * checks if we can equip an item to a slot + * + * Preconditions: The item will either be equipped on us already, or not yet equipped. + * + * @return TRUE/FALSE + * + * @params + * - I - item + * - slot - slot ID + * - flags - inventory operation hint bitfield, see defines + * - user - user trying to equip that thing to us there - can be null + * - denest_to - the old slot we're leaving if called from handle_item_reequip. **extremely** snowflakey + * + * todo: refactor nesting to not require this shit + */ +/mob/proc/can_equip(obj/item/I, slot, flags, mob/user, denest_to) + // let's NOT. + if(I && QDELETED(I)) + to_chat(user, SPAN_DANGER("A deleted [I] was checked in can_equip(). Report this entire line to coders immediately. Debug data: [I] ([REF(I)]) slot [slot] flags [flags] user [user]")) + to_chat(user, SPAN_DANGER("can_equip will now attempt to prevent the deleted item from being equipped. There should be no glitches.")) + return FALSE + + var/datum/inventory_slot/slot_meta = resolve_inventory_slot(slot) + var/self_equip = user == src + if(!slot_meta) + . = FALSE + CRASH("Failed to resolve to slot datm.") + + if(slot_meta.inventory_slot_flags & INV_SLOT_IS_ABSTRACT) + // special handling: make educated guess, defaulting to yes + switch(slot_meta.type) + if(/datum/inventory_slot/abstract/hand/left) + return (flags & INV_OP_FORCE) || !get_left_held_item() + if(/datum/inventory_slot/abstract/hand/right) + return (flags & INV_OP_FORCE) || !get_right_held_item() + if(/datum/inventory_slot/abstract/put_in_backpack) + var/obj/item/thing = item_by_slot_id(SLOT_ID_BACK) + return thing?.obj_storage?.can_be_inserted(I, new /datum/event_args/actor(user), TRUE) + if(/datum/inventory_slot/abstract/put_in_belt) + var/obj/item/thing = item_by_slot_id(SLOT_ID_BACK) + return thing?.obj_storage?.can_be_inserted(I, new /datum/event_args/actor(user), TRUE) + if(/datum/inventory_slot/abstract/put_in_hands) + return (flags & INV_OP_FORCE) || !are_usable_hands_full() + return TRUE + + if(!inventory_slot_bodypart_check(I, slot, user, flags) && !(flags & INV_OP_FORCE)) + return FALSE + + var/conflict_result = inventory_slot_conflict_check(I, slot, flags) + var/obj/item/to_wear_over + + if((flags & INV_OP_IS_FINAL_CHECK) && conflict_result && (slot != SLOT_ID_HANDS)) + // try to fit over + var/obj/item/conflicting = item_by_slot_id(slot) + if(conflicting) + // there's something there + var/can_fit_over = I.equip_worn_over_check(src, slot, user, conflicting, flags) + if(can_fit_over) + conflict_result = CAN_EQUIP_SLOT_CONFLICT_NONE + to_wear_over = conflicting + // ! DANGER: snowflake time + // take it out of the slot + _unequip_slot(slot, flags | INV_OP_NO_LOGIC | INV_OP_NO_UPDATE_ICONS) + // recheck + conflict_result = inventory_slot_conflict_check(I, slot) + // put it back in incase something else breaks + _equip_slot(conflicting, slot, flags | INV_OP_NO_LOGIC | INV_OP_NO_UPDATE_ICONS) + + switch(conflict_result) + if(CAN_EQUIP_SLOT_CONFLICT_HARD) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] are already [slot_meta.display_plural? "holding too many things" : "wearing something"] [slot_meta.display_preposition] [self_equip? "your" : "their"] [slot_meta.display_name].")) + return FALSE + if(CAN_EQUIP_SLOT_CONFLICT_SOFT) + if(!(flags & INV_OP_FORCE)) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("[self_equip? "You" : "They"] are already [slot_meta.display_plural? "holding too many things" : "wearing something"] [slot_meta.display_preposition] [self_equip? "your" : "their"] [slot_meta.display_name].")) + return FALSE + + if(!inventory_slot_semantic_conflict(I, slot, user) && !(flags & INV_OP_FORCE)) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("[I] doesn't fit there.")) + return FALSE + + var/blocked_by + + if((blocked_by = inventory_slot_reachability_conflict(I, slot, user)) && !(flags & (INV_OP_FORCE | INV_OP_IGNORE_REACHABILITY))) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("\the [blocked_by] is in the way!")) + return FALSE + + // lastly, check item's opinion + if(!I.can_equip(src, slot, user, flags)) + return FALSE + + // we're the final check - side effects ARE allowed + if((flags & INV_OP_IS_FINAL_CHECK) && to_wear_over) + //! Note: this means that can_unequip is NOT called for to wear over. + //! This is intentional, but very, very sonwflakey. + to_wear_over.worn_inside = I + // setting worn inside first disallows equip/unequip from triggering + to_wear_over.forceMove(I) + // check we don't have something already (wtf) + if(I.worn_over) + handle_item_denesting(I, denest_to, flags, user) + // set the other way around + I.worn_over = to_wear_over + // tell it we're inserting the old item + I.equip_on_worn_over_insert(src, slot, user, to_wear_over, flags) + // take the old item off our screen + client?.screen -= to_wear_over + to_wear_over.screen_loc = null + to_wear_over.hud_unlayerise() + // we don't call slot re-equips here because the equip proc does this for us + + return TRUE + +/** + * equips an item to a slot if possible + * + * @params + * - I - item + * - slot - the slot + * - flags - inventory operation hint bitfield, see defines + * - user - the user doing the action, if any. defaults to ourselves. + * + * @return TRUE/FALSE + */ +/mob/proc/equip_to_slot_if_possible(obj/item/I, slot, flags, mob/user) + return _equip_item(I, flags, slot, user) + +/** + * equips an item to a slot if possible + * item is deleted on failure + * + * @params + * - I - item + * - slot - the slot + * - flags - inventory operation hint bitfield, see defines + * - user - the user doing the action, if any. defaults to ourselves. + * + * @return TRUE/FALSE + */ +/mob/proc/equip_to_slot_or_del(obj/item/I, slot, flags, mob/user) + . = equip_to_slot_if_possible(I, slot, flags, user) + if(!.) + qdel(I) +/** + * automatically equips to the best inventory (non storage!) slot we can find for an item, if possible + * this proc is silent for the sub-calls by default to prevent spam. + * + * @params + * - I - item + * - flags - inventory operation hint bitfield, see defines + * - user - the user doing the action, if any. defaults to ourselves. + * + * @return TRUE/FALSE + */ +/mob/proc/equip_to_appropriate_slot(obj/item/I, flags, mob/user) + for(var/slot in GLOB.slot_equipment_priority) + if(equip_to_slot_if_possible(I, slot, flags | INV_OP_SUPPRESS_WARNING, user)) + return TRUE + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, user == src? SPAN_WARNING("You can't find somewhere to equip [I] to!") : SPAN_WARNING("[src] has nowhere to equip [I] to!")) + return FALSE + +/** + * automatically equips to the best inventory (non storage!) slot we can find for an item, if possible + * + * item is deleted on failure. + * + * @params + * - I - item + * - flags - inventory operation hint bitfield, see defines + * - user - the user doing the action, if any. defaults to ourselves. + * + * @return TRUE/FALSE + */ + +/mob/proc/equip_to_appropriate_slot_or_del(obj/item/I, flags, mob/user) + if(!equip_to_appropriate_slot(I, flags, user)) + qdel(I) + +/** + * forcefully equips an item to a slot + * kicks out conflicting items if possible + * + * This CAN fail, so listen to return value + * Why? YOU MIGHT EQUIP TO A MOB WITHOUT A CERTAIN SLOT! + * + * @params + * - I - item + * - slot - slot to equip to + * - flags - inventory operation hint bitfield, see defines + * - user - the user doing the action, if any. defaults to ourselves. + * + * @return TRUE/FALSE + */ +/mob/proc/force_equip_to_slot(obj/item/I, slot, flags, mob/user) + return _equip_item(I, flags | INV_OP_FORCE | INV_OP_CAN_DISPLACE, slot, user) + +/** + * forcefully equips an item to a slot + * kicks out conflicting items if possible + * if still failing, item is deleted + * + * this can fail, so listen to return values. + * @params + * - I - item + * - slot - slot to equip to + * - flags - inventory operation hint bitfield, see defines + * - user - the user doing the action, if any. defaults to ourselves. + * + * @return TRUE/FALSE + */ +/mob/proc/force_equip_to_slot_or_del(obj/item/I, slot, flags, mob/user) + if(!force_equip_to_slot(I, slot, flags, user)) + qdel(I) + return FALSE + return TRUE + +//* Dropping *// + +/** + * checks if we can unequip an item + * + * Preconditions: The item is either equipped already, or isn't equipped. + * + * @return TRUE/FALSE + * + * @params + * - I - item + * - slot - slot we're unequipping from - can be null + * - flags - inventory operation hint bitfield, see defines + * - user - stripper - can be null + */ +/mob/proc/can_unequip(obj/item/I, slot, flags, mob/user = src) + // destroyed IS allowed to call these procs + if(I && QDELETED(I) && !QDESTROYING(I)) + to_chat(user, SPAN_DANGER("A deleted [I] was checked in can_unequip(). Report this entire line to coders immediately. Debug data: [I] ([REF(I)]) slot [slot] flags [flags] user [user]")) + to_chat(user, SPAN_DANGER("can_unequip will return TRUE to allow you to drop the item, but expect potential glitches!")) + return TRUE + + if(!slot) + slot = slot_id_by_item(I) + + if(!(flags & INV_OP_FORCE) && HAS_TRAIT(I, TRAIT_ITEM_NODROP)) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + var/datum/inventory_slot/slot_meta = resolve_inventory_slot(slot) + to_chat(user, SPAN_WARNING("[I] is stubbornly stuck [slot_meta.display_preposition] your [slot_meta.display_name]!")) + return FALSE + + var/blocked_by + if((blocked_by = inventory_slot_reachability_conflict(I, slot, user)) && !(flags & (INV_OP_FORCE | INV_OP_IGNORE_REACHABILITY))) + if(!(flags & INV_OP_SUPPRESS_WARNING)) + to_chat(user, SPAN_WARNING("\the [blocked_by] is in the way!")) + return FALSE + + // lastly, check item's opinion + if(!I.can_unequip(src, slot, user, flags)) + return FALSE + + return TRUE + +// So why do all of these return true if the item is null? +// Semantically, transferring/dropping nothing always works +// This lets us tidy up other pieces of code by not having to typecheck everything. +// However, if you do pass in an invalid object instead of null, the procs will fail or pass +// depending on needed behavior. +// Use the helpers when you can, it's easier for everyone and makes replacing behaviors later easier. + +// This logic is actually **stricter** than the previous logic, which was "if item doesn't exist, it always works" + +// todo: yeah this is pretty bad huh; this is because new hand crap is properly refactored and we aren't +// so this is just a wrapper to route stuff around while we slowly refactor inventory. +/datum/inventory/proc/drop_item_to_ground(obj/item/I, inv_op_flags, datum/event_args/actor/actor) + if(!actor) + actor = E_ARGS_WRAP_USER_TO_ACTOR(actor || src) + return owner.drop_item_to_ground(I, inv_op_flags, actor?.performer) + +/** + * drops an item to ground + * + * semantically returns true if the thing is no longer in our inventory after our call, whether or not we dropped it + * if you require better checks, check if something is in inventory first. + * + * if the item is null, this returns true + * if an item is not in us, this returns true + */ +/mob/proc/drop_item_to_ground(obj/item/I, flags, mob/user = src) + // destroyed IS allowed to call these procs + if(I && QDELETED(I) && !QDESTROYING(I)) + to_chat(user, SPAN_DANGER("A deleted item [I] was used in drop_item_to_ground(). Report the entire line to coders. Debugging information: [I] ([REF(I)]) flags [flags] user [user]")) + to_chat(user, SPAN_DANGER("Drop item to ground will now proceed, ignoring the bugged state. Errors may ensue.")) + else if(!is_in_inventory(I)) + return TRUE + return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, drop_location(), user) + +/** + * transfers an item somewhere + * newloc MUST EXIST, use transfer_item_to_nullspace otherwise + * + * semantically returns true if we transferred something from our inventory to newloc in the call + * + * if the item is null, this returns true + * if an item is not in us, this crashes + */ +/mob/proc/transfer_item_to_loc(obj/item/I, newloc, flags, mob/user) + if(!I) + return TRUE + ASSERT(newloc) + if(!is_in_inventory(I)) + return FALSE + return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, newloc, user) + +/** + * transfers an item into nullspace + * + * semantically returns true if we transferred something from our inventory to null in the call + * + * if the item is null, this returns true + * if an item is not in us, this crashes + */ +/mob/proc/transfer_item_to_nullspace(obj/item/I, flags, mob/user) + if(!I) + return TRUE + if(!is_in_inventory(I)) + return FALSE + return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, null, user) + +/** + * removes an item from inventory. does NOT move it. + * item MUST be qdel'd or moved after this if it returns TRUE! + * + * semantically returns true if the passed item is no longer in our inventory after the call + * + * if the item is null, ths returns true + * if an item is not in us, this returns true + */ +/mob/proc/temporarily_remove_from_inventory(obj/item/I, flags, mob/user) + if(!is_in_inventory(I)) + return TRUE + return _unequip_item(I, flags | INV_OP_DIRECTLY_DROPPING, FALSE, user) + +//* MasS Operations *// + +/** + * drops everything in our inventory + * + * @params + * - include_inhands - include held items too? + * - include_restraints - include restraints too? + * - force - ignore nodrop and all that + */ +/mob/proc/drop_inventory(include_inhands = TRUE, include_restraints = TRUE, force = TRUE) + for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) + drop_item_to_ground(I, INV_OP_SILENT | INV_OP_FLUFFLESS | (force? INV_OP_FORCE : NONE)) + + // todo: handle what happens if dropping something requires a logic thing + // e.g. dropping jumpsuit makes it impossible to transfer a belt since it + // de-equipped from the jumpsuit + +/mob/proc/transfer_inventory_to_loc(atom/newLoc, include_inhands = TRUE, include_restraints = TRUE, force = TRUE) + for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) + transfer_item_to_loc(I, newLoc, INV_OP_SILENT | INV_OP_FLUFFLESS | (force? INV_OP_FORCE : NONE)) + // todo: handle what happens if dropping something requires a logic thing + // e.g. dropping jumpsuit makes it impossible to transfer a belt since it + // de-equipped from the jumpsuit + +/** + * wipe our inventory + * + * @params + * include_inhands - include held items too? + * include_restraints - include restraints too? + */ +/mob/proc/delete_inventory(include_inhands = TRUE, include_restraints = TRUE) + for(var/obj/item/I as anything in get_equipped_items(include_inhands, include_restraints)) + qdel(I) From 1054f5a2dca5ac5b1117eb6892068084e2e88701 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 17 Sep 2024 17:09:57 +0000 Subject: [PATCH 074/140] that --- code/__DEFINES/inventory/procs.dm | 5 +- .../mob/inventory/inventory-hands-put.dm | 80 ++++++++++++++----- code/modules/mob/inventory/inventory.dm | 7 +- code/modules/mob/mob-inventory.dm | 5 ++ 4 files changed, 68 insertions(+), 29 deletions(-) diff --git a/code/__DEFINES/inventory/procs.dm b/code/__DEFINES/inventory/procs.dm index f569fd24db66..4749999eb0d1 100644 --- a/code/__DEFINES/inventory/procs.dm +++ b/code/__DEFINES/inventory/procs.dm @@ -49,13 +49,16 @@ /// no sound, warnings, etc, entirely #define INV_OP_SILENT (INV_OP_SUPPRESS_SOUND | INV_OP_SUPPRESS_WARNING) -// todo: INV_OP_RECRUSE +// todo: INV_OP_RECURSE for nested / worn-over pieces //* Inventory Return Flags *// +// todo: should these be flags? maybe they should just be an enum? + /// Failed /// /// * Yes, on a failure, we just return null. +/// * This is to fail truthy checks, and be a valid switch() return. #define INV_RETURN_FAILED null /// Success #define INV_RETURN_SUCCESS (1<<0) diff --git a/code/modules/mob/inventory/inventory-hands-put.dm b/code/modules/mob/inventory/inventory-hands-put.dm index 27de2522aa85..8ee1d447f349 100644 --- a/code/modules/mob/inventory/inventory-hands-put.dm +++ b/code/modules/mob/inventory/inventory-hands-put.dm @@ -7,10 +7,16 @@ //* and the enforcement of 'mob.inventory' access, but given the overhead of *// //* a proc-call, this is currently not done. *// -#warn mirror & check below +// todo: return INV_RETURN_* +/datum/inventory/proc/put_in_hand(obj/item/I, index, inv_op_flags) + #warn impl & below + +/mob/proc/put_in_hand(obj/item/I, index, inv_op_flags) + return equip_hand_impl(I, index, inv_op_flags) -/mob/proc/put_in_hand(obj/item/I, index, flags) - return equip_hand_impl(I, index, flags) +// todo: return INV_RETURN_* +/datum/inventory/proc/put_in_hands(obj/item/I, inv_op_flags) + #warn impl & below /mob/proc/put_in_hands(obj/item/I, flags) if(is_holding(I)) @@ -26,16 +32,40 @@ return put_in_active_hand(I, flags) || put_in_inactive_hand(I, flags) /** - * put in hands or forcemove to drop location - * allows an optional param for where to drop on fail + * puts an item in hands or forcemoves to drop_loc + * + * * drop_loc defaults to the owner's location, if any owner is there. + * * not having a valid drop_loc is a runtime error. * - * @return TRUE/FALSE based on put in hand or dropped to ground + * @return INV_RETURN_* */ -/mob/proc/put_in_hands_or_drop(obj/item/I, flags, atom/drop_loc = drop_location()) - if(!put_in_hands(I, flags)) +/datum/inventory/proc/put_in_hands_or_drop(obj/item/I, inv_op_flags, atom/drop_loc) + if(isnull(drop_loc)) + drop_loc = owner?.drop_location() + if(isnull(drop_loc)) + CRASH("invalid drop location; placing stuff into nullspace is usually an error.") + + var/result = put_in_hands(I, inv_op_flags) + + // todo: switch(result) once put_in_hands uses INV_RETURN_*; convert this + if(!result) I.forceMove(drop_loc) - return FALSE - return TRUE + return INV_RETURN_FAILED + return INV_RETURN_SUCCESS + +/** + * puts an item in hands or forcemoves to drop_loc + * + * * drop_loc defaults to the owner's location, if any owner is there. + * * not having a valid drop_loc is a runtime error. + * + * @return INV_RETURN_* + */ +/mob/proc/put_in_hands_or_drop(obj/item/I, inv_op_flags, atom/drop_loc) + // inventory null --> INV_RETURN_FAILED, as that's also #define'd to be null + return inventory?.put_in_hands_or_drop(I, inv_op_flags, drop_loc) + +#warn mirror & check below /** * put in hands or del @@ -48,18 +78,6 @@ return FALSE return TRUE -/mob/proc/put_in_left_hand(obj/item/I, flags) - for(var/i in 1 to length(inventory?.held_items) step 2) - if(put_in_hand(I, i, flags)) - return TRUE - return FALSE - -/mob/proc/put_in_right_hand(obj/item/I, flags) - for(var/i in 1 to length(inventory?.held_items) step 2) - if(put_in_hand(I, i, flags)) - return TRUE - return FALSE - /mob/proc/put_in_hand_or_del(obj/item/I, index, flags) . = put_in_hand(I, index, flags) if(!.) @@ -69,3 +87,21 @@ . = put_in_hand(I, index, flags) if(!.) I.forceMove(drop_loc) + +#warn mirror & check above + +//* By Side *// +//* This is not on /datum/inventory level as *// +//* oftentimes a mob has no semantic 'sided hands'. *// + +/mob/proc/put_in_left_hand(obj/item/I, inv_op_flags) + for(var/i in 1 to length(inventory?.held_items) step 2) + if(put_in_hand(I, i, inv_op_flags)) + return TRUE + return FALSE + +/mob/proc/put_in_right_hand(obj/item/I, flags) + for(var/i in 1 to length(inventory?.held_items) step 2) + if(put_in_hand(I, i, inv_op_flags)) + return TRUE + return FALSE diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 776e259f434d..24d1941365be 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -102,12 +102,7 @@ #warn hook above 3 -//? init - -/mob/proc/init_inventory() - return - -//! unsorted below +//! unsorted / legacy below /mob/proc/handle_item_denesting(obj/item/I, old_slot, flags, mob/user) // if the item was inside something, diff --git a/code/modules/mob/mob-inventory.dm b/code/modules/mob/mob-inventory.dm index 6c3f3a9db9d0..68bf727a785f 100644 --- a/code/modules/mob/mob-inventory.dm +++ b/code/modules/mob/mob-inventory.dm @@ -1,6 +1,11 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2024 Citadel Station Developers *// +//* Init *// + +/mob/proc/init_inventory() + return + //* Carry Weight *// /mob/proc/update_carry_slowdown() From b1c79687322c9a03cbf51504a09396f642b8a38c Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 18 Sep 2024 10:41:06 -0400 Subject: [PATCH 075/140] fix --- code/game/rendering/mob_huds/mob_hud.dm | 2 +- code/game/rendering/screen_legacy.dm | 3 --- code/modules/mob/grab.dm | 18 +----------------- .../mob/inventory/inventory-hands-get.dm | 2 +- .../mob/inventory/inventory-hands-put.dm | 2 +- 5 files changed, 4 insertions(+), 23 deletions(-) diff --git a/code/game/rendering/mob_huds/mob_hud.dm b/code/game/rendering/mob_huds/mob_hud.dm index 53bfcab15a22..b3dcf607f384 100644 --- a/code/game/rendering/mob_huds/mob_hud.dm +++ b/code/game/rendering/mob_huds/mob_hud.dm @@ -11,7 +11,7 @@ * * "but this is so low level it's hard to use for remote control"; that's what later on /datum/remote_control is for! * * mob_hud does not track screens/images unlike perspective! these are mostly stateless as they're externally synchronized. */ -/datum/mob_hud# +/datum/mob_hud /// mob we're for (aka rendering the state of) var/mob/owner /// users using us diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index 72d280963708..f27f0748cdb1 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -425,9 +425,6 @@ var/darkness = round(1 - T.get_lumcount(),0.1) to_chat(usr,"Darkness: [darkness]") if("energy") - var/mob/living/simple_mob/shadekin/SK = usr - if(istype(SK)) - to_chat(usr,"Energy: [SK.energy] ([SK.dark_gains])") var/mob/living/carbon/human/H = usr if(istype(H) && istype(H.species, /datum/species/shadekin)) to_chat(usr,"Energy: [H.shadekin_get_energy(H)]") diff --git a/code/modules/mob/grab.dm b/code/modules/mob/grab.dm index 86a80c0515c5..0ceb80369444 100644 --- a/code/modules/mob/grab.dm +++ b/code/modules/mob/grab.dm @@ -33,25 +33,9 @@ CRASH("infinite loop guard tripped") . = L for(var/obj/item/grab/G in get_held_items()) - if(.[G.affecting] >= G.state) - continue .[G.affecting] = max(.[G.affecting], G.state) G.affecting.get_grabbing_recursive(., --safety, processed) -/** - * returns everyone we're grabbing, recursively; this can include ourselves! - */ -/mob/proc/grabbing_recursive_flat(list/L = list()) - RETURN_TYPE(/list) - if(src in L) - return - . = L - for(var/obj/item/grab/G in get_held_items()) - if(G.affecting in .) - continue - . |= G.affecting - grabbing_recursive(G.affecting) - /** * check the grab state of us to someone * @@ -187,7 +171,7 @@ if(state <= GRAB_AGGRESSIVE) allow_upgrade = 1 //disallow upgrading if we're grabbing more than one person - if(length(assailant.grabbing()) > 1) + if(length(assailant.get_grabbing()) > 1) allow_upgrade = 0 //disallow upgrading past aggressive if we're being grabbed aggressively diff --git a/code/modules/mob/inventory/inventory-hands-get.dm b/code/modules/mob/inventory/inventory-hands-get.dm index a6e4d82eafc9..633215f45f56 100644 --- a/code/modules/mob/inventory/inventory-hands-get.dm +++ b/code/modules/mob/inventory/inventory-hands-get.dm @@ -104,7 +104,7 @@ /** * @return list of held items of type */ -/datum/inventory/proc/get_held_items_of_type(type) +/mob/proc/get_held_items_of_type(type) RETURN_TYPE(/list) . = list() for(var/obj/item/I as anything in inventory?.held_items) diff --git a/code/modules/mob/inventory/inventory-hands-put.dm b/code/modules/mob/inventory/inventory-hands-put.dm index 8ee1d447f349..09f203a6addb 100644 --- a/code/modules/mob/inventory/inventory-hands-put.dm +++ b/code/modules/mob/inventory/inventory-hands-put.dm @@ -100,7 +100,7 @@ return TRUE return FALSE -/mob/proc/put_in_right_hand(obj/item/I, flags) +/mob/proc/put_in_right_hand(obj/item/I, inv_op_flags) for(var/i in 1 to length(inventory?.held_items) step 2) if(put_in_hand(I, i, inv_op_flags)) return TRUE From ed01e9967d6ca9622104a61ba52ef7d5a2ff7fa8 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 18 Sep 2024 15:44:29 +0000 Subject: [PATCH 076/140] That --- code/__DEFINES/inventory/hud.dm | 14 +-- .../mob/inventory/inventory-hands-put.dm | 64 +++++++------ code/modules/mob/inventory/inventory_slot.dm | 89 +++++++++++++++---- 3 files changed, 114 insertions(+), 53 deletions(-) diff --git a/code/__DEFINES/inventory/hud.dm b/code/__DEFINES/inventory/hud.dm index 83101edacc26..16092a175a1e 100644 --- a/code/__DEFINES/inventory/hud.dm +++ b/code/__DEFINES/inventory/hud.dm @@ -4,21 +4,25 @@ //* inventory_hud_anchor *// /// anchor to the main inventory drawer -/// +/// /// * main axis runs towards the middle of screen on Y axis /// * cross axis runs towards the middle of screen on X axis /// * both main and cross cannot be 0, as that is where the drawer button is -/// -/// * valid main-axis indices: >= 0 -/// * valid cross-axis indices: >= 0 +/// +/// * valid main-axis indices: >= 0, cross-axis != 0 if 0 +/// * valid cross-axis indices: >= 0, main-axis != 0 if 0 #define INVENTORY_HUD_ANCHOR_TO_DRAWER "drawer" /// anchor to next to hands panel /// /// * main axis runs left/right of hands /// * cross axis runs away from edge of screen of hands -/// +/// /// * valid main-axis indices: != 0 /// * valid cross-axis indices: >= 0 #define INVENTORY_HUD_ANCHOR_TO_HANDS "hands" +/// automatic - shove it in anywhere we can +/// +/// * axis cannot be specified for this +#define INVENTORY_HUD_ANCHOR_AUTOMATIC "automatic" #warn impl all diff --git a/code/modules/mob/inventory/inventory-hands-put.dm b/code/modules/mob/inventory/inventory-hands-put.dm index 09f203a6addb..500723aa5a9b 100644 --- a/code/modules/mob/inventory/inventory-hands-put.dm +++ b/code/modules/mob/inventory/inventory-hands-put.dm @@ -7,18 +7,15 @@ //* and the enforcement of 'mob.inventory' access, but given the overhead of *// //* a proc-call, this is currently not done. *// -// todo: return INV_RETURN_* /datum/inventory/proc/put_in_hand(obj/item/I, index, inv_op_flags) - #warn impl & below + #warn impl & below, INV_RETURN_* + return equip_hand_impl(I, index, inv_op_flags) /mob/proc/put_in_hand(obj/item/I, index, inv_op_flags) - return equip_hand_impl(I, index, inv_op_flags) + return inventory?.put_in_hand(I, index, inv_op_flags) -// todo: return INV_RETURN_* /datum/inventory/proc/put_in_hands(obj/item/I, inv_op_flags) - #warn impl & below - -/mob/proc/put_in_hands(obj/item/I, flags) + #warn impl & below, INV_RETURN_* if(is_holding(I)) return TRUE @@ -31,21 +28,25 @@ return put_in_active_hand(I, flags) || put_in_inactive_hand(I, flags) +/mob/proc/put_in_hands(obj/item/I, inv_op_flags) + return inventory?.put_in_hands(I, inv_op_flags) + /** * puts an item in hands or forcemoves to drop_loc * + * * if 'specific_index' is specified, this only tries to go to that hand index. * * drop_loc defaults to the owner's location, if any owner is there. * * not having a valid drop_loc is a runtime error. * * @return INV_RETURN_* */ -/datum/inventory/proc/put_in_hands_or_drop(obj/item/I, inv_op_flags, atom/drop_loc) +/datum/inventory/proc/put_in_hands_or_drop(obj/item/I, inv_op_flags, atom/drop_loc, specific_index) if(isnull(drop_loc)) drop_loc = owner?.drop_location() if(isnull(drop_loc)) CRASH("invalid drop location; placing stuff into nullspace is usually an error.") - var/result = put_in_hands(I, inv_op_flags) + var/result = specific_index ? put_in_hand(I, specific_index, inv_op_flags) : put_in_hands(I, inv_op_flags) // todo: switch(result) once put_in_hands uses INV_RETURN_*; convert this if(!result) @@ -56,39 +57,44 @@ /** * puts an item in hands or forcemoves to drop_loc * + * * if 'specific_index' is specified, this only tries to go to that hand index. * * drop_loc defaults to the owner's location, if any owner is there. * * not having a valid drop_loc is a runtime error. * * @return INV_RETURN_* */ -/mob/proc/put_in_hands_or_drop(obj/item/I, inv_op_flags, atom/drop_loc) +/mob/proc/put_in_hands_or_drop(obj/item/I, inv_op_flags, atom/drop_loc, specific_index) // inventory null --> INV_RETURN_FAILED, as that's also #define'd to be null - return inventory?.put_in_hands_or_drop(I, inv_op_flags, drop_loc) - -#warn mirror & check below + return inventory?.put_in_hands_or_drop(I, inv_op_flags, drop_loc, specific_index) /** - * put in hands or del + * puts an item in hands or deletes it * - * @return TRUE/FALSE based on put in hand or del'd + * * if 'specific_index' is specified, this only tries to go to that hand index. + * + * @return INV_RETURN_* */ -/mob/proc/put_in_hands_or_del(obj/item/I, flags) - if(!put_in_hands(I, flags)) - qdel(I) - return FALSE - return TRUE +/datum/inventory/proc/put_in_hands_or_del(obj/item/I, inv_op_flags, specific_index) + var/result = specific_index ? put_in_hand(I, specific_index, inv_op_flags) : put_in_hands(I, inv_op_flags) -/mob/proc/put_in_hand_or_del(obj/item/I, index, flags) - . = put_in_hand(I, index, flags) - if(!.) + // todo: switch(result) once put_in_hands uses INV_RETURN_*; convert this + if(!result) qdel(I) + return INV_RETURN_FAILED + return INV_RETURN_SUCCESS -/mob/proc/put_in_hand_or_drop(obj/item/I, index, flags, atom/drop_loc = drop_location()) - . = put_in_hand(I, index, flags) - if(!.) - I.forceMove(drop_loc) - -#warn mirror & check above +/** + * puts an item in hands or deletes it + * + * * if 'specific_index' is specified, this only tries to go to that hand index. + * + * @return INV_RETURN_* + */ +/mob/proc/put_in_hands_or_del(obj/item/I, inv_op_flags, specific_index) + if(inventory) + return inventory.put_in_hands_or_del(I, inv_op_flags, specific_index) + qdel(I) + return INV_RETURN_FAILED //* By Side *// //* This is not on /datum/inventory level as *// diff --git a/code/modules/mob/inventory/inventory_slot.dm b/code/modules/mob/inventory/inventory_slot.dm index 5f5357e2a12b..7a7d2388ef82 100644 --- a/code/modules/mob/inventory/inventory_slot.dm +++ b/code/modules/mob/inventory/inventory_slot.dm @@ -97,10 +97,12 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) var/sort_order = 0 //* HUD - /// our screen loc - var/hud_position - #warn uh oh! - /// our nominal + /// our anchoring enum + var/inventory_hud_anchor = INVENTORY_HUD_ANCHOR_AUTOMATIC + /// preferred main axis offset + var/inventory_hud_main_axis = 0 + /// preferred cross axis offset + var/inventory_hud_cross_axis = 0 //* Grammar /// player friendly name @@ -268,7 +270,10 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) sort_order = 2000 display_name = "back" display_preposition = "on" - hud_position = ui_back + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS + inventory_hud_main_axis = -1 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN slot_flags_required = SLOT_BACK @@ -290,7 +295,10 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) sort_order = 5000 display_name = "body" display_preposition = "on" - hud_position = ui_iclothing + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_main_axis = 1 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_ICLOTHING inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_HUD_REQUIRES_EXPAND | INV_SLOT_CONSIDERED_WORN @@ -414,7 +422,11 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) sort_order = 10000 display_name = "head" display_preposition = "on" - hud_position = ui_head + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_main_axis = 4 + inventory_hud_cross_axis = 1 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_HEAD inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_HUD_REQUIRES_EXPAND | INV_SLOT_CONSIDERED_WORN @@ -450,7 +462,10 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) display_name = "suit" display_preposition = "over" - hud_position = ui_oclothing + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_main_axis = 1 + inventory_hud_cross_axis = 1 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_OCLOTHING inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_HUD_REQUIRES_EXPAND | INV_SLOT_CONSIDERED_WORN @@ -518,7 +533,10 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) sort_order = 6000 display_name = "waist" display_preposition = "on" - hud_position = ui_belt + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_cross_axis = 4 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_BELT inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN @@ -550,14 +568,19 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) id = SLOT_ID_LEFT_POCKET display_name = "left pocket" display_preposition = "in" - hud_position = ui_storage1 + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS + inventory_hud_main_axis = 1 /datum/inventory_slot/inventory/pocket/right name = "right pocket" id = SLOT_ID_RIGHT_POCKET display_name = "right pocket" display_preposition = "in" - hud_position = ui_storage2 + + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS + inventory_hud_main_axis = 2 /datum/inventory_slot/inventory/id name = "id" @@ -566,7 +589,10 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) sort_order = 3000 display_name = "badge" display_preposition = "as" - hud_position = ui_id + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_cross_axis = 3 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_ID inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN @@ -597,7 +623,10 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) sort_order = 4000 display_name = "feet" display_preposition = "on" - hud_position = ui_shoes + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_cross_axis = 3 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_FEET inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN | INV_SLOT_HUD_REQUIRES_EXPAND @@ -633,7 +662,11 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) sort_order = 6500 display_name = "hands" display_preposition = "on" - hud_position = ui_gloves + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_main_axis = 1 + inventory_hud_cross_axis = 2 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_GLOVES inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN | INV_SLOT_HUD_REQUIRES_EXPAND @@ -656,7 +689,10 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) sort_order = 7500 display_name = "eyes" display_preposition = "over" - hud_position = ui_glasses + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_main_axis = 2 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_EYES inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN | INV_SLOT_HUD_REQUIRES_EXPAND @@ -679,7 +715,10 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) sort_order = 500 display_name = "suit" display_preposition = "on" - hud_position = ui_sstore1 + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_cross_axis = 2 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_PROC inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE render_layer = HUMAN_LAYER_SLOT_SUITSTORE @@ -728,7 +767,11 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) id = SLOT_ID_LEFT_EAR display_name = "left ear" display_preposition = "on" - hud_position = ui_l_ear + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_main_axis = 3 + inventory_hud_cross_axis = 2 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_EARS @@ -738,7 +781,11 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) id = SLOT_ID_RIGHT_EAR display_name = "right ear" display_preposition = "on" - hud_position = ui_r_ear + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_main_axis = 4 + inventory_hud_cross_axis = 2 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_EARS render_layer = HUMAN_LAYER_SLOT_EARS @@ -750,7 +797,11 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) sort_order = 9250 display_name = "face" display_preposition = "on" - hud_position = ui_mask + + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_main_axis = 3 + inventory_hud_cross_axis = 1 + slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_MASK render_default_icons = list( From f138abf7917d146ca15011df35b50d4d54cdf8e8 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 18 Sep 2024 15:56:46 +0000 Subject: [PATCH 077/140] that --- code/__DEFINES/screen.dm | 14 -------------- code/game/objects/items/offhand.dm | 8 ++++---- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/code/__DEFINES/screen.dm b/code/__DEFINES/screen.dm index cdcd26321b34..36428fed6213 100644 --- a/code/__DEFINES/screen.dm +++ b/code/__DEFINES/screen.dm @@ -35,20 +35,6 @@ #warn deal with this crap -//Pop-up inventory -#define ui_shoes "LEFT+1:8,BOTTOM:5" - -#define ui_iclothing "LEFT:6,BOTTOM+1:7" -#define ui_oclothing "LEFT+1:8,BOTTOM+1:7" -#define ui_gloves "LEFT+2:10,BOTTOM+1:7" - -#define ui_glasses "LEFT:6,BOTTOM+2:9" -#define ui_mask "LEFT+1:8,BOTTOM+2:9" -#define ui_l_ear "LEFT+2:10,BOTTOM+2:9" -#define ui_r_ear "LEFT+2:10,BOTTOM+3:11" - -#define ui_head "LEFT+1:8,BOTTOM+3:11" - /// Hands #define SCREEN_LOC_INV_HAND(index) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" #define ui_swaphand1 "CENTER-1:16,BOTTOM+1:5" diff --git a/code/game/objects/items/offhand.dm b/code/game/objects/items/offhand.dm index e19c0fa67f0a..b6206497aca3 100644 --- a/code/game/objects/items/offhand.dm +++ b/code/game/objects/items/offhand.dm @@ -28,15 +28,15 @@ * @params * - type - the type of the offhand * - index - hand index; null for any - * - flags - inv flags + * - inv_op_flags - inv flags * - ... - the rest of the args are passed into New() of the offhand. */ -/mob/proc/allocate_offhand(type, index, flags, ...) +/mob/proc/allocate_offhand(type, index, inv_op_flags, ...) RETURN_TYPE(/obj/item/offhand) var/obj/item/offhand/O = new type(arglist(list(src) + args.Copy(4))) if(index) - if(put_in_hand_or_del(O, index, flags)) + if(put_in_hands_or_del(O, inv_op_flags, index)) return O else - if(put_in_hands_or_del(O, flags)) + if(put_in_hands_or_del(O, inv_op_flags)) return O From 9476a6754d7f7fd540a276917a335ced7d9cf70c Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 18 Sep 2024 18:37:12 +0000 Subject: [PATCH 078/140] that --- code/__DEFINES/inventory/hud.dm | 20 ++++++- code/game/rendering/hud_style.dm | 55 +++++++++++++++--- code/modules/frames/frame.dm | 2 +- code/modules/mob/inventory/inventory_slot.dm | 18 +++++- .../species/promethean/promethean_blob.dm | 2 +- code/modules/species/protean/protean_blob.dm | 2 +- code/modules/species/species.dm | 23 ++++++++ code/modules/species/species_hud.dm | 20 ------- code/modules/species/station/adherent.dm | 35 +++++++---- code/modules/species/station/diona.dm | 29 +++++++++ code/modules/species/station/monkey.dm | 17 ++++++ icons/mob/screen1_Midnight.dmi | Bin 142240 -> 84403 bytes icons/screen/hud/hologram/inventory-wide.dmi | Bin 0 -> 444 bytes icons/screen/hud/hologram/inventory.dmi | Bin 1117 -> 1094 bytes icons/screen/hud/hologram/inventory_wide.dmi | Bin 437 -> 0 bytes icons/screen/hud/midnight/inventory-slot.dmi | Bin 0 -> 13726 bytes icons/screen/hud/midnight/inventory-wide.dmi | Bin 0 -> 506 bytes icons/screen/hud/midnight/inventory.dmi | Bin 2156 -> 4188 bytes icons/screen/hud/midnight/inventory_wide.dmi | Bin 517 -> 0 bytes .../screen/hud/minimalist/inventory-wide.dmi | Bin 0 -> 442 bytes icons/screen/hud/minimalist/inventory.dmi | Bin 1167 -> 1105 bytes .../screen/hud/minimalist/inventory_wide.dmi | Bin 446 -> 0 bytes icons/screen/hud/old/inventory-wide.dmi | Bin 0 -> 465 bytes icons/screen/hud/old/inventory.dmi | Bin 1406 -> 1389 bytes icons/screen/hud/old/inventory_wide.dmi | Bin 460 -> 0 bytes icons/screen/hud/orange/inventory-wide.dmi | Bin 0 -> 644 bytes icons/screen/hud/orange/inventory.dmi | Bin 2970 -> 3237 bytes icons/screen/hud/orange/inventory_wide.dmi | Bin 658 -> 0 bytes icons/screen/hud/white/inventory-wide.dmi | Bin 0 -> 591 bytes icons/screen/hud/white/inventory.dmi | Bin 1120 -> 2354 bytes icons/screen/hud/white/inventory_wide.dmi | Bin 373 -> 0 bytes 31 files changed, 181 insertions(+), 42 deletions(-) create mode 100644 icons/screen/hud/hologram/inventory-wide.dmi delete mode 100644 icons/screen/hud/hologram/inventory_wide.dmi create mode 100644 icons/screen/hud/midnight/inventory-slot.dmi create mode 100644 icons/screen/hud/midnight/inventory-wide.dmi delete mode 100644 icons/screen/hud/midnight/inventory_wide.dmi create mode 100644 icons/screen/hud/minimalist/inventory-wide.dmi delete mode 100644 icons/screen/hud/minimalist/inventory_wide.dmi create mode 100644 icons/screen/hud/old/inventory-wide.dmi delete mode 100644 icons/screen/hud/old/inventory_wide.dmi create mode 100644 icons/screen/hud/orange/inventory-wide.dmi delete mode 100644 icons/screen/hud/orange/inventory_wide.dmi create mode 100644 icons/screen/hud/white/inventory-wide.dmi delete mode 100644 icons/screen/hud/white/inventory_wide.dmi diff --git a/code/__DEFINES/inventory/hud.dm b/code/__DEFINES/inventory/hud.dm index 16092a175a1e..7a695fc6cae7 100644 --- a/code/__DEFINES/inventory/hud.dm +++ b/code/__DEFINES/inventory/hud.dm @@ -25,4 +25,22 @@ /// * axis cannot be specified for this #define INVENTORY_HUD_ANCHOR_AUTOMATIC "automatic" -#warn impl all +//* inventory_hud_class *// + +/// always visible +#define INVENTORY_HUD_CLASS_ALWAYS "always" +/// only when drawer is open +#define INVENTORY_HUD_CLASS_DRAWER "drawer" + +//* inventory slot remappings for species *// + +/// inventory_hud_main_axis +#define INVENTORY_SLOT_REMAP_MAIN_AXIS "main-axis" +/// inventory_hud_cross_axis +#define INVENTORY_SLOT_REMAP_CROSS_AXIS "cross-axis" +/// name +#define INVENTORY_SLOT_REMAP_NAME "name" +/// inventory_hud_class +#define INVENTORY_SLOT_REMAP_CLASS "class" +/// inventory_hud_anchor +#define INVENTORY_SLOT_REMAP_ANCHOR "anchor" diff --git a/code/game/rendering/hud_style.dm b/code/game/rendering/hud_style.dm index 78bed8304a1b..b621290cd0ab 100644 --- a/code/game/rendering/hud_style.dm +++ b/code/game/rendering/hud_style.dm @@ -11,7 +11,41 @@ GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) .[initial(path.id)] = new path /** - * default values are on /datum/hud_style + * # HUD Style + * + * Holds data on HUD styles + * + * * default values are on /datum/hud_style + * + * ## Icons + * + * ### inventory.dmi + * + * Mandatory: + * + * * button-equip: used as equip button + * + * * hand-left: self explanatory + * * hand-left-active: self explanatory + * * hand-right: self explanatory + * * hand-right-active: self explanatory + * + * * drawer: inactive inventory drawer + * * drawer-active: active inventory drawer + * + * ### inventory-slot.dmi + * + * Mandatory: + * + * * : used as default slot render + * + * Optional: + * + * * : states are matched to inventory slot by BYOND to render. + * + * ### inventory-wide.dmi + * + * * hand-swap: swap hands button */ /datum/hud_style abstract_type = /datum/hud_style @@ -22,8 +56,10 @@ GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) /// inventory icons var/inventory_icons = 'icons/screen/hud/midnight/inventory.dmi' + /// inventory icons: slots + var/inventory_icons_slot = 'icons/screen/hud/midnight/inventory-slot.dmi' /// inventory icons: big - var/inventory_icons_wide = 'icons/screen/hud/midnight/inventory_wide.dmi' + var/inventory_icons_wide = 'icons/screen/hud/midnight/inventory-wide.dmi' /** * midnight style just inherits defaults @@ -34,24 +70,29 @@ GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) /datum/hud_style/orange id = "orange" inventory_icons = 'icons/screen/hud/orange/inventory.dmi' - inventory_icons_wide = 'icons/screen/hud/orange/inventory_wide.dmi' + inventory_icons_slot = 'icons/screen/hud/orange/inventory-slot.dmi' + inventory_icons_wide = 'icons/screen/hud/orange/inventory-wide.dmi' /datum/hud_style/old id = "old" inventory_icons = 'icons/screen/hud/old/inventory.dmi' - inventory_icons_wide = 'icons/screen/hud/old/inventory_wide.dmi' + inventory_icons_slot = 'icons/screen/hud/old/inventory-slot.dmi' + inventory_icons_wide = 'icons/screen/hud/old/inventory-wide.dmi' /datum/hud_style/white id = "white" inventory_icons = 'icons/screen/hud/white/inventory.dmi' - inventory_icons_wide = 'icons/screen/hud/white/inventory_wide.dmi' + inventory_icons_slot = 'icons/screen/hud/white/inventory-slot.dmi' + inventory_icons_wide = 'icons/screen/hud/white/inventory-wide.dmi' /datum/hud_style/minimalist id = "minimalist" inventory_icons = 'icons/screen/hud/minimalist/inventory.dmi' - inventory_icons_wide = 'icons/screen/hud/minimalist/inventory_wide.dmi' + inventory_icons_slot = 'icons/screen/hud/minimalist/inventory-slot.dmi' + inventory_icons_wide = 'icons/screen/hud/minimalist/inventory-wide.dmi' /datum/hud_style/hologram id = "hologram" inventory_icons = 'icons/screen/hud/hologram/inventory.dmi' - inventory_icons_wide = 'icons/screen/hud/hologram/inventory_wide.dmi' + inventory_icons_slot = 'icons/screen/hud/hologram/inventory-slot.dmi' + inventory_icons_wide = 'icons/screen/hud/hologram/inventory-wide.dmi' diff --git a/code/modules/frames/frame.dm b/code/modules/frames/frame.dm index 395c5beada8c..b6628a0e079f 100644 --- a/code/modules/frames/frame.dm +++ b/code/modules/frames/frame.dm @@ -237,7 +237,7 @@ GLOBAL_LIST_INIT(frame_datum_lookup, init_frame_datums()) var/obj/item/frame2/collapsed if(actor?.performer && put_in_hand_if_possible) collapsed = new(actor.performer, src) - actor.performer.put_in_hand_or_drop(collapsed) + actor.performer.put_in_hands_or_drop(collapsed) else collapsed = new(frame.drop_location(), src) return collapsed diff --git a/code/modules/mob/inventory/inventory_slot.dm b/code/modules/mob/inventory/inventory_slot.dm index 7a7d2388ef82..1fc07b864a29 100644 --- a/code/modules/mob/inventory/inventory_slot.dm +++ b/code/modules/mob/inventory/inventory_slot.dm @@ -103,6 +103,8 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) var/inventory_hud_main_axis = 0 /// preferred cross axis offset var/inventory_hud_cross_axis = 0 + /// hud icon state in hud style + var/inventory_hud_icon_state = "" //* Grammar /// player friendly name @@ -273,6 +275,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS inventory_hud_main_axis = -1 + inventory_hud_icon_state = "back" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_CONSIDERED_WORN @@ -298,6 +301,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 1 + inventory_hud_icon_state = "uniform" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_ICLOTHING @@ -426,6 +430,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 4 inventory_hud_cross_axis = 1 + inventory_hud_icon_state = "head" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_HEAD @@ -465,6 +470,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 1 inventory_hud_cross_axis = 1 + inventory_hud_icon_state = "suit" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_OCLOTHING @@ -536,6 +542,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_cross_axis = 4 + inventory_hud_icon_state = "belt" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_BELT @@ -571,6 +578,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS inventory_hud_main_axis = 1 + inventory_hud_icon_state = "pocket" /datum/inventory_slot/inventory/pocket/right name = "right pocket" @@ -578,9 +586,9 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) display_name = "right pocket" display_preposition = "in" - inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS inventory_hud_main_axis = 2 + inventory_hud_icon_state = "pocket" /datum/inventory_slot/inventory/id name = "id" @@ -592,6 +600,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_cross_axis = 3 + inventory_hud_icon_state = "id" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_ID @@ -626,6 +635,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_cross_axis = 3 + inventory_hud_icon_state = "shoes" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_FEET @@ -666,6 +676,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 1 inventory_hud_cross_axis = 2 + inventory_hud_icon_state = "gloves" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_GLOVES @@ -692,6 +703,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 2 + inventory_hud_icon_state = "glasses" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_EYES @@ -718,6 +730,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_cross_axis = 2 + inventory_hud_icon_state = "suit-store" slot_equip_checks = SLOT_EQUIP_CHECK_USE_PROC inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE @@ -771,6 +784,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 3 inventory_hud_cross_axis = 2 + inventory_hud_icon_state = "ears" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_EARS @@ -785,6 +799,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 4 inventory_hud_cross_axis = 2 + inventory_hud_icon_state = "ears" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_EARS @@ -801,6 +816,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 3 inventory_hud_cross_axis = 1 + inventory_hud_icon_state = "mask" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_MASK diff --git a/code/modules/species/promethean/promethean_blob.dm b/code/modules/species/promethean/promethean_blob.dm index 59cda70540cd..89c741a20806 100644 --- a/code/modules/species/promethean/promethean_blob.dm +++ b/code/modules/species/promethean/promethean_blob.dm @@ -462,7 +462,7 @@ var/obj/item/resolved = ref?.resolve() if(isnull(resolved)) continue - put_in_hand_or_drop(resolved, i) + put_in_hands_or_drop(resolved, specific_index = i) if(!isnull(blob.mob_radio)) if(!equip_to_slots_if_possible(blob.mob_radio, list( diff --git a/code/modules/species/protean/protean_blob.dm b/code/modules/species/protean/protean_blob.dm index 335383b8afbf..388f6aa27ab2 100644 --- a/code/modules/species/protean/protean_blob.dm +++ b/code/modules/species/protean/protean_blob.dm @@ -484,7 +484,7 @@ var/obj/item/resolved = ref?.resolve() if(isnull(resolved)) continue - put_in_hand_or_drop(resolved, i) + put_in_hands_or_drop(resolved, specific_index = i) if(!isnull(blob.mob_radio)) if(!equip_to_slots_if_possible(blob.mob_radio, list( diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 49f83c734ec3..f15edddfeb38 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -111,6 +111,29 @@ /// Used for offsetting large icons. var/pixel_offset_y = 0 + //* Inventory *// + + /// Available inventory slots IDs + /// + /// * associate to list for remapping; use INVENTORY_SLOT_REMAP_* keys + var/list/inventory_slots = list( + /datum/inventory_slot/inventory/back::id, + /datum/inventory_slot/inventory/suit::id, + /datum/inventory_slot/inventory/suit_storage::id, + /datum/inventory_slot/inventory/uniform::id, + /datum/inventory_slot/inventory/ears/left::id, + /datum/inventory_slot/inventory/ears/right::id, + /datum/inventory_slot/inventory/glasses::id, + /datum/inventory_slot/inventory/gloves::id, + /datum/inventory_slot/inventory/mask::id, + /datum/inventory_slot/inventory/shoes::id, + /datum/inventory_slot/inventory/pocket/left::id, + /datum/inventory_slot/inventory/pocket/right::id, + /datum/inventory_slot/inventory/belt::id, + /datum/inventory_slot/inventory/id::id, + /datum/inventory_slot/inventory/head::id, + ) + //? Overlays /// Used by changelings. Should also be used for icon previews. var/base_color diff --git a/code/modules/species/species_hud.dm b/code/modules/species/species_hud.dm index 0ca78ac12b18..13a074b77224 100644 --- a/code/modules/species/species_hud.dm +++ b/code/modules/species/species_hud.dm @@ -31,23 +31,3 @@ SLOT_ID_RIGHT_POCKET = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = SLOT_ID_RIGHT_POCKET, "state" = "pocket"), SLOT_ID_BELT = list("loc" = ui_belt, "name" = "Belt", "slot" = SLOT_ID_BELT, "state" = "belt") ) - -/datum/hud_data/diona - has_internals = 0 - gear = list( - SLOT_ID_UNIFORM = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = SLOT_ID_UNIFORM, "state" = "center", "toggle" = 1), - SLOT_ID_SUIT = list("loc" = ui_shoes, "name" = "Suit", "slot" = SLOT_ID_SUIT, "state" = "suit", "toggle" = 1), - SLOT_ID_LEFT_EAR = list("loc" = ui_gloves, "name" = "Left Ear", "slot" = SLOT_ID_LEFT_EAR, "state" = "ears", "toggle" = 1), - SLOT_ID_HEAD = list("loc" = ui_oclothing, "name" = "Hat", "slot" = SLOT_ID_HEAD, "state" = "hair", "toggle" = 1), - SLOT_ID_SUIT_STORAGE = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = SLOT_ID_SUIT_STORAGE, "state" = "suitstore"), - SLOT_ID_BACK = list("loc" = ui_back, "name" = "Back", "slot" = SLOT_ID_BACK, "state" = "back"), - SLOT_ID_WORN_ID = list("loc" = ui_id, "name" = "ID", "slot" = SLOT_ID_WORN_ID, "state" = "id"), - SLOT_ID_LEFT_POCKET = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = SLOT_ID_LEFT_POCKET, "state" = "pocket"), - SLOT_ID_RIGHT_POCKET = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = SLOT_ID_RIGHT_POCKET, "state" = "pocket"), - ) - -/datum/hud_data/monkey - gear = list( - SLOT_ID_MASK = list("loc" = ui_shoes, "name" = "Mask", "slot" = SLOT_ID_MASK, "state" = "mask", "toggle" = 1), - SLOT_ID_BACK = list("loc" = ui_sstore1, "name" = "Back", "slot" = SLOT_ID_BACK, "state" = "back"), - ) diff --git a/code/modules/species/station/adherent.dm b/code/modules/species/station/adherent.dm index e6b9e0d1a3cc..1b470b1147f9 100644 --- a/code/modules/species/station/adherent.dm +++ b/code/modules/species/station/adherent.dm @@ -134,6 +134,31 @@ wikilink = "N/A" + //* Inventory *// + + #warn hud remappings + inventory_slots = list( + /datum/inventory_slot/inventory/back::id, + /datum/inventory_slot/inventory/ears/left::id = list( + INVENTORY_SLOT_REMAP_NAME = "Aux Port (1)", + ), + /datum/inventory_slot/inventory/ears/right::id = list( + INVENTORY_SLOT_REMAP_NAME = "Aux Port (2)", + ), + /datum/inventory_slot/inventory/belt::id, + /datum/inventory_slot/inventory/id::id, + ) + +/datum/hud_data/adherent + has_internals = FALSE + gear = list( + SLOT_ID_LEFT_EAR = list("loc" = ui_iclothing, "name" = "Aux Port", "slot" = SLOT_ID_LEFT_EAR, "state" = "ears", "toggle" = 1), + SLOT_ID_HEAD = list("loc" = ui_glasses, "name" = "Hat", "slot" = SLOT_ID_HEAD, "state" = "hair", "toggle" = 1), + SLOT_ID_BACK = list("loc" = ui_back, "name" = "Back", "slot" = SLOT_ID_BACK, "state" = "back"), + SLOT_ID_WORN_ID = list("loc" = ui_id, "name" = "ID", "slot" = SLOT_ID_WORN_ID, "state" = "id"), + SLOT_ID_BELT = list("loc" = ui_belt, "name" = "Belt", "slot" = SLOT_ID_BELT, "state" = "belt"), + ) + /datum/species/adherent/equip_survival_gear(mob/living/carbon/human/H, extendedtank = FALSE, comprehensive = FALSE) H.equip_to_slot_or_del(new /obj/item/storage/belt/utility/crystal, /datum/inventory_slot/abstract/put_in_backpack) @@ -198,15 +223,5 @@ if(can_overcome_gravity(H)) return "They are floating on a cloud of shimmering distortion." -/datum/hud_data/adherent - has_internals = FALSE - gear = list( - SLOT_ID_LEFT_EAR = list("loc" = ui_iclothing, "name" = "Aux Port", "slot" = SLOT_ID_LEFT_EAR, "state" = "ears", "toggle" = 1), - SLOT_ID_HEAD = list("loc" = ui_glasses, "name" = "Hat", "slot" = SLOT_ID_HEAD, "state" = "hair", "toggle" = 1), - SLOT_ID_BACK = list("loc" = ui_back, "name" = "Back", "slot" = SLOT_ID_BACK, "state" = "back"), - SLOT_ID_WORN_ID = list("loc" = ui_id, "name" = "ID", "slot" = SLOT_ID_WORN_ID, "state" = "id"), - SLOT_ID_BELT = list("loc" = ui_belt, "name" = "Belt", "slot" = SLOT_ID_BELT, "state" = "belt"), - ) - /datum/species/adherent/post_organ_rejuvenate(obj/item/organ/org, mob/living/carbon/human/H) org.robotic = ORGAN_CRYSTAL diff --git a/code/modules/species/station/diona.dm b/code/modules/species/station/diona.dm index 5505755348c6..0f2cbe6d846c 100644 --- a/code/modules/species/station/diona.dm +++ b/code/modules/species/station/diona.dm @@ -119,6 +119,35 @@ genders = list(PLURAL) + //* Inventory *// + + #warn remappings for hud positions + inventory_slots = list( + /datum/inventory_slot/inventory/back::id, + /datum/inventory_slot/inventory/suit::id, + /datum/inventory_slot/inventory/suit_storage::id, + /datum/inventory_slot/inventory/uniform::id, + /datum/inventory_slot/inventory/ears/left::id, + /datum/inventory_slot/inventory/ears/right::id, + /datum/inventory_slot/inventory/pocket/left::id, + /datum/inventory_slot/inventory/pocket/right::id, + /datum/inventory_slot/inventory/id::id, + /datum/inventory_slot/inventory/head::id, + ) + +/datum/hud_data/diona + has_internals = 0 + gear = list( + SLOT_ID_UNIFORM = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = SLOT_ID_UNIFORM, "state" = "center", "toggle" = 1), + SLOT_ID_SUIT = list("loc" = ui_shoes, "name" = "Suit", "slot" = SLOT_ID_SUIT, "state" = "suit", "toggle" = 1), + SLOT_ID_LEFT_EAR = list("loc" = ui_gloves, "name" = "Left Ear", "slot" = SLOT_ID_LEFT_EAR, "state" = "ears", "toggle" = 1), + SLOT_ID_HEAD = list("loc" = ui_oclothing, "name" = "Hat", "slot" = SLOT_ID_HEAD, "state" = "hair", "toggle" = 1), + SLOT_ID_SUIT_STORAGE = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = SLOT_ID_SUIT_STORAGE, "state" = "suitstore"), + SLOT_ID_BACK = list("loc" = ui_back, "name" = "Back", "slot" = SLOT_ID_BACK, "state" = "back"), + SLOT_ID_WORN_ID = list("loc" = ui_id, "name" = "ID", "slot" = SLOT_ID_WORN_ID, "state" = "id"), + SLOT_ID_LEFT_POCKET = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = SLOT_ID_LEFT_POCKET, "state" = "pocket"), + SLOT_ID_RIGHT_POCKET = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = SLOT_ID_RIGHT_POCKET, "state" = "pocket"), + ) /datum/species/diona/can_understand(mob/other) var/mob/living/carbon/alien/diona/D = other diff --git a/code/modules/species/station/monkey.dm b/code/modules/species/station/monkey.dm index 7719bf4df6ec..9b4cb94b0ee9 100644 --- a/code/modules/species/station/monkey.dm +++ b/code/modules/species/station/monkey.dm @@ -64,6 +64,23 @@ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right), ) + //* Inventory *// + + #warn remappings for hud positions + inventory_slots = list( + /datum/inventory_slot/inventory/back::id, + /datum/inventory_slot/inventory/id::id = list( + INVENTORY_SLOT_REMAP_MAIN_AXIS = 0, + INVENTORY_SLOT_REMAP_CROSS_AXIS = 2, + INVENTORY_SLOT_REMAP_CLASS = INVENTORY_HUD_CLASS_ALWAYS, + ), + /datum/inventory_slot/inventory/mask::id = list( + INVENTORY_SLOT_REMAP_MAIN_AXIS = 0, + INVENTORY_SLOT_REMAP_CROSS_AXIS = 1, + INVENTORY_SLOT_REMAP_CLASS = INVENTORY_HUD_CLASS_ALWAYS, + ), + ) + /datum/species/monkey/handle_npc(mob/living/carbon/human/H) if(H.stat != CONSCIOUS) return diff --git a/icons/mob/screen1_Midnight.dmi b/icons/mob/screen1_Midnight.dmi index b7a884dfb23081b6e0774ef52e73a4149ec77684..8aae00e4960f246ada4676c1c313fa389a8c5c47 100644 GIT binary patch literal 84403 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
oD(bsn$e4yl29}p-N!oFz_U(}A0 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

CBCs?}CztGET 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 literal 142240 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⪻AwGy=1lkF15D@ULd&1cqjX=J+;_Dyv2MZBA3 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%0Dy3GEKOD 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 literal 0 HcmV?d00001 diff --git a/icons/screen/hud/hologram/inventory.dmi b/icons/screen/hud/hologram/inventory.dmi index 3037a85319d9e994329ccab3d127cd24fc7f1286..f44553c12b84c6bd3bc8d39bddb51c6b92b98f57 100644 GIT binary patch delta 1053 zcmV+&1mgSM2*wDIIDb=CaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3K9+BQY;Uw+JMm#KoDCSyT)ZH00t;D@x2wg|JbT=A@>Ppi(z6 zxg@hJl{gJxR}iZsskEddKTkKcur#v(mttiFS3ehUr~m*;aeq^Ee<5t~000AVNkliKR}QoWrDug@ApHe9t-p5cszb9CAeHJ|Ada$u;uFO&tjVQe}BL8 ze}VRQ1@vzc&ws07OBMeY*6TY#@oVDwHEb!aX$QdY^s+rO3SYi#Uot;i!q_D`|9i2t7=$G79QiJaFe;{JzPz<`9$u?27-?tgCq zVZ{B91>oG-49Y7{C;(f}K85FTGebKw#@>aVbjM@6@qgSW^!XgNXv_V)YoEdg|Lv#l z5-lJp2+W1AiC_>o0~P{pj#^tEdIxa zp+4bZ6vcc-`>XN)L&o)enk!2Ku~*yjdn+o^)Si2pfH!af1%C(tJKTb~b5PpAcOWi;e63w>7r za&vgNn3cXA0BZIcH?z~n0Z7f;lwy|p7d<__E`1bKnGcrnLf1lKNecrnLf1Avp?Cos+4BJ`Al)4?tyl04gIL0QLF#wRtxR8lQqW z^Yc3q{R)vxSb)wm!h1r2-T|)A|5|h6+%W*8nKVQr1ubiWc(^ X4WKS5ZEFQS00000NkvXXu0mjfb0zpt delta 1076 zcmV-41k3xz2;B&fIDeJPI}XAy5QO2{KE)`hgLt)WP$J|axr2o_-jyJLy@cyiq@q9y z-Hi18HBQ~x4`_RDXUawH6C944tu=3n%5XUBtznYHx}2gx2@Vy9DK=RWYh_K8T;Q;? zX3XJ6%l@WU8vl?@xTwsuF36I2bwSUUJbtMf-O!@#z5M{>0)J4eW%B~>000AsNklA7vLqX4ppd`NtHG&l(cEDh;>;M z+4|#MX_5V#VGv+@clAk@ZLPT3@Anuf#{>XQr_+yI2B*{MOV{rue0jWo$Y%5D_4y+H z2`O(g*k1*1SAW8nBJoeG&wmAt|BBqcgfH1`+5!N;5x_g6;adRT6Zb9QOIDjM0Sp{Y z+%g;kDC0{On_U8|NqN)Xm+Y+3&+jbpfAjplXF#AuAMcMH=Zs5HZA2C-kaAEAJ^F1t~=f4w{5fSk$>!;!iKz3_ji?J_!7T;*PWvW z1c|_0`I_hy!8ZtpuylO4b2tH9im)=zVj?O(#8z&S;(xq(zBtQ5rJ4;h5b z!R%H*9RuDp#c8h8 z@EPKWnT7iqd2F@x8H6SB^FwCgs+vtp5#Wr^(~x~?N^Sj=wpq9;XVX#zph)HC|0d-> zJ&&c9SOIe9=bHz5)lO$>Umwu-Z^zW5eL|+{$_I3>4*)(Va|SgAXt~m;w$dru)-4AB udKy3$G_4N+bTojhOaL`m${HF#cK!j8TsI|WrRw1T0000 diff --git a/icons/screen/hud/hologram/inventory_wide.dmi b/icons/screen/hud/hologram/inventory_wide.dmi deleted file mode 100644 index 8569002fa0b51e961cc4eaecc6fe007ee48facc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQu$RO5hX6E#mPmP1tppJc?=8{ zb5xI6^ED_4upXFYd$jw@vG_OJ3y)s3pvKmH3N1x6=;tHW`St)%)tNX-MAD>Aj=j`n(;R8oVu-xh>k(Tv#nW%jB!) zrB8?SKkZwRscG}+dp46T&*28!;uQ9TWTqR8H)b%DF_@_}$TswHCSVoXT+PVGaIDZ~ zb92UpZErVkIp+H}){?t9+c!|;LjcdA2SL#%c6HJ)04X( zIN^QW_oe5L+cye7n{}xCi&L(B@9&vAzsU8599VS!WLPKDDt@78b*>dwZvU9`UrE_V UIvFRc0^@;M1& diff --git a/icons/screen/hud/midnight/inventory-slot.dmi b/icons/screen/hud/midnight/inventory-slot.dmi new file mode 100644 index 0000000000000000000000000000000000000000..014f313a34e672798056e6512dc30e9416f5cbfd GIT binary patch literal 13726 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 Z+t&0J*LbntAGiW&s=ZLHQ?`xz{{Ut&+4led literal 0 HcmV?d00001 diff --git a/icons/screen/hud/midnight/inventory-wide.dmi b/icons/screen/hud/midnight/inventory-wide.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ae62f032b871d61774937dec7579516416bbd4cf GIT binary patch literal 506 zcmVV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a?DJ)I5Sc+ z(=$qd9AhJ{;*!LYR3K9+BQY;Ux41m9K#7YpC9|j)C}zmTnO2mTn+jnoE4cc(fQ<$K zwNo3D(9TW`0003+Nkl+Pbf z2}DN+kuC}yI_LvmNlG1(RDZ09pVVF#s(9jTnFy zfJO{J3qT_Vpaq~21JDA{hyiE;Xv6@t05oC%S^yd`04)Gb&~A5Aw1~3UY*sbfoLZ~Z zNj@P4!E`!LZA~y9zFf}rawUBSpH0jR;Kld*gP*F1coeYf>_^JBege0UxK=Und!(7yqcAHO;O wMHS%kzOo6zaCD>2FW&+b=@y_h*!~AR0Jt-sP8x{0!vFvP07*qoM6N<$g4^KIbN~PV literal 0 HcmV?d00001 diff --git a/icons/screen/hud/midnight/inventory.dmi b/icons/screen/hud/midnight/inventory.dmi index 830322e5fbc338843af907d7e4caca2dc2d458e3..5118a41f7d1b8def37bce68a20c026eb68ed80b2 100644 GIT binary patch literal 4188 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 iip|Yuhw=st0RIE*HrRnhl*|JF0000(aj diff --git a/icons/screen/hud/midnight/inventory_wide.dmi b/icons/screen/hud/midnight/inventory_wide.dmi deleted file mode 100644 index 2d622a87801da004a10ae7eefbfb0b105fe63630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 517 zcmV+g0{Z=lP)V=-0C=1w#ybvxAP@z>nmxsf^u}N8wlNSxp?4qwg~CsO==Cj}Y9uB-n-yv? z^!SwHb%HU}4T(3p62KS-62Zqk6fpXZal75Hz{OKyKZ4BVeFPAUk#SolM@3C`rEH$B%fFyam zdhZ7`d1%-7wKmNR(QV^Azbf+3 z9!v55EUxVsF!c0^h%8aFx#M9M?AJPdEhmD2f^@*0ZuGYCT=Yuzd8eBAf@JQ#pkLF2+qBA}_ER2JUFB^L`$RsPT zdo=0Dq!5K*O=UxU*X=uOHac{68>?f#}U!O`5a&&7HD7 zXeYei-T$%V^L>>akEWe_nv~c4{|+n1E0!y)O}7<9JLF$~mt-x86<@3H$={&G+-PoD V%JQEQ^}xtr@O1TaS?83{1OUh>x>EoE literal 0 HcmV?d00001 diff --git a/icons/screen/hud/minimalist/inventory.dmi b/icons/screen/hud/minimalist/inventory.dmi index ecf131e398a34a4c20594d6495a798049cde4826..d59f6d6298eeede75ef08b8a529f4a42d0644565 100644 GIT binary patch delta 1064 zcmV+@1lRkI3DF3UIDb=CaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3K9+BQY;Uw+JMm#KoDCSyT)ZH00t;D@x2wg|JbT=A@<(sS<3c zZenstW?3rnW)rI+skEddKTkKcur#v(mttiFS3ehUr~m*_x_?u2dRXs-000AgNkl&=hLgW!#Oc zs=eL)NzB-0pkD2M*uSSY91i~!nP3dy$7C`IV*GSE6{*`F;Ld0?`m1UDa=Cn&`>ERR zYZ}c|8Q2F_tAEuuZm-wt-@5Mb1M&F8LB)S>t>5*Z@Z)}_z4%fofN9v*`B<>ypU>wk z-+MS5D#yqIWL_!DvUMYzPN(EqL>2%~!xURTpcy|o2&bBOL^J-{Sr9m34oLqq5C^_o zKcf|Yr3*5v@7fZs*Xwgm-S78B=hMEnd|R`2{H@mkV1Ilzn-%yno#95q7EC$o222T` zKAr`kAuu`~kDte3|9Cupai0koC}j(_rO!OdAM~M3{N4pX!^`E8d>@?QE&`Q&w1s|b zHXD^faL4ae05D!>I5cJ3OBzjFb)oO~1TQKAS^@jDd&ji1lw$G+VabOrQ}y9ko; zHx|G&et+-RiY7Ji^d>8bo)Hr}P(Vu(bAAK-a5v1dHIsx^R}Br#8S(>HT`kQ#$bAGqRoo_~g-F>1jB+jv|WY~i+j=@qe5{N5|! zx&Sr0qIWj5xf7!17yJ$xe=qd&0hokT>BRE^Dbtzf15zcg zgnt85SqE@y;Zv2kyFxC+xb*O4S+aaj%+#)gIW+N^X7U&im|TFss9cPT?ZH1zJ{IQ! z68ikq@D}Hqf+rsZG~D2T>+IT>d%KR8IJZms{8(@n=XOP(9~*3gu!cTAM%ZUTQu_Q@ zVJ(1^K0ju>w4ovN`LW}r4GpEwkC~6VAb%}=e(baw1MIFTw|;-T3m~D-cU2|aZnt8$ z+eLK~-@5?Z`g}~ji!dO@oA_P@kkaR4^4|#qV!esq8Eq&g-~Jadv0qK?OaV+{Pr6BM z0krh-6e<17G_nAi`gn>I5|300(1jZ&Dc!;hG6uYx(Zrr`n`Z&Er+N0AKGtbw6Cpw6 i=^#z_(dNgv68;CFguX%s>We4<0000H3 delta 1126 zcmV-s1eyEM2#*PnIDd`Iy$-@K3+VU^G(^M(5B-Sq6R9340t{u?pEzf_d#eQ_?1`l8BOMg(SZ1AP7000BJNkls1oY`0r0!Jp43EIs}j?`$@khsoeg)9l#$ON}3x z4C?u0%|DRmd4Gz37e(=FHXVBMJWo~X5Y^u_P1^qoH8z{gTP`00uz^*RcLl!w{eDmK zzPH=$<1wKCo_Fr|`{aW#j$`3jBoqKo!zCX50A}kK4#G=qJYur`-dRvl6u<0%^gom5 zd5SmL*O;n*6^7wuyWLKj2e)n8&8dSRkb0k{X?E;FNPjl|m{^qY$L18raeBMmx>*p$ zpF9Y+ZM#d7q`O~L)ow~-Y{zPvCf)D%(gW|*oJI?PswYVTQ51ELCrP5EF<7W57QnQ# zVQfB_!<71!1;D^rmI-U@T zmhl2u#_tLD(6@(6jTb z)qnMRh2!zKNQ?UEbov1RtM#vJe?I`5V2i`yU^DzYz8|n;X7l}krQ%n@mibr*PVDFJehsm{!Jsp&5|uFg?xV=k%^lGrzG0 su(!ZDolZZ;OV07*qoM6N<$g6<_PL;wH) diff --git a/icons/screen/hud/minimalist/inventory_wide.dmi b/icons/screen/hud/minimalist/inventory_wide.dmi deleted file mode 100644 index e379d7444d4fb580e3ab27d2b48818e35b7388bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQu$RO5hX6E#mPmP1tppJc?=8{ zb5xI6^ED_4upXFYd$jw@vG_OJ3y)s3pvKmH3N1x6=&yS`-9a+j~W1oU8pezLh(+xIjW%SonQ{{_zEO4<+yfmd{*Z zf2>lpW5Ri67gHW)+nM543{rv(d<||a3z!!OGQMEQaACkL^z0+klxw@rTP+B(Z1-OD zdRKXt{L-!OR^RbigU_V^h4ENkv*4B5H6w@)f>u4SoPd+i?AvFO_M zZ?#swQQolb_-zZHI&Y_S#q+zLO6~cq>tJ%9<(%a|(-VKY?#*rL$e6V(hgs=Ai)9UC Y2SY`Vv|@P2f^@*0ZuGYCT=Yuzd8eBAf@JQ#pkLF2+qBA}_ER2JUFB^L`$RsPT zdo=0Dq!5K*O=UxU*X=uOHac{68>?_2j16?;l$4*paSZiU!LD7md>+XI^{=tRR&|m4TdcYCOHgI3{qwcx(vM14Pp&# zybjzBhuIdeE=Xj)z;s~)BZ@MAA2anwrtWR|;*V_Y7Jb{CIr(GIo$GbsNnSf{DEmD( z%dv9ZHaDXAw{XHlmznJL@e^Jap8B{z_{JrczrtHM>nuNfUUvWYF+1t#x#``hk1|#{ z2()IdUTmPjU$w)UTS!=Ef#HMWIm;NQ?^t*2(dt53<+b4_m?~`Vy+0mr!)$hzHL0Fy z)lL3Ivo~Hp|Dj>Eh`8b|tq0q9)It>$S27ivW>g7QG2H5K=QY)QG!qy{44$rjF6*2U FngCpIzRLgr literal 0 HcmV?d00001 diff --git a/icons/screen/hud/old/inventory.dmi b/icons/screen/hud/old/inventory.dmi index 6313420591e41048db138b7fb396b8f154ed257a..a4524b2c80d7175abdbcb72a8ef36d28ca7e4c37 100644 GIT binary patch delta 1370 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 TTb==$00000NkvXXu0mjfSi(ll delta 2964 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 literal 0 HcmV?d00001 diff --git a/icons/screen/hud/white/inventory.dmi b/icons/screen/hud/white/inventory.dmi index 10071129b9a9e723ca51a61757267227b326e3b9..6666b8cf1f008c214bad2c655d773bf3dea82ddc 100644 GIT binary patch delta 2235 zcmV;s2t@bb2(l8884Lyh008AQat;6h0GN@UdVi$Sl9K#9-PFR;%mQ4BIdk&!3&1R8 z1y?^8aQFZKnW9ziJ&}1!000P8Nkl`6voqSI}hzV;0Udtf-b~`I|T(n z9KeO5uEnjxLhug|T-sqxOh};(k_b%Rk&{X2M!!)i~NHJ51M1s0aSiqV4&sJfE6`l*zfB=YPBZ(W6I+yzk$?o9C<0Cno>Mkt3yLqyZVb zckedmz4paLix#PwGiR#Bix-zp%a47uz&th zqeiK|zCLyF;zjl8(?-jDi(x*o>c+eedXHuU=RbUur$(w1q-w_1CFKa zm<2Ki%$YMsAFo}zRyY2YD_8V0lu?CV?PP$|1>L3WwlZM+`0@Jq#ful}`Sa&`Jb(K1 zY490gz|WsQ)#=lx_3yTA+tlI1hky06|5pY)c<{iR4-y@Kb-aK7z7hp!$dMyQ>SG!a zoI7_;|K7ZL)B6kz5R4f!CXr8PeE$5|E60WJKEb$gqZLZRBEr&wA4C zzjyDRITw#61mxSl;P&m?(Pz@&>ep@t96fq8dSB)_0KZwh8A+Uz&vD4>n14HWu1Q(E zAnwVVc+O7twW{U-u94=?pKp@niH8%K3nUeq1E3NQ)1&Lwty4pX4%PX;e*IFvfB#k& zE?kKA@SQt%66Y}s%rghkp#YtFdwbQ8Aw%@}j~_pbPLCfy9`syM1{AHoJLc#1g7CxX z?M<6DsoAq(^_U$VLZr5xvk6 zUC~+ABV`yMR$sLKzVd8D8GyCmwQS$MT}_`pUHj)Ym?%k1kRwKn&Z2?4Cl6g=!sW}CwLG^@A@~>|mS42~zVd8D8G!$a1wrxH1b>QR^sHE)_`Nhz zSq2~&5b^n9mAhxOC}~p2M=rcNu`SqJNqCyU4`=@g$gRNNJFYq6Db%rHb{m~cb^gvzl9X7h~( z;&}M*;odT1E76eruV25aZ{NP@vYGI{eEFh}?FJBCxQ4D`d4ImTC%d*vqx57*MAE?jDxQ zfJ}QqFhIP4j~_p3pBF{1U%#%YwrbTX-OxaGJVUF|BI^LGnn?}isSrS)t5>h;p^15d zav7>;>3x%Lg*qOKO{R%erz|iX#IWV*vPyaD({Oa zz%BU3jT?jVW95X9WiLoN08m*0tKKXqvlkS)E{w~9((eNp4;kZp`HaOf-pQotq6h;* z@L6~o%74BOa2IxVK1f@q6lOqGsA@N~74oyZ4{$9wEkEtPK@0#@y%lmHy&q#ho$|%S zY_)tFi4Hh^{J8eTTLrv>Q04yy`2S=n#1yOwzUa5Q<+CtiG3GW< zE8q=H3@O%5)Ggm`n0BG3j_`EBsZ*zV_}#K)OMh)T)CuZu_JTki@%hpT-HK8}P*w5y z-Hb#B)Da)w?JylsSA2Z8Bf)?=;^Vs=iFd-R1c~S+mQfPtRYncF??k&D2?oesh#Q}u z7T=f$S@%r31zrXKJ3c=x{;^>|ad;Wv#^*N-XdMPIKrEC90QtZo#sE9|*Ny^i7?2HK z27lNVpJx4eExKVq5`!3!cRZIwba0jk;f4W8co~ot5;<(g=ch#oHw;K37Xxf-&k~>S zn>!i?B$0~&V)0qy^LzTNmXE8O_}h5>Pycfzsw_@eRo zA=vTp-TqEE)eEw}k+K_K;`51-w;}QQp*^970ZC+H0I>ak;Kt`OPcT$5{)fH{5x5M< z8_R-MSqfGS}#0OXBJ+JC!u zZ^tm8)NW{%Z^YzZ6E|$wpmyxoVG`%$cWMk#sol^bNLvRG!MtzZK6C!Z+FPwst?<4P zYo+zayde8a_G8D6=_FszcPbJLs3Sh!2LCN2U$E@lxl>zztG}438>R#5ijTK}rHhv& z)(`Ng+&^^f6eJi>cetR-0MO|y=p-w$5NajZ^1%A-^G@!7e*r&jLdNLuVhjKP002ov JPDHLkV1f}~Xp#T` delta 991 zcmV<510eje65t4s8Gi!+007eJf;<2K0ANr|R7JqRz)nt1$jHb!IXQ80aY#r=SXfwN zV`FV?ZNI<2c6N5d!^3=he0_a=W@ct;YHCA6L!zRhr>Cc+q@=gEx2meDg@uK=xw%$W zRgiXtf z$~KPw|6eY(ytSm@Gs=f2=g65RA-!xGZg=X|EQ-vle-n*=ziAYIGI?I>_WDoV+Nvx9 zuRr#hDbOY0v82;C*z(7*&rcP9UIm0m7AELJAxr_GS(%{TA4{+G1t48m1_)USrU0A~ z@ytXSf9%g62pE6}B_Wssk<1G~4q=4=Hwe!70TV%<)7$J{2u%J8fyB>9j0AZ3#3(cY zA`Aq8=QH*MnYMQbbiP9%w2hk(jRby+hk(tW5eT8QUuQSU zLm*W%#Hd8L1Wvw7kQLQE?+weo>E{F)e3Upu+^Y|VfX|;3Jf;AOkn(C1h(u2Jrvk~< zC2;bWd!Xtu9Z?nF5EKf3alA#X!0jS7f8Ir6Si=3Dw-h0+bAl^v5w_ZA0Jtu)^OxrU zZY_B!qQ$&5OPmv^y3MJ?E2O=_@*Hsa)=8GKA!n=e5i2R2J&=_~$nPy(8vYzu`AdSV zD9QJwJF)#%kU0dPzFXacUvw>tY)Qc7I|NmYD!nxL>g2^akcw7+)?8ABb;T2m`K@BQ zi0b_)+Wdm9!&$UWvOdS^hXUw2WZ1K4nQu>1As(+e`50%aJBuEV$J@^Xh9FIci9Zfb zZko=_eI6|G{ZBNWfcL*a;927IL|gU8et%zpe`Jw$roe_j_9FDc>u~9KwD?`O(^kNC z{)YZP?X^wB00q{6H)(%?4SgS=!1_rHP{6PMgAr)`e<*=Z{|6(``u|7*um1mUy2zU0 za2w_EAq2htKZIbe|0i7&l3=F)!xK3Azc_%v(*MB;fYtvY2^{?&o`BW=LHEGc|KYoc z)&F6;NHsJ4KN0Me7}GD5m;MJW@PB5r$Wk5q2>5Ag>84#y1e`pM&3_&Bj7^j7D1t5# z&*xL@D6p#UsXz)(jqvvZtNOktpkFzEF0d{g0}yQK|DAiVssDF&(Jyn6se`-eI1&H= N002ovPDHLkV1iG9-o^j` diff --git a/icons/screen/hud/white/inventory_wide.dmi b/icons/screen/hud/white/inventory_wide.dmi deleted file mode 100644 index 6e1f700399fc9054c4571c7a3e48093c94e91882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmV-*0gC>KP)@0)`8;A_5c6?0d!JMQvg8b*k%9#0C0L# zSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1nN-u|SE7GbOXA7|1o`;!G<_%uR)|bMo^Gz$|42 zS3ei9`2aAw97bDs>_Pwl0ES6KK~y-6V_+BsqhQzpL0mupsz3=BP=qN^#BP8PT!F9) z2)L%D0zp`4T8Ik-7$OuH8=D&&SIn9L1f3l-+l?Urp+E$v-NhwrS=zE?%VtemF%4>h zBc=%}fMD@ToF=3#o3(1%s%6VUaGTKC*#UG$F@_0(5FKG5VPPR@sc>HiLKOf2goQ$4 T=r%;=00000NkvXXu0mjf3NMRd From 9543783fa510040f6cb2adea7bcdddd62e196ae5 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 18 Sep 2024 18:51:06 +0000 Subject: [PATCH 079/140] that --- code/modules/mob/mob-hands.dm | 2 +- code/modules/species/species_hud.dm | 22 ------------------ code/modules/species/station/adherent.dm | 14 ++++-------- code/modules/species/station/diona.dm | 29 ++++++++++-------------- 4 files changed, 17 insertions(+), 50 deletions(-) diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index 0344d001a49f..9817632c6853 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -67,7 +67,7 @@ * sets number of physical hands we should account for potentialy having */ /mob/proc/set_nominal_hand_count() - #warn impl + subtypes + return length(inventory?.held_items) /** * Are usable hands all holding items? diff --git a/code/modules/species/species_hud.dm b/code/modules/species/species_hud.dm index 13a074b77224..dd64ece05679 100644 --- a/code/modules/species/species_hud.dm +++ b/code/modules/species/species_hud.dm @@ -9,25 +9,3 @@ var/has_throw = 1 // Set to draw throw button. var/has_resist = 1 // Set to draw resist button. var/has_internals = 1 // Set to draw the internals toggle button. - - // Contains information on the position and tag for all inventory slots - // to be drawn for the mob. This is fairly delicate, try to avoid messing with it - // unless you know exactly what it does. - // keyed by slot ID. - var/list/gear = list( - SLOT_ID_UNIFORM = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = SLOT_ID_UNIFORM, "state" = "center", "toggle" = 1), - SLOT_ID_SUIT = list("loc" = ui_oclothing, "name" = "Suit", "slot" = SLOT_ID_SUIT, "state" = "suit", "toggle" = 1), - SLOT_ID_MASK = list("loc" = ui_mask, "name" = "Mask", "slot" = SLOT_ID_MASK, "state" = "mask", "toggle" = 1), - SLOT_ID_GLOVES = list("loc" = ui_gloves, "name" = "Gloves", "slot" = SLOT_ID_GLOVES, "state" = "gloves", "toggle" = 1), - SLOT_ID_GLASSES = list("loc" = ui_glasses, "name" = "Glasses", "slot" = SLOT_ID_GLASSES, "state" = "glasses","toggle" = 1), - SLOT_ID_LEFT_EAR = list("loc" = ui_l_ear, "name" = "Left Ear", "slot" = SLOT_ID_LEFT_EAR, "state" = "ears", "toggle" = 1), - SLOT_ID_RIGHT_EAR = list("loc" = ui_r_ear, "name" = "Right Ear", "slot" = SLOT_ID_RIGHT_EAR, "state" = "ears", "toggle" = 1), - SLOT_ID_HEAD = list("loc" = ui_head, "name" = "Hat", "slot" = SLOT_ID_HEAD, "state" = "hair", "toggle" = 1), - SLOT_ID_SHOES = list("loc" = ui_shoes, "name" = "Shoes", "slot" = SLOT_ID_SHOES, "state" = "shoes", "toggle" = 1), - SLOT_ID_SUIT_STORAGE = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = SLOT_ID_SUIT_STORAGE, "state" = "suitstore"), - SLOT_ID_BACK = list("loc" = ui_back, "name" = "Back", "slot" = SLOT_ID_BACK, "state" = "back"), - SLOT_ID_WORN_ID = list("loc" = ui_id, "name" = "ID", "slot" = SLOT_ID_WORN_ID, "state" = "id"), - SLOT_ID_LEFT_POCKET = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = SLOT_ID_LEFT_POCKET, "state" = "pocket"), - SLOT_ID_RIGHT_POCKET = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = SLOT_ID_RIGHT_POCKET, "state" = "pocket"), - SLOT_ID_BELT = list("loc" = ui_belt, "name" = "Belt", "slot" = SLOT_ID_BELT, "state" = "belt") - ) diff --git a/code/modules/species/station/adherent.dm b/code/modules/species/station/adherent.dm index 1b470b1147f9..bed42e742b4c 100644 --- a/code/modules/species/station/adherent.dm +++ b/code/modules/species/station/adherent.dm @@ -141,24 +141,18 @@ /datum/inventory_slot/inventory/back::id, /datum/inventory_slot/inventory/ears/left::id = list( INVENTORY_SLOT_REMAP_NAME = "Aux Port (1)", + INVENTORY_SLOT_REMAP_MAIN_AXIS = 1, + INVENTORY_SLOT_REMAP_CROSS_AXIS = 0, ), /datum/inventory_slot/inventory/ears/right::id = list( INVENTORY_SLOT_REMAP_NAME = "Aux Port (2)", + INVENTORY_SLOT_REMAP_MAIN_AXIS = 2, + INVENTORY_SLOT_REMAP_CROSS_AXIS = 0, ), /datum/inventory_slot/inventory/belt::id, /datum/inventory_slot/inventory/id::id, ) -/datum/hud_data/adherent - has_internals = FALSE - gear = list( - SLOT_ID_LEFT_EAR = list("loc" = ui_iclothing, "name" = "Aux Port", "slot" = SLOT_ID_LEFT_EAR, "state" = "ears", "toggle" = 1), - SLOT_ID_HEAD = list("loc" = ui_glasses, "name" = "Hat", "slot" = SLOT_ID_HEAD, "state" = "hair", "toggle" = 1), - SLOT_ID_BACK = list("loc" = ui_back, "name" = "Back", "slot" = SLOT_ID_BACK, "state" = "back"), - SLOT_ID_WORN_ID = list("loc" = ui_id, "name" = "ID", "slot" = SLOT_ID_WORN_ID, "state" = "id"), - SLOT_ID_BELT = list("loc" = ui_belt, "name" = "Belt", "slot" = SLOT_ID_BELT, "state" = "belt"), - ) - /datum/species/adherent/equip_survival_gear(mob/living/carbon/human/H, extendedtank = FALSE, comprehensive = FALSE) H.equip_to_slot_or_del(new /obj/item/storage/belt/utility/crystal, /datum/inventory_slot/abstract/put_in_backpack) diff --git a/code/modules/species/station/diona.dm b/code/modules/species/station/diona.dm index 0f2cbe6d846c..c8ce576ff736 100644 --- a/code/modules/species/station/diona.dm +++ b/code/modules/species/station/diona.dm @@ -124,31 +124,26 @@ #warn remappings for hud positions inventory_slots = list( /datum/inventory_slot/inventory/back::id, - /datum/inventory_slot/inventory/suit::id, + /datum/inventory_slot/inventory/suit::id = list( + INVENTORY_SLOT_REMAP_MAIN_AXIS = 0, + INVENTORY_SLOT_REMAP_CROSS_AXIS = 1, + ), /datum/inventory_slot/inventory/suit_storage::id, /datum/inventory_slot/inventory/uniform::id, - /datum/inventory_slot/inventory/ears/left::id, + /datum/inventory_slot/inventory/ears/left::id = list( + INVENTORY_SLOT_REMAP_MAIN_AXIS = 2, + INVENTORY_SLOT_REMAP_CROSS_AXIS = 2, + ), /datum/inventory_slot/inventory/ears/right::id, /datum/inventory_slot/inventory/pocket/left::id, /datum/inventory_slot/inventory/pocket/right::id, /datum/inventory_slot/inventory/id::id, - /datum/inventory_slot/inventory/head::id, + /datum/inventory_slot/inventory/head::id = list( + INVENTORY_SLOT_REMAP_MAIN_AXIS = 1, + INVENTORY_SLOT_REMAP_CROSS_AXIS = 1, + ), ) -/datum/hud_data/diona - has_internals = 0 - gear = list( - SLOT_ID_UNIFORM = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = SLOT_ID_UNIFORM, "state" = "center", "toggle" = 1), - SLOT_ID_SUIT = list("loc" = ui_shoes, "name" = "Suit", "slot" = SLOT_ID_SUIT, "state" = "suit", "toggle" = 1), - SLOT_ID_LEFT_EAR = list("loc" = ui_gloves, "name" = "Left Ear", "slot" = SLOT_ID_LEFT_EAR, "state" = "ears", "toggle" = 1), - SLOT_ID_HEAD = list("loc" = ui_oclothing, "name" = "Hat", "slot" = SLOT_ID_HEAD, "state" = "hair", "toggle" = 1), - SLOT_ID_SUIT_STORAGE = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = SLOT_ID_SUIT_STORAGE, "state" = "suitstore"), - SLOT_ID_BACK = list("loc" = ui_back, "name" = "Back", "slot" = SLOT_ID_BACK, "state" = "back"), - SLOT_ID_WORN_ID = list("loc" = ui_id, "name" = "ID", "slot" = SLOT_ID_WORN_ID, "state" = "id"), - SLOT_ID_LEFT_POCKET = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = SLOT_ID_LEFT_POCKET, "state" = "pocket"), - SLOT_ID_RIGHT_POCKET = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = SLOT_ID_RIGHT_POCKET, "state" = "pocket"), - ) - /datum/species/diona/can_understand(mob/other) var/mob/living/carbon/alien/diona/D = other if(istype(D)) From 511d9e8e7f64c4552f4814f9b6bc5ddf16d74420 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 18 Sep 2024 18:54:40 +0000 Subject: [PATCH 080/140] that --- code/__DEFINES/inventory/procs.dm | 8 ++++---- .../mob/inventory/inventory-hands-put.dm | 20 ++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/code/__DEFINES/inventory/procs.dm b/code/__DEFINES/inventory/procs.dm index 4749999eb0d1..a49a6ff2253d 100644 --- a/code/__DEFINES/inventory/procs.dm +++ b/code/__DEFINES/inventory/procs.dm @@ -53,17 +53,17 @@ //* Inventory Return Flags *// -// todo: should these be flags? maybe they should just be an enum? - /// Failed /// /// * Yes, on a failure, we just return null. /// * This is to fail truthy checks, and be a valid switch() return. #define INV_RETURN_FAILED null /// Success -#define INV_RETURN_SUCCESS (1<<0) +#define INV_RETURN_SUCCESS "success" /// Success, but was relocated instead of going to where it should go. -#define INV_RETURN_RELOCATED (1<<1) +#define INV_RETURN_RELOCATED "relocated" +/// Success, and was deleted for it +#define INV_RETURN_DELETED "deleted" //! return values from can_equip_conflict_check /// yes diff --git a/code/modules/mob/inventory/inventory-hands-put.dm b/code/modules/mob/inventory/inventory-hands-put.dm index 500723aa5a9b..fe2fa3a6bfc2 100644 --- a/code/modules/mob/inventory/inventory-hands-put.dm +++ b/code/modules/mob/inventory/inventory-hands-put.dm @@ -8,25 +8,31 @@ //* a proc-call, this is currently not done. *// /datum/inventory/proc/put_in_hand(obj/item/I, index, inv_op_flags) - #warn impl & below, INV_RETURN_* - return equip_hand_impl(I, index, inv_op_flags) + return owner.equip_hand_impl(I, index, inv_op_flags) ? INV_RETURN_SUCCESS : INV_RETURN_FAILED /mob/proc/put_in_hand(obj/item/I, index, inv_op_flags) return inventory?.put_in_hand(I, index, inv_op_flags) /datum/inventory/proc/put_in_hands(obj/item/I, inv_op_flags) - #warn impl & below, INV_RETURN_* if(is_holding(I)) - return TRUE + return INV_RETURN_SUCCESS - if(!(flags & INV_OP_NO_MERGE_STACKS) && istype(I, /obj/item/stack)) + if(!(inv_op_flags & INV_OP_NO_MERGE_STACKS) && istype(I, /obj/item/stack)) var/obj/item/stack/S = I for(var/obj/item/stack/held_stack in get_held_items()) if(S.can_merge(held_stack) && S.merge(held_stack)) to_chat(src, SPAN_NOTICE("Your [held_stack] stack now contains [held_stack.get_amount()] [held_stack.singular_name]\s.")) - return TRUE + return INV_RETURN_SUCCESS - return put_in_active_hand(I, flags) || put_in_inactive_hand(I, flags) + for(var/i in 1 to length(held_items)) + var/result = put_in_hand(I, i, inv_op_flags) + + switch(result) + if(INV_RETURN_FAILED) + else + return result + + return INV_RETURN_FAILED /mob/proc/put_in_hands(obj/item/I, inv_op_flags) return inventory?.put_in_hands(I, inv_op_flags) From 7ef1fc2e621184927199c207c780b3e0e510cc55 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:44:20 +0000 Subject: [PATCH 081/140] changes --- code/modules/mob/inventory/inventory.dm | 34 ++++++++++++++------ code/modules/mob/inventory/inventory_slot.dm | 17 ++++++++-- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 24d1941365be..d40bda012ad4 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -16,12 +16,18 @@ /// our action holder var/datum/action_holder/actions + //* Caches *// + /// cached overlays by slot id or hand index + var/list/rendered_normal_overlays = list() + /// cached overlays by slot id + // todo: emissives + // var/list/rendered_emissive_overlays = list() + //* HUD *// /// our hud var/datum/mob_hud/inventory/hud //* Inventory *// - /// held items /// /// * empty indices are null @@ -30,12 +36,12 @@ /// * 2, 4, 6, ... are right var/list/obj/item/held_items = list() - //* Caches *// - /// cached overlays by slot id or hand index - var/list/rendered_normal_overlays = list() - /// cached overlays by slot id - // todo: emissives - // var/list/rendered_emissive_overlays = list() + //* Slots *// + /// our base slot ids associated to remappings + /// + /// * key: string id; value: remapping list with keys of INVENTORY_SLOT_REMAP_* + /// * never ever modify this list in-place, this is why it's private; this may be shared lists in species! + VAR_PRIVATE/list/base_inventory_slots /datum/inventory/New(mob/M) if(!istype(M)) @@ -80,8 +86,6 @@ for(var/datum/action/action in actions.actions) action.update_button_availability() -#warn below - /** * called when an item is added to inventory */ @@ -102,6 +106,18 @@ #warn hook above 3 +//* Slots *// + +/** + * @return list(id = list(INVENTORY_SLOT_REMAP_*)) + */ +/datum/inventory/proc/build_inventory_slots_with_remappings() + return base_inventory_slots + +/datum/inventory/proc/set_base_inventory_slots(list/mapped_slots) + base_inventory_slots = mapped_slots + hud?.rebuild_slots(build_inventory_slots_with_remappings()) + //! unsorted / legacy below /mob/proc/handle_item_denesting(obj/item/I, old_slot, flags, mob/user) diff --git a/code/modules/mob/inventory/inventory_slot.dm b/code/modules/mob/inventory/inventory_slot.dm index 1fc07b864a29..fa9a634f7ca7 100644 --- a/code/modules/mob/inventory/inventory_slot.dm +++ b/code/modules/mob/inventory/inventory_slot.dm @@ -96,9 +96,13 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) /// display order - higher is upper. a


is applied on 0. var/sort_order = 0 - //* HUD + //* HUD *// + /// do we render on hud at all? + var/inventory_hud_rendered = FALSE /// our anchoring enum var/inventory_hud_anchor = INVENTORY_HUD_ANCHOR_AUTOMATIC + /// our hiding class + var/inventory_hud_class = INVENTORY_HUD_CLASS_ALWAYS /// preferred main axis offset var/inventory_hud_main_axis = 0 /// preferred cross axis offset @@ -264,6 +268,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) /datum/inventory_slot/inventory abstract_type = /datum/inventory_slot/inventory inventory_slot_flags = INV_SLOT_IS_RENDERED | INV_SLOT_IS_INVENTORY | INV_SLOT_IS_STRIPPABLE | INV_SLOT_HUD_REQUIRES_EXPAND | INV_SLOT_CONSIDERED_WORN + inventory_hud_rendered = TRUE /datum/inventory_slot/inventory/back name = "back" @@ -302,6 +307,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 1 inventory_hud_icon_state = "uniform" + inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_ICLOTHING @@ -393,7 +399,6 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) return FALSE return ..() - /datum/inventory_slot/inventory/uniform/render(mob/wearer, obj/item/item, bodytype) . = ..() if(!ishuman(wearer)) @@ -431,6 +436,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_main_axis = 4 inventory_hud_cross_axis = 1 inventory_hud_icon_state = "head" + inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_HEAD @@ -471,6 +477,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_main_axis = 1 inventory_hud_cross_axis = 1 inventory_hud_icon_state = "suit" + inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_OCLOTHING @@ -636,6 +643,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_cross_axis = 3 inventory_hud_icon_state = "shoes" + inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_FEET @@ -677,6 +685,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_main_axis = 1 inventory_hud_cross_axis = 2 inventory_hud_icon_state = "gloves" + inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_GLOVES @@ -704,6 +713,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 2 inventory_hud_icon_state = "glasses" + inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_EYES @@ -785,6 +795,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_main_axis = 3 inventory_hud_cross_axis = 2 inventory_hud_icon_state = "ears" + inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_EARS @@ -800,6 +811,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_main_axis = 4 inventory_hud_cross_axis = 2 inventory_hud_icon_state = "ears" + inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_EARS @@ -817,6 +829,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_main_axis = 3 inventory_hud_cross_axis = 1 inventory_hud_icon_state = "mask" + inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS slot_flags_required = SLOT_MASK From 37e52fd94fcb31e6486c939a31d6f1339f2cc0e2 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:49:02 +0000 Subject: [PATCH 082/140] changes --- code/modules/mob/inventory/inventory.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index d40bda012ad4..f4f54eaa46ca 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -25,6 +25,8 @@ //* HUD *// /// our hud + /// + /// todo: can we render this per user mob? /datum/remote_control? var/datum/mob_hud/inventory/hud //* Inventory *// From 61bfde0c864b0d6284dc0c0db94ce1c1be53627d Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:49:20 +0000 Subject: [PATCH 083/140] Changes --- code/game/click/click.dm | 14 +- code/game/rendering/legacy/hud.dm | 98 +-------- code/game/rendering/legacy/human.dm | 97 -------- code/game/rendering/mob_huds/inventory.dm | 207 ++++++++++++++++-- code/game/rendering/mob_huds/mob_hud.dm | 12 + code/game/rendering/screen.dm | 19 +- .../mob/living/carbon/human/update_icons.dm | 4 +- .../mob/living/simple_mob/simple_hud.dm | 62 ------ code/modules/mob/mob-hands.dm | 4 +- code/modules/mob/mob-inventory-abstraction.dm | 1 - code/modules/species/station/adherent.dm | 1 - code/modules/species/station/diona.dm | 1 - code/modules/species/station/monkey.dm | 1 - .../species/xenomorphs/alien_species.dm | 22 +- 14 files changed, 237 insertions(+), 306 deletions(-) diff --git a/code/game/click/click.dm b/code/game/click/click.dm index b7770f360371..17dbc881f349 100644 --- a/code/game/click/click.dm +++ b/code/game/click/click.dm @@ -1,7 +1,3 @@ -/* - Click code cleanup - ~Sayu -*/ // 1 decisecond click delay (above and beyond mob/next_move) /mob/var/next_click = 0 @@ -20,22 +16,18 @@ if(!(atom_flags & ATOM_INITIALIZED)) to_chat(usr, SPAN_WARNING("[type] initialization failure. Click dropped. Contact a coder or admin.")) return - if(src) - SEND_SIGNAL(src, COMSIG_CLICK, location, control, params, usr) - usr.ClickOn(src, params) + SEND_SIGNAL(src, COMSIG_CLICK, location, control, params, usr) + usr.ClickOn(src, params) /atom/DblClick(var/location, var/control, var/params) if(!(atom_flags & ATOM_INITIALIZED)) to_chat(usr, SPAN_WARNING("[type] initialization failure. Click dropped. Contact a coder or admin.")) return - if(src) - usr.DblClickOn(src, params) + usr.DblClickOn(src, params) /atom/MouseWheel(delta_x,delta_y,location,control,params) usr.MouseWheelOn(src, delta_x, delta_y, params) - - /** * click handling entrypoint * diff --git a/code/game/rendering/legacy/hud.dm b/code/game/rendering/legacy/hud.dm index 024c8b5c73d9..9e4a48a6346e 100644 --- a/code/game/rendering/legacy/hud.dm +++ b/code/game/rendering/legacy/hud.dm @@ -105,8 +105,6 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) var/atom/movable/screen/wiz_energy_display var/atom/movable/screen/blobpwrdisplay var/atom/movable/screen/blobhealthdisplay - var/atom/movable/screen/r_hand_hud_object - var/atom/movable/screen/l_hand_hud_object var/atom/movable/screen/action_intent var/atom/movable/screen/move_intent @@ -120,11 +118,6 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) var/list/miniobjs var/list/atom/movable/screen/hotkeybuttons - /// screen_loc's of slots, by slot id. hands are not slots. - var/list/slot_info = list() - /// screen_loc's of hands, by index - index is associative NUMBER AS TEXT. - var/list/hand_info = list() - // pending hardsync var/icon/ui_style var/ui_color @@ -162,92 +155,6 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) QDEL_LIST(static_inventory) -/datum/hud/proc/hidden_inventory_update() - if(!mymob) return - if(ishuman(mymob)) - var/mob/living/carbon/human/H = mymob - for(var/gear_slot in H.species.hud.gear) - var/list/hud_data = H.species.hud.gear[gear_slot] - if(inventory_shown && hud_shown) - switch(hud_data["slot"]) - if(SLOT_ID_HEAD) - if(H.head) H.head.screen_loc = hud_data["loc"] - if(SLOT_ID_SHOES) - if(H.shoes) H.shoes.screen_loc = hud_data["loc"] - if(SLOT_ID_LEFT_EAR) - if(H.l_ear) H.l_ear.screen_loc = hud_data["loc"] - if(SLOT_ID_RIGHT_EAR) - if(H.r_ear) H.r_ear.screen_loc = hud_data["loc"] - if(SLOT_ID_GLOVES) - if(H.gloves) H.gloves.screen_loc = hud_data["loc"] - if(SLOT_ID_GLASSES) - if(H.glasses) H.glasses.screen_loc = hud_data["loc"] - if(SLOT_ID_UNIFORM) - if(H.w_uniform) H.w_uniform.screen_loc = hud_data["loc"] - if(SLOT_ID_SUIT) - if(H.wear_suit) H.wear_suit.screen_loc = hud_data["loc"] - if(SLOT_ID_MASK) - if(H.wear_mask) H.wear_mask.screen_loc = hud_data["loc"] - else - switch(hud_data["slot"]) - if(SLOT_ID_HEAD) - if(H.head) H.head.screen_loc = null - if(SLOT_ID_SHOES) - if(H.shoes) H.shoes.screen_loc = null - if(SLOT_ID_LEFT_EAR) - if(H.l_ear) H.l_ear.screen_loc = null - if(SLOT_ID_RIGHT_EAR) - if(H.r_ear) H.r_ear.screen_loc = null - if(SLOT_ID_GLOVES) - if(H.gloves) H.gloves.screen_loc = null - if(SLOT_ID_GLASSES) - if(H.glasses) H.glasses.screen_loc = null - if(SLOT_ID_UNIFORM) - if(H.w_uniform) H.w_uniform.screen_loc = null - if(SLOT_ID_SUIT) - if(H.wear_suit) H.wear_suit.screen_loc = null - if(SLOT_ID_MASK) - if(H.wear_mask) H.wear_mask.screen_loc = null - - -/datum/hud/proc/persistant_inventory_update() - if(!mymob) - return - - if(ishuman(mymob)) - var/mob/living/carbon/human/H = mymob - for(var/gear_slot in H.species.hud.gear) - var/list/hud_data = H.species.hud.gear[gear_slot] - if(hud_shown) - switch(hud_data["slot"]) - if(SLOT_ID_SUIT_STORAGE) - if(H.s_store) H.s_store.screen_loc = hud_data["loc"] - if(SLOT_ID_WORN_ID) - if(H.wear_id) H.wear_id.screen_loc = hud_data["loc"] - if(SLOT_ID_BELT) - if(H.belt) H.belt.screen_loc = hud_data["loc"] - if(SLOT_ID_BACK) - if(H.back) H.back.screen_loc = hud_data["loc"] - if(SLOT_ID_LEFT_POCKET) - if(H.l_store) H.l_store.screen_loc = hud_data["loc"] - if(SLOT_ID_RIGHT_POCKET) - if(H.r_store) H.r_store.screen_loc = hud_data["loc"] - else - switch(hud_data["slot"]) - if(SLOT_ID_SUIT_STORAGE) - if(H.s_store) H.s_store.screen_loc = null - if(SLOT_ID_WORN_ID) - if(H.wear_id) H.wear_id.screen_loc = null - if(SLOT_ID_BELT) - if(H.belt) H.belt.screen_loc = null - if(SLOT_ID_BACK) - if(H.back) H.back.screen_loc = null - if(SLOT_ID_LEFT_POCKET) - if(H.l_store) H.l_store.screen_loc = null - if(SLOT_ID_RIGHT_POCKET) - if(H.r_store) H.r_store.screen_loc = null - - /datum/hud/proc/instantiate() if(!ismob(mymob)) return 0 @@ -323,8 +230,6 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) //Due to some poor coding some things need special treatment: //These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay if(!full) - src.client.screen += src.hud_used.l_hand_hud_object //we want the hands to be visible - src.client.screen += src.hud_used.r_hand_hud_object //we want the hands to be visible src.client.screen += src.hud_used.action_intent //we want the intent swticher visible src.hud_used.action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. else @@ -353,8 +258,7 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position src.client.screen += src.zone_sel //This one is a special snowflake - hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() + #warn update inventory hud //Similar to button_pressed_F12() but keeps zone_sel, gun_setting_icon, and healths. /mob/proc/toggle_zoom_hud() diff --git a/code/game/rendering/legacy/human.dm b/code/game/rendering/legacy/human.dm index 42418e63ddcf..c0dfeee439a2 100644 --- a/code/game/rendering/legacy/human.dm +++ b/code/game/rendering/legacy/human.dm @@ -14,49 +14,11 @@ src.adding = list() src.other = list() src.hotkeybuttons = list() //These can be disabled for hotkey users - slot_info = list() - hand_info = list() var/list/hud_elements = list() var/atom/movable/screen/using var/atom/movable/screen/inventory/slot/inv_box - // Draw the various inventory equipment slots. - var/has_hidden_gear - for(var/gear_slot in hud_data.gear) - - inv_box = new /atom/movable/screen/inventory/slot() - inv_box.icon = ui_style - inv_box.color = ui_color - inv_box.alpha = ui_alpha - - var/list/slot_data = hud_data.gear[gear_slot] - inv_box.name = gear_slot - inv_box.screen_loc = slot_data["loc"] - inv_box.slot_id = slot_data["slot"] - inv_box.icon_state = slot_data["state"] - slot_info["[inv_box.slot_id]"] = inv_box.screen_loc - - if(slot_data["dir"]) - inv_box.setDir(slot_data["dir"]) - - if(slot_data["toggle"]) - src.other += inv_box - has_hidden_gear = 1 - else - src.adding += inv_box - - if(has_hidden_gear) - using = new /atom/movable/screen() - using.name = "toggle" - using.icon = ui_style - using.icon_state = "other" - using.screen_loc = ui_inventory - using.hud_layerise() - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - // Draw the attack intent dialogue. using = new /atom/movable/screen() using.name = "act_intent" @@ -142,65 +104,6 @@ using.alpha = ui_alpha src.hotkeybuttons += using - if(hud_data.has_hands) - - using = new /atom/movable/screen() - using.name = "equip" - using.icon = ui_style - using.icon_state = "act_equip" - using.screen_loc = ui_equip - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - - var/atom/movable/screen/inventory/hand/right/right_hand = new - right_hand.index = 2 - using = right_hand - using.hud_legacy = src - using.name = "r_hand" - using.icon = ui_style - using.icon_state = "r_hand_inactive" - if(!target.hand) //This being 0 or null means the right hand is in use - using.icon_state = "r_hand_active" - using.screen_loc = ui_rhand - using.color = ui_color - using.alpha = ui_alpha - src.r_hand_hud_object = using - src.adding += using - hand_info["2"] = using.screen_loc - - var/atom/movable/screen/inventory/hand/left/left_hand = new - left_hand.index = 1 - using = left_hand - using.hud_legacy = src - using.name = "l_hand" - using.icon = ui_style - using.icon_state = "l_hand_inactive" - if(target.hand) //This being 1 means the left hand is in use - using.icon_state = "l_hand_active" - using.screen_loc = ui_lhand - using.color = ui_color - using.alpha = ui_alpha - src.l_hand_hud_object = using - src.adding += using - hand_info["1"] = using.screen_loc - - using = new /atom/movable/screen/inventory/swap_hands - using.icon = ui_style - using.icon_state = "hand1" - using.screen_loc = ui_swaphand1 - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - - using = new /atom/movable/screen/inventory/swap_hands - using.icon = ui_style - using.icon_state = "hand2" - using.screen_loc = ui_swaphand2 - using.color = ui_color - using.alpha = ui_alpha - src.adding += using - if(hud_data.has_resist) using = new /atom/movable/screen() using.name = "resist" diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index 12c47afded1e..6ffecf6ad732 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -8,31 +8,142 @@ /// owning inventory var/datum/inventory/host + /// hidden classes + var/list/hidden_classes + /// keyed slot id to screen object var/list/atom/movable/screen/inventory/slot/slot_by_id /// ordered hand objects - var/list/atom/movable/inventory/hand/hands + var/list/atom/movable/screen/inventory/hand/hands /// swap hand object - var/atom/movable/inventory/swap_hand/swap_hand + var/atom/movable/screen/inventory/swap_hand/swap_hand /// equip object - var/atom/movable/inventory/equip_hand/equip_hand + var/atom/movable/screen/inventory/equip_hand/equip_hand /// use hand on self object - var/atom/movable/inventory/use_self_hand/use_self_hand + var/atom/movable/screen/inventory/use_self_hand/use_self_hand + #warn add the drawer. /datum/mob_hud/inventory/New(mob/owner, datum/inventory/host) src.host = host + src.rebuild(host.build_inventory_slots_with_remappings(), host.get_nominal_hand_count()) ..() +/datum/mob_hud/Destroy() + host = null + cleanup() + return ..() + +/datum/mob_hud/inventory/screens() + . = ..() + // slots + . += all_slot_screen_objects() + // hands + . += all_hand_screen_objects() + // buttons + . += all_button_screen_objects() + +/datum/mob_hud/inventory/sync_client(client/C) + . = ..() + for(var/atom/movable/screen/screen_object in screens()) + screen_object.sync_style(hud_style, hud_alpha, hud_color) + +/** + * destroy everything + */ +/datum/mob_hud/inventory/proc/cleanup() + // slots + var/list/atom/movable/screen/inventory/slot/slot_objects = all_slot_screen_objects() + remove_screen(slot_objects) + QDEL_LIST(slot_objects) + + // hands + var/list/atom/movable/screen/inventory/hand/hand_objects = all_hand_screen_objects() + remove_screen(hand_objects) + QDEL_LIST(hand_objects) + + // buttons + var/list/atom/movable/screen/inventory/button_objects = all_button_screen_objects() + remove_screen(button_objects) + QDEL_NULL(button_objects) + +/** + * Accepts a list with keys as slot IDs, and values as null or a list of + * INVENTORY_SLOT_REMAP_*'s. + */ +/datum/mob_hud/inventory/proc/rebuild(list/inventory_slots_with_mappings, number_of_hands) + cleanup() + + // buttons + add_screen((swap_hand = new)) + add_screen((equip_hand = new)) + add_screen((use_self_hand = new)) + + // slots + LAZYINITLIST(slot_by_id) + for(var/slot_id in inventory_slots_with_mappings) + var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) + if(!slot) + stack_trace("failed to fetch slot during hud rebuild: [slot_id]") + continue + slot_by_id += new /atom/movable/screen/inventory/slot(null, slot, inventory_slot_with_mappings[slot_id] || list()) + + // hands + rebuild_hands(number_of_hands) + +/** + * Rebuilds our hands. Doesn't rebuild anything else. + */ +/datum/mob_hud/inventory/proc/rebuild_hands(number_of_hands) + LAZYINITLIST(hands) + #warn impl + +/datum/mob_hud/inventory/proc/all_slot_screen_objects(filter_by_class) + RETURN_TYPE(/list) + . = list() + if(filter_by_class) + if(islist(filter_by_class)) + for(var/id in slot_by_id) + var/atom/movable/screen/inventory/slot/slot_object = slot_by_id[id] + if(slot_object.inventory_hud_class in filter_by_class) + . += slot_object + else + for(var/id in slot_by_id) + var/atom/movable/screen/inventory/slot/slot_object = slot_by_id[id] + if(slot_object.inventory_hud_class == filter_by_class) + . += slot_object + else + for(var/id in slot_by_id) + . += slot_by_id[id] + +/datum/mob_hud/inventory/proc/all_hand_screen_objects() + RETURN_TYPE(/list) + . = list() + for(var/atom/movable/object in hands) + . += object + +/datum/mob_hud/inventory/proc/all_button_screen_objects() + RETURN_TYPE(/list) + . = list() + if(swap_hand) + . += swap_hand + if(equip_hand) + . += equip_hand + if(use_self_hand) + . += use_self_hand + /datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) + #warn impl /datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot_or_index) + #warn impl /datum/mob_hud/inventory/proc/move_item(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) + #warn impl /datum/mob_hud/inventory/proc/swap_active_hand(from_index, to_index) - var/atom/movable/inventory/hands/old_hand = hands[from_index] - var/atom/movable/inventory/hands/new_hand = hands[to_index] + var/atom/movable/screen/inventory/hands/old_hand = hands[from_index] + var/atom/movable/screen/inventory/hands/new_hand = hands[to_index] #warn impl all @@ -46,10 +157,16 @@ /atom/movable/screen/inventory/Initialize(mapload, datum/mob_hud/inventory/hud) . = ..() src.hud = hud - sync_style(hud.style) + sync_style(hud.hud_style) + +/atom/movable/screen/inventory/check_allowed(mob/user) + return ..() && hud.owner == user + +/atom/movable/screen/inventory/on_click(mob/user, list/params) + var/obj/item/held = user.get_active_held_item() + handle_inventory_click(user, held) /atom/movable/screen/inventory/sync_style(datum/hud_style/style, style_alpha, style_color) - icon = style.inventory_icons alpha = style_alpha color = style_color @@ -58,41 +175,93 @@ * * @params * * user - clicking user; not necessarily the inventory's owner - * * slot_or_index - slot ID or numerical hand index * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. */ -/atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) +/atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, obj/item/with_item) + return #warn impl all +/** + * Slot screen objects + */ /atom/movable/screen/inventory/slot /// our inventory slot id var/inventory_slot_id + /// our (potentially remapped) class + var/inventory_hud_class = INVENTORY_HUD_CLASS_ALWAYS + /// our (potentially remapped) main axis + var/inventory_hud_main_axis = 0 + /// our (potentially remapped) cross axis + var/inventory_hud_cross_axis = 0 + /// our (potentially remapped) anchor + var/inventory_hud_anchor = INVENTORY_HUD_ANCHOR_AUTOMATIC + +/atom/movable/screen/inventory/slot/Initialize(mapload, datum/mob_hud/inventory/hud, datum/inventory_slot/slot, list/slot_remappings) + . = ..() + inventory_slot_id = slot.id + inventory_hud_class = slot_remappings[INVENTORY_SLOT_REMAP_CLASS] || slot.inventory_hud_class + inventory_hud_main_axis = slot_remappings[INVENTORY_SLOT_REMAP_MAIN_AXIS] || slot.inventory_hud_main_axis + inventory_hud_cross_axis = slot_remappings[INVENTORY_SLOT_REMAP_CROSS_AXIS] || slot.inventory_hud_cross_axis + inventory_hud_anchor = slot_remappings[INVENTORY_SLOT_REMAP_ANCHOR] || slot.inventory_hud_anchor + name = slot_remappings[INVENTORY_SLOT_REMAP_NAME] || slot.display_name || slot.name -/atom/movable/inventory/hand +/atom/movable/screen/inventory/slot/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons_slot + +/atom/movable/screen/inventory/slot/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) + +/** + * Hand screen objects + */ +/atom/movable/screen/inventory/hand /// target hand index var/hand_index -/atom/movable/inventory/hand/Initialize(mapload, datum/inventory/host, hand_index) +/atom/movable/screen/inventory/hand/Initialize(mapload, datum/inventory/host, hand_index) . = ..() src.hand_index = hand_index sync_index(hand_index) -/atom/movable/inventory/hand/proc/sync_index(index = hand_index) +/atom/movable/screen/inventory/hand/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons + +/atom/movable/screen/inventory/hand/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) + +/atom/movable/screen/inventory/hand/proc/sync_index(index = hand_index) screen_loc = SCREEN_LOC_INV_HAND(index) var/index_of_side = round(index / 2) name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" icon_state = "hand-[index % 2? "left" : "right"]" -/atom/movable/inventory/swap_hand +/** + * Button: 'swap hand' + */ +/atom/movable/screen/inventory/swap_hand icon_state = "swap" -/atom/movable/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) +/atom/movable/screen/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() icon = style.inventory_icons_wide - alpha = style_alpha - color = style_color -/atom/movable/inventory/equip_hand +/atom/movable/screen/inventory/swap_hands/on_click(mob/user, list/params) + +/** + * Button: 'auto equip' + */ +/atom/movable/screen/inventory/equip_hand icon_state = "equip" -// /atom/movable/inventory/hands/use_self_hand +/atom/movable/screen/inventory/equip_hand/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons + +/atom/movable/screen/inventory/equip_hand/on_click(mob/user, list/params) + +/** + * Button: 'activate inhand' + */ +/atom/movable/screen/inventory/hands/use_self_hand + #warn does main have this? diff --git a/code/game/rendering/mob_huds/mob_hud.dm b/code/game/rendering/mob_huds/mob_hud.dm index b3dcf607f384..50313ded8b40 100644 --- a/code/game/rendering/mob_huds/mob_hud.dm +++ b/code/game/rendering/mob_huds/mob_hud.dm @@ -65,18 +65,30 @@ C.screen -= screens() C.images -= images() +/** + * * arg can be a list or a single object + */ /datum/mob_hud/proc/add_screen(atom/movable/what) for(var/client/C as anything in using) C.screen += what +/** + * * arg can be a list or a single object + */ /datum/mob_hud/proc/remove_screen(atom/movable/what) for(var/client/C as anything in using) C.screen -= what +/** + * * arg can be a list or a single object + */ /datum/mob_hud/proc/add_image(image/what) for(var/client/C as anything in using) C.images += what +/** + * * arg can be a list or a single object + */ /datum/mob_hud/proc/remove_image(image/what) for(var/client/C as anything in using) C.images -= what diff --git a/code/game/rendering/screen.dm b/code/game/rendering/screen.dm index d3c83096809a..7ab93181f8a5 100644 --- a/code/game/rendering/screen.dm +++ b/code/game/rendering/screen.dm @@ -19,10 +19,23 @@ //* Default Click Handling *// +/atom/movable/screen/Click(location, control, params) + if(!check_allowed(usr)) + return + on_click(usr, params2list(params)) + +/atom/movable/screen/DblClick(location, control, params) + if(!check_allowed(usr)) + return + on_doubleclick(usr, params2list(params)) + /atom/movable/screen/proc/on_click(mob/user, list/params) + return /atom/movable/screen/proc/on_doubleclick(mob/user, list/params) + return -/atom/movable/screen - -#warn impl all +/atom/movable/screen/proc/check_allowed(mob/user) + if(hud_legacy?.mymob && user != hud_legacy.mymob) + return FALSE + return TRUE diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index daaaf6d7ebd9..06b1413e261b 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -42,9 +42,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //update whether handcuffs appears on our hud. /mob/living/carbon/proc/update_hud_handcuffed() - if(hud_used && hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) - hud_used.l_hand_hud_object.update_icon() - hud_used.r_hand_hud_object.update_icon() + #warn impl - inventory hud /mob/living/carbon/human/update_transform() var/matrix/old_matrix = transform diff --git a/code/modules/mob/living/simple_mob/simple_hud.dm b/code/modules/mob/living/simple_mob/simple_hud.dm index 5c183ef9a7af..723152787dba 100644 --- a/code/modules/mob/living/simple_mob/simple_hud.dm +++ b/code/modules/mob/living/simple_mob/simple_hud.dm @@ -230,68 +230,6 @@ using.alpha = ui_alpha hud.hotkeybuttons += using - //Equip detail - using = new /atom/movable/screen() - using.name = "equip" - using.icon = ui_style - using.icon_state = "act_equip" - using.screen_loc = ui_equip - using.color = ui_color - using.alpha = ui_alpha - hud.adding += using - - //Hand slots themselves - var/atom/movable/screen/inventory/hand/right/right_hand = new - right_hand.index = 2 - using = right_hand - using.hud_legacy = src - using.name = "r_hand" - using.icon = ui_style - using.icon_state = "r_hand_inactive" - if(!hand) //This being 0 or null means the right hand is in use - using.icon_state = "r_hand_active" - using.screen_loc = ui_rhand - using.color = ui_color - using.alpha = ui_alpha - hud.r_hand_hud_object = using - hud.adding += using - hand_info["2"] = using.screen_loc - - var/atom/movable/screen/inventory/hand/left/left_hand = new - left_hand.index = 1 - using = left_hand - using.hud_legacy = src - using.name = "l_hand" - using.icon = ui_style - using.icon_state = "l_hand_inactive" - if(hand) //This being 1 means the left hand is in use - using.icon_state = "l_hand_active" - using.screen_loc = ui_lhand - using.color = ui_color - using.alpha = ui_alpha - hud.l_hand_hud_object = using - hud.adding += using - hand_info["1"] = using.screen_loc - - //Swaphand titlebar - using = new /atom/movable/screen/inventory/swap_hands - using.name = "hand" - using.icon = ui_style - using.icon_state = "hand1" - using.screen_loc = ui_swaphand1 - using.color = ui_color - using.alpha = ui_alpha - hud.adding += using - - using = new /atom/movable/screen/inventory/swap_hands - using.name = "hand" - using.icon = ui_style - using.icon_state = "hand2" - using.screen_loc = ui_swaphand2 - using.color = ui_color - using.alpha = ui_alpha - hud.adding += using - //Throw button throw_icon = new /atom/movable/screen() throw_icon.icon = ui_style diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index 9817632c6853..ac9d9dfefc16 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -187,7 +187,7 @@ . = TRUE - hands_hud?.swap_active_hand(old_index, to_index) + inventory.hud?.swap_active_hand(old_index, to_index) //! LEGACY // We just swapped hands, so the thing in our inactive hand will notice it's not the focus @@ -195,5 +195,3 @@ if(was_active.zoom) was_active.zoom() //! End - -#warn impl diff --git a/code/modules/mob/mob-inventory-abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm index e429a70e3a0e..5466d8285ad7 100644 --- a/code/modules/mob/mob-inventory-abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -152,7 +152,6 @@ * whether it's from the ground, from a slot, or from another hand. */ /mob/proc/equip_hand_impl(obj/item/I, index, flags) - PRIVATE_PROC(TRUE) if(!I) return TRUE // let's not do that if it's deleted! diff --git a/code/modules/species/station/adherent.dm b/code/modules/species/station/adherent.dm index bed42e742b4c..35e88b13be70 100644 --- a/code/modules/species/station/adherent.dm +++ b/code/modules/species/station/adherent.dm @@ -136,7 +136,6 @@ //* Inventory *// - #warn hud remappings inventory_slots = list( /datum/inventory_slot/inventory/back::id, /datum/inventory_slot/inventory/ears/left::id = list( diff --git a/code/modules/species/station/diona.dm b/code/modules/species/station/diona.dm index c8ce576ff736..93fa29e4e795 100644 --- a/code/modules/species/station/diona.dm +++ b/code/modules/species/station/diona.dm @@ -121,7 +121,6 @@ //* Inventory *// - #warn remappings for hud positions inventory_slots = list( /datum/inventory_slot/inventory/back::id, /datum/inventory_slot/inventory/suit::id = list( diff --git a/code/modules/species/station/monkey.dm b/code/modules/species/station/monkey.dm index 9b4cb94b0ee9..fb0230fe47c8 100644 --- a/code/modules/species/station/monkey.dm +++ b/code/modules/species/station/monkey.dm @@ -66,7 +66,6 @@ //* Inventory *// - #warn remappings for hud positions inventory_slots = list( /datum/inventory_slot/inventory/back::id, /datum/inventory_slot/inventory/id::id = list( diff --git a/code/modules/species/xenomorphs/alien_species.dm b/code/modules/species/xenomorphs/alien_species.dm index 87814b21f528..6016d95308a2 100644 --- a/code/modules/species/xenomorphs/alien_species.dm +++ b/code/modules/species/xenomorphs/alien_species.dm @@ -325,6 +325,21 @@ /mob/living/carbon/human/proc/acidspit, ) + //* Inventory *// + + inventory_slots = list( + /datum/inventory_slot/inventory/suit::id = list( + INVENTORY_SLOT_REMAP_MAIN_AXIS = 0, + INVENTORY_SLOT_REMAP_CROSS_AXIS = 4, + ), + /datum/inventory_slot/inventory/pocket/left::id, + /datum/inventory_slot/inventory/pocket/right::id, + /datum/inventory_slot/inventory/head::id = list( + INVENTORY_SLOT_REMAP_MAIN_AXIS = 0, + INVENTORY_SLOT_REMAP_CROSS_AXIS = 3, + ), + ) + /datum/species/xenos/queen/handle_login_special(var/mob/living/carbon/human/H) ..() // Make sure only one official queen exists at any point. @@ -346,10 +361,3 @@ has_nutrition = 0 has_bodytemp = 0 has_internals = 0 - - gear = list( - SLOT_ID_SUIT = list("loc" = ui_belt, "name" = "Suit", "slot" = SLOT_ID_SUIT, "state" = "equip", "dir" = SOUTH), - SLOT_ID_HEAD = list("loc" = ui_id, "name" = "Hat", "slot" = SLOT_ID_HEAD, "state" = "hair"), - SLOT_ID_LEFT_POCKET = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = SLOT_ID_LEFT_POCKET, "state" = "pocket"), - SLOT_ID_RIGHT_POCKET = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = SLOT_ID_RIGHT_POCKET, "state" = "pocket"), - ) From 1afa4974222b9afb9573b803f9fa44857f721e13 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 18 Sep 2024 21:06:03 +0000 Subject: [PATCH 084/140] sigh --- code/game/rendering/mob_huds/inventory.dm | 66 +++++++++++++++---- .../mob/living/carbon/human/inventory.dm | 2 +- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index 6ffecf6ad732..444570d37829 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -26,10 +26,10 @@ /datum/mob_hud/inventory/New(mob/owner, datum/inventory/host) src.host = host - src.rebuild(host.build_inventory_slots_with_remappings(), host.get_nominal_hand_count()) + src.rebuild(host.build_inventory_slots_with_remappings(), length(host.held_items)) ..() -/datum/mob_hud/Destroy() +/datum/mob_hud/inventory/Destroy() host = null cleanup() return ..() @@ -80,23 +80,63 @@ add_screen((use_self_hand = new)) // slots + rebuild_slots(inventory_slots_with_mappings) + + // hands + rebuild_hands(number_of_hands) + +/** + * Rebuilds our slots. Doesn't rebuild anything else. Doesn't wipe old objects. + */ +/datum/mob_hud/inventory/proc/rebuild_slots(list/inventory_slots_with_mappings) LAZYINITLIST(slot_by_id) for(var/slot_id in inventory_slots_with_mappings) var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) if(!slot) stack_trace("failed to fetch slot during hud rebuild: [slot_id]") continue - slot_by_id += new /atom/movable/screen/inventory/slot(null, slot, inventory_slot_with_mappings[slot_id] || list()) + slot_by_id += new /atom/movable/screen/inventory/slot(null, slot, inventory_slots_with_mappings[slot_id] || list()) - // hands - rebuild_hands(number_of_hands) + // here is where we basically pull a CSS flexbox. + + var/max_drawer_main = 0 + var/max_drawer_cross = 0 + + var/min_hands_main = 0 + var/max_hands_main = 0 + var/max_hands_cross = 0 + + var/list/atom/movable/screen/inventory/slot/place_anywhere = list() + var/list/atom/movable/screen/inventory/slot/ + + for(var/id in slot_by_id) + var/atom/movable/screen/inventory/slot/slot_object = slot_by_id[id] + + switch(slot_object.inventory_hud_anchor) + if(INVENTORY_HUD_ANCHOR_AUTOMATIC) + if(INVENTORY_HUD_ANCHOR_TO_DRAWER) + if(INVENTORY_HUD_ANCHOR_TO_HANDS) + #warn impl /** - * Rebuilds our hands. Doesn't rebuild anything else. + * Rebuilds our hands. Doesn't rebuild anything else. Doesn't wipe old objects. */ /datum/mob_hud/inventory/proc/rebuild_hands(number_of_hands) LAZYINITLIST(hands) - #warn impl + if(length(hands) < number_of_hands) + var/old_length = length(hands) + hands.len = number_of_hands + for(var/i in old_length + 1 to number_of_hands) + var/atom/movable/screen/inventory/hand/hand_object = new(null, src, i) + add_screen(hand_object) + hands[i] = hand_object + else if(length(hands) > number_of_hands) + for(var/i in number_of_hands + 1 to length(hands)) + if(!hands[i]) + continue + remove_screen(hands[i]) + qdel(hands[i]) + hands.len = number_of_hands /datum/mob_hud/inventory/proc/all_slot_screen_objects(filter_by_class) RETURN_TYPE(/list) @@ -142,10 +182,11 @@ #warn impl /datum/mob_hud/inventory/proc/swap_active_hand(from_index, to_index) - var/atom/movable/screen/inventory/hands/old_hand = hands[from_index] - var/atom/movable/screen/inventory/hands/new_hand = hands[to_index] + var/atom/movable/screen/inventory/hand/old_hand = hands[from_index] + var/atom/movable/screen/inventory/hand/new_hand = hands[to_index] -#warn impl all + old_hand.cut_overlay("[old_hand.icon_state]-active") + new_hand.add_overlay("[new_hand.icon_state]-active") /atom/movable/screen/inventory name = "inventory" @@ -184,6 +225,9 @@ /** * Slot screen objects + * + * * Stores remappings so we don't have to do it separately + * * Stores calculated screen_loc so we don't have to recalculate unless slots are mutated. */ /atom/movable/screen/inventory/slot /// our inventory slot id @@ -263,5 +307,5 @@ /** * Button: 'activate inhand' */ -/atom/movable/screen/inventory/hands/use_self_hand +/atom/movable/screen/inventory/use_self_hand #warn does main have this? diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index eb92b9cb3363..17c1c6da0818 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -271,4 +271,4 @@ var/datum/inventory_slot/slot_meta = resolve_inventory_slot(id) if(!slot_meta) return FALSE - return !(slot_meta.inventory_slot_flags & INV_SLOT_IS_INVENTORY) || !species || (id in species.hud.gear) + return !(slot_meta.inventory_slot_flags & INV_SLOT_IS_INVENTORY) || !species || (id in species.inventory_slots) From cf8e6239ea6c5d333743a9c76ab966ab37b3fc8a Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 20 Sep 2024 15:41:04 +0000 Subject: [PATCH 085/140] item binding --- code/game/atoms/atom.dm | 5 -- code/game/objects/items-interaction.dm | 16 ++--- code/game/objects/items-inventory.dm | 18 ++--- code/game/rendering/legacy/human.dm | 2 +- .../rendering/legacy/inventory/inventory.dm | 14 ++-- code/game/rendering/mob_huds/inventory.dm | 71 ++++++++++++------- code/modules/mob/inventory/inventory.dm | 4 -- .../mob/living/carbon/human/update_icons.dm | 11 --- .../mob/living/simple_mob/simple_hud.dm | 2 +- code/modules/mob/mob-inventory-internal.dm | 9 --- code/modules/mob/mob-inventory.dm | 1 - code/modules/mob/mob_helpers.dm | 29 -------- 12 files changed, 67 insertions(+), 115 deletions(-) diff --git a/code/game/atoms/atom.dm b/code/game/atoms/atom.dm index 95403d73eb59..544a902ee14a 100644 --- a/code/game/atoms/atom.dm +++ b/code/game/atoms/atom.dm @@ -1087,11 +1087,6 @@ set_base_layer(HUD_LAYER_ITEM) // appearance_flags |= NO_CLIENT_COLOR -/atom/proc/hud_unlayerise() - plane = initial(plane) - set_base_layer(initial(layer)) - // appearance_flags &= ~(NO_CLIENT_COLOR) - /atom/proc/reset_plane_and_layer() plane = initial(plane) set_base_layer(initial(layer)) diff --git a/code/game/objects/items-interaction.dm b/code/game/objects/items-interaction.dm index e15dc228a10e..98b5f64eeef6 100644 --- a/code/game/objects/items-interaction.dm +++ b/code/game/objects/items-interaction.dm @@ -114,12 +114,12 @@ return ..() if(user.Adjacent(src)) // check for equip - if(istype(over, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over + if(istype(over, /atom/movable/screen/inventory/plate/hand)) + var/atom/movable/screen/inventory/plate/hand/H = over user.put_in_hand(src, H.index) return CLICKCHAIN_DO_NOT_PROPAGATE - else if(istype(over, /atom/movable/screen/inventory/slot)) - var/atom/movable/screen/inventory/slot/S = over + else if(istype(over, /atom/movable/screen/inventory/plate/slot)) + var/atom/movable/screen/inventory/plate/slot/S = over user.equip_to_slot_if_possible(src, S.slot_id) return CLICKCHAIN_DO_NOT_PROPAGATE // check for slide @@ -138,12 +138,12 @@ return CLICKCHAIN_DO_NOT_PROPAGATE else // being held, check for attempt unequip - if(istype(over, /atom/movable/screen/inventory/hand)) - var/atom/movable/screen/inventory/hand/H = over + if(istype(over, /atom/movable/screen/inventory/plate/hand)) + var/atom/movable/screen/inventory/plate/hand/H = over user.put_in_hand(src, H.index) return CLICKCHAIN_DO_NOT_PROPAGATE - else if(istype(over, /atom/movable/screen/inventory/slot)) - var/atom/movable/screen/inventory/slot/S = over + else if(istype(over, /atom/movable/screen/inventory/plate/slot)) + var/atom/movable/screen/inventory/plate/slot/S = over user.equip_to_slot_if_possible(src, S.slot_id) return CLICKCHAIN_DO_NOT_PROPAGATE else if(istype(over, /turf)) diff --git a/code/game/objects/items-inventory.dm b/code/game/objects/items-inventory.dm index 374640c1a4d6..edd53d8a9808 100644 --- a/code/game/objects/items-inventory.dm +++ b/code/game/objects/items-inventory.dm @@ -16,13 +16,7 @@ SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot, flags) SEND_SIGNAL(user, COMSIG_MOB_ITEM_EQUIPPED, src, slot, flags) worn_slot = slot - if(!(flags & INV_OP_IS_ACCESSORY)) - // todo: shouldn't be in here - hud_layerise() - // todo: shouldn't be in here - if(user) - user.position_hud_item(src, slot) - user.client?.screen |= src + if((slot != SLOT_ID_HANDS) && equip_sound) playsound(src, equip_sound, 30, ignore_walls = FALSE) @@ -49,12 +43,7 @@ SEND_SIGNAL(src, COMSIG_ITEM_UNEQUIPPED, user, slot, flags) SEND_SIGNAL(user, COMSIG_MOB_ITEM_UNEQUIPPED, src, slot, flags) worn_slot = null - if(!(flags & INV_OP_IS_ACCESSORY)) - // todo: shouldn't be in here - hud_unlayerise() - // todo: shouldn't be in here - screen_loc = null - user?.client?.screen -= src + if(!(flags & INV_OP_DIRECTLY_DROPPING) && (slot != SLOT_ID_HANDS) && unequip_sound) playsound(src, unequip_sound, 30, ignore_walls = FALSE) @@ -78,7 +67,7 @@ /obj/item/proc/dropped(mob/user, flags, atom/newLoc) SHOULD_CALL_PARENT(TRUE) - hud_unlayerise() + vis_flags &= ~(VIS_INHERIT_LAYER | VIS_INHERIT_PLANE) item_flags &= ~ITEM_IN_INVENTORY . = SEND_SIGNAL(src, COMSIG_ITEM_DROPPED, user, flags, newLoc) @@ -137,6 +126,7 @@ hud_layerise() item_flags |= ITEM_IN_INVENTORY + vis_flags |= (VIS_INHERIT_LAYER | VIS_INHERIT_PLANE) // todo: should this be here transform = null diff --git a/code/game/rendering/legacy/human.dm b/code/game/rendering/legacy/human.dm index c0dfeee439a2..16eff23d3d70 100644 --- a/code/game/rendering/legacy/human.dm +++ b/code/game/rendering/legacy/human.dm @@ -17,7 +17,7 @@ var/list/hud_elements = list() var/atom/movable/screen/using - var/atom/movable/screen/inventory/slot/inv_box + var/atom/movable/screen/inventory/plate/slot/inv_box // Draw the attack intent dialogue. using = new /atom/movable/screen() diff --git a/code/game/rendering/legacy/inventory/inventory.dm b/code/game/rendering/legacy/inventory/inventory.dm index 55655cc843a4..41a629d9fdf2 100644 --- a/code/game/rendering/legacy/inventory/inventory.dm +++ b/code/game/rendering/legacy/inventory/inventory.dm @@ -8,18 +8,18 @@ return FALSE return TRUE -/atom/movable/screen/inventory/slot +/atom/movable/screen/inventory/plate/slot /// the ID of this slot var/slot_id -/atom/movable/screen/inventory/slot/Click() +/atom/movable/screen/inventory/plate/slot/Click() if(!check_inventory_usage(usr)) return // usr.attack_ui(slot_id) // Hand slots are special to handle the handcuffs overlay -/atom/movable/screen/inventory/hand +/atom/movable/screen/inventory/plate/hand /// hand index var/index /// are we the left hand @@ -27,10 +27,10 @@ /// current handcuffed overlay var/image/handcuff_overlay -/atom/movable/screen/inventory/hand/Click() +/atom/movable/screen/inventory/plate/hand/Click() usr.activate_hand_of_index(index) -/atom/movable/screen/inventory/hand/update_icon() +/atom/movable/screen/inventory/plate/hand/update_icon() ..() if(!hud) return @@ -45,11 +45,11 @@ if(C.handcuffed) add_overlay(handcuff_overlay) -/atom/movable/screen/inventory/hand/left +/atom/movable/screen/inventory/plate/hand/left name = "l_hand" is_left_hand = TRUE -/atom/movable/screen/inventory/hand/right +/atom/movable/screen/inventory/plate/hand/right name = "r_hand" is_left_hand = FALSE diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index 444570d37829..acc811cbc649 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -12,9 +12,9 @@ var/list/hidden_classes /// keyed slot id to screen object - var/list/atom/movable/screen/inventory/slot/slot_by_id + var/list/atom/movable/screen/inventory/plate/slot/slot_by_id /// ordered hand objects - var/list/atom/movable/screen/inventory/hand/hands + var/list/atom/movable/screen/inventory/plate/hand/hands /// swap hand object var/atom/movable/screen/inventory/swap_hand/swap_hand @@ -53,12 +53,12 @@ */ /datum/mob_hud/inventory/proc/cleanup() // slots - var/list/atom/movable/screen/inventory/slot/slot_objects = all_slot_screen_objects() + var/list/atom/movable/screen/inventory/plate/slot/slot_objects = all_slot_screen_objects() remove_screen(slot_objects) QDEL_LIST(slot_objects) // hands - var/list/atom/movable/screen/inventory/hand/hand_objects = all_hand_screen_objects() + var/list/atom/movable/screen/inventory/plate/hand/hand_objects = all_hand_screen_objects() remove_screen(hand_objects) QDEL_LIST(hand_objects) @@ -95,7 +95,7 @@ if(!slot) stack_trace("failed to fetch slot during hud rebuild: [slot_id]") continue - slot_by_id += new /atom/movable/screen/inventory/slot(null, slot, inventory_slots_with_mappings[slot_id] || list()) + slot_by_id += new /atom/movable/screen/inventory/plate/slot(null, slot, inventory_slots_with_mappings[slot_id] || list()) // here is where we basically pull a CSS flexbox. @@ -106,11 +106,11 @@ var/max_hands_main = 0 var/max_hands_cross = 0 - var/list/atom/movable/screen/inventory/slot/place_anywhere = list() - var/list/atom/movable/screen/inventory/slot/ + var/list/atom/movable/screen/inventory/plate/slot/place_anywhere = list() + var/list/atom/movable/screen/inventory/plate/slot/ for(var/id in slot_by_id) - var/atom/movable/screen/inventory/slot/slot_object = slot_by_id[id] + var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] switch(slot_object.inventory_hud_anchor) if(INVENTORY_HUD_ANCHOR_AUTOMATIC) @@ -127,7 +127,7 @@ var/old_length = length(hands) hands.len = number_of_hands for(var/i in old_length + 1 to number_of_hands) - var/atom/movable/screen/inventory/hand/hand_object = new(null, src, i) + var/atom/movable/screen/inventory/plate/hand/hand_object = new(null, src, i) add_screen(hand_object) hands[i] = hand_object else if(length(hands) > number_of_hands) @@ -144,12 +144,12 @@ if(filter_by_class) if(islist(filter_by_class)) for(var/id in slot_by_id) - var/atom/movable/screen/inventory/slot/slot_object = slot_by_id[id] + var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] if(slot_object.inventory_hud_class in filter_by_class) . += slot_object else for(var/id in slot_by_id) - var/atom/movable/screen/inventory/slot/slot_object = slot_by_id[id] + var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] if(slot_object.inventory_hud_class == filter_by_class) . += slot_object else @@ -173,17 +173,22 @@ . += use_self_hand /datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) - #warn impl + var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slot_by_id[slot_or_index.id] + screen_obj.bind_item(item) /datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot_or_index) - #warn impl + var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slot_by_id[slot_or_index.id] + screen_obj.unbind_item(item) /datum/mob_hud/inventory/proc/move_item(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) - #warn impl + var/atom/movable/screen/inventory/plate/old_screen_obj = isnum(from_slot_or_index) ? hands[from_slot_or_index] : slot_by_id[from_slot_or_index.id] + var/atom/movable/screen/inventory/plate/new_screen_obj = isnum(to_slot_or_index) ? hands[to_slot_or_index] : slot_by_id[to_slot_or_index.id] + old_screen_obj.unbind_item(item) + new_screen_obj.bind_item(item) /datum/mob_hud/inventory/proc/swap_active_hand(from_index, to_index) - var/atom/movable/screen/inventory/hand/old_hand = hands[from_index] - var/atom/movable/screen/inventory/hand/new_hand = hands[to_index] + var/atom/movable/screen/inventory/plate/hand/old_hand = hands[from_index] + var/atom/movable/screen/inventory/plate/hand/new_hand = hands[to_index] old_hand.cut_overlay("[old_hand.icon_state]-active") new_hand.add_overlay("[new_hand.icon_state]-active") @@ -223,13 +228,29 @@ #warn impl all +/** + * Base type of item-holding screen objects + */ +/atom/movable/screen/inventory/plate + +/atom/movable/screen/inventory/plate/Destroy() + if(length(vis_contents) != 0) + vis_contents.len = 0 + return ..() + +/atom/movable/screen/inventory/plate/proc/bind_item(obj/item/item) + vis_contents += item + +/atom/movable/screen/inventory/plate/proc/unbind_item(obj/item/item) + vis_contents -= item + /** * Slot screen objects * * * Stores remappings so we don't have to do it separately * * Stores calculated screen_loc so we don't have to recalculate unless slots are mutated. */ -/atom/movable/screen/inventory/slot +/atom/movable/screen/inventory/plate/slot /// our inventory slot id var/inventory_slot_id /// our (potentially remapped) class @@ -241,7 +262,7 @@ /// our (potentially remapped) anchor var/inventory_hud_anchor = INVENTORY_HUD_ANCHOR_AUTOMATIC -/atom/movable/screen/inventory/slot/Initialize(mapload, datum/mob_hud/inventory/hud, datum/inventory_slot/slot, list/slot_remappings) +/atom/movable/screen/inventory/plate/slot/Initialize(mapload, datum/mob_hud/inventory/hud, datum/inventory_slot/slot, list/slot_remappings) . = ..() inventory_slot_id = slot.id inventory_hud_class = slot_remappings[INVENTORY_SLOT_REMAP_CLASS] || slot.inventory_hud_class @@ -250,31 +271,31 @@ inventory_hud_anchor = slot_remappings[INVENTORY_SLOT_REMAP_ANCHOR] || slot.inventory_hud_anchor name = slot_remappings[INVENTORY_SLOT_REMAP_NAME] || slot.display_name || slot.name -/atom/movable/screen/inventory/slot/sync_style(datum/hud_style/style, style_alpha, style_color) +/atom/movable/screen/inventory/plate/slot/sync_style(datum/hud_style/style, style_alpha, style_color) ..() icon = style.inventory_icons_slot -/atom/movable/screen/inventory/slot/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) +/atom/movable/screen/inventory/plate/slot/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) /** * Hand screen objects */ -/atom/movable/screen/inventory/hand +/atom/movable/screen/inventory/plate/hand /// target hand index var/hand_index -/atom/movable/screen/inventory/hand/Initialize(mapload, datum/inventory/host, hand_index) +/atom/movable/screen/inventory/plate/hand/Initialize(mapload, datum/inventory/host, hand_index) . = ..() src.hand_index = hand_index sync_index(hand_index) -/atom/movable/screen/inventory/hand/sync_style(datum/hud_style/style, style_alpha, style_color) +/atom/movable/screen/inventory/plate/hand/sync_style(datum/hud_style/style, style_alpha, style_color) ..() icon = style.inventory_icons -/atom/movable/screen/inventory/hand/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) +/atom/movable/screen/inventory/plate/hand/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) -/atom/movable/screen/inventory/hand/proc/sync_index(index = hand_index) +/atom/movable/screen/inventory/plate/hand/proc/sync_index(index = hand_index) screen_loc = SCREEN_LOC_INV_HAND(index) var/index_of_side = round(index / 2) name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index f4f54eaa46ca..e01f18c729c4 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -151,10 +151,6 @@ over.worn_hook_suppressed = FALSE // put it back in the slot _equip_slot(over, old_slot, flags) - // put it back on the screen - over.hud_layerise() - position_hud_item(over, old_slot) - client?.screen |= over /** * drop items if a bodypart is missing diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 06b1413e261b..5f2b85bd8e87 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -29,17 +29,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) /mob/living/carbon/human/update_icons_huds() stack_trace("CANARY: Old human update_icons_huds was called.") -//TODO: Carbon procs in my human update_icons?? -/mob/living/carbon/human/update_hud() //TODO: do away with this if possible - // todo: this is utterly shitcode and fucking stupid ~silicons - // todo: the rest of hud code here ain't much better LOL - var/list/obj/item/relevant = get_equipped_items(TRUE, TRUE) - if(hud_used) - for(var/obj/item/I as anything in relevant) - position_hud_item(I, slot_id_by_item(I)) - if(client) - client.screen |= relevant - //update whether handcuffs appears on our hud. /mob/living/carbon/proc/update_hud_handcuffed() #warn impl - inventory hud diff --git a/code/modules/mob/living/simple_mob/simple_hud.dm b/code/modules/mob/living/simple_mob/simple_hud.dm index 723152787dba..45f39d815a1a 100644 --- a/code/modules/mob/living/simple_mob/simple_hud.dm +++ b/code/modules/mob/living/simple_mob/simple_hud.dm @@ -21,7 +21,7 @@ var/list/hud_elements = list() var/atom/movable/screen/using - var/atom/movable/screen/inventory/slot/inv_box + var/atom/movable/screen/inventory/plate/slot/inv_box var/has_hidden_gear if(LAZYLEN(hud_gears)) diff --git a/code/modules/mob/mob-inventory-internal.dm b/code/modules/mob/mob-inventory-internal.dm index cb946b1926a2..24c6f5f11eb8 100644 --- a/code/modules/mob/mob-inventory-internal.dm +++ b/code/modules/mob/mob-inventory-internal.dm @@ -217,15 +217,6 @@ SHOULD_NOT_OVERRIDE(TRUE) . = _set_inv_slot(slot, I, flags) != INVENTORY_SLOT_DOES_NOT_EXIST -/** - * handles adding an item or updating an item to our hud - */ -/mob/proc/_handle_inventory_hud_update(obj/item/I, slot) - var/datum/inventory_slot/meta = resolve_inventory_slot(slot) - I.screen_loc = meta.hud_position - if(client) - client.screen |= I - //* Slot Change *// /** diff --git a/code/modules/mob/mob-inventory.dm b/code/modules/mob/mob-inventory.dm index 68bf727a785f..00cb2a3221df 100644 --- a/code/modules/mob/mob-inventory.dm +++ b/code/modules/mob/mob-inventory.dm @@ -213,7 +213,6 @@ // take the old item off our screen client?.screen -= to_wear_over to_wear_over.screen_loc = null - to_wear_over.hud_unlayerise() // we don't call slot re-equips here because the equip proc does this for us return TRUE diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 601631672aa1..a4878017a767 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -593,35 +593,6 @@ GLOBAL_VAR_INIT(organ_combined_size, 25 + 70 + 30 + 25 + 25 + 25 + 25 + 10 + 10 var/area/A = get_area(src) return A.sound_env -/mob/proc/position_hud_item(obj/item/item, slot) - var/held = is_holding(item) - - if(!slot) - slot = slot_id_by_item(item) - - if(!istype(hud_used) || !slot || !LAZYLEN(hud_used.slot_info)) - return - - // They may have hidden their entire hud but the hands. - if(!hud_used.hud_shown && held) - item.screen_loc = null - return - - // They may have hidden the icons in the bottom left with the hide button. - if(!hud_used.inventory_shown && !held && (resolve_inventory_slot(slot)?.inventory_slot_flags & INV_SLOT_HUD_REQUIRES_EXPAND)) - item.screen_loc = null - return - - var/screen_place = held? hud_used.hand_info["[get_held_index(item)]"] : hud_used.slot_info["[slot]"] - if(!screen_place) - item.screen_loc = null - return - - if(item.base_pixel_x || item.base_pixel_y) - screen_place = pixel_shift_screen_loc(screen_place, item.base_pixel_x, item.base_pixel_y) - - item.screen_loc = screen_place - /mob/proc/can_see_reagents() // Dead guys and silicons can always see reagents. return stat == DEAD || issilicon(src) From a99feecfeb99862eb00864c52d6c841e63b8dbef Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 20 Sep 2024 15:46:59 +0000 Subject: [PATCH 086/140] progress --- code/game/rendering/legacy/hud.dm | 2 -- .../rendering/legacy/inventory/inventory.dm | 29 +------------------ code/game/rendering/mob_huds/inventory.dm | 21 ++++++++++++++ .../mob/living/simple_mob/simple_hud.dm | 2 +- 4 files changed, 23 insertions(+), 31 deletions(-) diff --git a/code/game/rendering/legacy/hud.dm b/code/game/rendering/legacy/hud.dm index 9e4a48a6346e..f6505b54202a 100644 --- a/code/game/rendering/legacy/hud.dm +++ b/code/game/rendering/legacy/hud.dm @@ -141,8 +141,6 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) wiz_energy_display = null blobpwrdisplay = null blobhealthdisplay = null - r_hand_hud_object = null - l_hand_hud_object = null action_intent = null move_intent = null adding = null diff --git a/code/game/rendering/legacy/inventory/inventory.dm b/code/game/rendering/legacy/inventory/inventory.dm index 41a629d9fdf2..8a22e44d5c55 100644 --- a/code/game/rendering/legacy/inventory/inventory.dm +++ b/code/game/rendering/legacy/inventory/inventory.dm @@ -30,31 +30,4 @@ /atom/movable/screen/inventory/plate/hand/Click() usr.activate_hand_of_index(index) -/atom/movable/screen/inventory/plate/hand/update_icon() - ..() - if(!hud) - return - if(!handcuff_overlay) - handcuff_overlay = image( - "icon" = 'icons/mob/screen_gen.dmi', - "icon_state" = "[is_left_hand? "l_hand" : "r_hand"]_hud_handcuffs" - ) - cut_overlays() - if(iscarbon(hud?.mymob)) - var/mob/living/carbon/C = hud.mymob - if(C.handcuffed) - add_overlay(handcuff_overlay) - -/atom/movable/screen/inventory/plate/hand/left - name = "l_hand" - is_left_hand = TRUE - -/atom/movable/screen/inventory/plate/hand/right - name = "r_hand" - is_left_hand = FALSE - -/atom/movable/screen/inventory/swap_hands - name = "swap hands" - -/atom/movable/screen/inventory/swap_hands/Click() - usr.swap_hand() +#warn parse above diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index acc811cbc649..d5ae130caf7a 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -283,6 +283,8 @@ /atom/movable/screen/inventory/plate/hand /// target hand index var/hand_index + /// should we have handcuffed overlay? + var/handcuffed = FALSE /atom/movable/screen/inventory/plate/hand/Initialize(mapload, datum/inventory/host, hand_index) . = ..() @@ -301,6 +303,18 @@ name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" icon_state = "hand-[index % 2? "left" : "right"]" +#warn hook +/atom/movable/screen/inventory/plate/hand/proc/set_handcuffed(state) + if(state == handcuffed) + return + handcuffed = state + update_icon() + +/atom/movable/screen/inventory/plate/hand/update_overlays() + . = ..() + if(handcuffed) + . += image('icons/mob/screen_gen.dmi', "[hand_index % 2 ? "r_hand" : "l_hand"]_hud_handcuffs") + /** * Button: 'swap hand' */ @@ -312,6 +326,8 @@ icon = style.inventory_icons_wide /atom/movable/screen/inventory/swap_hands/on_click(mob/user, list/params) + // todo: remote control + user.swap_hand() /** * Button: 'auto equip' @@ -324,9 +340,14 @@ icon = style.inventory_icons /atom/movable/screen/inventory/equip_hand/on_click(mob/user, list/params) + // todo: remote control + user.attempt_smart_equip(user.get_active_held_item()) /** * Button: 'activate inhand' */ /atom/movable/screen/inventory/use_self_hand #warn does main have this? + +/atom/movable/screen/inventory/use_self_hand/on_click(mob/user, list/params) + // todo: remote control diff --git a/code/modules/mob/living/simple_mob/simple_hud.dm b/code/modules/mob/living/simple_mob/simple_hud.dm index 45f39d815a1a..be5132d33304 100644 --- a/code/modules/mob/living/simple_mob/simple_hud.dm +++ b/code/modules/mob/living/simple_mob/simple_hud.dm @@ -219,7 +219,7 @@ hud_elements |= zone_sel //Hand things - if(has_hands) + if(get_nominal_hand_count() > 0) //Drop button using = new /atom/movable/screen() using.name = "drop" From ca58d078a37d680ef6949214bca6f2bf8fd8b5eb Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 21 Sep 2024 00:18:35 -0400 Subject: [PATCH 087/140] that --- code/__DEFINES/screen.dm | 28 +++--- code/game/rendering/mob_huds/inventory.dm | 74 +++++++++------ code/modules/flufftext/Hallucination.dm | 90 +++++++++---------- .../mob/living/simple_mob/simple_hud.dm | 36 -------- .../station/station_special_abilities.dm | 90 +++++++++---------- 5 files changed, 151 insertions(+), 167 deletions(-) diff --git a/code/__DEFINES/screen.dm b/code/__DEFINES/screen.dm index 36428fed6213..8d5c6005302f 100644 --- a/code/__DEFINES/screen.dm +++ b/code/__DEFINES/screen.dm @@ -27,31 +27,27 @@ //* These should be widescreen-agnostic and use anchorings *// //* to the sides of the screen / center. *// +//* Mob HUD - Inventory *// + /// the bottom-left hand of hands HUD -#define SCREEN_LOC_MOB_HANDS_HUD_ANCHOR "CENTER-1:16,BOTTOM+1:5" +#define SCREEN_LOC_MOB_HUD_INVENTORY_HANDS_BOTTOM_LEFT "CENTER-1:16,BOTTOM+1:5" +#define SCREEN_LOC_MOB_HUD_INVENTORY_HAND(HAND) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" +#warn fill these in +#define SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(TOTAL_HANDS) "" +#define SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(TOTAL_HANDS) "" /// the bottom-left drawer position of inventory HUD -#define SCREEN_LOC_MOB_INVENTORY_HUD_ANCHOR "LEFT:6,BOTTOM:5" +#define SCREEN_LOC_MOB_HUD_INVENTORY_DRAWER "LEFT:6,BOTTOM:5" + +#warn fill these in +#define SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_DRAWER_ALIGNED(MAIN_AXIS, CROSS_AXIS) "" +#define SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_HANDS_ALIGNED(MAIN_AXIS, CROSS_AXIS) "" #warn deal with this crap /// Hands -#define SCREEN_LOC_INV_HAND(index) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" -#define ui_swaphand1 "CENTER-1:16,BOTTOM+1:5" -#define ui_swaphand2 "CENTER:16,BOTTOM+1:5" - -//Lower left, persistant menu -#define ui_inventory "LEFT:6,BOTTOM:5" - -//Lower center, persistant menu -#define ui_sstore1 "LEFT+2:10,BOTTOM:5" -#define ui_id "LEFT+3:12,BOTTOM:5" -#define ui_belt "LEFT+4:14,BOTTOM:5" -#define ui_back "CENTER-2:14,BOTTOM:5" #define ui_equip "CENTER-1:16,BOTTOM+1:5" -#define ui_storage1 "CENTER+1:16,BOTTOM:5" -#define ui_storage2 "CENTER+2:16,BOTTOM:5" #define ui_smallquad "RIGHT-4:18,BOTTOM:4" ///aliens diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index d5ae130caf7a..d3ee7c37f30a 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -16,13 +16,12 @@ /// ordered hand objects var/list/atom/movable/screen/inventory/plate/hand/hands + /// drawer object + var/atom/movable/screen/inventory/drawer/button_drawer /// swap hand object - var/atom/movable/screen/inventory/swap_hand/swap_hand + var/atom/movable/screen/inventory/swap_hand/button_swap_hand /// equip object - var/atom/movable/screen/inventory/equip_hand/equip_hand - /// use hand on self object - var/atom/movable/screen/inventory/use_self_hand/use_self_hand - #warn add the drawer. + var/atom/movable/screen/inventory/equip_hand/button_equip_hand /datum/mob_hud/inventory/New(mob/owner, datum/inventory/host) src.host = host @@ -75,9 +74,9 @@ cleanup() // buttons - add_screen((swap_hand = new)) - add_screen((equip_hand = new)) - add_screen((use_self_hand = new)) + add_screen((button_swap_hand = new)) + add_screen((button_equip_hand = new)) + add_screen((button_drawer = new)) // slots rebuild_slots(inventory_slots_with_mappings) @@ -138,6 +137,9 @@ qdel(hands[i]) hands.len = number_of_hands + button_equip_hand?.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(number_of_hands) + button_swap_hand?.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(number_of_hands) + /datum/mob_hud/inventory/proc/all_slot_screen_objects(filter_by_class) RETURN_TYPE(/list) . = list() @@ -165,12 +167,22 @@ /datum/mob_hud/inventory/proc/all_button_screen_objects() RETURN_TYPE(/list) . = list() - if(swap_hand) - . += swap_hand - if(equip_hand) - . += equip_hand - if(use_self_hand) - . += use_self_hand + if(button_swap_hand) + . += button_swap_hand + if(button_equip_hand) + . += button_equip_hand + if(button_drawer) + . += button_drawer + +/datum/mob_hud/inventory/proc/toggle_hidden_class(class) + var/list/atom/movable/screen/inventory/affected = all_slot_screen_objects(class) + if(class in hidden_classes) + LAZYREMOVE(hidden_classes, class) + add_screen(affected) + else + LAZYADD(hidden_classes, class) + remove_screen(affected) + button_drawer?.update_icon() /datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slot_by_id[slot_or_index.id] @@ -193,6 +205,9 @@ old_hand.cut_overlay("[old_hand.icon_state]-active") new_hand.add_overlay("[new_hand.icon_state]-active") +/** + * Base type of inventory screen objects. + */ /atom/movable/screen/inventory name = "inventory" icon = 'icons/screen/hud/midnight/inventory.dmi' @@ -298,7 +313,7 @@ /atom/movable/screen/inventory/plate/hand/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) /atom/movable/screen/inventory/plate/hand/proc/sync_index(index = hand_index) - screen_loc = SCREEN_LOC_INV_HAND(index) + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND(index) var/index_of_side = round(index / 2) name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" icon_state = "hand-[index % 2? "left" : "right"]" @@ -315,6 +330,24 @@ if(handcuffed) . += image('icons/mob/screen_gen.dmi', "[hand_index % 2 ? "r_hand" : "l_hand"]_hud_handcuffs") +/** + * Button: 'swap hand' + */ +/atom/movable/screen/inventory/drawer + icon_state = "drawer" + +/atom/movable/screen/inventory/drawer/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons_wide + +/atom/movable/screen/inventory/drawer/on_click(mob/user, list/params) + // todo: remote control + hud.toggle_hidden_class(INVENTORY_HUD_CLASS_DRAWER) + +/atom/movable/screen/inventory/drawer/update_icon_state() + icon_state = "[INVENTORY_HUD_CLASS_DRAWER in hud.hidden_classes ? "drawer" : "drawer-active"]" + return ..() + /** * Button: 'swap hand' */ @@ -325,7 +358,7 @@ ..() icon = style.inventory_icons_wide -/atom/movable/screen/inventory/swap_hands/on_click(mob/user, list/params) +/atom/movable/screen/inventory/swap_hand/on_click(mob/user, list/params) // todo: remote control user.swap_hand() @@ -342,12 +375,3 @@ /atom/movable/screen/inventory/equip_hand/on_click(mob/user, list/params) // todo: remote control user.attempt_smart_equip(user.get_active_held_item()) - -/** - * Button: 'activate inhand' - */ -/atom/movable/screen/inventory/use_self_hand - #warn does main have this? - -/atom/movable/screen/inventory/use_self_hand/on_click(mob/user, list/params) - // todo: remote control diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 5e88fae9b74f..c93bdf60f8a4 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -35,51 +35,51 @@ Gunshots/explosions/opening doors/less rare audio (done) if(16 to 25) //Strange items //to_chat(src, "Traitor Items") - if(!halitem) - halitem = new - var/list/slots_free = list() - for(var/i in get_empty_hand_indices()) - slots_free += SCREEN_LOC_INV_HAND(i) - if(istype(src,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - if(!H.belt) slots_free += ui_belt - if(!H.l_store) slots_free += ui_storage1 - if(!H.r_store) slots_free += ui_storage2 - if(slots_free.len) - halitem.screen_loc = pick(slots_free) - halitem.hud_layerise() - switch(rand(1,6)) - if(1) //revolver - halitem.icon = 'icons/obj/gun/ballistic.dmi' - halitem.icon_state = "revolver" - halitem.name = "Revolver" - if(2) //c4 - halitem.icon = 'icons/obj/assemblies.dmi' - halitem.icon_state = "plastic-explosive0" - halitem.name = "Mysterious Package" - if(prob(25)) - halitem.icon_state = "c4small_1" - if(3) //sword - halitem.icon = 'icons/obj/weapons.dmi' - halitem.icon_state = "sword1" - halitem.name = "Sword" - if(4) //stun baton - halitem.icon = 'icons/obj/weapons.dmi' - halitem.icon_state = "stunbaton" - halitem.name = "Stun Baton" - if(5) //emag - halitem.icon = 'icons/obj/card.dmi' - halitem.icon_state = "emag" - halitem.name = "Cryptographic Sequencer" - if(6) //flashbang - halitem.icon = 'icons/obj/grenade.dmi' - halitem.icon_state = "flashbang1" - halitem.name = "Flashbang" - if(client) client.screen += halitem - spawn(rand(100,250)) - if(client) - client.screen -= halitem - halitem = null + // if(!halitem) + // halitem = new + // var/list/slots_free = list() + // for(var/i in get_empty_hand_indices()) + // slots_free += SCREEN_LOC_INV_HAND(i) + // if(istype(src,/mob/living/carbon/human)) + // var/mob/living/carbon/human/H = src + // if(!H.belt) slots_free += ui_belt + // if(!H.l_store) slots_free += ui_storage1 + // if(!H.r_store) slots_free += ui_storage2 + // if(slots_free.len) + // halitem.screen_loc = pick(slots_free) + // halitem.hud_layerise() + // switch(rand(1,6)) + // if(1) //revolver + // halitem.icon = 'icons/obj/gun/ballistic.dmi' + // halitem.icon_state = "revolver" + // halitem.name = "Revolver" + // if(2) //c4 + // halitem.icon = 'icons/obj/assemblies.dmi' + // halitem.icon_state = "plastic-explosive0" + // halitem.name = "Mysterious Package" + // if(prob(25)) + // halitem.icon_state = "c4small_1" + // if(3) //sword + // halitem.icon = 'icons/obj/weapons.dmi' + // halitem.icon_state = "sword1" + // halitem.name = "Sword" + // if(4) //stun baton + // halitem.icon = 'icons/obj/weapons.dmi' + // halitem.icon_state = "stunbaton" + // halitem.name = "Stun Baton" + // if(5) //emag + // halitem.icon = 'icons/obj/card.dmi' + // halitem.icon_state = "emag" + // halitem.name = "Cryptographic Sequencer" + // if(6) //flashbang + // halitem.icon = 'icons/obj/grenade.dmi' + // halitem.icon_state = "flashbang1" + // halitem.name = "Flashbang" + // if(client) client.screen += halitem + // spawn(rand(100,250)) + // if(client) + // client.screen -= halitem + // halitem = null if(26 to 40) //Flashes of danger //to_chat(src, "Danger Flash") diff --git a/code/modules/mob/living/simple_mob/simple_hud.dm b/code/modules/mob/living/simple_mob/simple_hud.dm index be5132d33304..c57feeb371fa 100644 --- a/code/modules/mob/living/simple_mob/simple_hud.dm +++ b/code/modules/mob/living/simple_mob/simple_hud.dm @@ -21,42 +21,6 @@ var/list/hud_elements = list() var/atom/movable/screen/using - var/atom/movable/screen/inventory/plate/slot/inv_box - - var/has_hidden_gear - if(LAZYLEN(hud_gears)) - for(var/gear_slot in hud_gears) - inv_box = new /atom/movable/screen/inventory() - inv_box.icon = ui_style - inv_box.color = ui_color - inv_box.alpha = ui_alpha - - var/list/slot_data = hud_gears[gear_slot] - inv_box.name = gear_slot - inv_box.screen_loc = slot_data["loc"] - inv_box.slot_id = slot_data["slot"] - inv_box.icon_state = slot_data["state"] - slot_info["[inv_box.slot_id]"] = inv_box.screen_loc - - if(slot_data["dir"]) - inv_box.setDir(slot_data["dir"]) - - if(slot_data["toggle"]) - other += inv_box - has_hidden_gear = 1 - else - adding += inv_box - - if(has_hidden_gear) - using = new /atom/movable/screen() - using.name = "toggle" - using.icon = ui_style - using.icon_state = "other" - using.screen_loc = ui_inventory - using.hud_layerise() - using.color = ui_color - using.alpha = ui_alpha - adding += using //Intent Backdrop using = new /atom/movable/screen() diff --git a/code/modules/species/station/station_special_abilities.dm b/code/modules/species/station/station_special_abilities.dm index 5055b58fe1e4..b7debb074b5d 100644 --- a/code/modules/species/station/station_special_abilities.dm +++ b/code/modules/species/station/station_special_abilities.dm @@ -159,51 +159,51 @@ if(16 to 25) //10% chance //Strange items //to_chat(src, "Traitor Items") - if(!halitem) - halitem = new - var/list/slots_free = list() - for(var/i in get_empty_hand_indices()) - slots_free += SCREEN_LOC_INV_HAND(i) - if(istype(src,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = src - if(!H.belt) slots_free += ui_belt - if(!H.l_store) slots_free += ui_storage1 - if(!H.r_store) slots_free += ui_storage2 - if(slots_free.len) - halitem.screen_loc = pick(slots_free) - halitem.layer = 50 - switch(rand(1,6)) - if(1) //revolver - halitem.icon = 'icons/obj/gun/ballistic.dmi' - halitem.icon_state = "revolver" - halitem.name = "Revolver" - if(2) //c4 - halitem.icon = 'icons/obj/assemblies.dmi' - halitem.icon_state = "plastic-explosive0" - halitem.name = "Mysterious Package" - if(prob(25)) - halitem.icon_state = "c4small_1" - if(3) //sword - halitem.icon = 'icons/obj/weapons.dmi' - halitem.icon_state = "sword1" - halitem.name = "Sword" - if(4) //stun baton - halitem.icon = 'icons/obj/weapons.dmi' - halitem.icon_state = "stunbaton" - halitem.name = "Stun Baton" - if(5) //emag - halitem.icon = 'icons/obj/card.dmi' - halitem.icon_state = "emag" - halitem.name = "Cryptographic Sequencer" - if(6) //flashbang - halitem.icon = 'icons/obj/grenade.dmi' - halitem.icon_state = "flashbang1" - halitem.name = "Flashbang" - if(client) client.screen += halitem - spawn(rand(100,250)) - if(client) - client.screen -= halitem - halitem = null + // if(!halitem) + // halitem = new + // var/list/slots_free = list() + // for(var/i in get_empty_hand_indices()) + // slots_free += SCREEN_LOC_INV_HAND(i) + // if(istype(src,/mob/living/carbon/human)) + // var/mob/living/carbon/human/H = src + // if(!H.belt) slots_free += ui_belt + // if(!H.l_store) slots_free += ui_storage1 + // if(!H.r_store) slots_free += ui_storage2 + // if(slots_free.len) + // halitem.screen_loc = pick(slots_free) + // halitem.layer = 50 + // switch(rand(1,6)) + // if(1) //revolver + // halitem.icon = 'icons/obj/gun/ballistic.dmi' + // halitem.icon_state = "revolver" + // halitem.name = "Revolver" + // if(2) //c4 + // halitem.icon = 'icons/obj/assemblies.dmi' + // halitem.icon_state = "plastic-explosive0" + // halitem.name = "Mysterious Package" + // if(prob(25)) + // halitem.icon_state = "c4small_1" + // if(3) //sword + // halitem.icon = 'icons/obj/weapons.dmi' + // halitem.icon_state = "sword1" + // halitem.name = "Sword" + // if(4) //stun baton + // halitem.icon = 'icons/obj/weapons.dmi' + // halitem.icon_state = "stunbaton" + // halitem.name = "Stun Baton" + // if(5) //emag + // halitem.icon = 'icons/obj/card.dmi' + // halitem.icon_state = "emag" + // halitem.name = "Cryptographic Sequencer" + // if(6) //flashbang + // halitem.icon = 'icons/obj/grenade.dmi' + // halitem.icon_state = "flashbang1" + // halitem.name = "Flashbang" + // if(client) client.screen += halitem + // spawn(rand(100,250)) + // if(client) + // client.screen -= halitem + // halitem = null if(26 to 35) //10% chance //Flashes of danger //to_chat(src, "Danger Flash") From c94ac5c74e57ff421bece58ec771a9d30dfcf4cf Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 29 Sep 2024 23:48:37 -0400 Subject: [PATCH 088/140] sigh --- code/game/rendering/mob_huds/inventory.dm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index d3ee7c37f30a..634daf236daa 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -205,6 +205,8 @@ old_hand.cut_overlay("[old_hand.icon_state]-active") new_hand.add_overlay("[new_hand.icon_state]-active") +//* Inventory Screen Objects *// + /** * Base type of inventory screen objects. */ @@ -291,6 +293,14 @@ icon = style.inventory_icons_slot /atom/movable/screen/inventory/plate/slot/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) + #warn impl + +/** + * comparator that sorts slots that are semantically closer to their anchors to be first, + * allowing a no-collision-or-cascading method of resolving slot alignment. + */ +/proc/cmp_inventory_slot_screen_object_for_anti_cascade(atom/movable/screen/inventory/plate/slot/A, atom/movable/screen/inventory/plate/slot/B) + /** * Hand screen objects @@ -311,6 +321,7 @@ icon = style.inventory_icons /atom/movable/screen/inventory/plate/hand/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) + #warn impl /atom/movable/screen/inventory/plate/hand/proc/sync_index(index = hand_index) screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND(index) From 881f6d8148d74b2f87f3ea5ad729b9f9de274bc7 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 17 Oct 2024 20:13:08 -0400 Subject: [PATCH 089/140] fixes --- citadel.dme | 1 - .../rendering/legacy/inventory/inventory.dm | 33 ------------------- code/game/rendering/mob_huds/inventory.dm | 6 ++-- code/game/rendering/screen_legacy.dm | 15 --------- .../mob/living/carbon/human/update_icons.dm | 4 --- .../mob/living/simple_mob/simple_mob.dm | 10 ++++++ code/modules/mob/mob-hands.dm | 10 +++--- 7 files changed, 20 insertions(+), 59 deletions(-) delete mode 100644 code/game/rendering/legacy/inventory/inventory.dm diff --git a/citadel.dme b/citadel.dme index 47d158e8aa3f..452efe1effc7 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2020,7 +2020,6 @@ #include "code\game\rendering\legacy\robot.dm" #include "code\game\rendering\legacy\spell_screen_objects.dm" #include "code\game\rendering\legacy\intents\throwing.dm" -#include "code\game\rendering\legacy\inventory\inventory.dm" #include "code\game\rendering\legacy\objects\waypoint_tracker.dm" #include "code\game\rendering\mob_huds\inventory.dm" #include "code\game\rendering\mob_huds\mob_hud.dm" diff --git a/code/game/rendering/legacy/inventory/inventory.dm b/code/game/rendering/legacy/inventory/inventory.dm deleted file mode 100644 index 8a22e44d5c55..000000000000 --- a/code/game/rendering/legacy/inventory/inventory.dm +++ /dev/null @@ -1,33 +0,0 @@ -/atom/movable/screen/inventory - name = "inv box" - -/atom/movable/screen/inventory/proc/check_inventory_usage(mob/user) - if(!user.canClick()) - return FALSE - if(!CHECK_MOBILITY(user, MOBILITY_CAN_STORAGE) || user.stat) - return FALSE - return TRUE - -/atom/movable/screen/inventory/plate/slot - /// the ID of this slot - var/slot_id - -/atom/movable/screen/inventory/plate/slot/Click() - if(!check_inventory_usage(usr)) - return - - // usr.attack_ui(slot_id) - -// Hand slots are special to handle the handcuffs overlay -/atom/movable/screen/inventory/plate/hand - /// hand index - var/index - /// are we the left hand - var/is_left_hand = FALSE - /// current handcuffed overlay - var/image/handcuff_overlay - -/atom/movable/screen/inventory/plate/hand/Click() - usr.activate_hand_of_index(index) - -#warn parse above diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index 634daf236daa..394cf562a165 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -292,7 +292,7 @@ ..() icon = style.inventory_icons_slot -/atom/movable/screen/inventory/plate/slot/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) +/atom/movable/screen/inventory/plate/slot/handle_inventory_click(mob/user, obj/item/with_item) #warn impl /** @@ -320,7 +320,9 @@ ..() icon = style.inventory_icons -/atom/movable/screen/inventory/plate/hand/handle_inventory_click(mob/user, slot_or_index, obj/item/with_item) +/atom/movable/screen/inventory/plate/hand/handle_inventory_click(mob/user, obj/item/with_item) + if(!with_item) + hud.owner.swap_hand(hand_index) #warn impl /atom/movable/screen/inventory/plate/hand/proc/sync_index(index = hand_index) diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index f27f0748cdb1..a91aeee53c50 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -136,21 +136,6 @@ if(!usr) return TRUE switch(name) - if("toggle") - if(usr.hud_used.inventory_shown) - usr.hud_used.inventory_shown = 0 - usr.client.screen -= usr.hud_used.other - else - usr.hud_used.inventory_shown = 1 - usr.client.screen += usr.hud_used.other - - usr.hud_used.hidden_inventory_update() - - if("equip") - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - H.quick_equip() - if("resist") if(isliving(usr)) var/mob/living/L = usr diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 5f2b85bd8e87..be9af271b290 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -29,10 +29,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) /mob/living/carbon/human/update_icons_huds() stack_trace("CANARY: Old human update_icons_huds was called.") -//update whether handcuffs appears on our hud. -/mob/living/carbon/proc/update_hud_handcuffed() - #warn impl - inventory hud - /mob/living/carbon/human/update_transform() var/matrix/old_matrix = transform var/matrix/M = matrix() diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index 5bcac8ea7a7f..19b3198cad63 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -457,3 +457,13 @@ . = ..() if(. && (!is_sharp(I) || !has_edge(I))) return FALSE + +//* Inventory *// + +/mob/living/simple_mob/get_usable_hand_count() + return hand_count + +/mob/living/simple_mob/get_usable_hand_indices() + . = list() + for(var/i in 1 to hand_count) + . += i diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index ac9d9dfefc16..573ef94d82b4 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -53,21 +53,23 @@ * * basically if a red deny symbol is in the hand it is not usable, otherwise it's usable. */ -/mob/proc/get_usable_hand_count() +/mob/proc/get_usable_hand_count() as num + return 0 #warn impl + subtypes /** * get indices of usable hands */ -/mob/proc/get_usable_hand_indices() +/mob/proc/get_usable_hand_indices() as /list RETURN_TYPE(/list) + return list() #warn impl + subtypes /** * sets number of physical hands we should account for potentialy having */ -/mob/proc/set_nominal_hand_count() - return length(inventory?.held_items) +/mob/proc/set_nominal_hand_count(count) + #warn sigh /** * Are usable hands all holding items? From 2886cd5a4ba505b8800672db78161f10cbca36b3 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:52:00 +0000 Subject: [PATCH 090/140] changes --- citadel.dme | 1 + code/__DEFINES/inventory/hud.dm | 7 +++ code/game/rendering/legacy/hud.dm | 13 +++-- code/game/rendering/mob_huds/inventory.dm | 35 ++++++++++--- code/modules/mob/inventory/inventory-hooks.dm | 49 +++++++++++++++++++ code/modules/mob/inventory/inventory.dm | 26 ---------- .../modules/mob/living/carbon/carbon-hands.dm | 26 ++++++++-- code/modules/mob/mob-hands.dm | 8 ++- code/modules/mob/mob-inventory-abstraction.dm | 43 ++++++++-------- code/modules/mob/mob-inventory-internal.dm | 9 ++-- 10 files changed, 147 insertions(+), 70 deletions(-) create mode 100644 code/modules/mob/inventory/inventory-hooks.dm diff --git a/citadel.dme b/citadel.dme index b0d60642ccf6..6e15684df711 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3070,6 +3070,7 @@ #include "code\modules\mob\inventory\inventory-hands-legacy.dm" #include "code\modules\mob\inventory\inventory-hands-put.dm" #include "code\modules\mob\inventory\inventory-hands.dm" +#include "code\modules\mob\inventory\inventory-hooks.dm" #include "code\modules\mob\inventory\inventory-rendering.dm" #include "code\modules\mob\inventory\inventory_slot.dm" #include "code\modules\mob\inventory\inventory.dm" diff --git a/code/__DEFINES/inventory/hud.dm b/code/__DEFINES/inventory/hud.dm index 7a695fc6cae7..c2848820a5c7 100644 --- a/code/__DEFINES/inventory/hud.dm +++ b/code/__DEFINES/inventory/hud.dm @@ -32,6 +32,13 @@ /// only when drawer is open #define INVENTORY_HUD_CLASS_DRAWER "drawer" +//* inventory_hud hide sources *// + +/// from f12 / zoom toggle +#define INVENTORY_HUD_HIDE_SOURCE_F12 "F12" +/// from drawer toggle +#define INVENTORY_HUD_HIDE_SOURCE_DRAWER "drawer" + //* inventory slot remappings for species *// /// inventory_hud_main_axis diff --git a/code/game/rendering/legacy/hud.dm b/code/game/rendering/legacy/hud.dm index f6505b54202a..4622c0e234bd 100644 --- a/code/game/rendering/legacy/hud.dm +++ b/code/game/rendering/legacy/hud.dm @@ -238,6 +238,9 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason. + inventory.hud.remove_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + inventory.hud.remove_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) + else hud_used.hud_shown = 1 if(src.hud_used.adding) @@ -256,7 +259,8 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position src.client.screen += src.zone_sel //This one is a special snowflake - #warn update inventory hud + inventory.hud.add_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + inventory.hud.add_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) //Similar to button_pressed_F12() but keeps zone_sel, gun_setting_icon, and healths. /mob/proc/toggle_zoom_hud() @@ -281,6 +285,9 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) src.client.screen -= src.hud_used.other_important src.client.screen -= src.internals src.client.screen += src.hud_used.action_intent //we want the intent swticher visible + + inventory.hud.remove_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + inventory.hud.remove_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) else hud_used.hud_shown = 1 if(src.hud_used.adding) @@ -295,5 +302,5 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) src.client.screen |= src.internals src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position - hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() + inventory.hud.add_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + inventory.hud.add_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm index 394cf562a165..840c6e6f2fc8 100644 --- a/code/game/rendering/mob_huds/inventory.dm +++ b/code/game/rendering/mob_huds/inventory.dm @@ -8,8 +8,12 @@ /// owning inventory var/datum/inventory/host - /// hidden classes - var/list/hidden_classes + /// hidden classes, associated to list of reasons + var/list/hidden_classes = list( + (INVENTORY_HUD_CLASS_DRAWER) = list( + INVENTORY_HUD_HIDE_SOURCE_DRAWER, + ), + ) /// keyed slot id to screen object var/list/atom/movable/screen/inventory/plate/slot/slot_by_id @@ -174,16 +178,31 @@ if(button_drawer) . += button_drawer -/datum/mob_hud/inventory/proc/toggle_hidden_class(class) +/datum/mob_hud/inventory/proc/toggle_hidden_class(class, source) var/list/atom/movable/screen/inventory/affected = all_slot_screen_objects(class) if(class in hidden_classes) - LAZYREMOVE(hidden_classes, class) - add_screen(affected) + LAZYREMOVE(hidden_classes[class], source) + if(!length(hidden_classes[class])) + add_screen(affected) + hidden_classes -= class else - LAZYADD(hidden_classes, class) - remove_screen(affected) + if(!hidden_classes[class]) + remove_screen(affected) + LAZYADD(hidden_classes[class], class) button_drawer?.update_icon() +/datum/mob_hud/inventory/proc/add_hidden_class(class, source) + if(class in hidden_classes) + return + toggle_hidden_class(class, source) + +/datum/mob_hud/inventory/proc/remove_hidden_class(class, source) + if(!(class in hidden_classes)) + return + toggle_hidden_class(class, source) + +//* Hooks *// + /datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slot_by_id[slot_or_index.id] screen_obj.bind_item(item) @@ -355,7 +374,7 @@ /atom/movable/screen/inventory/drawer/on_click(mob/user, list/params) // todo: remote control - hud.toggle_hidden_class(INVENTORY_HUD_CLASS_DRAWER) + hud.toggle_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_DRAWER) /atom/movable/screen/inventory/drawer/update_icon_state() icon_state = "[INVENTORY_HUD_CLASS_DRAWER in hud.hidden_classes ? "drawer" : "drawer-active"]" diff --git a/code/modules/mob/inventory/inventory-hooks.dm b/code/modules/mob/inventory/inventory-hooks.dm new file mode 100644 index 000000000000..c70744d03e93 --- /dev/null +++ b/code/modules/mob/inventory/inventory-hooks.dm @@ -0,0 +1,49 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 Citadel Station Developers *// + +//* Item enter / exit *// + +/** + * Should be called when an item is added to inventory. + * + * The call semantics for this proc is interesting. + * + * * It is allowed for on_item_swapped to be called instead of this proc if it's a swap. + * * It is not required for on_item_swapped to be called instead of this proc if it's a swap. + */ +/datum/inventory/proc/on_item_entered(obj/item/item, datum/inventory_slot/slot_or_index) + hud?.add_item(item, slot_or_index) + +/** + * Should be called when an item is removed from inventory. + * + * The call semantics for this proc is interesting. + * + * * It is allowed for on_item_swapped to be called instead of this proc if it's a swap. + * * It is not required for on_item_swapped to be called instead of this proc if it's a swap. + */ +/datum/inventory/proc/on_item_exited(obj/item/item, datum/inventory_slot/slot_or_index) + hud?.remove_item(item, slot_or_index) + +/** + * Should be called when an item is moved from one slot to another. + * + * The call semantics for this proc is interesting. + * + * * It is not required for this proc to be called instead of exited & entered. + * * It is recommended for this proc to be called instead of exited & entered. + * + * This is because this proc and exited/entered do not actually trigger item-level hooks, + * these are just here for visuals. + * + * As of right now, the functionality is equivalent; on_item_swapped() is just more efficient. + */ +/datum/inventory/proc/on_item_swapped(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) + hud?.move_item(item, from_slot_or_index, to_slot_or_index) + +/** + * Should be called when the mob's mobility flags change. + */ +/datum/inventory/proc/on_mobility_update() + for(var/datum/action/action in actions.actions) + action.update_button_availability() diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index e01f18c729c4..9e7938f9af39 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -82,32 +82,6 @@ if(I.body_cover_flags & cover_flags) . += I -//* Update Hooks *// - -/datum/inventory/proc/on_mobility_update() - for(var/datum/action/action in actions.actions) - action.update_button_availability() - -/** - * called when an item is added to inventory - */ -/datum/inventory/proc/item_entered(obj/item/item, datum/inventory_slot/slot) - hud?.add_item(item, slot) - -/** - * called when an item is removed from inventory - */ -/datum/inventory/proc/item_exited(obj/item/item, datum/inventory_slot/slot) - hud?.remove_item(item, slot) - -/** - * called when an item is moved from one slot to another - */ -/datum/inventory/proc/item_swapped(obj/item/item, datum/inventory_slot/from_slot, datum/inventory_slot/to_slot) - hud?.move_item(item, from_slot, to_slot) - -#warn hook above 3 - //* Slots *// /** diff --git a/code/modules/mob/living/carbon/carbon-hands.dm b/code/modules/mob/living/carbon/carbon-hands.dm index bb7de8aa2a90..fd256f9b2970 100644 --- a/code/modules/mob/living/carbon/carbon-hands.dm +++ b/code/modules/mob/living/carbon/carbon-hands.dm @@ -1,6 +1,14 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2024 Citadel Station Developers *// +//* Hands - Abstraction *// + +/mob/living/carbon/get_usable_hand_count() + #warn impl + +/mob/living/carbon/get_usable_hand_indices() + #warn impl + //* Hands - Checks *// /mob/living/carbon/get_hand_manipulation_level(index) @@ -19,17 +27,25 @@ * @return numerical index or null */ /mob/living/carbon/proc/get_hand_of_organ(obj/item/organ/external/organ) - #warn impl - return null + switch(organ.organ_tag) + if(BP_L_HAND) + return 1 + if(BP_R_HAND) + return 2 + else + return null /** * Get all hand indexes of an organ * * @return list of numerical indices */ -/mob/living/carbon/proc/get_hands_of_organ(obj/item/organ/external/organ) - RETURN_TYPE(/list) - #warn impl +/mob/living/carbon/proc/get_hands_of_organ(obj/item/organ/external/organ) as /list + switch(organ.organ_tag) + if(BP_L_HAND) + return list(1) + if(BP_R_HAND) + return list(2) return list() /** diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index 573ef94d82b4..59f5b799c25b 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -69,7 +69,8 @@ * sets number of physical hands we should account for potentialy having */ /mob/proc/set_nominal_hand_count(count) - #warn sigh + LAZYINITLIST(inventory.held_items) + inventory.held_items.len = count /** * Are usable hands all holding items? @@ -192,8 +193,5 @@ inventory.hud?.swap_active_hand(old_index, to_index) //! LEGACY - // We just swapped hands, so the thing in our inactive hand will notice it's not the focus - if(!isnull(was_active)) - if(was_active.zoom) - was_active.zoom() + was_active?.zoom() //! End diff --git a/code/modules/mob/mob-inventory-abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm index 5466d8285ad7..06067880f7c9 100644 --- a/code/modules/mob/mob-inventory-abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -174,23 +174,26 @@ return FALSE var/existing_slot = is_in_inventory(I) - if(existing_slot) - // already in inv - if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags)) - return FALSE + if(existing_slot == SLOT_ID_HANDS) + handle_item_handswap(I, index, get_held_index(I), flags) else - // newly eqiupped - var/atom/old_loc = I.loc - if(I.loc != src) - I.forceMove(src) - if(I.loc != src) - return FALSE - I.pickup(src, flags, old_loc) - I.equipped(src, SLOT_ID_HANDS, flags) - log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") + if(existing_slot) + // already in inv + if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags)) + return FALSE + else + // newly eqiupped + var/atom/old_loc = I.loc + if(I.loc != src) + I.forceMove(src) + if(I.loc != src) + return FALSE + I.pickup(src, flags, old_loc) + I.equipped(src, SLOT_ID_HANDS, flags) + log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") - inventory?.held_items[index] = I - #warn hud + inventory.held_items[index] = I + inventory.on_item_entered(item, index) //! LEGACY BEGIN I.update_twohanding() @@ -212,10 +215,10 @@ /mob/proc/unequip_hand_impl(obj/item/I, index, flags) ASSERT(inventory?.held_items[index] == I) - inventory?.held_items[index] = null + inventory.held_items[index] = null + inventory.on_item_exited(item, index) I.unequipped(src, SLOT_ID_HANDS, flags) - #warn impl; hud /** * handle swapping item from one hand index to another @@ -224,7 +227,7 @@ ASSERT(inventory?.held_items[old_index] == I) ASSERT(isnull(inventory?.held_items[index])) - inventory?.held_items[old_index] = null - inventory?.held_items[index] = I + inventory.held_items[old_index] = null + inventory.held_items[index] = I + inventory.on_item_swapped(item, old_index, index) - #warn impl; hud diff --git a/code/modules/mob/mob-inventory-internal.dm b/code/modules/mob/mob-inventory-internal.dm index 24c6f5f11eb8..a8c4a05ff0bc 100644 --- a/code/modules/mob/mob-inventory-internal.dm +++ b/code/modules/mob/mob-inventory-internal.dm @@ -136,6 +136,8 @@ /mob/proc/_unequip_slot(slot, flags) SHOULD_NOT_OVERRIDE(TRUE) . = _set_inv_slot(slot, null, flags) != INVENTORY_SLOT_DOES_NOT_EXIST + if(.) + inventory.on_item_exited(., resolve_inventory_slot(slot)) /** * handles removing an item from our hud @@ -216,6 +218,8 @@ /mob/proc/_equip_slot(obj/item/I, slot, flags) SHOULD_NOT_OVERRIDE(TRUE) . = _set_inv_slot(slot, I, flags) != INVENTORY_SLOT_DOES_NOT_EXIST + if(.) + inventory.on_item_entered(., resolve_inventory_slot(slot)) //* Slot Change *// @@ -242,7 +246,6 @@ // lol we're done (unless it was hands) return TRUE if(slot == SLOT_ID_HANDS) - #warn impl // if we're going into hands, // just check can unequip if(!can_unequip(I, old_slot, flags, user)) @@ -250,7 +253,7 @@ return FALSE // call procs if(old_slot == SLOT_ID_HANDS) - _unequip_held(I, flags) + unequip_hand_impl(I, get_held_index(I), flags) else _unequip_slot(old_slot, flags) I.unequipped(src, old_slot, flags) @@ -271,7 +274,7 @@ return FALSE // ?if it's from hands, hands aren't a slot. if(old_slot == SLOT_ID_HANDS) - _unequip_held(I, flags) + unequip_hand_impl(I, get_held_index(I), flags) else _unequip_slot(old_slot, flags) I.unequipped(src, old_slot, flags) From c7b1ed6874687e9346695bad2da5d6b5be9ee1b8 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:56:14 +0000 Subject: [PATCH 091/140] changes --- code/__DEFINES/mobs/hands.dm | 2 ++ code/modules/mob/inventory/inventory-hands.dm | 2 +- code/modules/mob/living/carbon/carbon-hands.dm | 9 +++++++-- code/modules/mob/living/carbon/carbon.dm | 1 + code/modules/mob/mob-hands.dm | 8 ++++---- code/modules/mob/mob-inventory-abstraction.dm | 6 +++--- 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/code/__DEFINES/mobs/hands.dm b/code/__DEFINES/mobs/hands.dm index 064f1acadf12..1462719aaec1 100644 --- a/code/__DEFINES/mobs/hands.dm +++ b/code/__DEFINES/mobs/hands.dm @@ -8,3 +8,5 @@ #define HAND_MANIPULATION_MOVE 2 /// just hit your hand against something #define HAND_MANIPULATION_DULL 1 +/// level at which someone just can't use a hand at all +#define HAND_MANIPULATION_NONE 0 diff --git a/code/modules/mob/inventory/inventory-hands.dm b/code/modules/mob/inventory/inventory-hands.dm index 3f66f68fc922..015f247e33b7 100644 --- a/code/modules/mob/inventory/inventory-hands.dm +++ b/code/modules/mob/inventory/inventory-hands.dm @@ -1,4 +1,4 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2024 Citadel Station Developers *// -#warn core swap procs? +// todo: all inventory core procs go on the inventory, not the mob; mob is just a hook point! diff --git a/code/modules/mob/living/carbon/carbon-hands.dm b/code/modules/mob/living/carbon/carbon-hands.dm index fd256f9b2970..1357f659ddac 100644 --- a/code/modules/mob/living/carbon/carbon-hands.dm +++ b/code/modules/mob/living/carbon/carbon-hands.dm @@ -4,10 +4,15 @@ //* Hands - Abstraction *// /mob/living/carbon/get_usable_hand_count() - #warn impl + // todo: slow as shit + return length(get_usable_hand_indices()) /mob/living/carbon/get_usable_hand_indices() - #warn impl + // todo: slow as shit + . = list() + for(var/i in 1 to get_nominal_hand_count()) + if(get_hand_manipulation_level(i) > HAND_MANIPULATION_NONE) + . += i //* Hands - Checks *// diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5f55b187c208..96e58c9bc0e0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,5 +1,6 @@ /mob/living/carbon/Initialize(mapload) . = ..() + set_nominal_hand_count(2) //setup reagent holders bloodstr = new/datum/reagents/metabolism/bloodstream(500, src) ingested = new/datum/reagents/metabolism/ingested(500, src) diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index 59f5b799c25b..b0adb4317e68 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -54,16 +54,16 @@ * basically if a red deny symbol is in the hand it is not usable, otherwise it's usable. */ /mob/proc/get_usable_hand_count() as num - return 0 - #warn impl + subtypes + return get_nominal_hand_count() /** * get indices of usable hands */ /mob/proc/get_usable_hand_indices() as /list RETURN_TYPE(/list) - return list() - #warn impl + subtypes + . = list() + for(var/i in 1 to get_nominal_hand_count()) + . += i /** * sets number of physical hands we should account for potentialy having diff --git a/code/modules/mob/mob-inventory-abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm index 06067880f7c9..09d557679447 100644 --- a/code/modules/mob/mob-inventory-abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -193,7 +193,7 @@ log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") inventory.held_items[index] = I - inventory.on_item_entered(item, index) + inventory.on_item_entered(I, index) //! LEGACY BEGIN I.update_twohanding() @@ -216,7 +216,7 @@ ASSERT(inventory?.held_items[index] == I) inventory.held_items[index] = null - inventory.on_item_exited(item, index) + inventory.on_item_exited(I, index) I.unequipped(src, SLOT_ID_HANDS, flags) @@ -229,5 +229,5 @@ inventory.held_items[old_index] = null inventory.held_items[index] = I - inventory.on_item_swapped(item, old_index, index) + inventory.on_item_swapped(I, old_index, index) From 56d738bd5b8f56c89cebb68494b0baae1be6bcc6 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:59:50 +0000 Subject: [PATCH 092/140] sigh --- code/modules/mob/living/carbon/carbon-hands.dm | 11 ++++++++--- code/modules/mob/living/carbon/human/human_organs.dm | 2 +- code/modules/organs/external/external.dm | 4 +++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon-hands.dm b/code/modules/mob/living/carbon/carbon-hands.dm index 1357f659ddac..2d6aa9f2d653 100644 --- a/code/modules/mob/living/carbon/carbon-hands.dm +++ b/code/modules/mob/living/carbon/carbon-hands.dm @@ -17,10 +17,12 @@ //* Hands - Checks *// /mob/living/carbon/get_hand_manipulation_level(index) - #warn impl + // todo: implement after organ refactors + return HAND_MANIPULATION_PRECISE /mob/living/carbon/why_hand_manipulation_insufficient(index, manipulation) - #warn impl + // todo: implement after organ refactors + return list() //* Hands - Organs *// @@ -63,7 +65,10 @@ */ /mob/living/carbon/proc/get_hand_organ(index) RETURN_TYPE(/obj/item/organ/external) - #warn impl + if(index % 2) + return get_organ(BP_L_HAND) + else + return get_organ(BP_R_HAND) /** * Get the external organ of a held item diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index e8f08a76251b..f529701c0e7d 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -123,7 +123,7 @@ if(isnull(held)) continue var/obj/item/organ/external/hand = get_hand_organ(i) - var/obj/item/organ/external/arm = get_arm_organ(i) + var/obj/item/organ/external/arm = get_organ(hand.parent_organ) if(isnull(arm) || isnull(hand)) visible_message("Lacking a functioning left hand, \the [src] drops \the [held].") drop_item_to_ground(held, INV_OP_FORCE) diff --git a/code/modules/organs/external/external.dm b/code/modules/organs/external/external.dm index 7760946cc9b7..e6507bcfb7a3 100644 --- a/code/modules/organs/external/external.dm +++ b/code/modules/organs/external/external.dm @@ -1498,7 +1498,9 @@ Note that amputating the affected organ does in fact remove the infection from t //* Hand Integration *// -#warn impl +// todo: some kind of API for querying what hands this organ provides +// this will require organs be composition instead of inheritance, +// as defining this on every left / right hand would be satanic. //* Environmentals *// From f74d55acefe1e0593aa986b5b3c74c610aec811b Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 25 Oct 2024 17:50:42 +0000 Subject: [PATCH 093/140] here we go again --- citadel.dme | 4 ++++ .../dcs/signals/datums/signals_inventory.dm | 13 +++++++++++ code/game/rendering/actor_huds/README.md | 5 +++++ code/game/rendering/actor_huds/actor_hud.dm | 22 +++++++++++++++++++ .../rendering/actor_huds/actor_hud_holder.dm | 17 ++++++++++++++ .../rendering/actor_huds/huds/inventory.dm | 6 +++++ code/modules/mob/inventory/inventory-hooks.dm | 7 +++--- 7 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/datums/signals_inventory.dm create mode 100644 code/game/rendering/actor_huds/README.md create mode 100644 code/game/rendering/actor_huds/actor_hud.dm create mode 100644 code/game/rendering/actor_huds/actor_hud_holder.dm create mode 100644 code/game/rendering/actor_huds/huds/inventory.dm diff --git a/citadel.dme b/citadel.dme index 6e15684df711..5bddeae58254 100644 --- a/citadel.dme +++ b/citadel.dme @@ -177,6 +177,7 @@ #include "code\__DEFINES\dcs\signals\signals_turf.dm" #include "code\__DEFINES\dcs\signals\datums\signals_beam.dm" #include "code\__DEFINES\dcs\signals\datums\signals_beam_legacy.dm" +#include "code\__DEFINES\dcs\signals\datums\signals_inventory.dm" #include "code\__DEFINES\dcs\signals\datums\signals_perspective.dm" #include "code\__DEFINES\dcs\signals\elements\signals_element_conflict_checking.dm" #include "code\__DEFINES\dcs\signals\items\signals_inducer.dm" @@ -2000,6 +2001,9 @@ #include "code\game\rendering\mob.dm" #include "code\game\rendering\screen.dm" #include "code\game\rendering\screen_legacy.dm" +#include "code\game\rendering\actor_huds\actor_hud.dm" +#include "code\game\rendering\actor_huds\actor_hud_holder.dm" +#include "code\game\rendering\actor_huds\huds\inventory.dm" #include "code\game\rendering\atom_huds\atom_hud.dm" #include "code\game\rendering\atom_huds\atom_hud_provider.dm" #include "code\game\rendering\atom_huds\legacy.dm" diff --git a/code/__DEFINES/dcs/signals/datums/signals_inventory.dm b/code/__DEFINES/dcs/signals/datums/signals_inventory.dm new file mode 100644 index 000000000000..5799a1ecc29e --- /dev/null +++ b/code/__DEFINES/dcs/signals/datums/signals_inventory.dm @@ -0,0 +1,13 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 Citadel Station Developers *// + +//* for /datum/inventory *// + +/// raised with (obj/item/item, datum/inventory_slot/slot_or_index) +/// +/// * raised after COMSIG_INVENTORY_ITEM_EXITED_SLOT during swaps +#define COMSIG_INVENTORY_ITEM_ENTERED_SLOT "inventory-item-entered-slot" +/// raised with (obj/item/item, datum/inventory_slot/slot_or_index) +/// +/// * raised before COMSIG_INVENTORY_ITEM_ENTERED_SLOT during swaps +#define COMSIG_INVENTORY_ITEM_EXITED_SLOT "inventory-item-exited-slot" diff --git a/code/game/rendering/actor_huds/README.md b/code/game/rendering/actor_huds/README.md new file mode 100644 index 000000000000..f38fcfd4bb4f --- /dev/null +++ b/code/game/rendering/actor_huds/README.md @@ -0,0 +1,5 @@ +# Actor HUDs + +Actor HUDs serve to allow a player to control a character. + +Instead of certain HUDs being on the mob, they're on the client, and instead register to a mob's functions to update as needed. diff --git a/code/game/rendering/actor_huds/actor_hud.dm b/code/game/rendering/actor_huds/actor_hud.dm new file mode 100644 index 000000000000..99d2dd556dc6 --- /dev/null +++ b/code/game/rendering/actor_huds/actor_hud.dm @@ -0,0 +1,22 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 Citadel Station Developers *// + +/** + * actor huds are: + * + * * used by one (1) client + * * bound to one (1) mob + * * renders the state of that mob if needed + * * renders the state of the client's intent / will otherwise + */ +/datum/actor_hud + /// the mob we're bound to right now + var/mob/bound + +/datum/actor_hud/proc/bind_to_mob(mob/target) + if(bound == target) + return FALSE + bound_actor = target + return TRUE + +#warn impl diff --git a/code/game/rendering/actor_huds/actor_hud_holder.dm b/code/game/rendering/actor_huds/actor_hud_holder.dm new file mode 100644 index 000000000000..49752aca29a2 --- /dev/null +++ b/code/game/rendering/actor_huds/actor_hud_holder.dm @@ -0,0 +1,17 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 Citadel Station Developers *// + +/** + * A holder for actor HUDs on a client. + */ +/datum/actor_hud_holder + /// inventory hud + var/datum/actor_hud/inventory + +/** + * reset every hud to a mob + */ +/datum/actor_hud_holder/proc/rebind_all_to_mob(mob/target) + #warn impl + +#warn impl diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm new file mode 100644 index 000000000000..c79046ae2759 --- /dev/null +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -0,0 +1,6 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 Citadel Station Developers *// + +/datum/actor_hud/inventory + +#warn impl diff --git a/code/modules/mob/inventory/inventory-hooks.dm b/code/modules/mob/inventory/inventory-hooks.dm index c70744d03e93..53c1572c3094 100644 --- a/code/modules/mob/inventory/inventory-hooks.dm +++ b/code/modules/mob/inventory/inventory-hooks.dm @@ -12,7 +12,7 @@ * * It is not required for on_item_swapped to be called instead of this proc if it's a swap. */ /datum/inventory/proc/on_item_entered(obj/item/item, datum/inventory_slot/slot_or_index) - hud?.add_item(item, slot_or_index) + SEND_SIGNAL(COMSIG_INVENTORY_ITEM_ENTERED_SLOT, slot_or_index) /** * Should be called when an item is removed from inventory. @@ -23,7 +23,7 @@ * * It is not required for on_item_swapped to be called instead of this proc if it's a swap. */ /datum/inventory/proc/on_item_exited(obj/item/item, datum/inventory_slot/slot_or_index) - hud?.remove_item(item, slot_or_index) + SEND_SIGNAL(COMSIG_INVENTORY_ITEM_EXITED_SLOT, slot_or_index) /** * Should be called when an item is moved from one slot to another. @@ -39,7 +39,8 @@ * As of right now, the functionality is equivalent; on_item_swapped() is just more efficient. */ /datum/inventory/proc/on_item_swapped(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) - hud?.move_item(item, from_slot_or_index, to_slot_or_index) + SEND_SIGNAL(COMSIG_INVENTORY_ITEM_EXITED_SLOT, slot_or_index) + SEND_SIGNAL(COMSIG_INVENTORY_ITEM_ENTERED_SLOT, slot_or_index) /** * Should be called when the mob's mobility flags change. From 16f62b7aab25672d7d49c8825eecc3feb2eae6dd Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 5 Nov 2024 19:56:45 -0500 Subject: [PATCH 094/140] Sigh --- code/game/rendering/actor_huds/actor_hud.dm | 2 +- code/game/rendering/actor_huds/actor_hud_holder.dm | 14 ++++++++++++++ code/modules/mob/inventory/inventory-hooks.dm | 8 ++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/code/game/rendering/actor_huds/actor_hud.dm b/code/game/rendering/actor_huds/actor_hud.dm index 99d2dd556dc6..f56b26406a5c 100644 --- a/code/game/rendering/actor_huds/actor_hud.dm +++ b/code/game/rendering/actor_huds/actor_hud.dm @@ -16,7 +16,7 @@ /datum/actor_hud/proc/bind_to_mob(mob/target) if(bound == target) return FALSE - bound_actor = target + bound = target return TRUE #warn impl diff --git a/code/game/rendering/actor_huds/actor_hud_holder.dm b/code/game/rendering/actor_huds/actor_hud_holder.dm index 49752aca29a2..0e50616f4b5d 100644 --- a/code/game/rendering/actor_huds/actor_hud_holder.dm +++ b/code/game/rendering/actor_huds/actor_hud_holder.dm @@ -5,9 +5,23 @@ * A holder for actor HUDs on a client. */ /datum/actor_hud_holder + /// owning client + var/client/owner + /// inventory hud var/datum/actor_hud/inventory +/datum/actor_hud_holder/New(client/C) + owner = C + + inventory = new(src) + +/datum/actor_hud_holder/Destroy() + QDEL_NULL(inventory) + + owner = null + return ..() + /** * reset every hud to a mob */ diff --git a/code/modules/mob/inventory/inventory-hooks.dm b/code/modules/mob/inventory/inventory-hooks.dm index 53c1572c3094..d2695ca1321c 100644 --- a/code/modules/mob/inventory/inventory-hooks.dm +++ b/code/modules/mob/inventory/inventory-hooks.dm @@ -12,7 +12,7 @@ * * It is not required for on_item_swapped to be called instead of this proc if it's a swap. */ /datum/inventory/proc/on_item_entered(obj/item/item, datum/inventory_slot/slot_or_index) - SEND_SIGNAL(COMSIG_INVENTORY_ITEM_ENTERED_SLOT, slot_or_index) + SEND_SIGNAL(src, COMSIG_INVENTORY_ITEM_ENTERED_SLOT, slot_or_index) /** * Should be called when an item is removed from inventory. @@ -23,7 +23,7 @@ * * It is not required for on_item_swapped to be called instead of this proc if it's a swap. */ /datum/inventory/proc/on_item_exited(obj/item/item, datum/inventory_slot/slot_or_index) - SEND_SIGNAL(COMSIG_INVENTORY_ITEM_EXITED_SLOT, slot_or_index) + SEND_SIGNAL(src, COMSIG_INVENTORY_ITEM_EXITED_SLOT, slot_or_index) /** * Should be called when an item is moved from one slot to another. @@ -39,8 +39,8 @@ * As of right now, the functionality is equivalent; on_item_swapped() is just more efficient. */ /datum/inventory/proc/on_item_swapped(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) - SEND_SIGNAL(COMSIG_INVENTORY_ITEM_EXITED_SLOT, slot_or_index) - SEND_SIGNAL(COMSIG_INVENTORY_ITEM_ENTERED_SLOT, slot_or_index) + SEND_SIGNAL(src, COMSIG_INVENTORY_ITEM_EXITED_SLOT, from_slot_or_index) + SEND_SIGNAL(src, COMSIG_INVENTORY_ITEM_ENTERED_SLOT, to_slot_or_index) /** * Should be called when the mob's mobility flags change. From d3236909e9c9ef6a291df547fc89d77ad105304f Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 6 Nov 2024 09:10:19 -0500 Subject: [PATCH 095/140] that --- citadel.dme | 3 +- code/game/objects/items-interaction.dm | 5 +- code/game/rendering/actor_huds/actor_hud.dm | 65 ++- .../rendering/actor_huds/actor_hud_holder.dm | 13 +- .../rendering/actor_huds/huds/inventory.dm | 401 ++++++++++++++++- .../{mob_huds => actor_huds}/mob_hud.dm | 1 + code/game/rendering/mob_huds/inventory.dm | 409 ------------------ 7 files changed, 475 insertions(+), 422 deletions(-) rename code/game/rendering/{mob_huds => actor_huds}/mob_hud.dm (98%) delete mode 100644 code/game/rendering/mob_huds/inventory.dm diff --git a/citadel.dme b/citadel.dme index bfd16c6fd665..b0b4f7f18d7a 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2005,6 +2005,7 @@ #include "code\game\rendering\screen_legacy.dm" #include "code\game\rendering\actor_huds\actor_hud.dm" #include "code\game\rendering\actor_huds\actor_hud_holder.dm" +#include "code\game\rendering\actor_huds\mob_hud.dm" #include "code\game\rendering\actor_huds\huds\inventory.dm" #include "code\game\rendering\atom_huds\atom_hud.dm" #include "code\game\rendering\atom_huds\atom_hud_provider.dm" @@ -2030,8 +2031,6 @@ #include "code\game\rendering\legacy\spell_screen_objects.dm" #include "code\game\rendering\legacy\intents\throwing.dm" #include "code\game\rendering\legacy\objects\waypoint_tracker.dm" -#include "code\game\rendering\mob_huds\inventory.dm" -#include "code\game\rendering\mob_huds\mob_hud.dm" #include "code\game\rendering\parallax\parallax.dm" #include "code\game\rendering\parallax\parallax_holder.dm" #include "code\game\rendering\parallax\parallax_object.dm" diff --git a/code/game/objects/items-interaction.dm b/code/game/objects/items-interaction.dm index 98b5f64eeef6..4191525a2b7f 100644 --- a/code/game/objects/items-interaction.dm +++ b/code/game/objects/items-interaction.dm @@ -108,6 +108,7 @@ if(user.restrained()) return // don't. // todo: restraint levels, e.g. handcuffs vs straightjacket + // todo: this needs to check for user / actor indirection bullshit (e.g. someone does the clickdragging while controlling another mob) if(!user.is_in_inventory(src)) // not being held if(!isturf(loc)) // yea nah @@ -140,11 +141,11 @@ // being held, check for attempt unequip if(istype(over, /atom/movable/screen/inventory/plate/hand)) var/atom/movable/screen/inventory/plate/hand/H = over - user.put_in_hand(src, H.index) + user.put_in_hand(src, H.hand_index) return CLICKCHAIN_DO_NOT_PROPAGATE else if(istype(over, /atom/movable/screen/inventory/plate/slot)) var/atom/movable/screen/inventory/plate/slot/S = over - user.equip_to_slot_if_possible(src, S.slot_id) + user.equip_to_slot_if_possible(src, S.inventory_slot_id) return CLICKCHAIN_DO_NOT_PROPAGATE else if(istype(over, /turf)) user.drop_item_to_ground(src) diff --git a/code/game/rendering/actor_huds/actor_hud.dm b/code/game/rendering/actor_huds/actor_hud.dm index f56b26406a5c..15543e8b6079 100644 --- a/code/game/rendering/actor_huds/actor_hud.dm +++ b/code/game/rendering/actor_huds/actor_hud.dm @@ -11,12 +11,69 @@ */ /datum/actor_hud /// the mob we're bound to right now - var/mob/bound + /// + /// * this is our actor + var/mob/actor + /// the client we're made for + /// + /// * this is our controller + var/client/owner + /// our holder + /// + /// * just a collection of actor huds + var/datum/actor_hud_holder/holder + +/datum/actor_hud/New(datum/actor_hud_holder/holder) + src.holder = holder + src.owner = holder.owner /datum/actor_hud/proc/bind_to_mob(mob/target) - if(bound == target) - return FALSE - bound = target + #warn component signals + actor = target return TRUE +/** + * returns all screens we should apply to a client + */ +/datum/actor_hud/proc/screens() + return list() + +/** + * returns all images we should apply to a client + */ +/datum/actor_hud/proc/images() + return list() + +/** + * wrapper; use this instead of directly editing client variables. + * + * * arg can be a list or a single object + */ +/datum/actor_hud/proc/add_screen(atom/movable/what) + owner.screens += what + +/** + * wrapper; use this instead of directly editing client variables. + * + * * arg can be a list or a single object + */ +/datum/actor_hud/proc/remove_screen(atom/movable/what) + owner.screens -= what + +/** + * wrapper; use this instead of directly editing client variables. + * + * * arg can be a list or a single object + */ +/datum/actor_hud/proc/add_image(image/what) + owner.images += what + +/** + * wrapper; use this instead of directly editing client variables. + * + * * arg can be a list or a single object + */ +/datum/actor_hud/proc/remove_image(image/what) + owner.images -= what + #warn impl diff --git a/code/game/rendering/actor_huds/actor_hud_holder.dm b/code/game/rendering/actor_huds/actor_hud_holder.dm index 0e50616f4b5d..f312e213e188 100644 --- a/code/game/rendering/actor_huds/actor_hud_holder.dm +++ b/code/game/rendering/actor_huds/actor_hud_holder.dm @@ -3,6 +3,8 @@ /** * A holder for actor HUDs on a client. + * + * This is used for stuff like inventory. */ /datum/actor_hud_holder /// owning client @@ -12,20 +14,23 @@ var/datum/actor_hud/inventory /datum/actor_hud_holder/New(client/C) + // set owner owner = C - + // create huds inventory = new(src) /datum/actor_hud_holder/Destroy() + // destroy huds QDEL_NULL(inventory) - + // teardown owner owner = null + // do rest return ..() /** * reset every hud to a mob */ -/datum/actor_hud_holder/proc/rebind_all_to_mob(mob/target) - #warn impl +/datum/actor_hud_holder/proc/bind_all_to_mob(mob/target) + inventory.bind_to_mob(target) #warn impl diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index c79046ae2759..94020d1d6613 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -3,4 +3,403 @@ /datum/actor_hud/inventory -#warn impl +/** + * Inventory slots specifically, not hands. + */ +/datum/actor_hud/inventory + /// owning inventory + var/datum/inventory/host + + /// hidden classes, associated to list of reasons + var/list/hidden_classes = list( + (INVENTORY_HUD_CLASS_DRAWER) = list( + INVENTORY_HUD_HIDE_SOURCE_DRAWER, + ), + ) + + /// keyed slot id to screen object + var/list/atom/movable/screen/inventory/plate/slot/slot_by_id + /// ordered hand objects + var/list/atom/movable/screen/inventory/plate/hand/hands + + /// drawer object + var/atom/movable/screen/inventory/drawer/button_drawer + /// swap hand object + var/atom/movable/screen/inventory/swap_hand/button_swap_hand + /// equip object + var/atom/movable/screen/inventory/equip_hand/button_equip_hand + +/datum/actor_hud/inventory/bind_to_mob(mob/target) + . = ..() + + +/datum/actor_hud/inventory/Destroy() + host = null + cleanup() + return ..() + +/datum/actor_hud/inventory/screens() + . = ..() + // slots + . += all_slot_screen_objects() + // hands + . += all_hand_screen_objects() + // buttons + . += all_button_screen_objects() + +/** + * destroy everything + */ +/datum/actor_hud/inventory/proc/cleanup() + // slots + var/list/atom/movable/screen/inventory/plate/slot/slot_objects = all_slot_screen_objects() + remove_screen(slot_objects) + QDEL_LIST(slot_objects) + + // hands + var/list/atom/movable/screen/inventory/plate/hand/hand_objects = all_hand_screen_objects() + remove_screen(hand_objects) + QDEL_LIST(hand_objects) + + // buttons + var/list/atom/movable/screen/inventory/button_objects = all_button_screen_objects() + remove_screen(button_objects) + QDEL_NULL(button_objects) + +/** + * Accepts a list with keys as slot IDs, and values as null or a list of + * INVENTORY_SLOT_REMAP_*'s. + */ +/datum/actor_hud/inventory/proc/rebuild(list/inventory_slots_with_mappings, number_of_hands) + cleanup() + + // buttons + add_screen((button_swap_hand = new)) + add_screen((button_equip_hand = new)) + add_screen((button_drawer = new)) + + // slots + rebuild_slots(inventory_slots_with_mappings) + + // hands + rebuild_hands(number_of_hands) + +/** + * Rebuilds our slots. Doesn't rebuild anything else. Doesn't wipe old objects. + */ +/datum/actor_hud/inventory/proc/rebuild_slots(list/inventory_slots_with_mappings) + LAZYINITLIST(slot_by_id) + for(var/slot_id in inventory_slots_with_mappings) + var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) + if(!slot) + stack_trace("failed to fetch slot during hud rebuild: [slot_id]") + continue + slot_by_id += new /atom/movable/screen/inventory/plate/slot(null, slot, inventory_slots_with_mappings[slot_id] || list()) + + // here is where we basically pull a CSS flexbox. + + var/max_drawer_main = 0 + var/max_drawer_cross = 0 + + var/min_hands_main = 0 + var/max_hands_main = 0 + var/max_hands_cross = 0 + + var/list/atom/movable/screen/inventory/plate/slot/place_anywhere = list() + var/list/atom/movable/screen/inventory/plate/slot/ + + for(var/id in slot_by_id) + var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] + + switch(slot_object.inventory_hud_anchor) + if(INVENTORY_HUD_ANCHOR_AUTOMATIC) + if(INVENTORY_HUD_ANCHOR_TO_DRAWER) + if(INVENTORY_HUD_ANCHOR_TO_HANDS) + #warn impl + +/** + * Rebuilds our hands. Doesn't rebuild anything else. Doesn't wipe old objects. + */ +/datum/actor_hud/inventory/proc/rebuild_hands(number_of_hands) + LAZYINITLIST(hands) + if(length(hands) < number_of_hands) + var/old_length = length(hands) + hands.len = number_of_hands + for(var/i in old_length + 1 to number_of_hands) + var/atom/movable/screen/inventory/plate/hand/hand_object = new(null, src, i) + add_screen(hand_object) + hands[i] = hand_object + else if(length(hands) > number_of_hands) + for(var/i in number_of_hands + 1 to length(hands)) + if(!hands[i]) + continue + remove_screen(hands[i]) + qdel(hands[i]) + hands.len = number_of_hands + + button_equip_hand?.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(number_of_hands) + button_swap_hand?.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(number_of_hands) + +/datum/actor_hud/inventory/proc/all_slot_screen_objects(filter_by_class) + RETURN_TYPE(/list) + . = list() + if(filter_by_class) + if(islist(filter_by_class)) + for(var/id in slot_by_id) + var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] + if(slot_object.inventory_hud_class in filter_by_class) + . += slot_object + else + for(var/id in slot_by_id) + var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] + if(slot_object.inventory_hud_class == filter_by_class) + . += slot_object + else + for(var/id in slot_by_id) + . += slot_by_id[id] + +/datum/actor_hud/inventory/proc/all_hand_screen_objects() + RETURN_TYPE(/list) + . = list() + for(var/atom/movable/object in hands) + . += object + +/datum/actor_hud/inventory/proc/all_button_screen_objects() + RETURN_TYPE(/list) + . = list() + if(button_swap_hand) + . += button_swap_hand + if(button_equip_hand) + . += button_equip_hand + if(button_drawer) + . += button_drawer + +/datum/actor_hud/inventory/proc/toggle_hidden_class(class, source) + var/list/atom/movable/screen/inventory/affected = all_slot_screen_objects(class) + if(class in hidden_classes) + LAZYREMOVE(hidden_classes[class], source) + if(!length(hidden_classes[class])) + add_screen(affected) + hidden_classes -= class + else + if(!hidden_classes[class]) + remove_screen(affected) + LAZYADD(hidden_classes[class], class) + button_drawer?.update_icon() + +/datum/actor_hud/inventory/proc/add_hidden_class(class, source) + if(class in hidden_classes) + return + toggle_hidden_class(class, source) + +/datum/actor_hud/inventory/proc/remove_hidden_class(class, source) + if(!(class in hidden_classes)) + return + toggle_hidden_class(class, source) + +//* Hooks *// + +/datum/actor_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) + var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slot_by_id[slot_or_index.id] + screen_obj.bind_item(item) + +/datum/actor_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot_or_index) + var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slot_by_id[slot_or_index.id] + screen_obj.unbind_item(item) + +/datum/actor_hud/inventory/proc/move_item(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) + var/atom/movable/screen/inventory/plate/old_screen_obj = isnum(from_slot_or_index) ? hands[from_slot_or_index] : slot_by_id[from_slot_or_index.id] + var/atom/movable/screen/inventory/plate/new_screen_obj = isnum(to_slot_or_index) ? hands[to_slot_or_index] : slot_by_id[to_slot_or_index.id] + old_screen_obj.unbind_item(item) + new_screen_obj.bind_item(item) + +/datum/actor_hud/inventory/proc/swap_active_hand(from_index, to_index) + var/atom/movable/screen/inventory/plate/hand/old_hand = hands[from_index] + var/atom/movable/screen/inventory/plate/hand/new_hand = hands[to_index] + + old_hand.cut_overlay("[old_hand.icon_state]-active") + new_hand.add_overlay("[new_hand.icon_state]-active") + +//* Inventory Screen Objects *// + +/** + * Base type of inventory screen objects. + */ +/atom/movable/screen/inventory + name = "inventory" + icon = 'icons/screen/hud/midnight/inventory.dmi' + + /// our owning mob hud + var/datum/actor_hud/inventory/hud + +/atom/movable/screen/inventory/Initialize(mapload, datum/actor_hud/inventory/hud) + . = ..() + src.hud = hud + sync_style(hud.hud_style) + +/atom/movable/screen/inventory/check_allowed(mob/user) + return ..() && hud.owner == user + +/atom/movable/screen/inventory/on_click(mob/user, list/params) + var/obj/item/held = user.get_active_held_item() + handle_inventory_click(user, held) + +/atom/movable/screen/inventory/sync_style(datum/hud_style/style, style_alpha, style_color) + alpha = style_alpha + color = style_color + +/** + * handle an inventory operation + * + * @params + * * user - clicking user; not necessarily the inventory's owner + * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. + */ +/atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, obj/item/with_item) + return + +#warn impl all + +/** + * Base type of item-holding screen objects + */ +/atom/movable/screen/inventory/plate + +/atom/movable/screen/inventory/plate/Destroy() + if(length(vis_contents) != 0) + vis_contents.len = 0 + return ..() + +/atom/movable/screen/inventory/plate/proc/bind_item(obj/item/item) + vis_contents += item + +/atom/movable/screen/inventory/plate/proc/unbind_item(obj/item/item) + vis_contents -= item + +/** + * Slot screen objects + * + * * Stores remappings so we don't have to do it separately + * * Stores calculated screen_loc so we don't have to recalculate unless slots are mutated. + */ +/atom/movable/screen/inventory/plate/slot + /// our inventory slot id + var/inventory_slot_id + /// our (potentially remapped) class + var/inventory_hud_class = INVENTORY_HUD_CLASS_ALWAYS + /// our (potentially remapped) main axis + var/inventory_hud_main_axis = 0 + /// our (potentially remapped) cross axis + var/inventory_hud_cross_axis = 0 + /// our (potentially remapped) anchor + var/inventory_hud_anchor = INVENTORY_HUD_ANCHOR_AUTOMATIC + +/atom/movable/screen/inventory/plate/slot/Initialize(mapload, datum/actor_hud/inventory/hud, datum/inventory_slot/slot, list/slot_remappings) + . = ..() + inventory_slot_id = slot.id + inventory_hud_class = slot_remappings[INVENTORY_SLOT_REMAP_CLASS] || slot.inventory_hud_class + inventory_hud_main_axis = slot_remappings[INVENTORY_SLOT_REMAP_MAIN_AXIS] || slot.inventory_hud_main_axis + inventory_hud_cross_axis = slot_remappings[INVENTORY_SLOT_REMAP_CROSS_AXIS] || slot.inventory_hud_cross_axis + inventory_hud_anchor = slot_remappings[INVENTORY_SLOT_REMAP_ANCHOR] || slot.inventory_hud_anchor + name = slot_remappings[INVENTORY_SLOT_REMAP_NAME] || slot.display_name || slot.name + +/atom/movable/screen/inventory/plate/slot/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons_slot + +/atom/movable/screen/inventory/plate/slot/handle_inventory_click(mob/user, obj/item/with_item) + #warn impl + +/** + * comparator that sorts slots that are semantically closer to their anchors to be first, + * allowing a no-collision-or-cascading method of resolving slot alignment. + */ +/proc/cmp_inventory_slot_screen_object_for_anti_cascade(atom/movable/screen/inventory/plate/slot/A, atom/movable/screen/inventory/plate/slot/B) + + +/** + * Hand screen objects + */ +/atom/movable/screen/inventory/plate/hand + /// target hand index + var/hand_index + /// should we have handcuffed overlay? + var/handcuffed = FALSE + +/atom/movable/screen/inventory/plate/hand/Initialize(mapload, datum/inventory/host, hand_index) + . = ..() + src.hand_index = hand_index + sync_index(hand_index) + +/atom/movable/screen/inventory/plate/hand/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons + +/atom/movable/screen/inventory/plate/hand/handle_inventory_click(mob/user, obj/item/with_item) + if(!with_item) + hud.owner.swap_hand(hand_index) + #warn impl + +/atom/movable/screen/inventory/plate/hand/proc/sync_index(index = hand_index) + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND(index) + var/index_of_side = round(index / 2) + name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" + icon_state = "hand-[index % 2? "left" : "right"]" + +#warn hook +/atom/movable/screen/inventory/plate/hand/proc/set_handcuffed(state) + if(state == handcuffed) + return + handcuffed = state + update_icon() + +/atom/movable/screen/inventory/plate/hand/update_overlays() + . = ..() + if(handcuffed) + . += image('icons/mob/screen_gen.dmi', "[hand_index % 2 ? "r_hand" : "l_hand"]_hud_handcuffs") + +/** + * Button: 'swap hand' + */ +/atom/movable/screen/inventory/drawer + icon_state = "drawer" + +/atom/movable/screen/inventory/drawer/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons_wide + +/atom/movable/screen/inventory/drawer/on_click(mob/user, list/params) + // todo: remote control + hud.toggle_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_DRAWER) + +/atom/movable/screen/inventory/drawer/update_icon_state() + icon_state = "[INVENTORY_HUD_CLASS_DRAWER in hud.hidden_classes ? "drawer" : "drawer-active"]" + return ..() + +/** + * Button: 'swap hand' + */ +/atom/movable/screen/inventory/swap_hand + icon_state = "swap" + +/atom/movable/screen/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons_wide + +/atom/movable/screen/inventory/swap_hand/on_click(mob/user, list/params) + // todo: remote control + user.swap_hand() + +/** + * Button: 'auto equip' + */ +/atom/movable/screen/inventory/equip_hand + icon_state = "equip" + +/atom/movable/screen/inventory/equip_hand/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons + +/atom/movable/screen/inventory/equip_hand/on_click(mob/user, list/params) + // todo: remote control + user.attempt_smart_equip(user.get_active_held_item()) diff --git a/code/game/rendering/mob_huds/mob_hud.dm b/code/game/rendering/actor_huds/mob_hud.dm similarity index 98% rename from code/game/rendering/mob_huds/mob_hud.dm rename to code/game/rendering/actor_huds/mob_hud.dm index 50313ded8b40..a484e5eb57c5 100644 --- a/code/game/rendering/mob_huds/mob_hud.dm +++ b/code/game/rendering/actor_huds/mob_hud.dm @@ -11,6 +11,7 @@ * * "but this is so low level it's hard to use for remote control"; that's what later on /datum/remote_control is for! * * mob_hud does not track screens/images unlike perspective! these are mostly stateless as they're externally synchronized. */ +#warn port this over to actor hud lmao /datum/mob_hud /// mob we're for (aka rendering the state of) var/mob/owner diff --git a/code/game/rendering/mob_huds/inventory.dm b/code/game/rendering/mob_huds/inventory.dm deleted file mode 100644 index 840c6e6f2fc8..000000000000 --- a/code/game/rendering/mob_huds/inventory.dm +++ /dev/null @@ -1,409 +0,0 @@ -//* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 Citadel Station Developers *// - -/** - * Inventory slots specifically, not hands. - */ -/datum/mob_hud/inventory - /// owning inventory - var/datum/inventory/host - - /// hidden classes, associated to list of reasons - var/list/hidden_classes = list( - (INVENTORY_HUD_CLASS_DRAWER) = list( - INVENTORY_HUD_HIDE_SOURCE_DRAWER, - ), - ) - - /// keyed slot id to screen object - var/list/atom/movable/screen/inventory/plate/slot/slot_by_id - /// ordered hand objects - var/list/atom/movable/screen/inventory/plate/hand/hands - - /// drawer object - var/atom/movable/screen/inventory/drawer/button_drawer - /// swap hand object - var/atom/movable/screen/inventory/swap_hand/button_swap_hand - /// equip object - var/atom/movable/screen/inventory/equip_hand/button_equip_hand - -/datum/mob_hud/inventory/New(mob/owner, datum/inventory/host) - src.host = host - src.rebuild(host.build_inventory_slots_with_remappings(), length(host.held_items)) - ..() - -/datum/mob_hud/inventory/Destroy() - host = null - cleanup() - return ..() - -/datum/mob_hud/inventory/screens() - . = ..() - // slots - . += all_slot_screen_objects() - // hands - . += all_hand_screen_objects() - // buttons - . += all_button_screen_objects() - -/datum/mob_hud/inventory/sync_client(client/C) - . = ..() - for(var/atom/movable/screen/screen_object in screens()) - screen_object.sync_style(hud_style, hud_alpha, hud_color) - -/** - * destroy everything - */ -/datum/mob_hud/inventory/proc/cleanup() - // slots - var/list/atom/movable/screen/inventory/plate/slot/slot_objects = all_slot_screen_objects() - remove_screen(slot_objects) - QDEL_LIST(slot_objects) - - // hands - var/list/atom/movable/screen/inventory/plate/hand/hand_objects = all_hand_screen_objects() - remove_screen(hand_objects) - QDEL_LIST(hand_objects) - - // buttons - var/list/atom/movable/screen/inventory/button_objects = all_button_screen_objects() - remove_screen(button_objects) - QDEL_NULL(button_objects) - -/** - * Accepts a list with keys as slot IDs, and values as null or a list of - * INVENTORY_SLOT_REMAP_*'s. - */ -/datum/mob_hud/inventory/proc/rebuild(list/inventory_slots_with_mappings, number_of_hands) - cleanup() - - // buttons - add_screen((button_swap_hand = new)) - add_screen((button_equip_hand = new)) - add_screen((button_drawer = new)) - - // slots - rebuild_slots(inventory_slots_with_mappings) - - // hands - rebuild_hands(number_of_hands) - -/** - * Rebuilds our slots. Doesn't rebuild anything else. Doesn't wipe old objects. - */ -/datum/mob_hud/inventory/proc/rebuild_slots(list/inventory_slots_with_mappings) - LAZYINITLIST(slot_by_id) - for(var/slot_id in inventory_slots_with_mappings) - var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) - if(!slot) - stack_trace("failed to fetch slot during hud rebuild: [slot_id]") - continue - slot_by_id += new /atom/movable/screen/inventory/plate/slot(null, slot, inventory_slots_with_mappings[slot_id] || list()) - - // here is where we basically pull a CSS flexbox. - - var/max_drawer_main = 0 - var/max_drawer_cross = 0 - - var/min_hands_main = 0 - var/max_hands_main = 0 - var/max_hands_cross = 0 - - var/list/atom/movable/screen/inventory/plate/slot/place_anywhere = list() - var/list/atom/movable/screen/inventory/plate/slot/ - - for(var/id in slot_by_id) - var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] - - switch(slot_object.inventory_hud_anchor) - if(INVENTORY_HUD_ANCHOR_AUTOMATIC) - if(INVENTORY_HUD_ANCHOR_TO_DRAWER) - if(INVENTORY_HUD_ANCHOR_TO_HANDS) - #warn impl - -/** - * Rebuilds our hands. Doesn't rebuild anything else. Doesn't wipe old objects. - */ -/datum/mob_hud/inventory/proc/rebuild_hands(number_of_hands) - LAZYINITLIST(hands) - if(length(hands) < number_of_hands) - var/old_length = length(hands) - hands.len = number_of_hands - for(var/i in old_length + 1 to number_of_hands) - var/atom/movable/screen/inventory/plate/hand/hand_object = new(null, src, i) - add_screen(hand_object) - hands[i] = hand_object - else if(length(hands) > number_of_hands) - for(var/i in number_of_hands + 1 to length(hands)) - if(!hands[i]) - continue - remove_screen(hands[i]) - qdel(hands[i]) - hands.len = number_of_hands - - button_equip_hand?.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(number_of_hands) - button_swap_hand?.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(number_of_hands) - -/datum/mob_hud/inventory/proc/all_slot_screen_objects(filter_by_class) - RETURN_TYPE(/list) - . = list() - if(filter_by_class) - if(islist(filter_by_class)) - for(var/id in slot_by_id) - var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] - if(slot_object.inventory_hud_class in filter_by_class) - . += slot_object - else - for(var/id in slot_by_id) - var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] - if(slot_object.inventory_hud_class == filter_by_class) - . += slot_object - else - for(var/id in slot_by_id) - . += slot_by_id[id] - -/datum/mob_hud/inventory/proc/all_hand_screen_objects() - RETURN_TYPE(/list) - . = list() - for(var/atom/movable/object in hands) - . += object - -/datum/mob_hud/inventory/proc/all_button_screen_objects() - RETURN_TYPE(/list) - . = list() - if(button_swap_hand) - . += button_swap_hand - if(button_equip_hand) - . += button_equip_hand - if(button_drawer) - . += button_drawer - -/datum/mob_hud/inventory/proc/toggle_hidden_class(class, source) - var/list/atom/movable/screen/inventory/affected = all_slot_screen_objects(class) - if(class in hidden_classes) - LAZYREMOVE(hidden_classes[class], source) - if(!length(hidden_classes[class])) - add_screen(affected) - hidden_classes -= class - else - if(!hidden_classes[class]) - remove_screen(affected) - LAZYADD(hidden_classes[class], class) - button_drawer?.update_icon() - -/datum/mob_hud/inventory/proc/add_hidden_class(class, source) - if(class in hidden_classes) - return - toggle_hidden_class(class, source) - -/datum/mob_hud/inventory/proc/remove_hidden_class(class, source) - if(!(class in hidden_classes)) - return - toggle_hidden_class(class, source) - -//* Hooks *// - -/datum/mob_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) - var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slot_by_id[slot_or_index.id] - screen_obj.bind_item(item) - -/datum/mob_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot_or_index) - var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slot_by_id[slot_or_index.id] - screen_obj.unbind_item(item) - -/datum/mob_hud/inventory/proc/move_item(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) - var/atom/movable/screen/inventory/plate/old_screen_obj = isnum(from_slot_or_index) ? hands[from_slot_or_index] : slot_by_id[from_slot_or_index.id] - var/atom/movable/screen/inventory/plate/new_screen_obj = isnum(to_slot_or_index) ? hands[to_slot_or_index] : slot_by_id[to_slot_or_index.id] - old_screen_obj.unbind_item(item) - new_screen_obj.bind_item(item) - -/datum/mob_hud/inventory/proc/swap_active_hand(from_index, to_index) - var/atom/movable/screen/inventory/plate/hand/old_hand = hands[from_index] - var/atom/movable/screen/inventory/plate/hand/new_hand = hands[to_index] - - old_hand.cut_overlay("[old_hand.icon_state]-active") - new_hand.add_overlay("[new_hand.icon_state]-active") - -//* Inventory Screen Objects *// - -/** - * Base type of inventory screen objects. - */ -/atom/movable/screen/inventory - name = "inventory" - icon = 'icons/screen/hud/midnight/inventory.dmi' - - /// our owning mob hud - var/datum/mob_hud/inventory/hud - -/atom/movable/screen/inventory/Initialize(mapload, datum/mob_hud/inventory/hud) - . = ..() - src.hud = hud - sync_style(hud.hud_style) - -/atom/movable/screen/inventory/check_allowed(mob/user) - return ..() && hud.owner == user - -/atom/movable/screen/inventory/on_click(mob/user, list/params) - var/obj/item/held = user.get_active_held_item() - handle_inventory_click(user, held) - -/atom/movable/screen/inventory/sync_style(datum/hud_style/style, style_alpha, style_color) - alpha = style_alpha - color = style_color - -/** - * handle an inventory operation - * - * @params - * * user - clicking user; not necessarily the inventory's owner - * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. - */ -/atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, obj/item/with_item) - return - -#warn impl all - -/** - * Base type of item-holding screen objects - */ -/atom/movable/screen/inventory/plate - -/atom/movable/screen/inventory/plate/Destroy() - if(length(vis_contents) != 0) - vis_contents.len = 0 - return ..() - -/atom/movable/screen/inventory/plate/proc/bind_item(obj/item/item) - vis_contents += item - -/atom/movable/screen/inventory/plate/proc/unbind_item(obj/item/item) - vis_contents -= item - -/** - * Slot screen objects - * - * * Stores remappings so we don't have to do it separately - * * Stores calculated screen_loc so we don't have to recalculate unless slots are mutated. - */ -/atom/movable/screen/inventory/plate/slot - /// our inventory slot id - var/inventory_slot_id - /// our (potentially remapped) class - var/inventory_hud_class = INVENTORY_HUD_CLASS_ALWAYS - /// our (potentially remapped) main axis - var/inventory_hud_main_axis = 0 - /// our (potentially remapped) cross axis - var/inventory_hud_cross_axis = 0 - /// our (potentially remapped) anchor - var/inventory_hud_anchor = INVENTORY_HUD_ANCHOR_AUTOMATIC - -/atom/movable/screen/inventory/plate/slot/Initialize(mapload, datum/mob_hud/inventory/hud, datum/inventory_slot/slot, list/slot_remappings) - . = ..() - inventory_slot_id = slot.id - inventory_hud_class = slot_remappings[INVENTORY_SLOT_REMAP_CLASS] || slot.inventory_hud_class - inventory_hud_main_axis = slot_remappings[INVENTORY_SLOT_REMAP_MAIN_AXIS] || slot.inventory_hud_main_axis - inventory_hud_cross_axis = slot_remappings[INVENTORY_SLOT_REMAP_CROSS_AXIS] || slot.inventory_hud_cross_axis - inventory_hud_anchor = slot_remappings[INVENTORY_SLOT_REMAP_ANCHOR] || slot.inventory_hud_anchor - name = slot_remappings[INVENTORY_SLOT_REMAP_NAME] || slot.display_name || slot.name - -/atom/movable/screen/inventory/plate/slot/sync_style(datum/hud_style/style, style_alpha, style_color) - ..() - icon = style.inventory_icons_slot - -/atom/movable/screen/inventory/plate/slot/handle_inventory_click(mob/user, obj/item/with_item) - #warn impl - -/** - * comparator that sorts slots that are semantically closer to their anchors to be first, - * allowing a no-collision-or-cascading method of resolving slot alignment. - */ -/proc/cmp_inventory_slot_screen_object_for_anti_cascade(atom/movable/screen/inventory/plate/slot/A, atom/movable/screen/inventory/plate/slot/B) - - -/** - * Hand screen objects - */ -/atom/movable/screen/inventory/plate/hand - /// target hand index - var/hand_index - /// should we have handcuffed overlay? - var/handcuffed = FALSE - -/atom/movable/screen/inventory/plate/hand/Initialize(mapload, datum/inventory/host, hand_index) - . = ..() - src.hand_index = hand_index - sync_index(hand_index) - -/atom/movable/screen/inventory/plate/hand/sync_style(datum/hud_style/style, style_alpha, style_color) - ..() - icon = style.inventory_icons - -/atom/movable/screen/inventory/plate/hand/handle_inventory_click(mob/user, obj/item/with_item) - if(!with_item) - hud.owner.swap_hand(hand_index) - #warn impl - -/atom/movable/screen/inventory/plate/hand/proc/sync_index(index = hand_index) - screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND(index) - var/index_of_side = round(index / 2) - name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" - icon_state = "hand-[index % 2? "left" : "right"]" - -#warn hook -/atom/movable/screen/inventory/plate/hand/proc/set_handcuffed(state) - if(state == handcuffed) - return - handcuffed = state - update_icon() - -/atom/movable/screen/inventory/plate/hand/update_overlays() - . = ..() - if(handcuffed) - . += image('icons/mob/screen_gen.dmi', "[hand_index % 2 ? "r_hand" : "l_hand"]_hud_handcuffs") - -/** - * Button: 'swap hand' - */ -/atom/movable/screen/inventory/drawer - icon_state = "drawer" - -/atom/movable/screen/inventory/drawer/sync_style(datum/hud_style/style, style_alpha, style_color) - ..() - icon = style.inventory_icons_wide - -/atom/movable/screen/inventory/drawer/on_click(mob/user, list/params) - // todo: remote control - hud.toggle_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_DRAWER) - -/atom/movable/screen/inventory/drawer/update_icon_state() - icon_state = "[INVENTORY_HUD_CLASS_DRAWER in hud.hidden_classes ? "drawer" : "drawer-active"]" - return ..() - -/** - * Button: 'swap hand' - */ -/atom/movable/screen/inventory/swap_hand - icon_state = "swap" - -/atom/movable/screen/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) - ..() - icon = style.inventory_icons_wide - -/atom/movable/screen/inventory/swap_hand/on_click(mob/user, list/params) - // todo: remote control - user.swap_hand() - -/** - * Button: 'auto equip' - */ -/atom/movable/screen/inventory/equip_hand - icon_state = "equip" - -/atom/movable/screen/inventory/equip_hand/sync_style(datum/hud_style/style, style_alpha, style_color) - ..() - icon = style.inventory_icons - -/atom/movable/screen/inventory/equip_hand/on_click(mob/user, list/params) - // todo: remote control - user.attempt_smart_equip(user.get_active_held_item()) From 510a7ce119561ba9e022b36e6d9c472cbf0981da Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 9 Nov 2024 16:43:03 -0500 Subject: [PATCH 096/140] That --- .../rendering/actor_huds/actor_hud_holder.dm | 31 ++++++++++++++ code/game/rendering/actor_huds/mob_hud.dm | 42 ------------------- code/game/rendering/legacy/hud.dm | 16 +++---- code/modules/client/client.dm | 2 + code/modules/client/client_procs.dm | 4 +- code/modules/mob/mob-login.dm | 5 +-- code/modules/mob/mob-logout.dm | 1 - 7 files changed, 45 insertions(+), 56 deletions(-) diff --git a/code/game/rendering/actor_huds/actor_hud_holder.dm b/code/game/rendering/actor_huds/actor_hud_holder.dm index f312e213e188..4294cbca0d09 100644 --- a/code/game/rendering/actor_huds/actor_hud_holder.dm +++ b/code/game/rendering/actor_huds/actor_hud_holder.dm @@ -33,4 +33,35 @@ /datum/actor_hud_holder/proc/bind_all_to_mob(mob/target) inventory.bind_to_mob(target) +/** + * get all screens + */ +/datum/actor_hud_holder/proc/screens() + . = list() + for(var/datum/actor_hud/hud as anything in all_huds()) + . += hud.screens() + +/** + * get all screens + */ +/datum/actor_hud_holder/proc/images() + . = list() + for(var/datum/actor_hud/hud as anything in all_huds()) + . += hud.images() + +/** + * get all huds + */ +/datum/actor_hud_holder/proc/all_huds() + return list( + inventory, + ) + +/** + * apply everything to our client + */ +/datum/actor_hud_holder/proc/reassert_onto_owner() + owner.images |= images() + owner.screens |= screens() + #warn impl diff --git a/code/game/rendering/actor_huds/mob_hud.dm b/code/game/rendering/actor_huds/mob_hud.dm index a484e5eb57c5..70d6b50f1bda 100644 --- a/code/game/rendering/actor_huds/mob_hud.dm +++ b/code/game/rendering/actor_huds/mob_hud.dm @@ -30,20 +30,6 @@ /datum/mob_hud/New(mob/owner) src.owner = owner -/datum/mob_hud/proc/screens() - return list() - -/datum/mob_hud/proc/images() - return list() - -/datum/mob_hud/proc/add_user(client/C) - LAZYADD(using, C) - apply_client(C) - -/datum/mob_hud/proc/remove_user(client/C) - LAZYREMOVE(using, C) - unapply_client(C) - /datum/mob_hud/proc/sync_client(client/C) if(!C) hud_style = GLOB.hud_styles[/datum/hud_style/midnight::id] @@ -65,31 +51,3 @@ /datum/mob_hud/proc/unapply_client(client/C) C.screen -= screens() C.images -= images() - -/** - * * arg can be a list or a single object - */ -/datum/mob_hud/proc/add_screen(atom/movable/what) - for(var/client/C as anything in using) - C.screen += what - -/** - * * arg can be a list or a single object - */ -/datum/mob_hud/proc/remove_screen(atom/movable/what) - for(var/client/C as anything in using) - C.screen -= what - -/** - * * arg can be a list or a single object - */ -/datum/mob_hud/proc/add_image(image/what) - for(var/client/C as anything in using) - C.images += what - -/** - * * arg can be a list or a single object - */ -/datum/mob_hud/proc/remove_image(image/what) - for(var/client/C as anything in using) - C.images -= what diff --git a/code/game/rendering/legacy/hud.dm b/code/game/rendering/legacy/hud.dm index 4622c0e234bd..c1705109e566 100644 --- a/code/game/rendering/legacy/hud.dm +++ b/code/game/rendering/legacy/hud.dm @@ -238,8 +238,8 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason. - inventory.hud.remove_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) - inventory.hud.remove_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) + actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) else hud_used.hud_shown = 1 @@ -259,8 +259,8 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position src.client.screen += src.zone_sel //This one is a special snowflake - inventory.hud.add_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) - inventory.hud.add_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) + actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) //Similar to button_pressed_F12() but keeps zone_sel, gun_setting_icon, and healths. /mob/proc/toggle_zoom_hud() @@ -286,8 +286,8 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) src.client.screen -= src.internals src.client.screen += src.hud_used.action_intent //we want the intent swticher visible - inventory.hud.remove_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) - inventory.hud.remove_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) + actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) else hud_used.hud_shown = 1 if(src.hud_used.adding) @@ -302,5 +302,5 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) src.client.screen |= src.internals src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position - inventory.hud.add_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) - inventory.hud.add_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) + actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) diff --git a/code/modules/client/client.dm b/code/modules/client/client.dm index 7c36b27ebb5c..9bbccd20ea69 100644 --- a/code/modules/client/client.dm +++ b/code/modules/client/client.dm @@ -136,6 +136,8 @@ //* UI - Map *// /// Our action drawer var/datum/action_drawer/action_drawer + /// Our actor HUD holder + var/datum/actor_hud_holder/actor_huds //////////////// diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 138744a62a74..4de3c5f6122b 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -232,8 +232,10 @@ init_cutscene_system() // instantiate tooltips tooltips = new(src) - // start action drawer + // make action drawer action_drawer = new(src) + // make actor HUDs + actor_huds = new(src) // make action holder action_holder = new /datum/action_holder/client_actor(src) action_drawer.register_holder(action_holder) diff --git a/code/modules/mob/mob-login.dm b/code/modules/mob/mob-login.dm index 222c41314327..77dbbc34ce13 100644 --- a/code/modules/mob/mob-login.dm +++ b/code/modules/mob/mob-login.dm @@ -91,10 +91,7 @@ login_cutscene() // Make sure blindness fullscreen is applied if needed blindness_handle_reconnect() - // load inventory HUD - var/datum/mob_hud/inventory/inventory_hud = inventory?.get_hud() - inventory_hud?.add_user(client) - + //* legacy // this is below reset_perspective so self perspective generates. recalculate_vis() diff --git a/code/modules/mob/mob-logout.dm b/code/modules/mob/mob-logout.dm index e2d805f0b4be..6096b0519ac6 100644 --- a/code/modules/mob/mob-logout.dm +++ b/code/modules/mob/mob-logout.dm @@ -15,7 +15,6 @@ client.action_drawer.unregister_holder(actions_innate) if(inventory) client.action_drawer.unregister_holder(inventory.actions) - inventory?.hud?.remove_user(client) /** * Linter check, do not call. From ca42c5266f743c643c45b27efb8bfdf53558c0be Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 9 Nov 2024 17:25:10 -0500 Subject: [PATCH 097/140] that --- citadel.dme | 4 +- .../dcs/signals/datums/signals_inventory.dm | 4 ++ code/game/rendering/actor_huds/actor_hud.dm | 16 +++++- .../rendering/actor_huds/actor_hud_holder.dm | 10 +++- .../rendering/actor_huds/huds/inventory.dm | 22 ++++++-- code/game/rendering/actor_huds/mob_hud.dm | 53 ------------------- code/game/rendering/hud_preferences.dm | 22 ++++++++ code/game/rendering/legacy/hud.dm | 16 +++--- code/game/rendering/mob.dm | 2 +- code/game/rendering/screen.dm | 2 +- code/modules/mob/inventory/inventory-hands.dm | 10 ++++ code/modules/mob/inventory/inventory-hooks.dm | 6 +++ code/modules/mob/inventory/inventory.dm | 25 +++------ code/modules/mob/mob-hands.dm | 5 +- 14 files changed, 103 insertions(+), 94 deletions(-) delete mode 100644 code/game/rendering/actor_huds/mob_hud.dm create mode 100644 code/game/rendering/hud_preferences.dm diff --git a/citadel.dme b/citadel.dme index 13cd41d29ee2..86ef53c7f581 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2006,13 +2006,13 @@ #include "code\game\objects\systems\cell_slot.dm" #include "code\game\objects\systems\storage.dm" #include "code\game\rendering\client.dm" +#include "code\game\rendering\hud_preferences.dm" #include "code\game\rendering\hud_style.dm" #include "code\game\rendering\mob.dm" #include "code\game\rendering\screen.dm" #include "code\game\rendering\screen_legacy.dm" #include "code\game\rendering\actor_huds\actor_hud.dm" #include "code\game\rendering\actor_huds\actor_hud_holder.dm" -#include "code\game\rendering\actor_huds\mob_hud.dm" #include "code\game\rendering\actor_huds\huds\inventory.dm" #include "code\game\rendering\atom_huds\atom_hud.dm" #include "code\game\rendering\atom_huds\atom_hud_provider.dm" @@ -3562,8 +3562,6 @@ #include "code\modules\mob\hear_say.dm" #include "code\modules\mob\holder.dm" #include "code\modules\mob\life.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\logout.dm" #include "code\modules\mob\mob-client.dm" #include "code\modules\mob\mob-damage.dm" #include "code\modules\mob\mob-defense.dm" diff --git a/code/__DEFINES/dcs/signals/datums/signals_inventory.dm b/code/__DEFINES/dcs/signals/datums/signals_inventory.dm index 5799a1ecc29e..3f232a7913a1 100644 --- a/code/__DEFINES/dcs/signals/datums/signals_inventory.dm +++ b/code/__DEFINES/dcs/signals/datums/signals_inventory.dm @@ -11,3 +11,7 @@ /// /// * raised before COMSIG_INVENTORY_ITEM_ENTERED_SLOT during swaps #define COMSIG_INVENTORY_ITEM_EXITED_SLOT "inventory-item-exited-slot" +/// raised with () +/// +/// * raised on any inventory slot mutation +#define COMSIG_INVENTORY_SLOT_REBUILD "inventory-slot-rebuild" diff --git a/code/game/rendering/actor_huds/actor_hud.dm b/code/game/rendering/actor_huds/actor_hud.dm index 15543e8b6079..07677531582c 100644 --- a/code/game/rendering/actor_huds/actor_hud.dm +++ b/code/game/rendering/actor_huds/actor_hud.dm @@ -8,6 +8,11 @@ * * bound to one (1) mob * * renders the state of that mob if needed * * renders the state of the client's intent / will otherwise + * + * Add/remove screen/image procs are **stateless**. + * `screens()` and `images()` gather everything up. + * This is to save some CPU / memory as it's rare to need everything rather + * than just 'patch' the client's render. */ /datum/actor_hud /// the mob we're bound to right now @@ -32,6 +37,13 @@ actor = target return TRUE +/** + * syncs hud + */ +/datum/actor_hud/proc/sync_to_preferences(datum/hud_preferences/preference_set) + for(var/atom/movable/screen/screen_object in screens()) + screen_object.sync_to_preferences(preference_set) + /** * returns all screens we should apply to a client */ @@ -50,7 +62,7 @@ * * arg can be a list or a single object */ /datum/actor_hud/proc/add_screen(atom/movable/what) - owner.screens += what + owner.screen += what /** * wrapper; use this instead of directly editing client variables. @@ -58,7 +70,7 @@ * * arg can be a list or a single object */ /datum/actor_hud/proc/remove_screen(atom/movable/what) - owner.screens -= what + owner.screen -= what /** * wrapper; use this instead of directly editing client variables. diff --git a/code/game/rendering/actor_huds/actor_hud_holder.dm b/code/game/rendering/actor_huds/actor_hud_holder.dm index 4294cbca0d09..17689477eaf5 100644 --- a/code/game/rendering/actor_huds/actor_hud_holder.dm +++ b/code/game/rendering/actor_huds/actor_hud_holder.dm @@ -11,7 +11,7 @@ var/client/owner /// inventory hud - var/datum/actor_hud/inventory + var/datum/actor_hud/inventory/inventory /datum/actor_hud_holder/New(client/C) // set owner @@ -33,6 +33,12 @@ /datum/actor_hud_holder/proc/bind_all_to_mob(mob/target) inventory.bind_to_mob(target) +/** + * syncs hud preferences + */ +/datum/actor_hud_holder/proc/sync_all_to_preferences(datum/hud_preferences/preference_set) + inventory?.sync_to_preferences(preference_set) + /** * get all screens */ @@ -62,6 +68,6 @@ */ /datum/actor_hud_holder/proc/reassert_onto_owner() owner.images |= images() - owner.screens |= screens() + owner.screen |= screens() #warn impl diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 94020d1d6613..6ed226b94b6e 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -29,14 +29,21 @@ /// equip object var/atom/movable/screen/inventory/equip_hand/button_equip_hand +/datum/actor_hud/inventory/Destroy() + host = null + cleanup() + return ..() + /datum/actor_hud/inventory/bind_to_mob(mob/target) . = ..() +/datum/actor_hud/inventory/proc/bind_to_inventory(datum/inventory/inventory) + host = inventory + rebuild(inventory.build_inventory_slots_with_remappings(), length(inventory.held_items)) -/datum/actor_hud/inventory/Destroy() - host = null +/datum/actor_hud/inventory/proc/unbind_to_inventory(datum/inventory/inventory) cleanup() - return ..() + host = null /datum/actor_hud/inventory/screens() . = ..() @@ -235,7 +242,11 @@ /atom/movable/screen/inventory/Initialize(mapload, datum/actor_hud/inventory/hud) . = ..() src.hud = hud - sync_style(hud.hud_style) + sync_style(hud.holder.owner?.legacy_get_hud_preferences()) + +/atom/movable/screen/inventory/Destroy() + hud = null + return ..() /atom/movable/screen/inventory/check_allowed(mob/user) return ..() && hud.owner == user @@ -244,6 +255,9 @@ var/obj/item/held = user.get_active_held_item() handle_inventory_click(user, held) +/atom/movable/screen/inventory/sync_to_preferences(datum/hud_preferences/preference_set) + sync_style(preference_set.hud_style, preference_set.hud_color, preference_set.hud_alpha) + /atom/movable/screen/inventory/sync_style(datum/hud_style/style, style_alpha, style_color) alpha = style_alpha color = style_color diff --git a/code/game/rendering/actor_huds/mob_hud.dm b/code/game/rendering/actor_huds/mob_hud.dm deleted file mode 100644 index 70d6b50f1bda..000000000000 --- a/code/game/rendering/actor_huds/mob_hud.dm +++ /dev/null @@ -1,53 +0,0 @@ -//* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 Citadel Station Developers *// - -/** - * owned by one mob as the user, and one mob as the owner - * - * therefore, keep screen locs as widescreen/viewrange agnostic as possible. - * - * * mob_hud is **owned** by a mob, meaning it's that mob's viewpoint - * * mob_hud is **consumed / used** by clients, including the owning mob's client, as clients render the HUD. - * * "but this is so low level it's hard to use for remote control"; that's what later on /datum/remote_control is for! - * * mob_hud does not track screens/images unlike perspective! these are mostly stateless as they're externally synchronized. - */ -#warn port this over to actor hud lmao -/datum/mob_hud - /// mob we're for (aka rendering the state of) - var/mob/owner - /// users using us - var/list/client/using - - //* hud config *// - - /// desired hud style - set at base of sync_client - var/datum/hud_style/hud_style - /// desired hud color - set at base of sync_client - var/hud_color - /// desired hud alpha - set at base of sync_client - var/hud_alpha - -/datum/mob_hud/New(mob/owner) - src.owner = owner - -/datum/mob_hud/proc/sync_client(client/C) - if(!C) - hud_style = GLOB.hud_styles[/datum/hud_style/midnight::id] - hud_color = "#ffffff" - hud_alpha = 255 - return - var/requested = C.get_preference_entry(/datum/game_preference_entry/dropdown/hud_style) - hud_style = GLOB.hud_styles[all_ui_style_ids[requested]] - if(isnull(hud_style)) - stack_trace("failed to get style [requested]") - hud_style = new /datum/hud_style/midnight - hud_color = C.get_preference_entry(/datum/game_preference_entry/simple_color/hud_color) - hud_alpha = C.get_preference_entry(/datum/game_preference_entry/number/hud_alpha) - -/datum/mob_hud/proc/apply_client(client/C) - C.screen += screens() - C.screen += images() - -/datum/mob_hud/proc/unapply_client(client/C) - C.screen -= screens() - C.images -= images() diff --git a/code/game/rendering/hud_preferences.dm b/code/game/rendering/hud_preferences.dm new file mode 100644 index 000000000000..f4236f7c6d8d --- /dev/null +++ b/code/game/rendering/hud_preferences.dm @@ -0,0 +1,22 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 Citadel Station Developers *// + +/** + * A set of preferences for how to render the game's HUDs. + */ +/datum/hud_preferences + /// desired hud style - set at base of sync_client + var/datum/hud_style/hud_style + /// desired hud color - set at base of sync_client + var/hud_color + /// desired hud alpha - set at base of sync_client + var/hud_alpha + +/** + * todo: remove + */ +/client/proc/legacy_get_hud_preferences() + var/datum/hud_preferences/creating = new + creating.hud_style = preferences.get_entry(/datum/game_preference_entry/dropdown/hud_style) + creating.hud_color = preferences.get_entry(/datum/game_preference_entry/simple_color/hud_color) + creating.hud_alpha = preferences.get_entry(/datum/game_preference_entry/number/hud_alpha) diff --git a/code/game/rendering/legacy/hud.dm b/code/game/rendering/legacy/hud.dm index c1705109e566..09c1cd39ec1f 100644 --- a/code/game/rendering/legacy/hud.dm +++ b/code/game/rendering/legacy/hud.dm @@ -238,8 +238,8 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) //These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone. src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason. - actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) - actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) + client.actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + client.actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) else hud_used.hud_shown = 1 @@ -259,8 +259,8 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position src.client.screen += src.zone_sel //This one is a special snowflake - actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) - actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) + client.actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + client.actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) //Similar to button_pressed_F12() but keeps zone_sel, gun_setting_icon, and healths. /mob/proc/toggle_zoom_hud() @@ -286,8 +286,8 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) src.client.screen -= src.internals src.client.screen += src.hud_used.action_intent //we want the intent swticher visible - actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) - actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) + client.actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + client.actor_huds.inventory?.remove_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) else hud_used.hud_shown = 1 if(src.hud_used.adding) @@ -302,5 +302,5 @@ GLOBAL_DATUM_INIT(global_hud, /datum/global_hud, new) src.client.screen |= src.internals src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position - actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) - actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) + client.actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_ALWAYS, INVENTORY_HUD_HIDE_SOURCE_F12) + client.actor_huds.inventory?.add_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_F12) diff --git a/code/game/rendering/mob.dm b/code/game/rendering/mob.dm index a2b0c9a1f5ae..bfcd07a224dd 100644 --- a/code/game/rendering/mob.dm +++ b/code/game/rendering/mob.dm @@ -49,4 +49,4 @@ /mob/proc/resync_rendering() if(!client) return - inventory?.hud?.sync_client(client) + client.actor_huds.sync_all_to_preferences(client.legacy_get_hud_preferences()) diff --git a/code/game/rendering/screen.dm b/code/game/rendering/screen.dm index 7ab93181f8a5..2e44c6f06966 100644 --- a/code/game/rendering/screen.dm +++ b/code/game/rendering/screen.dm @@ -10,7 +10,7 @@ /** * called to resync to a hud_style datum */ -/atom/movable/screen/proc/sync_style(datum/hud_style/style, alpha, color) +/atom/movable/screen/proc/sync_to_preferences(datum/hud_preferences/preference_set) return /atom/movable/screen/Destroy() diff --git a/code/modules/mob/inventory/inventory-hands.dm b/code/modules/mob/inventory/inventory-hands.dm index 015f247e33b7..b8dcc89b4a0e 100644 --- a/code/modules/mob/inventory/inventory-hands.dm +++ b/code/modules/mob/inventory/inventory-hands.dm @@ -1,4 +1,14 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2024 Citadel Station Developers *// +/datum/inventory/proc/set_hand_count(count) + LAZYINITLIST(held_items) + held_items.len = count + for(var/datum/actor_hud/inventory/hud in huds_using) + hud.rebuild() + SEND_SIGNAL(src, COMSIG_INVENTORY_SLOT_REBUILD) + +/datum/inventory/proc/get_hand_count() + return length(held_items) + // todo: all inventory core procs go on the inventory, not the mob; mob is just a hook point! diff --git a/code/modules/mob/inventory/inventory-hooks.dm b/code/modules/mob/inventory/inventory-hooks.dm index d2695ca1321c..dd5ba1bc4803 100644 --- a/code/modules/mob/inventory/inventory-hooks.dm +++ b/code/modules/mob/inventory/inventory-hooks.dm @@ -13,6 +13,8 @@ */ /datum/inventory/proc/on_item_entered(obj/item/item, datum/inventory_slot/slot_or_index) SEND_SIGNAL(src, COMSIG_INVENTORY_ITEM_ENTERED_SLOT, slot_or_index) + for(var/datum/actor_hud/inventory/hud in huds_using) + hud.add_item(item, slot_or_index) /** * Should be called when an item is removed from inventory. @@ -24,6 +26,8 @@ */ /datum/inventory/proc/on_item_exited(obj/item/item, datum/inventory_slot/slot_or_index) SEND_SIGNAL(src, COMSIG_INVENTORY_ITEM_EXITED_SLOT, slot_or_index) + for(var/datum/actor_hud/inventory/hud in huds_using) + hud.remove_item(item, slot_or_index) /** * Should be called when an item is moved from one slot to another. @@ -41,6 +45,8 @@ /datum/inventory/proc/on_item_swapped(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) SEND_SIGNAL(src, COMSIG_INVENTORY_ITEM_EXITED_SLOT, from_slot_or_index) SEND_SIGNAL(src, COMSIG_INVENTORY_ITEM_ENTERED_SLOT, to_slot_or_index) + for(var/datum/actor_hud/inventory/hud in huds_using) + move_item(item, from_slot_or_index, to_slot_or_index) /** * Should be called when the mob's mobility flags change. diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 9e7938f9af39..4c458e722f29 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -23,11 +23,9 @@ // todo: emissives // var/list/rendered_emissive_overlays = list() - //* HUD *// - /// our hud - /// - /// todo: can we render this per user mob? /datum/remote_control? - var/datum/mob_hud/inventory/hud + //* HUDs *// + /// Actor HUDs using us + var/list/datum/actor_hud/inventory/huds_using //* Inventory *// /// held items @@ -56,19 +54,10 @@ /datum/inventory/Destroy() QDEL_NULL(actions) owner = null + for(var/datum/actor_hud/hud/inventory/hud in huds_using) + hud.unbind_from_inventory(src) return ..() -//* HUD *// - -/** - * returns our mob inventory - */ -/datum/inventory/proc/get_hud() - RETURN_TYPE(/datum/mob_hud/inventory) - if(!hud) - hud = new(owner, src) - return hud - //* Queries *// /** @@ -92,7 +81,9 @@ /datum/inventory/proc/set_base_inventory_slots(list/mapped_slots) base_inventory_slots = mapped_slots - hud?.rebuild_slots(build_inventory_slots_with_remappings()) + for(var/datum/actor_hud/inventory/hud in huds_using) + hud.rebuild() + SEND_SIGNAL(src, COMSIG_INVENTORY_SLOT_REBUILD) //! unsorted / legacy below diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index b0adb4317e68..7d21ede52fef 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -69,8 +69,7 @@ * sets number of physical hands we should account for potentialy having */ /mob/proc/set_nominal_hand_count(count) - LAZYINITLIST(inventory.held_items) - inventory.held_items.len = count + inventory.set_hand_count(count) /** * Are usable hands all holding items? @@ -190,7 +189,7 @@ . = TRUE - inventory.hud?.swap_active_hand(old_index, to_index) + client?.actor_huds?.inventory?.swap_active_hand(old_index, to_index) //! LEGACY was_active?.zoom() From e466f8ca7278c38fb4b45bae0fcd0dd66f69f793 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 9 Nov 2024 18:20:33 -0500 Subject: [PATCH 098/140] that --- code/game/rendering/actor_huds/actor_hud.dm | 22 ++++++++++++++++- .../rendering/actor_huds/huds/inventory.dm | 24 ++++++++++++++++--- code/modules/mob/inventory/inventory-hooks.dm | 2 +- code/modules/mob/inventory/inventory.dm | 2 +- 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/code/game/rendering/actor_huds/actor_hud.dm b/code/game/rendering/actor_huds/actor_hud.dm index 07677531582c..89fea72b2764 100644 --- a/code/game/rendering/actor_huds/actor_hud.dm +++ b/code/game/rendering/actor_huds/actor_hud.dm @@ -32,11 +32,31 @@ src.holder = holder src.owner = holder.owner +/datum/actor_hud/Destroy() + unbind_from_mob() + return ..() + /datum/actor_hud/proc/bind_to_mob(mob/target) - #warn component signals + SHOULD_NOT_OVERRIDE(TRUE) actor = target + RegisterSignal(target, PROC_REF(bound_actor_deleted)) + on_mob_bound(target) return TRUE +/datum/actor_hud/proc/unbind_from_mob() + SHOULD_NOT_OVERRIDE(TRUE) + if(!actor) + return + var/mob/old = actor + actor = null + on_mob_unbound(old) + +/datum/actor_hud/proc/on_mob_bound(mob/target) + return + +/datum/actor_hud/proc/on_mob_unbound(mob/target) + return + /** * syncs hud */ diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 6ed226b94b6e..28b75703f38a 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -34,8 +34,17 @@ cleanup() return ..() -/datum/actor_hud/inventory/bind_to_mob(mob/target) - . = ..() +/datum/actor_hud/inventory/on_mob_bound(mob/target) + // we don't have a hook for 'on inventory init', + // so we can't init it lazily; we init it immediately. + target.init_inventory() + bind_to_inventory(target.inventory) + return ..() + +/datum/actor_hud/inventory/on_mob_unbound(mob/target) + if(target.inventory) + unbind_to_inventory(target.inventory) + return ..() /datum/actor_hud/inventory/proc/bind_to_inventory(datum/inventory/inventory) host = inventory @@ -113,15 +122,24 @@ var/max_hands_cross = 0 var/list/atom/movable/screen/inventory/plate/slot/place_anywhere = list() - var/list/atom/movable/screen/inventory/plate/slot/ + + var/list/cross_axis_for_drawer = list() + var/list/cross_axis_left_of_hands = list() + var/list/crosS_axis_right_of_hands = list() for(var/id in slot_by_id) var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] switch(slot_object.inventory_hud_anchor) if(INVENTORY_HUD_ANCHOR_AUTOMATIC) + plcae_anywhere += slot_object if(INVENTORY_HUD_ANCHOR_TO_DRAWER) + var/requested_cross_axis = clamp(slot_object.inventory_hud_cross_axis, 0, 4) + 1 // 1 to 5 + if(INVENTORY_HUD_ANCHOR_TO_HANDS) + var/requested_cross_axis = clamp(slot_object.inventory_hud_cross_axis, 0, 2) + 1 // 1 to 5 + + for(var/atom/movable/screen/inventory/plate/slot/slot_object as anything in place_anywhere) #warn impl /** diff --git a/code/modules/mob/inventory/inventory-hooks.dm b/code/modules/mob/inventory/inventory-hooks.dm index dd5ba1bc4803..70d9464a88b4 100644 --- a/code/modules/mob/inventory/inventory-hooks.dm +++ b/code/modules/mob/inventory/inventory-hooks.dm @@ -46,7 +46,7 @@ SEND_SIGNAL(src, COMSIG_INVENTORY_ITEM_EXITED_SLOT, from_slot_or_index) SEND_SIGNAL(src, COMSIG_INVENTORY_ITEM_ENTERED_SLOT, to_slot_or_index) for(var/datum/actor_hud/inventory/hud in huds_using) - move_item(item, from_slot_or_index, to_slot_or_index) + hud.move_item(item, from_slot_or_index, to_slot_or_index) /** * Should be called when the mob's mobility flags change. diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 4c458e722f29..a00867babe18 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -54,7 +54,7 @@ /datum/inventory/Destroy() QDEL_NULL(actions) owner = null - for(var/datum/actor_hud/hud/inventory/hud in huds_using) + for(var/datum/actor_hud/inventory/hud in huds_using) hud.unbind_from_inventory(src) return ..() From d13eb0a50ac37af8e3153926f933eee804cdbe8c Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 10 Nov 2024 14:27:20 -0500 Subject: [PATCH 099/140] that --- code/game/objects/items-interaction.dm | 4 +-- code/game/rendering/actor_huds/actor_hud.dm | 7 ++++- .../rendering/actor_huds/actor_hud_holder.dm | 2 -- .../rendering/actor_huds/huds/inventory.dm | 30 +++++++++---------- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/code/game/objects/items-interaction.dm b/code/game/objects/items-interaction.dm index 4191525a2b7f..9b1f24cf554b 100644 --- a/code/game/objects/items-interaction.dm +++ b/code/game/objects/items-interaction.dm @@ -117,11 +117,11 @@ // check for equip if(istype(over, /atom/movable/screen/inventory/plate/hand)) var/atom/movable/screen/inventory/plate/hand/H = over - user.put_in_hand(src, H.index) + user.put_in_hand(src, H.hand_index) return CLICKCHAIN_DO_NOT_PROPAGATE else if(istype(over, /atom/movable/screen/inventory/plate/slot)) var/atom/movable/screen/inventory/plate/slot/S = over - user.equip_to_slot_if_possible(src, S.slot_id) + user.equip_to_slot_if_possible(src, S.inventory_slot_id) return CLICKCHAIN_DO_NOT_PROPAGATE // check for slide if(Adjacent(over) && user.CanSlideItem(src, over) && (istype(over, /obj/structure/table/rack) || istype(over, /obj/structure/table) || istype(over, /turf))) diff --git a/code/game/rendering/actor_huds/actor_hud.dm b/code/game/rendering/actor_huds/actor_hud.dm index 89fea72b2764..654a52095ed8 100644 --- a/code/game/rendering/actor_huds/actor_hud.dm +++ b/code/game/rendering/actor_huds/actor_hud.dm @@ -39,7 +39,7 @@ /datum/actor_hud/proc/bind_to_mob(mob/target) SHOULD_NOT_OVERRIDE(TRUE) actor = target - RegisterSignal(target, PROC_REF(bound_actor_deleted)) + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(bound_actor_deleted)) on_mob_bound(target) return TRUE @@ -47,10 +47,15 @@ SHOULD_NOT_OVERRIDE(TRUE) if(!actor) return + UnregisterSignal(actor, COMSIG_PARENT_QDELETING) var/mob/old = actor actor = null on_mob_unbound(old) +/datum/actor_hud/proc/bound_actor_deleted(datum/source) + ASSERT(source == actor) + unbind_from_mob() + /datum/actor_hud/proc/on_mob_bound(mob/target) return diff --git a/code/game/rendering/actor_huds/actor_hud_holder.dm b/code/game/rendering/actor_huds/actor_hud_holder.dm index 17689477eaf5..6fccda558907 100644 --- a/code/game/rendering/actor_huds/actor_hud_holder.dm +++ b/code/game/rendering/actor_huds/actor_hud_holder.dm @@ -69,5 +69,3 @@ /datum/actor_hud_holder/proc/reassert_onto_owner() owner.images |= images() owner.screen |= screens() - -#warn impl diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 28b75703f38a..b4e3870f5f1b 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -1,8 +1,6 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2024 Citadel Station Developers *// -/datum/actor_hud/inventory - /** * Inventory slots specifically, not hands. */ @@ -50,7 +48,7 @@ host = inventory rebuild(inventory.build_inventory_slots_with_remappings(), length(inventory.held_items)) -/datum/actor_hud/inventory/proc/unbind_to_inventory(datum/inventory/inventory) +/datum/actor_hud/inventory/proc/unbind_from_inventory(datum/inventory/inventory) cleanup() host = null @@ -124,20 +122,29 @@ var/list/atom/movable/screen/inventory/plate/slot/place_anywhere = list() var/list/cross_axis_for_drawer = list() - var/list/cross_axis_left_of_hands = list() - var/list/crosS_axis_right_of_hands = list() + var/list/cross_axis_for_hands = list() for(var/id in slot_by_id) var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] + var/list/inject_into switch(slot_object.inventory_hud_anchor) if(INVENTORY_HUD_ANCHOR_AUTOMATIC) - plcae_anywhere += slot_object + place_anywhere += slot_object if(INVENTORY_HUD_ANCHOR_TO_DRAWER) var/requested_cross_axis = clamp(slot_object.inventory_hud_cross_axis, 0, 4) + 1 // 1 to 5 - + if(length(cross_axis_for_drawer) < requested_cross_axis) + for(var/i in length(cross_axis_for_drawer) + 1 to requested_cross_axis) + cross_axis_for_drawer[++cross_axis_for_drawer.len] = list() + insert_into = cross_axis_for_drawer[requested_cross_axis] if(INVENTORY_HUD_ANCHOR_TO_HANDS) var/requested_cross_axis = clamp(slot_object.inventory_hud_cross_axis, 0, 2) + 1 // 1 to 5 + if(length(cross_axis_for_hands) < requested_cross_axis) + for(var/i in length(cross_axis_for_hands) + 1 to requested_cross_axis) + cross_axis_for_hands[++cross_axis_for_drawer.len] = list() + insert_into = cross_axis_for_hands[requested_cross_axis] + + BINARY_INSERT(slot_object, inject_into, /atom/movable/screen/inventory/plate, slot_object, inventory_hud_main_axis, COMPARE_KEY) for(var/atom/movable/screen/inventory/plate/slot/slot_object as anything in place_anywhere) #warn impl @@ -290,8 +297,6 @@ /atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, obj/item/with_item) return -#warn impl all - /** * Base type of item-holding screen objects */ @@ -342,13 +347,6 @@ /atom/movable/screen/inventory/plate/slot/handle_inventory_click(mob/user, obj/item/with_item) #warn impl -/** - * comparator that sorts slots that are semantically closer to their anchors to be first, - * allowing a no-collision-or-cascading method of resolving slot alignment. - */ -/proc/cmp_inventory_slot_screen_object_for_anti_cascade(atom/movable/screen/inventory/plate/slot/A, atom/movable/screen/inventory/plate/slot/B) - - /** * Hand screen objects */ From 6a2e3d3cfa242be9e45c811b1a68963815d5818a Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 11 Nov 2024 17:15:51 +0000 Subject: [PATCH 100/140] lazy pack algorithm --- citadel.dme | 1 + code/__DEFINES/inventory/hud.dm | 4 +- code/__DEFINES/qdel.dm | 12 +++++- .../lists/unsorted/pack_2d_flat_list.dm | 38 +++++++++++++++++++ .../rendering/actor_huds/huds/inventory.dm | 36 ++++++++++++------ 5 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 code/__HELPERS/lists/unsorted/pack_2d_flat_list.dm diff --git a/citadel.dme b/citadel.dme index 0ba897292af0..bceb147cf5fc 100644 --- a/citadel.dme +++ b/citadel.dme @@ -445,6 +445,7 @@ #include "code\__HELPERS\lists\traverse.dm" #include "code\__HELPERS\lists\types_typecaches.dm" #include "code\__HELPERS\lists\unique.dm" +#include "code\__HELPERS\lists\unsorted\pack_2d_flat_list.dm" #include "code\__HELPERS\math\angle.dm" #include "code\__HELPERS\math\distance.dm" #include "code\__HELPERS\math\fractions.dm" diff --git a/code/__DEFINES/inventory/hud.dm b/code/__DEFINES/inventory/hud.dm index c2848820a5c7..24f9a0a11bf3 100644 --- a/code/__DEFINES/inventory/hud.dm +++ b/code/__DEFINES/inventory/hud.dm @@ -1,5 +1,5 @@ //* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// +//* Copyright (c) 2024 Citadel Station Developers *// //* inventory_hud_anchor *// @@ -14,7 +14,7 @@ #define INVENTORY_HUD_ANCHOR_TO_DRAWER "drawer" /// anchor to next to hands panel /// -/// * main axis runs left/right of hands +/// * main axis runs left/right of hands if negative/positive /// * cross axis runs away from edge of screen of hands /// /// * valid main-axis indices: != 0 diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index d36121bd886e..e31d3a0b9884 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -34,15 +34,25 @@ #define QDELETED(X) (!X || QDELING(X)) #define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) -//Qdel helper macros. +//* Qdel helper macros. *// + +/// qdel something in a specific amount of time. returns a timer ID. #define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), item), time, TIMER_STOPPABLE) +/// qdel something in a specific amount of real (wall) time. returns a timer ID. #define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME) +/// qdel's something and nulls it out #define QDEL_NULL(item) qdel(item); item = null +/// qdel's all the elements in a list and then nulls the list out. #define QDEL_NULL_LIST QDEL_LIST_NULL +/// qdel's all the elements in a list and then nulls the list out. #define QDEL_LIST_NULL(x) if(x) { for(var/y in x) { qdel(y) } ; x = null } +/// qdels the elements in a list and proceed to cut the list. in an asosciative list, this will qdelete the keys. #define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); } +/// QDEL_LIST in a specific amount of time #define QDEL_LIST_IN(L, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(______qdel_list_wrapper), L), time, TIMER_STOPPABLE) +/// qdel's both the keys and the values of an associative list, and then cut the list. #define QDEL_LIST_ASSOC(L) if(L) { for(var/I in L) { qdel(L[I]); qdel(I); } L.Cut(); } +/// qdel()'s the value associations of an associative list, and then cut the list. #define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qdel(L[I]); L.Cut(); } /proc/______qdel_list_wrapper(list/L) //the underscores are to encourage people not to use this directly. diff --git a/code/__HELPERS/lists/unsorted/pack_2d_flat_list.dm b/code/__HELPERS/lists/unsorted/pack_2d_flat_list.dm new file mode 100644 index 000000000000..9303569c0319 --- /dev/null +++ b/code/__HELPERS/lists/unsorted/pack_2d_flat_list.dm @@ -0,0 +1,38 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 Citadel Station Developers *// + +/** + * puts something into the smallest inner list of a list of lists. + * + * three `list`'s in one sentence, yippee! + * + * * `inserting` can be a single element or a list of elements + * + * @return + * * outer_list - outer list reference + * * inserting - an element or a list of elements to insert + * * put_at_end - pack into end, rather than start of list + * * length_limit - max length to pack lists to + * * out_packed - if exists, packed elements get put here + * * out_leftovers - if exists, elements that couldn't go in due to length limit go in here + */ +/proc/pack_2d_flat_list(list/outer_list, list/inserting, put_at_end = TRUE, length_limit, list/out_packed, list/out_leftovers) + // todo: optimize algorithm + inserting = islist(inserting) ? inserting.Copy() : list(inserting) + for(var/i in 1 to length(inserting)) + var/elem = inserting[i] + var/list/smallest + var/smallest_length = INFINITY + for(var/i in 1 to length(outer_list)) + var/their_length = length(outer_list[i]) + if(their_length < smallest_length && their_length < length_limit) + smallest = outer_list[i] + if(!smallest) + out_leftovers?.Add(inserting.Copy(i)) + out_packed?.Add(inserting.Copy(1, i)) + return + if(put_at_end) + smallest.Add(elem) + else + smallest.Insert(1, elem) + out_packed?.Add(inserting) diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index b4e3870f5f1b..0fcf7709fd32 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -41,7 +41,7 @@ /datum/actor_hud/inventory/on_mob_unbound(mob/target) if(target.inventory) - unbind_to_inventory(target.inventory) + unbind_from_inventory(target.inventory) return ..() /datum/actor_hud/inventory/proc/bind_to_inventory(datum/inventory/inventory) @@ -102,13 +102,14 @@ * Rebuilds our slots. Doesn't rebuild anything else. Doesn't wipe old objects. */ /datum/actor_hud/inventory/proc/rebuild_slots(list/inventory_slots_with_mappings) + QDEL_LIST_ASSOC_VAL(slot_by_id) LAZYINITLIST(slot_by_id) for(var/slot_id in inventory_slots_with_mappings) var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) if(!slot) stack_trace("failed to fetch slot during hud rebuild: [slot_id]") continue - slot_by_id += new /atom/movable/screen/inventory/plate/slot(null, slot, inventory_slots_with_mappings[slot_id] || list()) + slot_by_id[slot_id] = new /atom/movable/screen/inventory/plate/slot(null, src, slot, inventory_slots_with_mappings[slot_id] || list()) // here is where we basically pull a CSS flexbox. @@ -122,7 +123,8 @@ var/list/atom/movable/screen/inventory/plate/slot/place_anywhere = list() var/list/cross_axis_for_drawer = list() - var/list/cross_axis_for_hands = list() + var/list/cross_axis_for_hands_left = list() + var/list/cross_axis_for_hands_right = list() for(var/id in slot_by_id) var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] @@ -136,17 +138,27 @@ if(length(cross_axis_for_drawer) < requested_cross_axis) for(var/i in length(cross_axis_for_drawer) + 1 to requested_cross_axis) cross_axis_for_drawer[++cross_axis_for_drawer.len] = list() - insert_into = cross_axis_for_drawer[requested_cross_axis] + inject_into = cross_axis_for_drawer[requested_cross_axis] if(INVENTORY_HUD_ANCHOR_TO_HANDS) + var/list/relevant_cross_axis = slot_object.inventory_hud_main_axis > 0 ? cross_axis_for_hands_right : cross_axis_for_hands_left var/requested_cross_axis = clamp(slot_object.inventory_hud_cross_axis, 0, 2) + 1 // 1 to 5 - if(length(cross_axis_for_hands) < requested_cross_axis) - for(var/i in length(cross_axis_for_hands) + 1 to requested_cross_axis) - cross_axis_for_hands[++cross_axis_for_drawer.len] = list() - insert_into = cross_axis_for_hands[requested_cross_axis] - - BINARY_INSERT(slot_object, inject_into, /atom/movable/screen/inventory/plate, slot_object, inventory_hud_main_axis, COMPARE_KEY) - - for(var/atom/movable/screen/inventory/plate/slot/slot_object as anything in place_anywhere) + if(length(relevant_cross_axis) < requested_cross_axis) + for(var/i in length(relevant_cross_axis) + 1 to requested_cross_axis) + relevant_cross_axis[++cross_axis_for_drawer.len] = list() + inject_into = relevant_cross_axis[requested_cross_axis] + + BINARY_INSERT(slot_object, inject_into, /atom/movable/screen/inventory/plate/slot, slot_object, inventory_hud_main_axis, COMPARE_KEY) + + if(length(place_anywhere)) + var/list/cram_into_bottom_of_drawer = list() + for(var/atom/movable/screen/inventory/plate/slot/slot_object as anything in place_anywhere) + // intelligent detection; cluster based on class + switch(slot_object.inventory_hud_class) + if(INVENTORY_HUD_CLASS_ALWAYS) + cram_into_bottom_of_drawer += slot_object + if(INVENTORY_HUD_CLASS_DRAWER) + cram_into_bottom_of_drawer += slot_object + pack_2d_flat_list(cross_axis_for_drawer, cram_into_bottom_of_drawer, FALSE) #warn impl /** From c2b989dba99be9511e8fbfa1fed2b8dc963e8d79 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 11 Nov 2024 17:16:25 +0000 Subject: [PATCH 101/140] that --- code/game/rendering/actor_huds/actor_hud.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/rendering/actor_huds/actor_hud.dm b/code/game/rendering/actor_huds/actor_hud.dm index 654a52095ed8..cafc28e9e82c 100644 --- a/code/game/rendering/actor_huds/actor_hud.dm +++ b/code/game/rendering/actor_huds/actor_hud.dm @@ -112,5 +112,3 @@ */ /datum/actor_hud/proc/remove_image(image/what) owner.images -= what - -#warn impl From 161e95ce3c9cd90ae6336242d2fb17ad0fce53df Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 13 Nov 2024 11:06:14 -0500 Subject: [PATCH 102/140] updates --- citadel.dme | 38 ++++----- code/__DEFINES/inventory/hud.dm | 2 + code/__DEFINES/rendering/ui_style.dm | 1 - code/__DEFINES/screen.dm | 32 +++----- .../lists/unsorted/pack_2d_flat_list.dm | 6 +- code/game/rendering/actor_huds/actor_hud.dm | 2 - .../rendering/actor_huds/huds/inventory.dm | 72 +++++++++++------- code/game/rendering/legacy/human.dm | 1 - code/modules/mob/inventory/inventory-hooks.dm | 9 +++ .../mob/living/carbon/alien/alien_attacks.dm | 5 -- .../mob/living/carbon/human/rendering.dm | 1 + .../mob/living/simple_mob/simple_hud.dm | 2 - code/modules/mob/mob-inventory.dm | 2 +- code/modules/species/station/adherent.dm | 1 - code/modules/species/station/diona.dm | 1 - code/modules/species/station/monkey.dm | 1 - icons/mob/screen/holo.dmi | Bin 108425 -> 110386 bytes icons/mob/screen/midnight.dmi | Bin 36934 -> 27199 bytes icons/mob/screen/minimalist.dmi | Bin 29402 -> 24179 bytes icons/mob/screen/old.dmi | Bin 34023 -> 27212 bytes icons/mob/screen1_Orange.dmi | Bin 140676 -> 125372 bytes icons/mob/screen1_White.dmi | Bin 128274 -> 119422 bytes icons/mob/screen1_old.dmi | Bin 114287 -> 115877 bytes icons/screen/hud/hologram/32x32.dmi | Bin 0 -> 317 bytes icons/screen/hud/hologram/inventory-slot.dmi | Bin 0 -> 3122 bytes icons/screen/hud/hologram/inventory.dmi | Bin 1094 -> 1665 bytes icons/screen/hud/midnight/32x32.dmi | Bin 0 -> 182 bytes icons/screen/hud/midnight/inventory-slot.dmi | Bin 13726 -> 16153 bytes icons/screen/hud/minimalist/32x32.dmi | Bin 0 -> 291 bytes .../screen/hud/minimalist/inventory-slot.dmi | Bin 0 -> 3460 bytes icons/screen/hud/minimalist/inventory.dmi | Bin 1105 -> 1911 bytes icons/screen/hud/old/32x32.dmi | Bin 0 -> 329 bytes icons/screen/hud/old/inventory-slot.dmi | Bin 0 -> 6905 bytes icons/screen/hud/old/inventory.dmi | Bin 1389 -> 2012 bytes icons/screen/hud/orange/32x32.dmi | Bin 0 -> 466 bytes icons/screen/hud/orange/inventory-slot.dmi | Bin 0 -> 14195 bytes icons/screen/hud/white/32x32.dmi | Bin 0 -> 289 bytes icons/screen/hud/white/inventory-slot.dmi | Bin 0 -> 11169 bytes 38 files changed, 92 insertions(+), 84 deletions(-) create mode 100644 icons/screen/hud/hologram/32x32.dmi create mode 100644 icons/screen/hud/hologram/inventory-slot.dmi create mode 100644 icons/screen/hud/midnight/32x32.dmi create mode 100644 icons/screen/hud/minimalist/32x32.dmi create mode 100644 icons/screen/hud/minimalist/inventory-slot.dmi create mode 100644 icons/screen/hud/old/32x32.dmi create mode 100644 icons/screen/hud/old/inventory-slot.dmi create mode 100644 icons/screen/hud/orange/32x32.dmi create mode 100644 icons/screen/hud/orange/inventory-slot.dmi create mode 100644 icons/screen/hud/white/32x32.dmi create mode 100644 icons/screen/hud/white/inventory-slot.dmi diff --git a/citadel.dme b/citadel.dme index bceb147cf5fc..eab21c1cbad0 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3075,25 +3075,6 @@ #include "code\modules\integrated_electronics\subtypes\time.dm" #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\integrated_electronics\~defines\~defines.dm" -#include "code\modules\mob\inventory_legacy.dm" -#include "code\modules\mob\mob-hands.dm" -#include "code\modules\mob\mob-inventory-abstraction.dm" -#include "code\modules\mob\mob-inventory-helpers.dm" -#include "code\modules\mob\mob-inventory-internal.dm" -#include "code\modules\mob\mob-inventory-stripping.dm" -#include "code\modules\mob\mob-inventory.dm" -#include "code\modules\mob\mob-login.dm" -#include "code\modules\mob\mob-logout.dm" -#include "code\modules\mob\inventory\inventory-hands-check.dm" -#include "code\modules\mob\inventory\inventory-hands-drop.dm" -#include "code\modules\mob\inventory\inventory-hands-get.dm" -#include "code\modules\mob\inventory\inventory-hands-legacy.dm" -#include "code\modules\mob\inventory\inventory-hands-put.dm" -#include "code\modules\mob\inventory\inventory-hands.dm" -#include "code\modules\mob\inventory\inventory-hooks.dm" -#include "code\modules\mob\inventory\inventory-rendering.dm" -#include "code\modules\mob\inventory\inventory_slot.dm" -#include "code\modules\mob\inventory\inventory.dm" #include "code\modules\jobs\access.dm" #include "code\modules\jobs\alt_title.dm" #include "code\modules\jobs\department.dm" @@ -3570,12 +3551,21 @@ #include "code\modules\mob\health.dm" #include "code\modules\mob\hear_say.dm" #include "code\modules\mob\holder.dm" +#include "code\modules\mob\inventory_legacy.dm" #include "code\modules\mob\life.dm" #include "code\modules\mob\mob-client.dm" #include "code\modules\mob\mob-damage.dm" #include "code\modules\mob\mob-defense.dm" +#include "code\modules\mob\mob-hands.dm" #include "code\modules\mob\mob-iff.dm" +#include "code\modules\mob\mob-inventory-abstraction.dm" +#include "code\modules\mob\mob-inventory-helpers.dm" +#include "code\modules\mob\mob-inventory-internal.dm" +#include "code\modules\mob\mob-inventory-stripping.dm" +#include "code\modules\mob\mob-inventory.dm" #include "code\modules\mob\mob-keybind-triggers.dm" +#include "code\modules\mob\mob-login.dm" +#include "code\modules\mob\mob-logout.dm" #include "code\modules\mob\mob.dm" #include "code\modules\mob\mob_defines.dm" #include "code\modules\mob\mob_helpers.dm" @@ -3633,6 +3623,16 @@ #include "code\modules\mob\freelook\mask\cultnet.dm" #include "code\modules\mob\freelook\mask\eye.dm" #include "code\modules\mob\freelook\mask\update_triggers.dm" +#include "code\modules\mob\inventory\inventory-hands-check.dm" +#include "code\modules\mob\inventory\inventory-hands-drop.dm" +#include "code\modules\mob\inventory\inventory-hands-get.dm" +#include "code\modules\mob\inventory\inventory-hands-legacy.dm" +#include "code\modules\mob\inventory\inventory-hands-put.dm" +#include "code\modules\mob\inventory\inventory-hands.dm" +#include "code\modules\mob\inventory\inventory-hooks.dm" +#include "code\modules\mob\inventory\inventory-rendering.dm" +#include "code\modules\mob\inventory\inventory.dm" +#include "code\modules\mob\inventory\inventory_slot.dm" #include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\butchering.dm" #include "code\modules\mob\living\death.dm" diff --git a/code/__DEFINES/inventory/hud.dm b/code/__DEFINES/inventory/hud.dm index 24f9a0a11bf3..9773ab7bc94b 100644 --- a/code/__DEFINES/inventory/hud.dm +++ b/code/__DEFINES/inventory/hud.dm @@ -1,6 +1,8 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2024 Citadel Station Developers *// +//? HUD screen_loc's are in code/__DEFINES/screen.dm ?// + //* inventory_hud_anchor *// /// anchor to the main inventory drawer diff --git a/code/__DEFINES/rendering/ui_style.dm b/code/__DEFINES/rendering/ui_style.dm index 80db51ba2c63..a4988efa32f4 100644 --- a/code/__DEFINES/rendering/ui_style.dm +++ b/code/__DEFINES/rendering/ui_style.dm @@ -5,7 +5,6 @@ #define UI_STYLE_ORANGE "Orange" #define UI_STYLE_OLD "old" #define UI_STYLE_WHITE "White" -#define UI_STYLE_OLD_NOBORDER "old-noborder" #define UI_STYLE_MINIMALIST "minimalist" #define UI_STYLE_HOLOGRAM "Hologram" diff --git a/code/__DEFINES/screen.dm b/code/__DEFINES/screen.dm index 8d5c6005302f..914d0c08ffa5 100644 --- a/code/__DEFINES/screen.dm +++ b/code/__DEFINES/screen.dm @@ -1,3 +1,5 @@ +//* All static screen_loc of UI objects are in here! *// + /* These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var. @@ -29,31 +31,25 @@ //* Mob HUD - Inventory *// -/// the bottom-left hand of hands HUD -#define SCREEN_LOC_MOB_HUD_INVENTORY_HANDS_BOTTOM_LEFT "CENTER-1:16,BOTTOM+1:5" +/// screen loc for a hand index #define SCREEN_LOC_MOB_HUD_INVENTORY_HAND(HAND) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" -#warn fill these in -#define SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(TOTAL_HANDS) "" -#define SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(TOTAL_HANDS) "" - +/// screen loc for hand swap button for a given number of hands +#define SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(TOTAL_HANDS) "CENTER-1:24,BOTTOM+[ceil(TOTAL_HANDS - 2 / 2)]:5" +/// screen loc for hand swap button for a given number of hands +#define SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(TOTAL_HANDS) "CENTER-1:16,BOTTOM+[ceil(TOTAL_HANDS - 2 / 2)]:5" /// the bottom-left drawer position of inventory HUD #define SCREEN_LOC_MOB_HUD_INVENTORY_DRAWER "LEFT:6,BOTTOM:5" +/// slot alignment for drawer-anchor +#define SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_DRAWER_ALIGNED(MAIN_AXIS, CROSS_AXIS) "LEFT+[MAIN_AXIS]:[6 + (MAIN_AXIS * 2)],BOTTOM+[CROSS_AXIS]:[5 + (CROSS_AXIS * 2)]" +/// slot alignment for hand-anchor +#define SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_HANDS_ALIGNED(MAIN_AXIS, CROSS_AXIS) "CENTER-1:[16 + (MAIN_AXIS > 0 ? (34 * (MAIN_AXIS + 1)) : (-34 * MAIN_AXIS))],BOTTOM+[CROSS_AXIS]:[5 + (CROSS_AXIS * 2)]" -#warn fill these in -#define SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_DRAWER_ALIGNED(MAIN_AXIS, CROSS_AXIS) "" -#define SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_HANDS_ALIGNED(MAIN_AXIS, CROSS_AXIS) "" - -#warn deal with this crap +//! < legacy stuff below > !// /// Hands -#define ui_equip "CENTER-1:16,BOTTOM+1:5" #define ui_smallquad "RIGHT-4:18,BOTTOM:4" -///aliens -#define ui_alien_head "CENTER-3:12,BOTTOM:5" -///aliens -#define ui_alien_oclothing "CENTER-2:14,BOTTOM:5" ///borgs #define ui_inv1 "CENTER-1,BOTTOM:5" ///borgs @@ -64,10 +60,6 @@ #define ui_borg_store "CENTER+2,BOTTOM:5" ///borgs #define ui_borg_inventory "CENTER-2,BOTTOM:5" -///monkey -#define ui_monkey_mask "LEFT+4:14,BOTTOM:5" -///monkey -#define ui_monkey_back "LEFT+5:14,BOTTOM:5" ///same height as humans, hugging the right border #define ui_construct_health "RIGHT:00,CENTER:15" #define ui_construct_purge "RIGHT:00,CENTER-1:15" diff --git a/code/__HELPERS/lists/unsorted/pack_2d_flat_list.dm b/code/__HELPERS/lists/unsorted/pack_2d_flat_list.dm index 9303569c0319..e8a08ce9a9ec 100644 --- a/code/__HELPERS/lists/unsorted/pack_2d_flat_list.dm +++ b/code/__HELPERS/lists/unsorted/pack_2d_flat_list.dm @@ -23,10 +23,10 @@ var/elem = inserting[i] var/list/smallest var/smallest_length = INFINITY - for(var/i in 1 to length(outer_list)) - var/their_length = length(outer_list[i]) + for(var/j in 1 to length(outer_list)) + var/their_length = length(outer_list[j]) if(their_length < smallest_length && their_length < length_limit) - smallest = outer_list[i] + smallest = outer_list[j] if(!smallest) out_leftovers?.Add(inserting.Copy(i)) out_packed?.Add(inserting.Copy(1, i)) diff --git a/code/game/rendering/actor_huds/actor_hud.dm b/code/game/rendering/actor_huds/actor_hud.dm index 654a52095ed8..cafc28e9e82c 100644 --- a/code/game/rendering/actor_huds/actor_hud.dm +++ b/code/game/rendering/actor_huds/actor_hud.dm @@ -112,5 +112,3 @@ */ /datum/actor_hud/proc/remove_image(image/what) owner.images -= what - -#warn impl diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 0fcf7709fd32..f3296166eba9 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -16,7 +16,7 @@ ) /// keyed slot id to screen object - var/list/atom/movable/screen/inventory/plate/slot/slot_by_id + var/list/atom/movable/screen/inventory/plate/slot/slots /// ordered hand objects var/list/atom/movable/screen/inventory/plate/hand/hands @@ -102,32 +102,25 @@ * Rebuilds our slots. Doesn't rebuild anything else. Doesn't wipe old objects. */ /datum/actor_hud/inventory/proc/rebuild_slots(list/inventory_slots_with_mappings) - QDEL_LIST_ASSOC_VAL(slot_by_id) - LAZYINITLIST(slot_by_id) + QDEL_LIST_ASSOC_VAL(slots) + LAZYINITLIST(slots) for(var/slot_id in inventory_slots_with_mappings) var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) if(!slot) stack_trace("failed to fetch slot during hud rebuild: [slot_id]") continue - slot_by_id[slot_id] = new /atom/movable/screen/inventory/plate/slot(null, src, slot, inventory_slots_with_mappings[slot_id] || list()) + slots[slot_id] = new /atom/movable/screen/inventory/plate/slot(null, src, slot, inventory_slots_with_mappings[slot_id] || list()) // here is where we basically pull a CSS flexbox. - var/max_drawer_main = 0 - var/max_drawer_cross = 0 - - var/min_hands_main = 0 - var/max_hands_main = 0 - var/max_hands_cross = 0 - var/list/atom/movable/screen/inventory/plate/slot/place_anywhere = list() var/list/cross_axis_for_drawer = list() var/list/cross_axis_for_hands_left = list() var/list/cross_axis_for_hands_right = list() - for(var/id in slot_by_id) - var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] + for(var/id in slots) + var/atom/movable/screen/inventory/plate/slot/slot_object = slots[id] var/list/inject_into switch(slot_object.inventory_hud_anchor) @@ -159,7 +152,34 @@ if(INVENTORY_HUD_CLASS_DRAWER) cram_into_bottom_of_drawer += slot_object pack_2d_flat_list(cross_axis_for_drawer, cram_into_bottom_of_drawer, FALSE) - #warn impl + + var/list/atom/movable/screen/inventory/plate/slot/aligned = list() + + for(var/cross_axis in 1 to length(cross_axis_for_drawer)) + var/list/cross_axis_list = cross_axis_for_drawer[cross_axis] + for(var/main_axis in 1 to length(cross_axis_list)) + var/atom/movable/screen/inventory/plate/slot/aligning = cross_axis_list[main_axis] + aligning.inventory_hud_cross_axis = cross_axis - 1 + aligning.inventory_hud_main_axis = main_axis - 1 + for(var/cross_axis in 1 to length(cross_axis_for_hands_left)) + var/list/cross_axis_list = cross_axis_for_hands_left[cross_axis] + for(var/main_axis in 1 to length(cross_axis_list)) + var/atom/movable/screen/inventory/plate/slot/aligning = cross_axis_list[main_axis] + aligning.inventory_hud_cross_axis = cross_axis - 1 + aligning.inventory_hud_main_axis = -main_axis + for(var/cross_axis in 1 to length(cross_axis_for_hands_right)) + var/list/cross_axis_list = cross_axis_for_hands_right[cross_axis] + for(var/main_axis in 1 to length(cross_axis_list)) + var/atom/movable/screen/inventory/plate/slot/aligning = cross_axis_list[main_axis] + aligning.inventory_hud_cross_axis = cross_axis - 1 + aligning.inventory_hud_main_axis = main_axis + + for(var/atom/movable/screen/inventory/plate/slot/slot_object as anything in aligned) + switch(slot_object.inventory_hud_anchor) + if(INVENTORY_HUD_ANCHOR_TO_DRAWER) + slot_object.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_DRAWER_ALIGNED(slot_object.inventory_hud_main_axis, slot_object.inventory_hud_cross_axis) + if(INVENTORY_HUD_ANCHOR_TO_HANDS) + slot_object.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_HANDS_ALIGNED(slot_object.inventory_hud_main_axis, slot_object.inventory_hud_cross_axis) /** * Rebuilds our hands. Doesn't rebuild anything else. Doesn't wipe old objects. @@ -189,18 +209,18 @@ . = list() if(filter_by_class) if(islist(filter_by_class)) - for(var/id in slot_by_id) - var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] + for(var/id in slots) + var/atom/movable/screen/inventory/plate/slot/slot_object = slots[id] if(slot_object.inventory_hud_class in filter_by_class) . += slot_object else - for(var/id in slot_by_id) - var/atom/movable/screen/inventory/plate/slot/slot_object = slot_by_id[id] + for(var/id in slots) + var/atom/movable/screen/inventory/plate/slot/slot_object = slots[id] if(slot_object.inventory_hud_class == filter_by_class) . += slot_object else - for(var/id in slot_by_id) - . += slot_by_id[id] + for(var/id in slots) + . += slots[id] /datum/actor_hud/inventory/proc/all_hand_screen_objects() RETURN_TYPE(/list) @@ -244,16 +264,16 @@ //* Hooks *// /datum/actor_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) - var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slot_by_id[slot_or_index.id] + var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slots[slot_or_index.id] screen_obj.bind_item(item) /datum/actor_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot_or_index) - var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slot_by_id[slot_or_index.id] + var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slots[slot_or_index.id] screen_obj.unbind_item(item) /datum/actor_hud/inventory/proc/move_item(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) - var/atom/movable/screen/inventory/plate/old_screen_obj = isnum(from_slot_or_index) ? hands[from_slot_or_index] : slot_by_id[from_slot_or_index.id] - var/atom/movable/screen/inventory/plate/new_screen_obj = isnum(to_slot_or_index) ? hands[to_slot_or_index] : slot_by_id[to_slot_or_index.id] + var/atom/movable/screen/inventory/plate/old_screen_obj = isnum(from_slot_or_index) ? hands[from_slot_or_index] : slots[from_slot_or_index.id] + var/atom/movable/screen/inventory/plate/new_screen_obj = isnum(to_slot_or_index) ? hands[to_slot_or_index] : slots[to_slot_or_index.id] old_screen_obj.unbind_item(item) new_screen_obj.bind_item(item) @@ -295,7 +315,7 @@ /atom/movable/screen/inventory/sync_to_preferences(datum/hud_preferences/preference_set) sync_style(preference_set.hud_style, preference_set.hud_color, preference_set.hud_alpha) -/atom/movable/screen/inventory/sync_style(datum/hud_style/style, style_alpha, style_color) +/atom/movable/screen/inventory/proc/sync_style(datum/hud_style/style, style_alpha, style_color) alpha = style_alpha color = style_color @@ -384,11 +404,9 @@ /atom/movable/screen/inventory/plate/hand/proc/sync_index(index = hand_index) screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND(index) - var/index_of_side = round(index / 2) name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" icon_state = "hand-[index % 2? "left" : "right"]" -#warn hook /atom/movable/screen/inventory/plate/hand/proc/set_handcuffed(state) if(state == handcuffed) return diff --git a/code/game/rendering/legacy/human.dm b/code/game/rendering/legacy/human.dm index 16eff23d3d70..a36e4035acd4 100644 --- a/code/game/rendering/legacy/human.dm +++ b/code/game/rendering/legacy/human.dm @@ -17,7 +17,6 @@ var/list/hud_elements = list() var/atom/movable/screen/using - var/atom/movable/screen/inventory/plate/slot/inv_box // Draw the attack intent dialogue. using = new /atom/movable/screen() diff --git a/code/modules/mob/inventory/inventory-hooks.dm b/code/modules/mob/inventory/inventory-hooks.dm index 70d9464a88b4..c87b90257e91 100644 --- a/code/modules/mob/inventory/inventory-hooks.dm +++ b/code/modules/mob/inventory/inventory-hooks.dm @@ -54,3 +54,12 @@ /datum/inventory/proc/on_mobility_update() for(var/datum/action/action in actions.actions) action.update_button_availability() + +/** + * Trigger handcuffed overlay updates for HUDs. + */ +/datum/inventory/proc/on_handcuffed_update() + var/restrained = !!owner.item_by_slot_id(/datum/inventory_slot/restraints/handcuffs::id) + for(var/datum/actor_hud/inventory/hud in huds_using) + for(var/atom/movable/screen/inventory/plate/hand/hand_plate in hud.hands) + hand_plate.set_handcuffed(restrained) diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index 744421493b1f..567dbcba5cad 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -1,8 +1,3 @@ -//There has to be a better way to define this shit. ~ Z -//can't equip anything -/mob/living/carbon/alien/attack_ui(slot_id) - return - /mob/living/carbon/alien/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args) . = ..() if(.) diff --git a/code/modules/mob/living/carbon/human/rendering.dm b/code/modules/mob/living/carbon/human/rendering.dm index 6a91b1a1e883..0fb48af7a4bd 100644 --- a/code/modules/mob/living/carbon/human/rendering.dm +++ b/code/modules/mob/living/carbon/human/rendering.dm @@ -838,6 +838,7 @@ inventory.update_slot_render(SLOT_ID_BACK) /mob/living/carbon/human/update_inv_handcuffed() + inventory.on_handcuffed_update() inventory.update_slot_render(SLOT_ID_HANDCUFFED) /mob/living/carbon/human/update_inv_legcuffed() diff --git a/code/modules/mob/living/simple_mob/simple_hud.dm b/code/modules/mob/living/simple_mob/simple_hud.dm index c57feeb371fa..d9b44d4317e6 100644 --- a/code/modules/mob/living/simple_mob/simple_hud.dm +++ b/code/modules/mob/living/simple_mob/simple_hud.dm @@ -12,8 +12,6 @@ var/list/adding = list() var/list/other = list() var/list/hotkeybuttons = list() - var/list/slot_info = list() - var/list/hand_info = list() hud.adding = adding hud.other = other diff --git a/code/modules/mob/mob-inventory.dm b/code/modules/mob/mob-inventory.dm index 00cb2a3221df..d6590064e962 100644 --- a/code/modules/mob/mob-inventory.dm +++ b/code/modules/mob/mob-inventory.dm @@ -377,7 +377,7 @@ // so this is just a wrapper to route stuff around while we slowly refactor inventory. /datum/inventory/proc/drop_item_to_ground(obj/item/I, inv_op_flags, datum/event_args/actor/actor) if(!actor) - actor = E_ARGS_WRAP_USER_TO_ACTOR(actor || src) + actor = E_ARGS_WRAP_USER_TO_ACTOR(owner) return owner.drop_item_to_ground(I, inv_op_flags, actor?.performer) /** diff --git a/code/modules/species/station/adherent.dm b/code/modules/species/station/adherent.dm index 35e88b13be70..f55fd5a8f4ae 100644 --- a/code/modules/species/station/adherent.dm +++ b/code/modules/species/station/adherent.dm @@ -75,7 +75,6 @@ vision_innate = /datum/vision/baseline/species_tier_2 - hud_type = /datum/hud_data/adherent /* available_cultural_info = list( TAG_CULTURE = list( diff --git a/code/modules/species/station/diona.dm b/code/modules/species/station/diona.dm index 93fa29e4e795..18c736fc3852 100644 --- a/code/modules/species/station/diona.dm +++ b/code/modules/species/station/diona.dm @@ -32,7 +32,6 @@ dark_slowdown = 3 snow_movement = -2 // Ignore light snow water_movement = -4 // Ignore shallow water - hud_type = /datum/hud_data/diona siemens_coefficient = 0.3 show_ssd = "completely quiescent" health_hud_intensity = 2.5 diff --git a/code/modules/species/station/monkey.dm b/code/modules/species/station/monkey.dm index fb0230fe47c8..6367ef4d319f 100644 --- a/code/modules/species/station/monkey.dm +++ b/code/modules/species/station/monkey.dm @@ -32,7 +32,6 @@ unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) inherent_verbs = list(/mob/living/proc/ventcrawl) - hud_type = /datum/hud_data/monkey meat_type = /obj/item/reagent_containers/food/snacks/meat/monkey //rarity_value = 0.1 diff --git a/icons/mob/screen/holo.dmi b/icons/mob/screen/holo.dmi index 539e07fbf7a920012f144dda511a4b6fb3588123..72a5464604d49626999fd92f05a4d2b25279d463 100644 GIT binary patch literal 110386 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

+6Q8sf6fgY5@U( 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 literal 36934 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

aI=o%)B6QcVV4%8ivMOyvS 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

8ea^ic6#-H_%;TP34M$tAns|0J} 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 ZPqVnlnX5!@@INboJDPeL#kZ`({twD+@zekS diff --git a/icons/mob/screen/old.dmi b/icons/mob/screen/old.dmi index 2805abc652b53f0673d76064180fedd0757c6fae..c23fb6234f65d4002859331c6bc48ec245573e3b 100644 GIT binary patch literal 27212 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 literal 34023 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

Fxf$u-^t7kPg&n;ws)taY;2d@QE&t7im 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 P5O5gi-qrc6?Hu)glMW=b literal 140676 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 diff --git a/icons/mob/screen1_White.dmi b/icons/mob/screen1_White.dmi index 2286669e27797a6f4cbe0ae096ee4129a59391aa..afce3d16f1f20928e816afcc17f6afd2caedcbaf 100644 GIT binary patch literal 119422 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%0AoTkqjSZqW<6PJp8FbLSY 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 diff --git a/icons/screen/hud/hologram/32x32.dmi b/icons/screen/hud/hologram/32x32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..be511b041894b147c97ec234e384f47d528c8dda GIT binary patch literal 317 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 M07*qoM6N<$f<9>ZK>z>% literal 0 HcmV?d00001 diff --git a/icons/screen/hud/hologram/inventory.dmi b/icons/screen/hud/hologram/inventory.dmi index f44553c12b84c6bd3bc8d39bddb51c6b92b98f57..50673be6fae825a64071539560bcd44b4c5d17b8 100644 GIT binary patch delta 1661 zcmV-@27>v<2!Rcd7k^*~1^@s6;+S_h0001;dQ@0+L}hbha%pgMX>V=-0C=30&b6jwYP+CJJoMn; zdN^9Ma!>*Xm$Nm597(q_saFIC8TmdG!jUwyCa_H4;ABlF{(p^I{-rPM{*Z-#DleEe z5RR0*c+9FpU*KovaTf>iD@r2Ud5}ZZmQXge{Q{T_Y-2%sYxDpB1)oVoK~#90?VUYu z8#xe$-{gEbxQt325TsC>YwlnmodN`K>U91EF5ISd<@VYu{0mYXa0qZs1O$j{2X2xw zZtW(3kuGft?SEJ!ir-5PDUlB#c(tN-I2?ZLk}s_X7Z(@klw%J7Zf|e@lrlJ-POogA zm&nVjXD`HTzW?%Z&Hp`id@f-B*fU*;ycF?&PkH}eM&qvo)0fDLxJ@+x0B{4~M?%B< z0Dh1BZi&2z+SCPrNRf&C1lIt{Zu~ zV>n~4*zfC(L)h?Ned?BI0bW5!T=+F%4T5VB_Tf--ZlTEpupWeCnu`f2d>>oVMEU>f z*^A@%Uw=McjR^o5J{bPqIWjSpLjW`Oev;XqizNQX1VA-R@B*QNN>wOS_-di+@{v0b zN&OEEz@f%)E%1Eh3PN)KLk3}PTy1VDx|%u`*EK0m2hjJ+W69#bZve>n9e_)A-joqn z24nECbve9G9fWND`via+zaEY!N=8)U*GSt9EPsY;njE_v@^rw`r3yk;|9x8kH%_&H zGNO{Y@Cgcn3KcxB{kCAmkj;OeL6|P4)&ia}Kz?wh8c26X6oeT&PEirE`X4d~n~X1% zG`Zn6)UGK^CWCCAT<@RQ}%a#J)nAQEg+SmA(kfW>jDs~;YmeP_SFD{s@GD}oP8buU)^Rd znza9*%hSu!?}7@mF$kB`%9lcNPXcE;of_AKYuYOyg@n(XW5E6#P}5!kDRTPEx%b~S z6;ab(0Vz`X{8Dr7R{&r63E#P(n)V7vF@M(Q|FOP~{0o53YNDKXK~-xqg;>D6bO|7h zGOh(q0@D7Yyr)^x=eoo_0B%kYCbKz#J_wJn90S(q4`OzXpcewzxE{Wz@GLJveLB}3sa#?`IIgkao)B>^>2Byn9AKrx z%%Msy4OKdq@{K;XjT0NBybI!i*mhoGvj$tAXf>Zt;87MKU67AHpER1l_I62g0Dl1Z z#?JZHe$#nlS%hjsUFUP@^LLg|ZGWg~pBBlrRfRJDu946cDc679O28F>Ckd`Y-O@f* zQ}M3>-0u*L(T3_ar|G2OL4y&(R;2z4ymkmrq0HHjWCq|9G=&e0n~ck$&-Yo8s&zHZ z#BVSZJ`fiG8f<~ht|_+mb4)8zQmbj-C9fBA8>;Hyb^Etc==0yOmn821Jb%W@AJ^@t z3ZD~C);Q}6Ird9S7R{Q+bD?bukT5JPUMvv1Il zq?Re|Y!8(+?+*Z0i#dN6u-)wb0HQ>p1C8$w0LoT?ruPQ`Wh+3t`vWSR3lgLFUC?|! z2bPmxO(OpL0i0c`$+1ZPet!U`hB2o&lD{9oso`#`3UdB_z&_R|==h>UXCUYA2h{K+ zT|Hf#TNvNl&@uY>js>3pq|nEA47j?Wl=}FN2A?q?Rv$0%@5{Cx-v9vaAaH$r#}l71 zAgeyUb!;tw^zocK%Zo$$_>Kct3&^gIZyld8AgeyUbxZ*e)5o`tu67HWLr@>zI(;sv zFs1;cTB&mC<6B1;fTxLV%+L$ph(s4;)yKDvE&!tX_}0+{KvW;!I;JOKF@1dNxTYeq z>*HG|_9sj_iKu;lz|K?i{(vT^aeqKl)V4pMIrf0AQZC6)+xWr~#m4iE00000NkvXX Hu0mjfiM${) delta 1086 zcmV-E1i|}(4aNwN7k@wq1^@s6V=-0C=2JR&a84 z_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DI+m2 zMYjkfp~S_Rl37#?6g1@GOe;#vO@**gmFA?Tk)TpHF}WnOEPs_a4PaLgt0Sqjq$EF2 zH?^=dvjCT3Wd&D17jUQm07`LFbbldi@c;k=aY;l$RCt{2oV{|}Fbv0)o|mj0-PLQS z_PTd+=Db8+Agd>@eF48j=47g8-*xJmH6FcYZI}}pgy9z`fP^Xj?v%)utUo}IB4vWU z*zfm4rydLQ=YM!Sek&!oTrU5Fj@Pi|>g&&9n)iQyzw>{A_ICyJZxYX|VM`VN7uM@L zLGf$i`88}Qu4xCr@bt1hGYVh6Y+o`zTf>&3nyvr<97bF+T*FYqmLi&=0Bq3ycDgOa zG4@ZfyNLgvBFDGmwuzkAD&qc!TEKvW&#?t?Ant!}0e@k{{f`CU+}RAuD^Dl@ThBg) z=W#PbJ2S@Kg`RZBW4rO(C-nIowrI=!ylbDr2mkG-?h-8^DG1DkuZds~I0CSCY*8a{ z5D0~zqE(tK{~-ud0svw^#%+Z*iGo>M8lYP%5G?-3hM_*;VHCxDM*FMr|3k+0eVQvv z1F-Gj(tixu;?m9XpBey&xJIyDQbAz%pK=Sr;-|>Du9`ZP*fqf>xGixb;(uxYK->r) z(EC0^Vg}}rqIDQwa|c1p|CC!07JnSxYJo9i)G7EiI0CID9xR{l`9ROCuO_KUukfyZ) zO(8i7Qk|2jg+2_eObWC}B$P>cND&9@6u};d3{nH2DL=m{IDbb$c*RO55lR4R=jS&GH8<211pGdCYIyTd zb3;Y)^Qpg*75mk#b0Q}b%7 diff --git a/icons/screen/hud/midnight/32x32.dmi b/icons/screen/hud/midnight/32x32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf literal 0 HcmV?d00001 diff --git a/icons/screen/hud/midnight/inventory-slot.dmi b/icons/screen/hud/midnight/inventory-slot.dmi index 014f313a34e672798056e6512dc30e9416f5cbfd..ec08f647d6b5d4554c3b87cf125f4abbc585416f 100644 GIT binary patch literal 16153 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 Z+t&0J*LbntAGiW&s=ZLHQ?`xz{{Ut&+4led diff --git a/icons/screen/hud/minimalist/32x32.dmi b/icons/screen/hud/minimalist/32x32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..509052f6a7548095e57ee4c3c8c5a9f95fa9189b GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ%&L%x5|`BCkOrgvg-0Y)*SYD zb9$kwhmP?^k5p00i_>zopr0MP4hG5`Po literal 0 HcmV?d00001 diff --git a/icons/screen/hud/minimalist/inventory-slot.dmi b/icons/screen/hud/minimalist/inventory-slot.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e1008481b6e75b69cab752ad91da0cdc62830290 GIT binary patch literal 3460 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 Q&bJD{nOGZF7V=-0C=2@&OHu; zFboCYIXQ&|bE^KWS*oCl0q&4CCb85)>lnCx2c}MB^OL^!6sdxGUYb?4pYS?_daY;rte#r(aCd zHqrd)O!|N@qklCgCnq^cnzxP|$N4}5#+V?4&}=p{V!S8{WV`(d{NuXrS*LM~@tpkM zR{LX}MhEIl=r^|8Z3KVscDuda>d0ri-9{pQu>8juN6p_5!*$)ey3_(d8WyemUxD_2 zu~3{W~ISJd^@PJPL8&^TQ-EL1# zNWYowb{oNq_dB}$A32WmF`LbvS_faR*J@2Y9*?=o!5GiUjS#Q>M{LQo|7e|pAc#(< zQ?&{L`%h28*Xwm2hGF%8nx^w-8pgCOjB&JBEVw7$XY2HE03hmN7$VQ}s`tY%RMIfu zD9aW?&wq`EN9zN1c*cL>0D$4mX2bm4^E~N6U^PD2f_lVptR)b#{TB+r^?IE*88!_W z2$d;Nw*TDsg8JO}B%96VZc>zmD*w3x0LCwu3%Xn`(kmegsGsa0sPw-x0HpCWO_Aq$ ztrdamWTt`fczjONwAJS2azUQwA-GOf5LElmHGcx2P`V=I=YZ_SuPS;A0?Q`d@NL0* z1eN}G1^^rn!|<*mU^tFrL^g~r(lkYJ99Pbh4S!pONa+Zw{TDirp^dBR?Yz*b34)*s z75;MtfHnMC#&t~4v<=q$plS{x>mbX2?tK6lV{LfGN8Ln)G05D*w7gR9>fP&WTsHU0&XsO;`hUKd% z|3{#XHX%?oDUJo(fT=o+j>jWfuh&*e)RQE6LkJo5e`Nak0BD51pgI_|zrA=qpbwA@ zuc|$YqNwaZAbRtBfJvZH$cC5Q9vI^}lz$I_NRs4j*a_c&#&KQutfDiL<&uG}?E_?M z;rlLeCsU8>x@Xxt;4I7b^fL!A`q%6A2XiAPOAnuAnUr!=L+AXLmlvt!vvj7j*$lNx z6J==Pe-m`t`TYEp=09Ws2!iXn=iwPKO^_*=m5PUZL7X^_!#y{YWm$W~Yq?xT-+$lV zwalU=0KfggKgV&R)oR6k{o!zk%Cg+^`1-Io7a_i5xZl{|B#z@mzV8ct$M=1d=XnGp zp$(xq094BG5>cK7K@iDY;_Bw>>r3i&fRH#BB;xRbAgB<-_K7^t5klRK3!lUFJaDC; zKI!vKa7!u3_x;Wwz;(PqkTwbH(0}LahPCo(Ygl@&a2%&|9+18dP^Hf|1=*<3_`dJg zUgYQW_u7ye09E>Y-O#(>>2!(^x^L9!bXvUt_?&#N3n6W&34Ok9V520Oewsdqa++>! zaE}0!`h4B6HeO`9p?mmrI<2K6V6|Gc?xG)_gdrHPI@)YDD30T5k6>E5E`OV@v?7vr zNS>MlbnEkVayT5clp{O>AlCyR4JY>rqP?H@ApGa&2fe?)YdORhS<63Dj&J~E>+@OX zu}$>p5MLHT0Z^sSC(mP>t}%It54&HUJTH1Ls5j>U(D?Mxor$}tWm)d?Jg==>L>m{O z|CXk0yW!phfW+i2>>voDEPu=P&}a|{kz3M`^T~#X0~wme0O-=kvoP_KX&B=ROp1{h~Ndj%j)%D6Cp+bbnD|;=sdzq zlH?6mVi@DOEHy||Ib`oolH|?E9MHC+F_r&e6hPfnNE1n0z=U;y4u9x1y~$-Ji~{m` z1r_xneFkx^QF%H!{CUu^6V@$HA03ZJqZN34eN}0$_f#p!ls?{eCJ33;$IGwzb zo6^VI&fQazI`#3eA}Gt!>QTUaMogzZ-gX+F5!0oQw;kor2XyJKZ`&NW1eZ1{7?gMn` z<87xg0HU`aRG0Ht8Gf$DFkEwhN`1WTFaw}dA8$Lg6af>#v`tfd_2jye{y}u|5lqAWU?b^_44uBqsF`lbP5oEbT@Bg1l v9j!~83xF=v_7PA`!sKu1tL&kJAores;E8}a7}#(O00000NkvXXu0mjfip{=A delta 1097 zcmV-P1h)J44$%mZ7k@wq1^@s6V=-0C=2JR&a84 z_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DI+m2 zMYjkfp~S_Rl37#?6g1@GOe;#vO@**gmFA?T5vdYvsBU6%Nq=TpD)D9$t0Aehq$EF2 zH?^=dvjCT3Wd&D17jUQm08zSAbb46tga7~od`Uz>RCt{2oI8%H+V5)`%~ToK2Ue@qH*T-j>)*QW z@B{Jq#6iV>Z>`_;pYY>;roH%5DS&C%*ZEkmjKcE>uIS8kkctkV)+F1}dVGc}60Xjq2-pFW-ip&>9j9*>{LVgGnMesP}( z7${{6wx!QJ${+NhP5j;kK*P)Bl6)VW;VuG|e6)prY&IK}LU70LRRAzvXE-!wA*6~R z5x;W*x__K}6Yx=@2vYGo6#$K&&*#U!-4%2N^pCp;lJPedz%+jE*NP@b@b5TVAbc0} zsnj@tHqoDZ;vao5R}rM+cRB-XAHgD^UDGC!_{TOElJPedz-)cCaoh*A z#|N~FXN8&gpIHb?Ly(T&YavD%*Pefy{3Pe4?|;XHNFWivQx}A-0Qc*RV`14Kqz~ll1 zCf^gT!RL~68*%{%DD{FAxd0ZnZbzEu7+_2FVup$}RQx?uM~4uoh7`x5Z6uTrz5RY) zEPob@Bqi$G?e-V^4jF$h^z#9jgjDIo^8qQ-ndbviC9i}7Q&|UaYvEIsxVu6w#JKeE zWm&R(Pt4S=ggG?vnP&1B5SUzmz^Gh|i|xTbPCgdr0uuWC)bJMPnt~@E1vK2?fa~nq zmwUU8mpHde`utdM7Uy{8(WvfRsKzX1uhaA@upNY>zKbv*#+&$F z1(4F`WAfh#17f|2-x+NvCg1)SF|l7w?MwkoVo$nBZ2`3O@f0cj%QUh8n)-N(6hab@ zR0`0A8zw2;!VEG7yqnR)o^YFI0ko%i_MAS}X=W2a<>??z_tECZxDx&cp@hCd2I`9_ P00000NkvXXu0mjfJXZ?| diff --git a/icons/screen/hud/old/32x32.dmi b/icons/screen/hud/old/32x32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..22d9801354a89353c1e01743ed3723c0cce617ba GIT binary patch literal 329 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 literal 0 HcmV?d00001 diff --git a/icons/screen/hud/old/inventory.dmi b/icons/screen/hud/old/inventory.dmi index a4524b2c80d7175abdbcb72a8ef36d28ca7e4c37..74d04a8afa660aeb6949add2e45cb89c1662a6d3 100644 GIT binary patch delta 2011 zcmV<12PF9I3fvEn7k^*~1^@s6;+S_h0001V=-0C=30&OHu; zFboCYIXQ&|bE^KWS*oBa1Kc5P9Ab%vHZgGh4osb(o1gT(C)aRm?zRKdS~+7bG$zn+ zJshQ2$a4e@m$MWRsgJyd!j2I%RM91`1`J$D;VBo;aFQZq_kY6m{*{^fxRVYTSh*+D zjDKwJZ9FFCF)92^^xniiy9M)3w(&s?O=rNgR(=7IKWt-z+`e@H00#L`{2WjMyG$V~{&5Z2P2Zlx->({&| zjYiXFBe+-n3uI$$mjD0&J*iXwmP<)?LF>g1005xPDoog0wxu5g71_t(7>)%|!Gz~8 zS!WW>rpk!tlNUxbr{!BDVU`o?Xi?g5vsEe1GfBXQAcM>NKFus%wJx3c#Je z_C-wfuh;DwM|<@571wvgpDc)}f7Jr(&1XQX)9xlC&?xE7|M6@8Oyk-2wJ-K(@GD7p z>L)BdDxZYzJ7_>!Slg|`+HO5@6H>-RbQ48j;n#LmOiiVcT>*-bV}OY9e1t&d6Ysr% zK>QFi$bS$*erCjnAgeYX`hI%v0leg&1WVq{El}+QYd~?%bT@ZRfPb1( zB@xGkYL&n?tGqwdKKTvEO_lBx0rJFMquDmV>^P>#GQtslVF7P2J#Xg?fIG$HO+d8@ z(E5)}8Po_q11RDHfPLo8+5c`dBp8vKD)ogA(tkDWWBm6&1N_De15JDYZ~q51f_oNZ zcZ$uzf^$~VhN&co5FgV`PInKy{ih96VI)2c6=H%TezR>rv&}x_yb(N0WfRwgL=P7W zl&A@W_-4n1;+z?31a7BdazOT<*91NTdKY!GV}^FR*|ujRxLuMaU{U=>kndweh;Nnm zVSkYR^O(SY1vn;-$;c#Ocu&}cZK3kI8jNvi(?t7LXeXf*ltD6R)u-&+dk;9;vvV^dMPOxuQcxeQPTSca zfhLfdAOO+;Yr6#KNj+4cq@YCu71y_3>;T%V1_TmPo*GSL9GFxT*H;nJMT?7z)_=!u zD_Tq=X)J#CXX)d&6=n4i+^bq-UR^ftpWR2&ixMpVwrr`a?-_z*UxF$Or}98i-FH3% zROI7R#XCuL2*X_iRORDS0~Y@$!F3LuT8;_cAxJ?!K2?YoAJ;hS{~272n=E*8j8W0L zSWFhgK5331%(Wn^HV;;9o*635NPh~8}eWlX@FJU2UM##`Fuu19Qt2Y8&_z;v)a&%U=eG? zrinlDXFCJxa3WwoTn5m-9YPadc0OMy{wbxP{cul1vDo&5m>GDFwtt<6<)1&q`qjqw z&+dO8yGV+O{Uj_Rq8%@g^bwK6aaLAzyq5 zXRYW5E9A6y>3s@)8cvS^So}wnuXeuPr~lHTNU&&*5s_;^B=`wf#&UF`VDTRl-!FcC zQHMtr+XNN(jEMCa4u66MT(yM8Qn-1ZvadbG5H$|oWSoM0Jd?*$CFv#{f}CI$fop)O zd^{7`;y(a8v33~MFriuwO2fIK;QN3~BNT*mCje5EQhvQ}--!L9i@pKN3guEj@FOVA z$HVWjo?FHadk9jPkJlaVG*m%8UU&KiD9Xp{j(7c7Rz5z%Wq*to@JEx(0L5emD29JE zRM2Xm?(i8PFdwfw(FO?4$LkLF5F{!euRDAO2+YUp4(HF;i_6FBPWUvGm5*n=cs`%u zA^HjsoR8NXt_LxZ`FP!78z3nkuRHW1NMb%-cetMeMCIdkhdBhv%E#*t`yL=EAFn&v za%Zit_Qg;~j!BVWeXlkfoHB@ju^*@-02|rQiSn002ovPDHLkV1mihyEFg* delta 1383 zcmV-t1(^EW5A6z&7k@wq1^@s6V=-0C=2JR&a84 z_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DI+m2 zMK>oktwf27GbOXA7$|1Q#hF%=n41b=qpB=Xeop`Z1eZxfK~#90?VLYv)G!#vlhX}&u&S5<9UI+kda~=O;z&<#KuB=W*;LeXe1!vGX->&1`$Zeul4)g|FQ*ab0ls{uTQf zKHUk%^EKPf4?>9R<46ogK`0n!Ub*UlGNFmU^zVP_XF@PDMRG)3KjxKYqJzOm4F=SC#;@EF!sqs-e&BReL5*rN6~HA2mRMEs@P*3fu7 z7$-(>!i%^_y!igZ?8u7Zm$kpH5z0qe)u@aSHb}&;;v%ZvrVgs@*EPZTBy7cmMEuk9 z5nE(H56$;d*XWvH^l(uiqb6|TN7IO%_GL!kc7MU|U(PRI`Sz=tpmrY+Hzt}cPflaM z@{=AG2H?GullXN22LZpwCKwO`Mdgj)ha*^r$7MtO+14HtRJZ-`8Tf1&>NjGE3Bl^3 zC>~5v_=x=;%b~pcs=9E+ae5wP#7}!W)LCs_sth#2bo*=H2}8qArt?cNyc)p5qZKJ ztW1K*{@A>d7dd`UxZVQ!_KW5R)!q+i8-S-?USQdJjdD{OpwB-y25K}Y&q8qkQ**A6l%YQR_^#%LR&H<2@f!vHu5oDPl59&i+hh>8- zn!sm*fQ12&6obTAnLwrxMFWZJLsAVAYk7gJlov)5B?smd;`$UJ-SNFEpC@1b1++aIE5-3*-<^@z+6WvOHsLY#G~Pq|bsN(+G=k69zI!A4j9`RpHWsW(;QlF~j3%VuS|p z!_F`S*`@IpG(-uoCV!&q8?}cZOaqJZ`6hDneL>p*6uv5-KbW9~mI1u*B5dXJyNt3@ zD1H^T^7&mwX%a^9`4q4S>TG@+sed$p7oU%a1G1>LPBgFYDD_!UKA#t#|FXm&z8;ll z0ESPg^Z8vxYt$BrKlJuyC{4oYw?h(S;=9i0cLC)`5h(WDh^X+MXuS&epC4)c*T%!$ z&AZw~JVyIjkd278ULfnJejN|->mN3i1+=JBdzSFW02Kd`;2F~Xp7=j4c3=R%?p;y* zXUmgx;n#PN;u!$ZY>TlJW#0AUYfsr^96>%_3iSRSn2;Jkm5-Ow1MvaUaBe9${&(C6 pW`H*-Ww_db2{$kLes>>t{0B$%wTht`IA{O>002ovPDHLkV1nuGqFw+1 diff --git a/icons/screen/hud/orange/32x32.dmi b/icons/screen/hud/orange/32x32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7f55b8e80f603f8839d5ca8cb8c57f3c7b0ebcb4 GIT binary patch literal 466 zcmV;@0WJQCP)V=-0C=1w$Gr-GAQT4B+4~e9x<`MjODN%>?;vRDP=QLleuLXN0-N5AgR+L+ zSZaQ5NUXz1?8~7gNGvn46!V!{Pi?+MNN`Rp%Vz+>H3d$P#0h+fM3zl+5 zLI3~(BuPX;R9J=Wm%VO-FcgKqYZ%jDk5;ARHTwP&Ptd(cmDLHGW-WB!Cq|`-D%FsI zGhmQ~&c~5`%@qJ+&LtbDuHRmAW6q`4r!D*e$~=DZzOrk$YJGC!{RH5BWsk=visIQV zzxF>0;oW*)*%2b2Paj+efwpavm@B1#gM-g0=@~##6v@nEh^D!QJOfDi^)W!KJ%K%e z$4x*4vS9@1I%tPc1QdXP03H41YnZUe_)IIHI!Jfe5Cjcb=Ex&OZ zR@JLrqcIV=rZ53$eRAGcwrO0__Dn=Aw`L{`>b<+egFUf07*qo IM6N<$g6(0-6951J literal 0 HcmV?d00001 diff --git a/icons/screen/hud/orange/inventory-slot.dmi b/icons/screen/hud/orange/inventory-slot.dmi new file mode 100644 index 0000000000000000000000000000000000000000..128813cb43cbf960c88ae3a5216470e6368165e4 GIT binary patch literal 14195 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

BM0?qq_k9lX4rP&9T@w)hI$TqEA*YNoahK6yu z8!zJ*b8#~HIa#pG(AD!sCL#I`+<90i%zadPyzJpIl7MKizhb`US4YJ1*o$bjb;FCju^JMR5_42 zktCLuFALQdZ}J++SP54m9qN77%@gUjJvBF-CO3aU9V<*_lVds^dMA9q%P* zmy8#7J}G~%wsC7mHqbrUZ=KQgjGk8mo$CTn*B$E_D(R58z96SB+F>kiOKjb6q)_U2 z7-T}^C(mM$}5F z4ab4Q3B0*wl`K1Af&1N8c8fp)x`dNx269@~4u-?z&&F(6#Zoy5l|f?)#W+0k#H5cM&4nTtqtxs=6Ib zJG0g4qf=&Ml6X9C&)aQ)TB!Ouz2hHQ-k+(zhRq8efY{0JFuqY`MMdboXdwIN8A?um zPyJWcL&n7#TYwqi?uteV39oDsPM4xTi@sQ^MF5(eB7(VhtQgV~$C&qK9Yz$-57b>x z4u8f>*!kRiko97d3Wxt$)=0}IuRDAxmEG}C@P8bzr!F(rk9elj|LcUmXSYu$H>~sN z(XHkJO5a8rp_kfua}1p31@qn`5Sj0aIs$lxQ)qL-;c(#ng|8mO9CKzHS=)lQu}D?| z>h9nfgQF=*A3fP5156=j1KC-SE^4}UJLz-!##v+xd21J+-J$byG~Sqf-PDJEhUm|y z*@b0>j-HTe^Hte%i!s_bGj4>TdF*g{}w}9eA$P7|(|3V)+Y)24sR9k363B_|!x}OD`ju z8sqVxDRtL|iN;D0q{G=!N|J*tvCh=XWkb8JFOElg`|Y{pORWRlXW@Czz?X9&P2Me5 zZZPUQ|Ce?UM@82s9=6ATqOcM9-3DU4AATn9Av1#J;J;xZ6!<+irJyo${MMK80@HSP z2zaAlMslROox$DneW1JPg9opBUDHZjOP0Gz7;8H7Iu8eq`suK&1I~^&H%LV81#Hhm z!R=C&d{yzAw=_AdP`!I3f8+5bA4g`OwtSfUb;w)2A84ofez^l(|KJig`QEdRe~?*? zyj=ZYq1nD;6U%nAVK-u7GPN!--pFv+0T=rR^6fOED%zaiaFTb$n%QcfK=!={f~~iz-a6$4rBPU^XV3C#KAeKX zQD=$Lrxy$e{PBR_vpUZ>N;4m5(>X@9ar(a7y?Tl=b^iTV=W9G?GOSCGT3;Ewc7;i2 zg~Hx|o`&pMa>lwKD9sV`Ri|C#ieh-F4#vKu`mHM#BP~jHaq@`GPB5+$R&cux9vIDP zir%;p{EeDpy*YY{N?9Dks3LC1tQj4r=CxM_ao_>XH5~ro7R^i`5)kw(oB* zB3tPYgWMS7V^$EK9U ziLtJa`}%&U&tT}jMz`gc^kc%=XoiCJvx7$?L3Gy}ZiVBam*c@rM)eIJ^KXPSb9+-N zar7~}{^IZ*nQZ32X*Gy65aAIOlkq^X6s(NS?QUb|M4Ni-n18@GS;s`^fxW z?DIm2geK`)9?R%>mhLu6QcA_2Ky4Ff6*rE1CDyR?#@H$$1J^dHouu z06%X^RS6u?*K%npJr;3fB|lI8j zPJr$WSp%XQn#E%Jx7nudkR*``gnt0*{pxZQ9T(DMDa17EjVO55^Ty|7Wzx>E}_Sn$DMh9!?z-svWVnjvZEqo^~)x(a$M(g$P za~Y`5PPhQ!GngmfP-2n9@8n|G~_N1zoa@YyyNx{Ik z2%pqMvka2o=@dm>(h5gr0jPhNN^pY+Sn`a z6M4QP(GK&(g@wfz#hq7ZP`hY!!3QrcSH}?LnYbmT@$Eyrk)w9=n-1ZKn%^ zWguzX_`InNY&Nv<+WsXLzd!mF(3Lo(;-x`l2hzPbwIH+PE87*t;=v)I&+k(MkUe2d zZm>XdD7GDM$;D$Aotv#bmm=B9N-!WxNYN%OUYC<6mB ziFYGDtM?)B31mznunD|+->za~0HFnP7MKsyTEoSQQCYH*K8&j_KE1LDl1(q0iGZ>| z*aP%c1~39PlAK{JJLmxh7$bZU$rOJde$IpLT640It?Mu!8_-KvW!HXW{IYHHMp{oy zK{qvqvsFkDSTaaAWl}tWKa#~BNj?Mq=!e^$5MnRX<&^-tARESdBakYd=5$)T6S&s} z7Eol>S_PriNOeQQRr|~5M;Mi%9p7V&aG@1@A0GWg9N#>#m>)J%$3C6G8+Y-boA1#O zXXC%i2Y5r0QXaqVHVRgw6H?Z%E|8m@&^K*`bO(nT=qq*=(!j^g@;Bj@uz|(K0=%IT zkxkEXv`=J6OHHs5x~qNrm@)uN-5afC0@A=D&h4qM zi3UPTespohl7+3WB?~mbzpe||!G%r|Z?9$mh~G8NPm`&F8TB~Tj=lP67(bt*m(wEx zFK9a_%orKBMdw2&SYyMAi(EHZjGW@fg+yP{ftw~fV&p%{{Jm!F2{Wd1zaEWk=9JCO zRjJBH&k3fQMSE=goy6DTp*Y5d%R2V>iSObM~ycvvyz4k1p>BDFMAs(L=Q`EbAme_RDzm$pf)YTYYc8U0{^79bB3MG>ZiF z^>XoH#>H|LM`xlIblSPB7kIb{i`oi@woy&VQjZy_3_g(RA*c{l&o3 z(4gh{NCYam^~cehGNccn?ObJiPA_zl$0<25_Vnvz9ajJoJemV~hQ^+0 z1S~1XAQKVeO^fL_5#r@~3KC29kjCv+Z+w%y^XYg3B;xn@d8L`-JFk#KLW0F~irHl} z6om6}cSC#HeA&=7EpEU$5oppk_956C=DDF5&!c?+hvOjKiWxaPwv#&k3?O0ve;3U^xM?H&bO_& zD0P&hhEf5ZH`5=H#poC2VcoATtDJ#js@*-vnlzT|Cj(kj5uTo$NkNSj_goZXHqu6_ zod=MsTDY2#>u1zYqK8s{lOGx(F_{2yE8No{Kjv0i5jYR|Xm)5FBs0Adfyf z4|bDf_ypghj4-7f7GMAYFid-8DwH}Q`k7;y8KYGS^0bi5=%l&tGccS@P3 zC#8@{s6~yCN^Tu=HL3FR5a{QsD~{Vy$7lD!OI*1XwVJG}DZfG&cNFZrA!N44cQ@Kk zyvL&UyDZe5P1^o{C%FTA7{IIG?kG94t%B;y;QZkp1|dRN$j%q)Wdhmp?u>foQOV3N zMmT9QJQKG7e|O>%A3%2Yx;{b6t<+q6hytw?Izr|d>nq0bIJpwNv!HAVAdXu+UOA?1k&ZZYe27^<0VAuKv9$J%QJprP7#(jQ$k`nJV`rFzGAicnZH7kKA24Ai^c)%7r$p!L+jh^^fDsuECqJSgJ&Y zV?8TnqdzPh_yxe*efjXk8lGRDG}Dlh!p=|$ka>mK;R!P;%pnj#|P7F@i@EM)SvB%@sr9*+zkBIwUt~ z2H2qcU9}FERWvo-A}e;xBjef822XaDQ;3m2se;a=Yu+YPV)ygV*kfA)+PIM}CnLr5 zW_Hst-av1w<=CRWnr){goMG{4bvroe8uRh29`ZP=`?k^DYxl;c}d8 zJ6Qtt8#E?+#LdmdWZ-A140SYZiAyAR%wXhyN#2fBvFvN8I9Lc72G zCpVN!1QXa-AA=qan8{=5VsE@ct|#qz>FHuB3o#Bp2Hqc_yMI=54j^24CzNAp3H_%o zRO(wmGmpE?hkqI&)kWVpjez-I{aPBp3(`x-Zc~e1c-KH*MXp*Ko!v$q=oo-Ift;%r gv-VDH`w7%T*|JT%7o3m$iVmRgR#mP-#w_Un0F1xDx&QzG literal 0 HcmV?d00001 diff --git a/icons/screen/hud/white/32x32.dmi b/icons/screen/hud/white/32x32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b2c310fb93bfe00fb3a6b9029896ee0a17dd573c GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(i*8>L*h>3~$`T1E|S{4=- zdU$vwCnt+2NJ#<}FqQ=Q1v5B2yO9Ruq*R4Ol(?i8Cl_TFlw{`TF)&oj2@WeLD*gT? zxZva0CtBXRTIbH358e=JaMAd|Bc1a;nkN~GdU|(Q7zY_&Huh4O^JvnMNg)cso}Jys zs+(6xoG^Lv$Vc1jjBo3PsiHA|V-Bb>G0fU7!Ckw$(HUr;m#2$kh{nX^1Q8cTCLSj* z4Tp)29)gjL0s#&;SUDw_SY4WXA099f&`_Av#v!z+yv(LIhc+<>Msc)I$ztaD0e0s!^-V5tBA literal 0 HcmV?d00001 diff --git a/icons/screen/hud/white/inventory-slot.dmi b/icons/screen/hud/white/inventory-slot.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fd1c2381a0ea0f27501dd5d4e4f02287a43bb47e GIT binary patch literal 11169 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 literal 0 HcmV?d00001 From 22595a02da0fa49f6e03a416cfa2d9592c6d1f09 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 14 Nov 2024 09:11:54 -0500 Subject: [PATCH 103/140] patches --- code/game/rendering/actor_huds/actor_hud.dm | 4 ++++ code/game/rendering/actor_huds/huds/inventory.dm | 9 +++++---- code/modules/mob/living/silicon/robot/inventory.dm | 2 +- code/modules/mob/mob-login.dm | 4 ++++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/code/game/rendering/actor_huds/actor_hud.dm b/code/game/rendering/actor_huds/actor_hud.dm index cafc28e9e82c..c9bca3642b9d 100644 --- a/code/game/rendering/actor_huds/actor_hud.dm +++ b/code/game/rendering/actor_huds/actor_hud.dm @@ -38,6 +38,10 @@ /datum/actor_hud/proc/bind_to_mob(mob/target) SHOULD_NOT_OVERRIDE(TRUE) + if(actor == target) + return TRUE + else if(actor) + unbind_from_mob() actor = target RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(bound_actor_deleted)) on_mob_bound(target) diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index f3296166eba9..2dd206f3ab36 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -36,7 +36,8 @@ // we don't have a hook for 'on inventory init', // so we can't init it lazily; we init it immediately. target.init_inventory() - bind_to_inventory(target.inventory) + if(target.inventory) + bind_to_inventory(target.inventory) return ..() /datum/actor_hud/inventory/on_mob_unbound(mob/target) @@ -88,9 +89,9 @@ cleanup() // buttons - add_screen((button_swap_hand = new)) - add_screen((button_equip_hand = new)) - add_screen((button_drawer = new)) + add_screen((button_swap_hand = new(null, src))) + add_screen((button_equip_hand = new(null, src))) + add_screen((button_drawer = new(null, src))) // slots rebuild_slots(inventory_slots_with_mappings) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 20202f2e050e..f08ddfd06dc4 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -270,7 +270,7 @@ if(module_state_3) . += module_state_3 -/mob/living/silicon/robot/get_number_of_hands() +/mob/living/silicon/robot/get_nominal_hand_count() return 3 /mob/living/silicon/robot/get_held_index(obj/item/I) diff --git a/code/modules/mob/mob-login.dm b/code/modules/mob/mob-login.dm index 77dbbc34ce13..2b8d8a1ea632 100644 --- a/code/modules/mob/mob-login.dm +++ b/code/modules/mob/mob-login.dm @@ -83,6 +83,10 @@ client.action_drawer.register_holder(inventory.actions) // todo: we really hate that this is needed but it is until the screens/images reset isn't in Login() client.action_drawer.reassert_screen() + // bind actor HUDs + // todo: invalidate any potential remote control going on as we will have a state desync otherwise; + // remote control systems will overrule actor hud binding. + client.actor_huds.bind_all_to_mob(src) // reset statpanel of any verbs/whatnot client.tgui_stat?.request_reload() // update ssd overlay From 7b16f46ff2a53237079147e3503fd6b601fb5aa8 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 15 Nov 2024 02:04:32 -0500 Subject: [PATCH 104/140] Changes --- citadel.dme | 1 + code/game/objects/items-interaction.dm | 16 +-- .../actor_huds/actor_hud-screen_object.dm | 22 +++ .../rendering/actor_huds/huds/inventory.dm | 135 ++++++++---------- code/game/rendering/hud_preferences.dm | 8 ++ code/modules/mob/inventory/inventory-hooks.dm | 2 +- code/modules/mob/inventory/inventory.dm | 13 +- code/modules/mob/living/carbon/carbon.dm | 25 ++-- code/modules/mob/living/carbon/human/human.dm | 3 +- code/modules/mob/mob-hands.dm | 6 - 10 files changed, 124 insertions(+), 107 deletions(-) create mode 100644 code/game/rendering/actor_huds/actor_hud-screen_object.dm diff --git a/citadel.dme b/citadel.dme index eab21c1cbad0..34b88ce7c205 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2016,6 +2016,7 @@ #include "code\game\rendering\mob.dm" #include "code\game\rendering\screen.dm" #include "code\game\rendering\screen_legacy.dm" +#include "code\game\rendering\actor_huds\actor_hud-screen_object.dm" #include "code\game\rendering\actor_huds\actor_hud.dm" #include "code\game\rendering\actor_huds\actor_hud_holder.dm" #include "code\game\rendering\actor_huds\huds\inventory.dm" diff --git a/code/game/objects/items-interaction.dm b/code/game/objects/items-interaction.dm index 9b1f24cf554b..3f601a5ea584 100644 --- a/code/game/objects/items-interaction.dm +++ b/code/game/objects/items-interaction.dm @@ -115,12 +115,12 @@ return ..() if(user.Adjacent(src)) // check for equip - if(istype(over, /atom/movable/screen/inventory/plate/hand)) - var/atom/movable/screen/inventory/plate/hand/H = over + if(istype(over, /atom/movable/screen/actor_hud/inventory/plate/hand)) + var/atom/movable/screen/actor_hud/inventory/plate/hand/H = over user.put_in_hand(src, H.hand_index) return CLICKCHAIN_DO_NOT_PROPAGATE - else if(istype(over, /atom/movable/screen/inventory/plate/slot)) - var/atom/movable/screen/inventory/plate/slot/S = over + else if(istype(over, /atom/movable/screen/actor_hud/inventory/plate/slot)) + var/atom/movable/screen/actor_hud/inventory/plate/slot/S = over user.equip_to_slot_if_possible(src, S.inventory_slot_id) return CLICKCHAIN_DO_NOT_PROPAGATE // check for slide @@ -139,12 +139,12 @@ return CLICKCHAIN_DO_NOT_PROPAGATE else // being held, check for attempt unequip - if(istype(over, /atom/movable/screen/inventory/plate/hand)) - var/atom/movable/screen/inventory/plate/hand/H = over + if(istype(over, /atom/movable/screen/actor_hud/inventory/plate/hand)) + var/atom/movable/screen/actor_hud/inventory/plate/hand/H = over user.put_in_hand(src, H.hand_index) return CLICKCHAIN_DO_NOT_PROPAGATE - else if(istype(over, /atom/movable/screen/inventory/plate/slot)) - var/atom/movable/screen/inventory/plate/slot/S = over + else if(istype(over, /atom/movable/screen/actor_hud/inventory/plate/slot)) + var/atom/movable/screen/actor_hud/inventory/plate/slot/S = over user.equip_to_slot_if_possible(src, S.inventory_slot_id) return CLICKCHAIN_DO_NOT_PROPAGATE else if(istype(over, /turf)) diff --git a/code/game/rendering/actor_huds/actor_hud-screen_object.dm b/code/game/rendering/actor_huds/actor_hud-screen_object.dm new file mode 100644 index 000000000000..5e394a436c75 --- /dev/null +++ b/code/game/rendering/actor_huds/actor_hud-screen_object.dm @@ -0,0 +1,22 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 Citadel Station Developers *// + +/** + * The screen objects for actor HUDs + */ +/atom/movable/screen/actor_hud + + /// our owning actor hud + var/datum/actor_hud/inventory/hud + +/atom/movable/screen/actor_hud/Initialize(mapload, datum/actor_hud/inventory/hud) + . = ..() + src.hud = hud + sync_to_preferences(hud.holder.owner?.legacy_get_hud_preferences() || GLOB.default_hud_preferences) + +/atom/movable/screen/actor_hud/Destroy() + hud = null + return ..() + +/atom/movable/screen/actor_hud/check_allowed(mob/user) + return ..() && hud.owner == user diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 2dd206f3ab36..056ffd167135 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -16,16 +16,16 @@ ) /// keyed slot id to screen object - var/list/atom/movable/screen/inventory/plate/slot/slots + var/list/atom/movable/screen/actor_hud/inventory/plate/slot/slots /// ordered hand objects - var/list/atom/movable/screen/inventory/plate/hand/hands + var/list/atom/movable/screen/actor_hud/inventory/plate/hand/hands /// drawer object - var/atom/movable/screen/inventory/drawer/button_drawer + var/atom/movable/screen/actor_hud/inventory/drawer/button_drawer /// swap hand object - var/atom/movable/screen/inventory/swap_hand/button_swap_hand + var/atom/movable/screen/actor_hud/inventory/swap_hand/button_swap_hand /// equip object - var/atom/movable/screen/inventory/equip_hand/button_equip_hand + var/atom/movable/screen/actor_hud/inventory/equip_hand/button_equip_hand /datum/actor_hud/inventory/Destroy() host = null @@ -67,17 +67,17 @@ */ /datum/actor_hud/inventory/proc/cleanup() // slots - var/list/atom/movable/screen/inventory/plate/slot/slot_objects = all_slot_screen_objects() + var/list/atom/movable/screen/actor_hud/inventory/plate/slot/slot_objects = all_slot_screen_objects() remove_screen(slot_objects) QDEL_LIST(slot_objects) // hands - var/list/atom/movable/screen/inventory/plate/hand/hand_objects = all_hand_screen_objects() + var/list/atom/movable/screen/actor_hud/inventory/plate/hand/hand_objects = all_hand_screen_objects() remove_screen(hand_objects) QDEL_LIST(hand_objects) // buttons - var/list/atom/movable/screen/inventory/button_objects = all_button_screen_objects() + var/list/atom/movable/screen/actor_hud/inventory/button_objects = all_button_screen_objects() remove_screen(button_objects) QDEL_NULL(button_objects) @@ -85,7 +85,7 @@ * Accepts a list with keys as slot IDs, and values as null or a list of * INVENTORY_SLOT_REMAP_*'s. */ -/datum/actor_hud/inventory/proc/rebuild(list/inventory_slots_with_mappings, number_of_hands) +/datum/actor_hud/inventory/proc/rebuild(list/inventory_slots_with_mappings = host.build_inventory_slots_with_remappings(), number_of_hands = host.get_hand_count()) cleanup() // buttons @@ -110,18 +110,18 @@ if(!slot) stack_trace("failed to fetch slot during hud rebuild: [slot_id]") continue - slots[slot_id] = new /atom/movable/screen/inventory/plate/slot(null, src, slot, inventory_slots_with_mappings[slot_id] || list()) + slots[slot_id] = new /atom/movable/screen/actor_hud/inventory/plate/slot(null, src, slot, inventory_slots_with_mappings[slot_id] || list()) // here is where we basically pull a CSS flexbox. - var/list/atom/movable/screen/inventory/plate/slot/place_anywhere = list() + var/list/atom/movable/screen/actor_hud/inventory/plate/slot/place_anywhere = list() var/list/cross_axis_for_drawer = list() var/list/cross_axis_for_hands_left = list() var/list/cross_axis_for_hands_right = list() for(var/id in slots) - var/atom/movable/screen/inventory/plate/slot/slot_object = slots[id] + var/atom/movable/screen/actor_hud/inventory/plate/slot/slot_object = slots[id] var/list/inject_into switch(slot_object.inventory_hud_anchor) @@ -138,14 +138,14 @@ var/requested_cross_axis = clamp(slot_object.inventory_hud_cross_axis, 0, 2) + 1 // 1 to 5 if(length(relevant_cross_axis) < requested_cross_axis) for(var/i in length(relevant_cross_axis) + 1 to requested_cross_axis) - relevant_cross_axis[++cross_axis_for_drawer.len] = list() + relevant_cross_axis[++relevant_cross_axis.len] = list() inject_into = relevant_cross_axis[requested_cross_axis] - BINARY_INSERT(slot_object, inject_into, /atom/movable/screen/inventory/plate/slot, slot_object, inventory_hud_main_axis, COMPARE_KEY) + BINARY_INSERT(slot_object, inject_into, /atom/movable/screen/actor_hud/inventory/plate/slot, slot_object, inventory_hud_main_axis, COMPARE_KEY) if(length(place_anywhere)) var/list/cram_into_bottom_of_drawer = list() - for(var/atom/movable/screen/inventory/plate/slot/slot_object as anything in place_anywhere) + for(var/atom/movable/screen/actor_hud/inventory/plate/slot/slot_object as anything in place_anywhere) // intelligent detection; cluster based on class switch(slot_object.inventory_hud_class) if(INVENTORY_HUD_CLASS_ALWAYS) @@ -154,28 +154,28 @@ cram_into_bottom_of_drawer += slot_object pack_2d_flat_list(cross_axis_for_drawer, cram_into_bottom_of_drawer, FALSE) - var/list/atom/movable/screen/inventory/plate/slot/aligned = list() + var/list/atom/movable/screen/actor_hud/inventory/plate/slot/aligned = list() for(var/cross_axis in 1 to length(cross_axis_for_drawer)) var/list/cross_axis_list = cross_axis_for_drawer[cross_axis] for(var/main_axis in 1 to length(cross_axis_list)) - var/atom/movable/screen/inventory/plate/slot/aligning = cross_axis_list[main_axis] + var/atom/movable/screen/actor_hud/inventory/plate/slot/aligning = cross_axis_list[main_axis] aligning.inventory_hud_cross_axis = cross_axis - 1 aligning.inventory_hud_main_axis = main_axis - 1 for(var/cross_axis in 1 to length(cross_axis_for_hands_left)) var/list/cross_axis_list = cross_axis_for_hands_left[cross_axis] for(var/main_axis in 1 to length(cross_axis_list)) - var/atom/movable/screen/inventory/plate/slot/aligning = cross_axis_list[main_axis] + var/atom/movable/screen/actor_hud/inventory/plate/slot/aligning = cross_axis_list[main_axis] aligning.inventory_hud_cross_axis = cross_axis - 1 aligning.inventory_hud_main_axis = -main_axis for(var/cross_axis in 1 to length(cross_axis_for_hands_right)) var/list/cross_axis_list = cross_axis_for_hands_right[cross_axis] for(var/main_axis in 1 to length(cross_axis_list)) - var/atom/movable/screen/inventory/plate/slot/aligning = cross_axis_list[main_axis] + var/atom/movable/screen/actor_hud/inventory/plate/slot/aligning = cross_axis_list[main_axis] aligning.inventory_hud_cross_axis = cross_axis - 1 aligning.inventory_hud_main_axis = main_axis - for(var/atom/movable/screen/inventory/plate/slot/slot_object as anything in aligned) + for(var/atom/movable/screen/actor_hud/inventory/plate/slot/slot_object as anything in aligned) switch(slot_object.inventory_hud_anchor) if(INVENTORY_HUD_ANCHOR_TO_DRAWER) slot_object.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_DRAWER_ALIGNED(slot_object.inventory_hud_main_axis, slot_object.inventory_hud_cross_axis) @@ -191,7 +191,7 @@ var/old_length = length(hands) hands.len = number_of_hands for(var/i in old_length + 1 to number_of_hands) - var/atom/movable/screen/inventory/plate/hand/hand_object = new(null, src, i) + var/atom/movable/screen/actor_hud/inventory/plate/hand/hand_object = new(null, src, i) add_screen(hand_object) hands[i] = hand_object else if(length(hands) > number_of_hands) @@ -211,12 +211,12 @@ if(filter_by_class) if(islist(filter_by_class)) for(var/id in slots) - var/atom/movable/screen/inventory/plate/slot/slot_object = slots[id] + var/atom/movable/screen/actor_hud/inventory/plate/slot/slot_object = slots[id] if(slot_object.inventory_hud_class in filter_by_class) . += slot_object else for(var/id in slots) - var/atom/movable/screen/inventory/plate/slot/slot_object = slots[id] + var/atom/movable/screen/actor_hud/inventory/plate/slot/slot_object = slots[id] if(slot_object.inventory_hud_class == filter_by_class) . += slot_object else @@ -240,7 +240,7 @@ . += button_drawer /datum/actor_hud/inventory/proc/toggle_hidden_class(class, source) - var/list/atom/movable/screen/inventory/affected = all_slot_screen_objects(class) + var/list/atom/movable/screen/actor_hud/inventory/affected = all_slot_screen_objects(class) if(class in hidden_classes) LAZYREMOVE(hidden_classes[class], source) if(!length(hidden_classes[class])) @@ -265,22 +265,22 @@ //* Hooks *// /datum/actor_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) - var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slots[slot_or_index.id] + var/atom/movable/screen/actor_hud/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slots[slot_or_index.id] screen_obj.bind_item(item) /datum/actor_hud/inventory/proc/remove_item(obj/item/item, datum/inventory_slot/slot_or_index) - var/atom/movable/screen/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slots[slot_or_index.id] + var/atom/movable/screen/actor_hud/inventory/plate/screen_obj = isnum(slot_or_index) ? hands[slot_or_index] : slots[slot_or_index.id] screen_obj.unbind_item(item) /datum/actor_hud/inventory/proc/move_item(obj/item/item, datum/inventory_slot/from_slot_or_index, datum/inventory_slot/to_slot_or_index) - var/atom/movable/screen/inventory/plate/old_screen_obj = isnum(from_slot_or_index) ? hands[from_slot_or_index] : slots[from_slot_or_index.id] - var/atom/movable/screen/inventory/plate/new_screen_obj = isnum(to_slot_or_index) ? hands[to_slot_or_index] : slots[to_slot_or_index.id] + var/atom/movable/screen/actor_hud/inventory/plate/old_screen_obj = isnum(from_slot_or_index) ? hands[from_slot_or_index] : slots[from_slot_or_index.id] + var/atom/movable/screen/actor_hud/inventory/plate/new_screen_obj = isnum(to_slot_or_index) ? hands[to_slot_or_index] : slots[to_slot_or_index.id] old_screen_obj.unbind_item(item) new_screen_obj.bind_item(item) /datum/actor_hud/inventory/proc/swap_active_hand(from_index, to_index) - var/atom/movable/screen/inventory/plate/hand/old_hand = hands[from_index] - var/atom/movable/screen/inventory/plate/hand/new_hand = hands[to_index] + var/atom/movable/screen/actor_hud/inventory/plate/hand/old_hand = hands[from_index] + var/atom/movable/screen/actor_hud/inventory/plate/hand/new_hand = hands[to_index] old_hand.cut_overlay("[old_hand.icon_state]-active") new_hand.add_overlay("[new_hand.icon_state]-active") @@ -290,33 +290,18 @@ /** * Base type of inventory screen objects. */ -/atom/movable/screen/inventory +/atom/movable/screen/actor_hud/inventory name = "inventory" icon = 'icons/screen/hud/midnight/inventory.dmi' - /// our owning mob hud - var/datum/actor_hud/inventory/hud - -/atom/movable/screen/inventory/Initialize(mapload, datum/actor_hud/inventory/hud) - . = ..() - src.hud = hud - sync_style(hud.holder.owner?.legacy_get_hud_preferences()) - -/atom/movable/screen/inventory/Destroy() - hud = null - return ..() - -/atom/movable/screen/inventory/check_allowed(mob/user) - return ..() && hud.owner == user - -/atom/movable/screen/inventory/on_click(mob/user, list/params) +/atom/movable/screen/actor_hud/inventory/on_click(mob/user, list/params) var/obj/item/held = user.get_active_held_item() handle_inventory_click(user, held) -/atom/movable/screen/inventory/sync_to_preferences(datum/hud_preferences/preference_set) +/atom/movable/screen/actor_hud/inventory/sync_to_preferences(datum/hud_preferences/preference_set) sync_style(preference_set.hud_style, preference_set.hud_color, preference_set.hud_alpha) -/atom/movable/screen/inventory/proc/sync_style(datum/hud_style/style, style_alpha, style_color) +/atom/movable/screen/actor_hud/inventory/proc/sync_style(datum/hud_style/style, style_alpha, style_color) alpha = style_alpha color = style_color @@ -327,23 +312,23 @@ * * user - clicking user; not necessarily the inventory's owner * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. */ -/atom/movable/screen/inventory/proc/handle_inventory_click(mob/user, obj/item/with_item) +/atom/movable/screen/actor_hud/inventory/proc/handle_inventory_click(mob/user, obj/item/with_item) return /** * Base type of item-holding screen objects */ -/atom/movable/screen/inventory/plate +/atom/movable/screen/actor_hud/inventory/plate -/atom/movable/screen/inventory/plate/Destroy() +/atom/movable/screen/actor_hud/inventory/plate/Destroy() if(length(vis_contents) != 0) vis_contents.len = 0 return ..() -/atom/movable/screen/inventory/plate/proc/bind_item(obj/item/item) +/atom/movable/screen/actor_hud/inventory/plate/proc/bind_item(obj/item/item) vis_contents += item -/atom/movable/screen/inventory/plate/proc/unbind_item(obj/item/item) +/atom/movable/screen/actor_hud/inventory/plate/proc/unbind_item(obj/item/item) vis_contents -= item /** @@ -352,7 +337,7 @@ * * Stores remappings so we don't have to do it separately * * Stores calculated screen_loc so we don't have to recalculate unless slots are mutated. */ -/atom/movable/screen/inventory/plate/slot +/atom/movable/screen/actor_hud/inventory/plate/slot /// our inventory slot id var/inventory_slot_id /// our (potentially remapped) class @@ -364,7 +349,7 @@ /// our (potentially remapped) anchor var/inventory_hud_anchor = INVENTORY_HUD_ANCHOR_AUTOMATIC -/atom/movable/screen/inventory/plate/slot/Initialize(mapload, datum/actor_hud/inventory/hud, datum/inventory_slot/slot, list/slot_remappings) +/atom/movable/screen/actor_hud/inventory/plate/slot/Initialize(mapload, datum/actor_hud/inventory/hud, datum/inventory_slot/slot, list/slot_remappings) . = ..() inventory_slot_id = slot.id inventory_hud_class = slot_remappings[INVENTORY_SLOT_REMAP_CLASS] || slot.inventory_hud_class @@ -373,48 +358,48 @@ inventory_hud_anchor = slot_remappings[INVENTORY_SLOT_REMAP_ANCHOR] || slot.inventory_hud_anchor name = slot_remappings[INVENTORY_SLOT_REMAP_NAME] || slot.display_name || slot.name -/atom/movable/screen/inventory/plate/slot/sync_style(datum/hud_style/style, style_alpha, style_color) +/atom/movable/screen/actor_hud/inventory/plate/slot/sync_style(datum/hud_style/style, style_alpha, style_color) ..() icon = style.inventory_icons_slot -/atom/movable/screen/inventory/plate/slot/handle_inventory_click(mob/user, obj/item/with_item) +/atom/movable/screen/actor_hud/inventory/plate/slot/handle_inventory_click(mob/user, obj/item/with_item) #warn impl /** * Hand screen objects */ -/atom/movable/screen/inventory/plate/hand +/atom/movable/screen/actor_hud/inventory/plate/hand /// target hand index var/hand_index /// should we have handcuffed overlay? var/handcuffed = FALSE -/atom/movable/screen/inventory/plate/hand/Initialize(mapload, datum/inventory/host, hand_index) +/atom/movable/screen/actor_hud/inventory/plate/hand/Initialize(mapload, datum/inventory/host, hand_index) . = ..() src.hand_index = hand_index sync_index(hand_index) -/atom/movable/screen/inventory/plate/hand/sync_style(datum/hud_style/style, style_alpha, style_color) +/atom/movable/screen/actor_hud/inventory/plate/hand/sync_style(datum/hud_style/style, style_alpha, style_color) ..() icon = style.inventory_icons -/atom/movable/screen/inventory/plate/hand/handle_inventory_click(mob/user, obj/item/with_item) +/atom/movable/screen/actor_hud/inventory/plate/hand/handle_inventory_click(mob/user, obj/item/with_item) if(!with_item) hud.owner.swap_hand(hand_index) #warn impl -/atom/movable/screen/inventory/plate/hand/proc/sync_index(index = hand_index) +/atom/movable/screen/actor_hud/inventory/plate/hand/proc/sync_index(index = hand_index) screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND(index) name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" icon_state = "hand-[index % 2? "left" : "right"]" -/atom/movable/screen/inventory/plate/hand/proc/set_handcuffed(state) +/atom/movable/screen/actor_hud/inventory/plate/hand/proc/set_handcuffed(state) if(state == handcuffed) return handcuffed = state update_icon() -/atom/movable/screen/inventory/plate/hand/update_overlays() +/atom/movable/screen/actor_hud/inventory/plate/hand/update_overlays() . = ..() if(handcuffed) . += image('icons/mob/screen_gen.dmi', "[hand_index % 2 ? "r_hand" : "l_hand"]_hud_handcuffs") @@ -422,45 +407,45 @@ /** * Button: 'swap hand' */ -/atom/movable/screen/inventory/drawer +/atom/movable/screen/actor_hud/inventory/drawer icon_state = "drawer" -/atom/movable/screen/inventory/drawer/sync_style(datum/hud_style/style, style_alpha, style_color) +/atom/movable/screen/actor_hud/inventory/drawer/sync_style(datum/hud_style/style, style_alpha, style_color) ..() icon = style.inventory_icons_wide -/atom/movable/screen/inventory/drawer/on_click(mob/user, list/params) +/atom/movable/screen/actor_hud/inventory/drawer/on_click(mob/user, list/params) // todo: remote control hud.toggle_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_DRAWER) -/atom/movable/screen/inventory/drawer/update_icon_state() +/atom/movable/screen/actor_hud/inventory/drawer/update_icon_state() icon_state = "[INVENTORY_HUD_CLASS_DRAWER in hud.hidden_classes ? "drawer" : "drawer-active"]" return ..() /** * Button: 'swap hand' */ -/atom/movable/screen/inventory/swap_hand +/atom/movable/screen/actor_hud/inventory/swap_hand icon_state = "swap" -/atom/movable/screen/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) +/atom/movable/screen/actor_hud/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) ..() icon = style.inventory_icons_wide -/atom/movable/screen/inventory/swap_hand/on_click(mob/user, list/params) +/atom/movable/screen/actor_hud/inventory/swap_hand/on_click(mob/user, list/params) // todo: remote control user.swap_hand() /** * Button: 'auto equip' */ -/atom/movable/screen/inventory/equip_hand +/atom/movable/screen/actor_hud/inventory/equip_hand icon_state = "equip" -/atom/movable/screen/inventory/equip_hand/sync_style(datum/hud_style/style, style_alpha, style_color) +/atom/movable/screen/actor_hud/inventory/equip_hand/sync_style(datum/hud_style/style, style_alpha, style_color) ..() icon = style.inventory_icons -/atom/movable/screen/inventory/equip_hand/on_click(mob/user, list/params) +/atom/movable/screen/actor_hud/inventory/equip_hand/on_click(mob/user, list/params) // todo: remote control user.attempt_smart_equip(user.get_active_held_item()) diff --git a/code/game/rendering/hud_preferences.dm b/code/game/rendering/hud_preferences.dm index f4236f7c6d8d..af329da61227 100644 --- a/code/game/rendering/hud_preferences.dm +++ b/code/game/rendering/hud_preferences.dm @@ -1,6 +1,8 @@ //* This file is explicitly licensed under the MIT license. *// //* Copyright (c) 2024 Citadel Station Developers *// +GLOBAL_DATUM_INIT(default_hud_preferences, /datum/hud_preferences, new /datum/hud_preferences/default) + /** * A set of preferences for how to render the game's HUDs. */ @@ -12,6 +14,11 @@ /// desired hud alpha - set at base of sync_client var/hud_alpha +/datum/hud_preferences/default + hud_style = new /datum/hud_style/midnight // yes, this doesn't use the global cached variant. sue me. + hud_color = "#ffffff" + hud_alpha = 200 + /** * todo: remove */ @@ -20,3 +27,4 @@ creating.hud_style = preferences.get_entry(/datum/game_preference_entry/dropdown/hud_style) creating.hud_color = preferences.get_entry(/datum/game_preference_entry/simple_color/hud_color) creating.hud_alpha = preferences.get_entry(/datum/game_preference_entry/number/hud_alpha) + return creating diff --git a/code/modules/mob/inventory/inventory-hooks.dm b/code/modules/mob/inventory/inventory-hooks.dm index c87b90257e91..a52382909040 100644 --- a/code/modules/mob/inventory/inventory-hooks.dm +++ b/code/modules/mob/inventory/inventory-hooks.dm @@ -61,5 +61,5 @@ /datum/inventory/proc/on_handcuffed_update() var/restrained = !!owner.item_by_slot_id(/datum/inventory_slot/restraints/handcuffs::id) for(var/datum/actor_hud/inventory/hud in huds_using) - for(var/atom/movable/screen/inventory/plate/hand/hand_plate in hud.hands) + for(var/atom/movable/screen/actor_hud/inventory/plate/hand/hand_plate in hud.hands) hand_plate.set_handcuffed(restrained) diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index a00867babe18..6879450bf822 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -74,17 +74,20 @@ //* Slots *// /** - * @return list(id = list(INVENTORY_SLOT_REMAP_*)) + * mapped slots input should be a list of slot IDs, optionally associated to remapping lists */ -/datum/inventory/proc/build_inventory_slots_with_remappings() - return base_inventory_slots - -/datum/inventory/proc/set_base_inventory_slots(list/mapped_slots) +/datum/inventory/proc/set_inventory_slots(list/mapped_slots) base_inventory_slots = mapped_slots for(var/datum/actor_hud/inventory/hud in huds_using) hud.rebuild() SEND_SIGNAL(src, COMSIG_INVENTORY_SLOT_REBUILD) +/** + * @return list(id = list(INVENTORY_SLOT_REMAP_*)) + */ +/datum/inventory/proc/build_inventory_slots_with_remappings() + return base_inventory_slots + //! unsorted / legacy below /mob/proc/handle_item_denesting(obj/item/I, old_slot, flags, mob/user) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0d926770ff05..0340ceab5c23 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,6 +1,5 @@ /mob/living/carbon/Initialize(mapload) . = ..() - set_nominal_hand_count(2) //setup reagent holders bloodstr = new/datum/reagent_holder/metabolism/bloodstream(500, src) ingested = new/datum/reagent_holder/metabolism/ingested(500, src) @@ -9,16 +8,6 @@ if (!default_language && species_language) default_language = SScharacters.resolve_language_name(species_language) -/mob/living/carbon/BiologicalLife(seconds, times_fired) - if((. = ..())) - return - - handle_viruses() - - // Increase germ_level regularly - if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level - germ_level++ - /mob/living/carbon/Destroy() qdel(ingested) qdel(touching) @@ -29,6 +18,20 @@ qdel(food) return ..() +/mob/living/carbon/init_inventory() + . = ..() + inventory.set_hand_count(2) + +/mob/living/carbon/BiologicalLife(seconds, times_fired) + if((. = ..())) + return + + handle_viruses() + + // Increase germ_level regularly + if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level + germ_level++ + /mob/living/carbon/gib() for(var/mob/M in src) if(M in src.stomach_contents) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9b82bac5bd27..7610c6191d36 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1129,7 +1129,8 @@ // i seriously hate vorecode species.on_apply(src) - set_nominal_hand_count(species.hud? (species.hud.has_hands ? 2 : 0) : 2) + inventory.set_inventory_slots(species.inventory_slots) + inventory.set_hand_count(species.hud? (species.hud.has_hands ? 2 : 0) : 2) // until we unfuck hud datums, this will force reload our entire hud if(hud_used) diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index 7d21ede52fef..d914424ca0d3 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -65,12 +65,6 @@ for(var/i in 1 to get_nominal_hand_count()) . += i -/** - * sets number of physical hands we should account for potentialy having - */ -/mob/proc/set_nominal_hand_count(count) - inventory.set_hand_count(count) - /** * Are usable hands all holding items? * From 5f21bca84a818d1d19ece9ffc5a698127f9a26aa Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 15 Nov 2024 22:34:44 -0500 Subject: [PATCH 105/140] fixes --- .../rendering/actor_huds/actor_hud-screen_object.dm | 1 + code/game/rendering/actor_huds/huds/inventory.dm | 11 +++++++++-- code/game/rendering/hud_preferences.dm | 2 +- code/game/rendering/hud_style.dm | 6 ++++++ code/modules/mob/inventory/inventory-hands.dm | 3 +++ code/modules/mob/inventory/inventory.dm | 4 ++-- code/modules/mob/living/carbon/carbon.dm | 2 ++ code/modules/mob/living/living-inventory.dm | 2 ++ code/modules/mob/mob-hands.dm | 5 ++++- code/modules/mob/mob-inventory.dm | 1 + 10 files changed, 31 insertions(+), 6 deletions(-) diff --git a/code/game/rendering/actor_huds/actor_hud-screen_object.dm b/code/game/rendering/actor_huds/actor_hud-screen_object.dm index 5e394a436c75..461d2d66ee4e 100644 --- a/code/game/rendering/actor_huds/actor_hud-screen_object.dm +++ b/code/game/rendering/actor_huds/actor_hud-screen_object.dm @@ -12,6 +12,7 @@ /atom/movable/screen/actor_hud/Initialize(mapload, datum/actor_hud/inventory/hud) . = ..() src.hud = hud + // todo: cache this and don't keep grabbing it? sync_to_preferences(hud.holder.owner?.legacy_get_hud_preferences() || GLOB.default_hud_preferences) /atom/movable/screen/actor_hud/Destroy() diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 056ffd167135..1c0489136b7a 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -47,10 +47,12 @@ /datum/actor_hud/inventory/proc/bind_to_inventory(datum/inventory/inventory) host = inventory + LAZYADD(inventory.using_huds, src) rebuild(inventory.build_inventory_slots_with_remappings(), length(inventory.held_items)) /datum/actor_hud/inventory/proc/unbind_from_inventory(datum/inventory/inventory) cleanup() + LAZYREMOVE(inventory.using_huds, src) host = null /datum/actor_hud/inventory/screens() @@ -110,7 +112,9 @@ if(!slot) stack_trace("failed to fetch slot during hud rebuild: [slot_id]") continue - slots[slot_id] = new /atom/movable/screen/actor_hud/inventory/plate/slot(null, src, slot, inventory_slots_with_mappings[slot_id] || list()) + var/atom/movable/screen/actor_hud/inventory/plate/slot/slot_object = new /atom/movable/screen/actor_hud/inventory/plate/slot(null, src, slot, inventory_slots_with_mappings[slot_id] || list()) + add_screen(slot_object) + slots[slot_id] = slot_object // here is where we basically pull a CSS flexbox. @@ -409,10 +413,11 @@ */ /atom/movable/screen/actor_hud/inventory/drawer icon_state = "drawer" + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_DRAWER /atom/movable/screen/actor_hud/inventory/drawer/sync_style(datum/hud_style/style, style_alpha, style_color) ..() - icon = style.inventory_icons_wide + icon = style.inventory_icons /atom/movable/screen/actor_hud/inventory/drawer/on_click(mob/user, list/params) // todo: remote control @@ -427,6 +432,7 @@ */ /atom/movable/screen/actor_hud/inventory/swap_hand icon_state = "swap" + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP /atom/movable/screen/actor_hud/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) ..() @@ -441,6 +447,7 @@ */ /atom/movable/screen/actor_hud/inventory/equip_hand icon_state = "equip" + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND /atom/movable/screen/actor_hud/inventory/equip_hand/sync_style(datum/hud_style/style, style_alpha, style_color) ..() diff --git a/code/game/rendering/hud_preferences.dm b/code/game/rendering/hud_preferences.dm index af329da61227..6b75e5c3cb6d 100644 --- a/code/game/rendering/hud_preferences.dm +++ b/code/game/rendering/hud_preferences.dm @@ -24,7 +24,7 @@ GLOBAL_DATUM_INIT(default_hud_preferences, /datum/hud_preferences, new /datum/hu */ /client/proc/legacy_get_hud_preferences() var/datum/hud_preferences/creating = new - creating.hud_style = preferences.get_entry(/datum/game_preference_entry/dropdown/hud_style) + creating.hud_style = legacy_find_hud_style_by_name(preferences.get_entry(/datum/game_preference_entry/dropdown/hud_style)) || GLOB.hud_styles[/datum/hud_style/midnight::id] creating.hud_color = preferences.get_entry(/datum/game_preference_entry/simple_color/hud_color) creating.hud_alpha = preferences.get_entry(/datum/game_preference_entry/number/hud_alpha) return creating diff --git a/code/game/rendering/hud_style.dm b/code/game/rendering/hud_style.dm index b621290cd0ab..72e57409d040 100644 --- a/code/game/rendering/hud_style.dm +++ b/code/game/rendering/hud_style.dm @@ -10,6 +10,12 @@ GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) continue .[initial(path.id)] = new path +/proc/legacy_find_hud_style_by_name(name) + for(var/id in GLOB.hud_styles) + var/datum/hud_style/style = GLOB.hud_styles[id] + if(style.name == name) + return style + /** * # HUD Style * diff --git a/code/modules/mob/inventory/inventory-hands.dm b/code/modules/mob/inventory/inventory-hands.dm index b8dcc89b4a0e..9f196ff259dd 100644 --- a/code/modules/mob/inventory/inventory-hands.dm +++ b/code/modules/mob/inventory/inventory-hands.dm @@ -6,6 +6,9 @@ held_items.len = count for(var/datum/actor_hud/inventory/hud in huds_using) hud.rebuild() + //! legacy + owner.swap_hand(count ? clamp(owner.active_hand, 1, count) : null) + //! end SEND_SIGNAL(src, COMSIG_INVENTORY_SLOT_REBUILD) /datum/inventory/proc/get_hand_count() diff --git a/code/modules/mob/inventory/inventory.dm b/code/modules/mob/inventory/inventory.dm index 6879450bf822..197ac691ea81 100644 --- a/code/modules/mob/inventory/inventory.dm +++ b/code/modules/mob/inventory/inventory.dm @@ -77,7 +77,7 @@ * mapped slots input should be a list of slot IDs, optionally associated to remapping lists */ /datum/inventory/proc/set_inventory_slots(list/mapped_slots) - base_inventory_slots = mapped_slots + base_inventory_slots = deep_copy_list(mapped_slots) for(var/datum/actor_hud/inventory/hud in huds_using) hud.rebuild() SEND_SIGNAL(src, COMSIG_INVENTORY_SLOT_REBUILD) @@ -86,7 +86,7 @@ * @return list(id = list(INVENTORY_SLOT_REMAP_*)) */ /datum/inventory/proc/build_inventory_slots_with_remappings() - return base_inventory_slots + return deep_copy_list(base_inventory_slots) //! unsorted / legacy below diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0340ceab5c23..069ea5c72e8a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -21,6 +21,8 @@ /mob/living/carbon/init_inventory() . = ..() inventory.set_hand_count(2) + if(species) // todo: sigh we need to talk about init order; this shouldn't be needed + inventory.set_inventory_slots(species.inventory_slots) /mob/living/carbon/BiologicalLife(seconds, times_fired) if((. = ..())) diff --git a/code/modules/mob/living/living-inventory.dm b/code/modules/mob/living/living-inventory.dm index 461d60b0ab07..24431f48340e 100644 --- a/code/modules/mob/living/living-inventory.dm +++ b/code/modules/mob/living/living-inventory.dm @@ -58,6 +58,8 @@ //* Init *// /mob/living/init_inventory() + if(inventory) + return inventory = new(src) //* Carry Weight *// diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index d914424ca0d3..67aeaee33e43 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -167,9 +167,11 @@ * * This is so remote control abstraction works. */ /mob/proc/swap_hand(to_index) + if(active_hand == to_index) + return var/hand_count = get_nominal_hand_count() var/obj/item/was_active = get_active_held_item() - var/old_index = active_hand + var/old_index = active_hand || 1 if(isnull(to_index)) if(active_hand >= hand_count) @@ -180,6 +182,7 @@ if(to_index > hand_count) return FALSE active_hand = to_index + to_index = active_hand . = TRUE diff --git a/code/modules/mob/mob-inventory.dm b/code/modules/mob/mob-inventory.dm index d6590064e962..d9588ed4d031 100644 --- a/code/modules/mob/mob-inventory.dm +++ b/code/modules/mob/mob-inventory.dm @@ -3,6 +3,7 @@ //* Init *// +// todo: rework this proc. what happens if it's already there? documentation?? this should probably reset the inventory maybe? /mob/proc/init_inventory() return From de56b5fa321aeff7b61f609535ea610384bfc47b Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 15 Nov 2024 22:41:20 -0500 Subject: [PATCH 106/140] fix --- .../rendering/actor_huds/huds/inventory.dm | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 1c0489136b7a..abcae4ea7033 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -47,12 +47,12 @@ /datum/actor_hud/inventory/proc/bind_to_inventory(datum/inventory/inventory) host = inventory - LAZYADD(inventory.using_huds, src) + LAZYADD(inventory.huds_using, src) rebuild(inventory.build_inventory_slots_with_remappings(), length(inventory.held_items)) /datum/actor_hud/inventory/proc/unbind_from_inventory(datum/inventory/inventory) cleanup() - LAZYREMOVE(inventory.using_huds, src) + LAZYREMOVE(inventory.huds_using, src) host = null /datum/actor_hud/inventory/screens() @@ -91,8 +91,8 @@ cleanup() // buttons - add_screen((button_swap_hand = new(null, src))) - add_screen((button_equip_hand = new(null, src))) + add_screen((button_swap_hand = new(null, src, number_of_hands))) + add_screen((button_equip_hand = new(null, src, number_of_hands))) add_screen((button_drawer = new(null, src))) // slots @@ -303,7 +303,7 @@ handle_inventory_click(user, held) /atom/movable/screen/actor_hud/inventory/sync_to_preferences(datum/hud_preferences/preference_set) - sync_style(preference_set.hud_style, preference_set.hud_color, preference_set.hud_alpha) + sync_style(preference_set.hud_style, preference_set.hud_alpha, preference_set.hud_color) /atom/movable/screen/actor_hud/inventory/proc/sync_style(datum/hud_style/style, style_alpha, style_color) alpha = style_alpha @@ -431,8 +431,10 @@ * Button: 'swap hand' */ /atom/movable/screen/actor_hud/inventory/swap_hand - icon_state = "swap" - screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP + icon_state = "hand-swap" +/atom/movable/screen/actor_hud/inventory/swap_hand/Initialize(mapload, datum/inventory/host, hand_count) + . = ..() + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(hand_count) /atom/movable/screen/actor_hud/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) ..() @@ -446,8 +448,11 @@ * Button: 'auto equip' */ /atom/movable/screen/actor_hud/inventory/equip_hand - icon_state = "equip" - screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND + icon_state = "button-equip" + +/atom/movable/screen/actor_hud/inventory/equip_hand/Initialize(mapload, datum/inventory/host, hand_count) + . = ..() + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(hand_count) /atom/movable/screen/actor_hud/inventory/equip_hand/sync_style(datum/hud_style/style, style_alpha, style_color) ..() From ef0f6726d632a4eeff76267bb888d8355a7f258c Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 16 Nov 2024 10:23:13 -0500 Subject: [PATCH 107/140] Fixes --- code/__DEFINES/screen.dm | 4 ++-- code/game/rendering/actor_huds/huds/inventory.dm | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/screen.dm b/code/__DEFINES/screen.dm index 914d0c08ffa5..6c2231fe773e 100644 --- a/code/__DEFINES/screen.dm +++ b/code/__DEFINES/screen.dm @@ -32,9 +32,9 @@ //* Mob HUD - Inventory *// /// screen loc for a hand index -#define SCREEN_LOC_MOB_HUD_INVENTORY_HAND(HAND) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" +#define SCREEN_LOC_MOB_HUD_INVENTORY_HAND(HAND) "CENTER[index % 2? "-1" : ""]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" /// screen loc for hand swap button for a given number of hands -#define SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(TOTAL_HANDS) "CENTER-1:24,BOTTOM+[ceil(TOTAL_HANDS - 2 / 2)]:5" +#define SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(TOTAL_HANDS) "CENTER-1:28,BOTTOM+[ceil(TOTAL_HANDS - 2 / 2)]:5" /// screen loc for hand swap button for a given number of hands #define SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(TOTAL_HANDS) "CENTER-1:16,BOTTOM+[ceil(TOTAL_HANDS - 2 / 2)]:5" /// the bottom-left drawer position of inventory HUD diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index abcae4ea7033..e232d44a2485 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -166,18 +166,21 @@ var/atom/movable/screen/actor_hud/inventory/plate/slot/aligning = cross_axis_list[main_axis] aligning.inventory_hud_cross_axis = cross_axis - 1 aligning.inventory_hud_main_axis = main_axis - 1 + aligned += aligning for(var/cross_axis in 1 to length(cross_axis_for_hands_left)) var/list/cross_axis_list = cross_axis_for_hands_left[cross_axis] for(var/main_axis in 1 to length(cross_axis_list)) var/atom/movable/screen/actor_hud/inventory/plate/slot/aligning = cross_axis_list[main_axis] aligning.inventory_hud_cross_axis = cross_axis - 1 aligning.inventory_hud_main_axis = -main_axis + aligned += aligning for(var/cross_axis in 1 to length(cross_axis_for_hands_right)) var/list/cross_axis_list = cross_axis_for_hands_right[cross_axis] for(var/main_axis in 1 to length(cross_axis_list)) var/atom/movable/screen/actor_hud/inventory/plate/slot/aligning = cross_axis_list[main_axis] aligning.inventory_hud_cross_axis = cross_axis - 1 aligning.inventory_hud_main_axis = main_axis + aligned += aligning for(var/atom/movable/screen/actor_hud/inventory/plate/slot/slot_object as anything in aligned) switch(slot_object.inventory_hud_anchor) @@ -394,7 +397,7 @@ /atom/movable/screen/actor_hud/inventory/plate/hand/proc/sync_index(index = hand_index) screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND(index) - name = "[index % 2? "left" : "right"] hand[index > 1? " #[index]" : ""]" + name = "[index % 2? "left" : "right"] hand[index > 2? " #[index]" : ""]" icon_state = "hand-[index % 2? "left" : "right"]" /atom/movable/screen/actor_hud/inventory/plate/hand/proc/set_handcuffed(state) @@ -412,6 +415,7 @@ * Button: 'swap hand' */ /atom/movable/screen/actor_hud/inventory/drawer + name = "drawer" icon_state = "drawer" screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_DRAWER @@ -431,6 +435,7 @@ * Button: 'swap hand' */ /atom/movable/screen/actor_hud/inventory/swap_hand + name = "swap active hand" icon_state = "hand-swap" /atom/movable/screen/actor_hud/inventory/swap_hand/Initialize(mapload, datum/inventory/host, hand_count) . = ..() @@ -448,6 +453,7 @@ * Button: 'auto equip' */ /atom/movable/screen/actor_hud/inventory/equip_hand + name = "equip held item" icon_state = "button-equip" /atom/movable/screen/actor_hud/inventory/equip_hand/Initialize(mapload, datum/inventory/host, hand_count) From 7df3bed5f2d2c09f66bd7cbbfc396a6d8d2ee172 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 16 Nov 2024 21:56:03 -0500 Subject: [PATCH 108/140] fix --- code/__DEFINES/screen.dm | 4 +- .../rendering/actor_huds/huds/inventory.dm | 51 ++++++++++++++----- code/game/rendering/hud_style.dm | 2 +- code/modules/mob/inventory/inventory_slot.dm | 18 +++++-- 4 files changed, 53 insertions(+), 22 deletions(-) diff --git a/code/__DEFINES/screen.dm b/code/__DEFINES/screen.dm index 6c2231fe773e..4c7b7e5922f8 100644 --- a/code/__DEFINES/screen.dm +++ b/code/__DEFINES/screen.dm @@ -40,9 +40,9 @@ /// the bottom-left drawer position of inventory HUD #define SCREEN_LOC_MOB_HUD_INVENTORY_DRAWER "LEFT:6,BOTTOM:5" /// slot alignment for drawer-anchor -#define SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_DRAWER_ALIGNED(MAIN_AXIS, CROSS_AXIS) "LEFT+[MAIN_AXIS]:[6 + (MAIN_AXIS * 2)],BOTTOM+[CROSS_AXIS]:[5 + (CROSS_AXIS * 2)]" +#define SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_DRAWER_ALIGNED(MAIN_AXIS, CROSS_AXIS) "LEFT+[CROSS_AXIS]:[6 + (CROSS_AXIS * 2)],BOTTOM+[MAIN_AXIS]:[5 + (MAIN_AXIS * 2)]" /// slot alignment for hand-anchor -#define SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_HANDS_ALIGNED(MAIN_AXIS, CROSS_AXIS) "CENTER-1:[16 + (MAIN_AXIS > 0 ? (34 * (MAIN_AXIS + 1)) : (-34 * MAIN_AXIS))],BOTTOM+[CROSS_AXIS]:[5 + (CROSS_AXIS * 2)]" +#define SCREEN_LOC_MOB_HUD_INVENTORY_SLOT_HANDS_ALIGNED(MAIN_AXIS, CROSS_AXIS) "CENTER-1:[16 + (MAIN_AXIS > 0 ? (32 * (MAIN_AXIS + 1)) : (32 * MAIN_AXIS))],BOTTOM+[CROSS_AXIS]:[5 + (CROSS_AXIS * 2)]" //! < legacy stuff below > !// diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index e232d44a2485..d2fbedb53e9b 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -58,7 +58,7 @@ /datum/actor_hud/inventory/screens() . = ..() // slots - . += all_slot_screen_objects() + . += all_slot_screen_objects(hidden_classes, TRUE) // hands . += all_hand_screen_objects() // buttons @@ -113,7 +113,8 @@ stack_trace("failed to fetch slot during hud rebuild: [slot_id]") continue var/atom/movable/screen/actor_hud/inventory/plate/slot/slot_object = new /atom/movable/screen/actor_hud/inventory/plate/slot(null, src, slot, inventory_slots_with_mappings[slot_id] || list()) - add_screen(slot_object) + if(!hidden_classes[slot_object.inventory_hud_class]) + add_screen(slot_object) slots[slot_id] = slot_object // here is where we basically pull a CSS flexbox. @@ -139,7 +140,7 @@ inject_into = cross_axis_for_drawer[requested_cross_axis] if(INVENTORY_HUD_ANCHOR_TO_HANDS) var/list/relevant_cross_axis = slot_object.inventory_hud_main_axis > 0 ? cross_axis_for_hands_right : cross_axis_for_hands_left - var/requested_cross_axis = clamp(slot_object.inventory_hud_cross_axis, 0, 2) + 1 // 1 to 5 + var/requested_cross_axis = clamp(slot_object.inventory_hud_cross_axis, 0, 4) + 1 // 1 to 5 if(length(relevant_cross_axis) < requested_cross_axis) for(var/i in length(relevant_cross_axis) + 1 to requested_cross_axis) relevant_cross_axis[++relevant_cross_axis.len] = list() @@ -162,17 +163,19 @@ for(var/cross_axis in 1 to length(cross_axis_for_drawer)) var/list/cross_axis_list = cross_axis_for_drawer[cross_axis] + var/main_axis_bias = cross_axis == 1 ? 1 : 0 for(var/main_axis in 1 to length(cross_axis_list)) var/atom/movable/screen/actor_hud/inventory/plate/slot/aligning = cross_axis_list[main_axis] aligning.inventory_hud_cross_axis = cross_axis - 1 - aligning.inventory_hud_main_axis = main_axis - 1 + aligning.inventory_hud_main_axis = main_axis - 1 + main_axis_bias aligned += aligning for(var/cross_axis in 1 to length(cross_axis_for_hands_left)) var/list/cross_axis_list = cross_axis_for_hands_left[cross_axis] + var/add_for_inverse = -(length(cross_axis_list) + 1) for(var/main_axis in 1 to length(cross_axis_list)) var/atom/movable/screen/actor_hud/inventory/plate/slot/aligning = cross_axis_list[main_axis] aligning.inventory_hud_cross_axis = cross_axis - 1 - aligning.inventory_hud_main_axis = -main_axis + aligning.inventory_hud_main_axis = add_for_inverse + main_axis aligned += aligning for(var/cross_axis in 1 to length(cross_axis_for_hands_right)) var/list/cross_axis_list = cross_axis_for_hands_right[cross_axis] @@ -212,19 +215,25 @@ button_equip_hand?.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(number_of_hands) button_swap_hand?.screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(number_of_hands) -/datum/actor_hud/inventory/proc/all_slot_screen_objects(filter_by_class) +/** + * @params + * * filter_by_class - a singular, or a list, of inventory hud classes to filter by + * * inverse - get everything that isn't in the filter, instead of everything that is + */ +/datum/actor_hud/inventory/proc/all_slot_screen_objects(filter_by_class, inverse = FALSE) RETURN_TYPE(/list) . = list() if(filter_by_class) + inverse = !!inverse if(islist(filter_by_class)) for(var/id in slots) var/atom/movable/screen/actor_hud/inventory/plate/slot/slot_object = slots[id] - if(slot_object.inventory_hud_class in filter_by_class) + if((slot_object.inventory_hud_class in filter_by_class) != inverse) . += slot_object else for(var/id in slots) var/atom/movable/screen/actor_hud/inventory/plate/slot/slot_object = slots[id] - if(slot_object.inventory_hud_class == filter_by_class) + if((slot_object.inventory_hud_class == filter_by_class) != inverse) . += slot_object else for(var/id in slots) @@ -247,17 +256,25 @@ . += button_drawer /datum/actor_hud/inventory/proc/toggle_hidden_class(class, source) - var/list/atom/movable/screen/actor_hud/inventory/affected = all_slot_screen_objects(class) + var/list/atom/movable/screen/actor_hud/inventory/affected + var/something_changed if(class in hidden_classes) LAZYREMOVE(hidden_classes[class], source) if(!length(hidden_classes[class])) + affected = all_slot_screen_objects(class) add_screen(affected) hidden_classes -= class + something_changed = TRUE else if(!hidden_classes[class]) + affected = all_slot_screen_objects(class) remove_screen(affected) + something_changed = TRUE LAZYADD(hidden_classes[class], class) - button_drawer?.update_icon() + if(something_changed) + switch(class) + if(INVENTORY_HUD_CLASS_DRAWER) + button_drawer?.update_icon() /datum/actor_hud/inventory/proc/add_hidden_class(class, source) if(class in hidden_classes) @@ -359,6 +376,7 @@ /atom/movable/screen/actor_hud/inventory/plate/slot/Initialize(mapload, datum/actor_hud/inventory/hud, datum/inventory_slot/slot, list/slot_remappings) . = ..() inventory_slot_id = slot.id + icon_state = slot.inventory_hud_icon_state inventory_hud_class = slot_remappings[INVENTORY_SLOT_REMAP_CLASS] || slot.inventory_hud_class inventory_hud_main_axis = slot_remappings[INVENTORY_SLOT_REMAP_MAIN_AXIS] || slot.inventory_hud_main_axis inventory_hud_cross_axis = slot_remappings[INVENTORY_SLOT_REMAP_CROSS_AXIS] || slot.inventory_hud_cross_axis @@ -370,7 +388,14 @@ icon = style.inventory_icons_slot /atom/movable/screen/actor_hud/inventory/plate/slot/handle_inventory_click(mob/user, obj/item/with_item) - #warn impl + var/obj/item/in_slot = user.item_by_slot_id(inventory_slot_id) + if(with_item) + if(in_slot) + with_item.melee_interaction_chain(in_slot, user, NONE, list()) + else + user.equip_to_slot_if_possible(with_item, inventory_slot_id, NONE, user) + else + in_slot?.attack_hand(user, new /datum/event_args/actor/clickchain(user)) /** * Hand screen objects @@ -391,9 +416,7 @@ icon = style.inventory_icons /atom/movable/screen/actor_hud/inventory/plate/hand/handle_inventory_click(mob/user, obj/item/with_item) - if(!with_item) - hud.owner.swap_hand(hand_index) - #warn impl + hud.owner.swap_hand(hand_index) /atom/movable/screen/actor_hud/inventory/plate/hand/proc/sync_index(index = hand_index) screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND(index) diff --git a/code/game/rendering/hud_style.dm b/code/game/rendering/hud_style.dm index 72e57409d040..bb8b8b3fba6c 100644 --- a/code/game/rendering/hud_style.dm +++ b/code/game/rendering/hud_style.dm @@ -13,7 +13,7 @@ GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) /proc/legacy_find_hud_style_by_name(name) for(var/id in GLOB.hud_styles) var/datum/hud_style/style = GLOB.hud_styles[id] - if(style.name == name) + if(lowertext(style.name) == lowertext(name)) return style /** diff --git a/code/modules/mob/inventory/inventory_slot.dm b/code/modules/mob/inventory/inventory_slot.dm index 46bcadd53dda..5b5df236dec9 100644 --- a/code/modules/mob/inventory/inventory_slot.dm +++ b/code/modules/mob/inventory/inventory_slot.dm @@ -280,6 +280,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS inventory_hud_main_axis = -1 + inventory_hud_cross_axis = 0 inventory_hud_icon_state = "back" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS @@ -306,6 +307,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 1 + inventory_hud_cross_axis = 0 inventory_hud_icon_state = "uniform" inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER @@ -547,8 +549,9 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) display_name = "waist" display_preposition = "on" - inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER - inventory_hud_cross_axis = 4 + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS + inventory_hud_main_axis = -2 + inventory_hud_cross_axis = 0 inventory_hud_icon_state = "belt" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS @@ -585,6 +588,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS inventory_hud_main_axis = 1 + inventory_hud_cross_axis = 0 inventory_hud_icon_state = "pocket" /datum/inventory_slot/inventory/pocket/right @@ -595,6 +599,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS inventory_hud_main_axis = 2 + inventory_hud_cross_axis = 0 inventory_hud_icon_state = "pocket" /datum/inventory_slot/inventory/id @@ -605,8 +610,9 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) display_name = "badge" display_preposition = "as" - inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER - inventory_hud_cross_axis = 3 + inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_HANDS + inventory_hud_main_axis = -3 + inventory_hud_cross_axis = 0 inventory_hud_icon_state = "id" slot_equip_checks = SLOT_EQUIP_CHECK_USE_FLAGS @@ -641,7 +647,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) display_preposition = "on" inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER - inventory_hud_cross_axis = 3 + inventory_hud_cross_axis = 1 inventory_hud_icon_state = "shoes" inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER @@ -712,6 +718,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER inventory_hud_main_axis = 2 + inventory_hud_cross_axis = 0 inventory_hud_icon_state = "glasses" inventory_hud_class = INVENTORY_HUD_CLASS_DRAWER @@ -739,6 +746,7 @@ GLOBAL_LIST_EMPTY(inventory_slot_type_cache) display_preposition = "on" inventory_hud_anchor = INVENTORY_HUD_ANCHOR_TO_DRAWER + inventory_hud_main_axis = 0 inventory_hud_cross_axis = 2 inventory_hud_icon_state = "suit-store" From 18221e9b62df99e26ddf998f4af80d5c26b38aae Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:04:37 -0500 Subject: [PATCH 109/140] that --- code/game/rendering/actor_huds/actor_hud-screen_object.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/rendering/actor_huds/actor_hud-screen_object.dm b/code/game/rendering/actor_huds/actor_hud-screen_object.dm index 461d2d66ee4e..eebdde11a452 100644 --- a/code/game/rendering/actor_huds/actor_hud-screen_object.dm +++ b/code/game/rendering/actor_huds/actor_hud-screen_object.dm @@ -20,4 +20,4 @@ return ..() /atom/movable/screen/actor_hud/check_allowed(mob/user) - return ..() && hud.owner == user + return ..() && hud.actor == user From 96f53063463500158de572b67e90651232ecb7db Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 17 Nov 2024 09:20:24 -0500 Subject: [PATCH 110/140] all that --- code/__DEFINES/screen.dm | 2 +- .../rendering/actor_huds/huds/inventory.dm | 25 ++++++++++++++++++- code/game/rendering/hud_style.dm | 6 +++++ code/game/rendering/screen.dm | 5 +++- code/modules/mob/mob-inventory-abstraction.dm | 6 ++++- code/modules/mob/mob-inventory-internal.dm | 5 ++-- 6 files changed, 43 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/screen.dm b/code/__DEFINES/screen.dm index 4c7b7e5922f8..a3c302aa4143 100644 --- a/code/__DEFINES/screen.dm +++ b/code/__DEFINES/screen.dm @@ -32,7 +32,7 @@ //* Mob HUD - Inventory *// /// screen loc for a hand index -#define SCREEN_LOC_MOB_HUD_INVENTORY_HAND(HAND) "CENTER[index % 2? "-1" : ""]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" +#define SCREEN_LOC_MOB_HUD_INVENTORY_HAND(HAND) "CENTER[index % 2? "" : "-1"]:16,BOTTOM[index < 2? "" : "+[(round(index / 2) - 1)]"]:5" /// screen loc for hand swap button for a given number of hands #define SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(TOTAL_HANDS) "CENTER-1:28,BOTTOM+[ceil(TOTAL_HANDS - 2 / 2)]:5" /// screen loc for hand swap button for a given number of hands diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index d2fbedb53e9b..1f55fefdc284 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -46,11 +46,32 @@ return ..() /datum/actor_hud/inventory/proc/bind_to_inventory(datum/inventory/inventory) + ASSERT(!host) host = inventory LAZYADD(inventory.huds_using, src) rebuild(inventory.build_inventory_slots_with_remappings(), length(inventory.held_items)) + for(var/i in 1 to length(inventory.held_items)) + if(!inventory.held_items[i]) + continue + add_item(inventory.held_items[i], i) + for(var/slot_id in inventory.owner.get_inventory_slot_ids()) + var/obj/item/item_in_slot = inventory.owner.item_by_slot_id(slot_id) + if(!item_in_slot) + continue + add_item(item_in_slot, resolve_inventory_slot(slot_id)) + var/atom/movable/screen/actor_hud/inventory/plate/hand/active_hand_plate = inventory.owner.active_hand + active_hand_plate.add_overlay("[active_hand_plate.icon_state]-active") /datum/actor_hud/inventory/proc/unbind_from_inventory(datum/inventory/inventory) + for(var/i in 1 to length(inventory.held_items)) + if(!inventory.held_items[i]) + continue + remove_item(inventory.held_items[i], i) + for(var/slot_id in inventory.owner.get_inventory_slot_ids()) + var/obj/item/item_in_slot = inventory.owner.item_by_slot_id(slot_id) + if(!item_in_slot) + continue + remove_item(item_in_slot, resolve_inventory_slot(slot_id)) cleanup() LAZYREMOVE(inventory.huds_using, src) host = null @@ -72,11 +93,13 @@ var/list/atom/movable/screen/actor_hud/inventory/plate/slot/slot_objects = all_slot_screen_objects() remove_screen(slot_objects) QDEL_LIST(slot_objects) + slots = null // hands var/list/atom/movable/screen/actor_hud/inventory/plate/hand/hand_objects = all_hand_screen_objects() remove_screen(hand_objects) QDEL_LIST(hand_objects) + hands = null // buttons var/list/atom/movable/screen/actor_hud/inventory/button_objects = all_button_screen_objects() @@ -451,7 +474,7 @@ hud.toggle_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_DRAWER) /atom/movable/screen/actor_hud/inventory/drawer/update_icon_state() - icon_state = "[INVENTORY_HUD_CLASS_DRAWER in hud.hidden_classes ? "drawer" : "drawer-active"]" + icon_state = "[(INVENTORY_HUD_CLASS_DRAWER in hud.hidden_classes) ? "drawer" : "drawer-active"]" return ..() /** diff --git a/code/game/rendering/hud_style.dm b/code/game/rendering/hud_style.dm index bb8b8b3fba6c..559c5e839af5 100644 --- a/code/game/rendering/hud_style.dm +++ b/code/game/rendering/hud_style.dm @@ -71,33 +71,39 @@ GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) * midnight style just inherits defaults */ /datum/hud_style/midnight + name = "Midnight" id = "midnight" /datum/hud_style/orange + name = "Orange" id = "orange" inventory_icons = 'icons/screen/hud/orange/inventory.dmi' inventory_icons_slot = 'icons/screen/hud/orange/inventory-slot.dmi' inventory_icons_wide = 'icons/screen/hud/orange/inventory-wide.dmi' /datum/hud_style/old + name = "Retro" id = "old" inventory_icons = 'icons/screen/hud/old/inventory.dmi' inventory_icons_slot = 'icons/screen/hud/old/inventory-slot.dmi' inventory_icons_wide = 'icons/screen/hud/old/inventory-wide.dmi' /datum/hud_style/white + name = "White" id = "white" inventory_icons = 'icons/screen/hud/white/inventory.dmi' inventory_icons_slot = 'icons/screen/hud/white/inventory-slot.dmi' inventory_icons_wide = 'icons/screen/hud/white/inventory-wide.dmi' /datum/hud_style/minimalist + name = "Minimalist" id = "minimalist" inventory_icons = 'icons/screen/hud/minimalist/inventory.dmi' inventory_icons_slot = 'icons/screen/hud/minimalist/inventory-slot.dmi' inventory_icons_wide = 'icons/screen/hud/minimalist/inventory-wide.dmi' /datum/hud_style/hologram + name = "Holographic" id = "hologram" inventory_icons = 'icons/screen/hud/hologram/inventory.dmi' inventory_icons_slot = 'icons/screen/hud/hologram/inventory-slot.dmi' diff --git a/code/game/rendering/screen.dm b/code/game/rendering/screen.dm index 2e44c6f06966..ab50acad8486 100644 --- a/code/game/rendering/screen.dm +++ b/code/game/rendering/screen.dm @@ -17,7 +17,10 @@ master = null return ..() -//* Default Click Handling *// +//* Default Click Handling *// +//* At this point in time, all new screen objects should be able to self-sanitize their inputs. *// +//* This is to prevent security holes from happening when we eventually add the ability to *// +//* observe another player's POV, including their full UI. *// /atom/movable/screen/Click(location, control, params) if(!check_allowed(usr)) diff --git a/code/modules/mob/mob-inventory-abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm index 09d557679447..7522fdf54219 100644 --- a/code/modules/mob/mob-inventory-abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -181,6 +181,7 @@ // already in inv if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags)) return FALSE + log_inventory("equip-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)]) from slot [existing_slot]") else // newly eqiupped var/atom/old_loc = I.loc @@ -189,9 +190,10 @@ if(I.loc != src) return FALSE I.pickup(src, flags, old_loc) - I.equipped(src, SLOT_ID_HANDS, flags) log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") + I.held_index = index + I.equipped(src, SLOT_ID_HANDS, flags) inventory.held_items[index] = I inventory.on_item_entered(I, index) @@ -218,6 +220,7 @@ inventory.held_items[index] = null inventory.on_item_exited(I, index) + I.held_index = null I.unequipped(src, SLOT_ID_HANDS, flags) /** @@ -229,5 +232,6 @@ inventory.held_items[old_index] = null inventory.held_items[index] = I + I.held_index = index inventory.on_item_swapped(I, old_index, index) diff --git a/code/modules/mob/mob-inventory-internal.dm b/code/modules/mob/mob-inventory-internal.dm index a8c4a05ff0bc..0f603ffb8c8f 100644 --- a/code/modules/mob/mob-inventory-internal.dm +++ b/code/modules/mob/mob-inventory-internal.dm @@ -135,9 +135,10 @@ /mob/proc/_unequip_slot(slot, flags) SHOULD_NOT_OVERRIDE(TRUE) + var/obj/item/old = _item_by_slot(slot) . = _set_inv_slot(slot, null, flags) != INVENTORY_SLOT_DOES_NOT_EXIST if(.) - inventory.on_item_exited(., resolve_inventory_slot(slot)) + inventory.on_item_exited(old, resolve_inventory_slot(slot)) /** * handles removing an item from our hud @@ -219,7 +220,7 @@ SHOULD_NOT_OVERRIDE(TRUE) . = _set_inv_slot(slot, I, flags) != INVENTORY_SLOT_DOES_NOT_EXIST if(.) - inventory.on_item_entered(., resolve_inventory_slot(slot)) + inventory.on_item_entered(I, resolve_inventory_slot(slot)) //* Slot Change *// From 6f4daf4d17c2308029d9521b20a5d6d612e1d9a1 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:47:27 -0500 Subject: [PATCH 111/140] fix that --- code/game/objects/items-interaction.dm | 2 +- code/game/rendering/actor_huds/huds/inventory.dm | 2 +- .../modules/mob/inventory/inventory-hands-put.dm | 16 ++++++++++++---- code/modules/mob/mob-inventory-abstraction.dm | 4 ++++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items-interaction.dm b/code/game/objects/items-interaction.dm index 3f601a5ea584..3481c62b03b8 100644 --- a/code/game/objects/items-interaction.dm +++ b/code/game/objects/items-interaction.dm @@ -89,7 +89,7 @@ if(isnull(actually_picked_up)) to_chat(user, SPAN_WARNING("[src] somehow slips through your grasp. What just happened?")) return - if(!user.put_in_hands(actually_picked_up)) + if(!user.put_in_hands(actually_picked_up, user.active_hand)) if(has_to_drop_to_ground_on_fail) actually_picked_up.forceMove(user.drop_location()) return diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 1f55fefdc284..656322b0c962 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -59,7 +59,7 @@ if(!item_in_slot) continue add_item(item_in_slot, resolve_inventory_slot(slot_id)) - var/atom/movable/screen/actor_hud/inventory/plate/hand/active_hand_plate = inventory.owner.active_hand + var/atom/movable/screen/actor_hud/inventory/plate/hand/active_hand_plate = hands[inventory.owner.active_hand] active_hand_plate.add_overlay("[active_hand_plate.icon_state]-active") /datum/actor_hud/inventory/proc/unbind_from_inventory(datum/inventory/inventory) diff --git a/code/modules/mob/inventory/inventory-hands-put.dm b/code/modules/mob/inventory/inventory-hands-put.dm index fe2fa3a6bfc2..2e0398f04517 100644 --- a/code/modules/mob/inventory/inventory-hands-put.dm +++ b/code/modules/mob/inventory/inventory-hands-put.dm @@ -13,7 +13,7 @@ /mob/proc/put_in_hand(obj/item/I, index, inv_op_flags) return inventory?.put_in_hand(I, index, inv_op_flags) -/datum/inventory/proc/put_in_hands(obj/item/I, inv_op_flags) +/datum/inventory/proc/put_in_hands(obj/item/I, inv_op_flags, prioritize_index) if(is_holding(I)) return INV_RETURN_SUCCESS @@ -24,9 +24,17 @@ to_chat(src, SPAN_NOTICE("Your [held_stack] stack now contains [held_stack.get_amount()] [held_stack.singular_name]\s.")) return INV_RETURN_SUCCESS + if(prioritize_index) + var/priority_result = put_in_hand(I, i, inv_op_flags) + switch(priority_result) + if(INV_RETURN_FAILED) + else + return priority_result + for(var/i in 1 to length(held_items)) + if(i == prioritize_index) + continue var/result = put_in_hand(I, i, inv_op_flags) - switch(result) if(INV_RETURN_FAILED) else @@ -34,8 +42,8 @@ return INV_RETURN_FAILED -/mob/proc/put_in_hands(obj/item/I, inv_op_flags) - return inventory?.put_in_hands(I, inv_op_flags) +/mob/proc/put_in_hands(obj/item/I, inv_op_flags, prioritize_index) + return inventory?.put_in_hands(I, inv_op_flags, prioritize_index) /** * puts an item in hands or forcemoves to drop_loc diff --git a/code/modules/mob/mob-inventory-abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm index 7522fdf54219..d37d9a777794 100644 --- a/code/modules/mob/mob-inventory-abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -209,6 +209,8 @@ else I.add_hiddenprint(src) + return TRUE + /** * get something out of our hand * @@ -223,6 +225,8 @@ I.held_index = null I.unequipped(src, SLOT_ID_HANDS, flags) + return TRUE + /** * handle swapping item from one hand index to another */ From 5b3bda439ba57bb0682877e5556fec27ddfe17b2 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:47:29 -0500 Subject: [PATCH 112/140] fix that --- code/modules/mob/inventory/inventory-hands-put.dm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/inventory/inventory-hands-put.dm b/code/modules/mob/inventory/inventory-hands-put.dm index 2e0398f04517..36dbbd501897 100644 --- a/code/modules/mob/inventory/inventory-hands-put.dm +++ b/code/modules/mob/inventory/inventory-hands-put.dm @@ -13,7 +13,13 @@ /mob/proc/put_in_hand(obj/item/I, index, inv_op_flags) return inventory?.put_in_hand(I, index, inv_op_flags) -/datum/inventory/proc/put_in_hands(obj/item/I, inv_op_flags, prioritize_index) +/** + * @params + * * I - the item + * * inv_op_flags - inventory operation flags + * * prioritize_index - try that index first; defaults to the inventory owner's active hand, if any. set to `0` (not null!) to prioritize none. + */ +/datum/inventory/proc/put_in_hands(obj/item/I, inv_op_flags, prioritize_index = owner.acitve_hand) if(is_holding(I)) return INV_RETURN_SUCCESS @@ -42,6 +48,12 @@ return INV_RETURN_FAILED +/** + * @params + * * I - the item + * * inv_op_flags - inventory operation flags + * * prioritize_index - try that index first; defaults to the inventory owner's active hand, if any. set to `0` (not null!) to prioritize none. + */ /mob/proc/put_in_hands(obj/item/I, inv_op_flags, prioritize_index) return inventory?.put_in_hands(I, inv_op_flags, prioritize_index) From c81818b8a2101fc22a128f4023de9ae05f97178d Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:51:43 -0500 Subject: [PATCH 113/140] add that.. --- code/modules/mob/mob-inventory-abstraction.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/mob-inventory-abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm index d37d9a777794..66eaaa836c1f 100644 --- a/code/modules/mob/mob-inventory-abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -225,6 +225,9 @@ I.held_index = null I.unequipped(src, SLOT_ID_HANDS, flags) + if(!(flags & INV_OP_NO_UPDATE_ICONS)) + update_inv_hand(index) + return TRUE /** From 1e588a5e30c0cb148223e47c9e7ff7978e323c91 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:51:54 -0500 Subject: [PATCH 114/140] add that.. --- code/modules/mob/mob-inventory-abstraction.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/mob-inventory-abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm index 66eaaa836c1f..36dcfe68fc1f 100644 --- a/code/modules/mob/mob-inventory-abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -242,3 +242,7 @@ I.held_index = index inventory.on_item_swapped(I, old_index, index) + + if(!(flags & INV_OP_NO_UPDATE_ICONS)) + update_inv_hand(old_index) + update_inv_hand(index) From a496ce40710d587636d6e7c047936a3b8304f862 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:57:18 -0500 Subject: [PATCH 115/140] that --- code/modules/mob/inventory/inventory-hands-put.dm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/inventory/inventory-hands-put.dm b/code/modules/mob/inventory/inventory-hands-put.dm index 36dbbd501897..b5799ca1698f 100644 --- a/code/modules/mob/inventory/inventory-hands-put.dm +++ b/code/modules/mob/inventory/inventory-hands-put.dm @@ -14,12 +14,18 @@ return inventory?.put_in_hand(I, index, inv_op_flags) /** + * **Warning**: `prioritize_index` is patched to support legacy behavior by defaulting to owner active hand. + * This may be removed at any time. Besure to specify the index if you need this behavior. + * * @params * * I - the item * * inv_op_flags - inventory operation flags * * prioritize_index - try that index first; defaults to the inventory owner's active hand, if any. set to `0` (not null!) to prioritize none. */ -/datum/inventory/proc/put_in_hands(obj/item/I, inv_op_flags, prioritize_index = owner.acitve_hand) +/datum/inventory/proc/put_in_hands(obj/item/I, inv_op_flags, prioritize_index) + if(isnull(prioritize_index)) + prioritize_index = owner.active_hand + if(is_holding(I)) return INV_RETURN_SUCCESS @@ -31,7 +37,7 @@ return INV_RETURN_SUCCESS if(prioritize_index) - var/priority_result = put_in_hand(I, i, inv_op_flags) + var/priority_result = put_in_hand(I, prioritize_index, inv_op_flags) switch(priority_result) if(INV_RETURN_FAILED) else @@ -49,6 +55,9 @@ return INV_RETURN_FAILED /** + * **Warning**: `prioritize_index` is patched to support legacy behavior by defaulting to owner active hand. + * This may be removed at any time. Besure to specify the index if you need this behavior. + * * @params * * I - the item * * inv_op_flags - inventory operation flags From 8be515303e4f6f77d57c53904f38c4dc104920d9 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 17 Nov 2024 14:17:27 -0500 Subject: [PATCH 116/140] don't need to mess with that anymore --- code/game/atoms/_atom.dm | 1 + code/game/objects/items-inventory.dm | 1 - code/game/objects/items.dm | 6 +++++- code/modules/mob/living/silicon/pai/pai.dm | 2 +- code/modules/mob/mob_defines.dm | 1 - 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/code/game/atoms/_atom.dm b/code/game/atoms/_atom.dm index 9acd46a99942..08dfd3014cb8 100644 --- a/code/game/atoms/_atom.dm +++ b/code/game/atoms/_atom.dm @@ -913,6 +913,7 @@ // base layer being null isn't layer = base_layer + 0.001 * relative_layer +// todo: deprecate this /atom/proc/hud_layerise() plane = INVENTORY_PLANE set_base_layer(HUD_LAYER_ITEM) diff --git a/code/game/objects/items-inventory.dm b/code/game/objects/items-inventory.dm index 51ca0654dc11..fb41848ddf32 100644 --- a/code/game/objects/items-inventory.dm +++ b/code/game/objects/items-inventory.dm @@ -142,7 +142,6 @@ //! LEGACY reset_pixel_offsets() - hud_layerise() // todo: should this be here transform = null if(isturf(oldLoc) && !(flags & (INV_OP_SILENT | INV_OP_DIRECTLY_EQUIPPING))) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 400f25679cd4..e4a3ed586c63 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -84,10 +84,14 @@ /// These flags are listed in [code/__DEFINES/_flags/interaction_flags.dm] var/interaction_flags_item = INTERACT_ITEM_ATTACK_SELF - //* Inventory - Main + //* Inventory *// /// currently equipped slot id + /// + /// todo: `worn_slot_or_index` var/worn_slot /// current hand index, if held in hand + /// + /// todo: `worn_slot_or_index` var/held_index /** * current item we fitted over diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 19c7654659b2..e2defee3997a 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -466,7 +466,7 @@ A.update_buttons() /mob/living/silicon/pai/proc/update_chassis_actions() - for(var/datum/action/pai/A in actions) + for(var/datum/action/pai/A in actions_to_grant) if(A.update_on_chassis_change) A.update_buttons() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 6f5eb2373b94..93d40d40da3f 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -163,7 +163,6 @@ var/next_move = null // For click delay, despite the misleading name. - var/list/datum/action/actions = list() var/atom/movable/screen/hands = null var/atom/movable/screen/pullin = null var/atom/movable/screen/purged = null From 675dd89f4b48c720f1788da6ef63cfce42eb5c70 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 17 Nov 2024 14:41:47 -0500 Subject: [PATCH 117/140] hell. --- code/modules/mob/mob-hands.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index 67aeaee33e43..257e1753ee91 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -189,5 +189,6 @@ client?.actor_huds?.inventory?.swap_active_hand(old_index, to_index) //! LEGACY - was_active?.zoom() + if(was_active.zoom) + was_active?.zoom() //! End From 9169bd4f45b23f6ef3a2a8f7966c46cbf61157cc Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 17 Nov 2024 14:46:51 -0500 Subject: [PATCH 118/140] sigh. --- code/game/rendering/hud_style.dm | 2 +- code/modules/mob/mob-hands.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/rendering/hud_style.dm b/code/game/rendering/hud_style.dm index 559c5e839af5..58be182cf796 100644 --- a/code/game/rendering/hud_style.dm +++ b/code/game/rendering/hud_style.dm @@ -13,7 +13,7 @@ GLOBAL_LIST_INIT(hud_styles, init_hud_styles()) /proc/legacy_find_hud_style_by_name(name) for(var/id in GLOB.hud_styles) var/datum/hud_style/style = GLOB.hud_styles[id] - if(lowertext(style.name) == lowertext(name)) + if(lowertext(style.name) == lowertext(name) || lowertext(style.id) == lowertext(name)) return style /** diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index 257e1753ee91..79767ea14944 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -189,6 +189,6 @@ client?.actor_huds?.inventory?.swap_active_hand(old_index, to_index) //! LEGACY - if(was_active.zoom) + if(was_active?.zoom) was_active?.zoom() //! End From 0241cc6cf361cbe9cc66b1765f4173631250e8b2 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 17 Nov 2024 23:07:41 -0500 Subject: [PATCH 119/140] fix --- .../rendering/actor_huds/huds/inventory.dm | 5 ----- code/modules/client/client_procs.dm | 19 +++++++------------ 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 656322b0c962..7b5281b29f21 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -27,11 +27,6 @@ /// equip object var/atom/movable/screen/actor_hud/inventory/equip_hand/button_equip_hand -/datum/actor_hud/inventory/Destroy() - host = null - cleanup() - return ..() - /datum/actor_hud/inventory/on_mob_bound(mob/target) // we don't have a hook for 'on inventory init', // so we can't init it lazily; we init it immediately. diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4de3c5f6122b..bb1edf8d647a 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -221,22 +221,18 @@ preferences.on_reconnect() //? END ?// - //* Create UI *// + //* Create interface UI *// // todo: move top level menu here, for now it has to be under prefs. - // Instantiate statpanel tgui_stat = new(src, SKIN_BROWSER_ID_STAT) - // Instantiate tgui panel tgui_panel = new(src, SKIN_BROWSER_ID_CHAT) // Instantiate cutscene system spawn(1) init_cutscene_system() - // instantiate tooltips tooltips = new(src) - // make action drawer + + //* Setup on-map HUDs *// action_drawer = new(src) - // make actor HUDs actor_huds = new(src) - // make action holder action_holder = new /datum/action_holder/client_actor(src) action_drawer.register_holder(action_holder) @@ -436,20 +432,19 @@ active_mousedown_item = null - //* cleanup rendering - // clear perspective + //* Cleanup rendering *// if(using_perspective) set_perspective(null) - // clear HUDs clear_atom_hud_providers() - //* cleanup client UI *// + //* Cleanup interface UI *// QDEL_NULL(tgui_stat) cleanup_cutscene_system() QDEL_NULL(tgui_panel) QDEL_NULL(tooltips) - //* cleanup map UI *// + //* Cleanup on-map HUDs *// + QDEL_NULL(actor_huds) QDEL_NULL(action_holder) QDEL_NULL(action_drawer) From 384f2d6ec304d6f6011207a7194497ab66c40f3d Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 00:19:46 -0500 Subject: [PATCH 120/140] That --- code/modules/mob/mob-inventory-abstraction.dm | 6 +++--- code/modules/mob/mob-inventory-internal.dm | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/mob-inventory-abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm index 36dcfe68fc1f..f73388336450 100644 --- a/code/modules/mob/mob-inventory-abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -189,11 +189,11 @@ I.forceMove(src) if(I.loc != src) return FALSE - I.pickup(src, flags, old_loc) log_inventory("pickup-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)])") + I.held_index = index + I.pickup(src, flags, old_loc) + I.equipped(src, SLOT_ID_HANDS, flags) - I.held_index = index - I.equipped(src, SLOT_ID_HANDS, flags) inventory.held_items[index] = I inventory.on_item_entered(I, index) diff --git a/code/modules/mob/mob-inventory-internal.dm b/code/modules/mob/mob-inventory-internal.dm index 0f603ffb8c8f..b3421051cdb8 100644 --- a/code/modules/mob/mob-inventory-internal.dm +++ b/code/modules/mob/mob-inventory-internal.dm @@ -232,7 +232,7 @@ * * return true/false based on if we succeeded */ -/mob/proc/_handle_item_reequip(obj/item/I, slot, old_slot, flags, mob/user = src) +/mob/proc/_handle_item_reequip(obj/item/I, slot, old_slot, flags, mob/user = src, hand_index) ASSERT(slot) if(!old_slot) // DO NOT USE _slot_by_item - at this point, the item has already been var-set into the new slot! @@ -263,6 +263,7 @@ // TODO: HANDLE DELETIONS ON EQUIPPED PROPERLY, INCLUDING ON HANDS // ? we don't do this on hands, hand procs do it // _equip_slot(I, slot, update_icons) + I.held_index = hand_index I.equipped(src, slot, flags) log_inventory("[key_name(src)] moved [I] from [old_slot] to hands.") // hand procs handle rest From eaafc65fc3c608f460032aa7a88623e0230c871a Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 00:19:55 -0500 Subject: [PATCH 121/140] sigh --- code/modules/mob/mob-inventory-abstraction.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/mob-inventory-abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm index f73388336450..410d4f5d9f1e 100644 --- a/code/modules/mob/mob-inventory-abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -179,7 +179,7 @@ else if(existing_slot) // already in inv - if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags)) + if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags, index)) return FALSE log_inventory("equip-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)]) from slot [existing_slot]") else From 79949c27a6dbae860cd4e8e92d8c147a9708a141 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 00:44:39 -0500 Subject: [PATCH 122/140] fixing a bug in an entirely unrelated pr to avoid a merge conflict ftw --- code/game/objects/structures/crates_lockers/__closet.dm | 6 ++++++ code/modules/mob/mob-inventory-abstraction.dm | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/crates_lockers/__closet.dm b/code/game/objects/structures/crates_lockers/__closet.dm index d3597b1c215e..7cad5fa08288 100644 --- a/code/game/objects/structures/crates_lockers/__closet.dm +++ b/code/game/objects/structures/crates_lockers/__closet.dm @@ -25,6 +25,7 @@ var/breakout_time = 2 //2 minutes by default breakout_sound = 'sound/effects/grillehit.ogg' //Sound that plays while breaking out + // todo: why the fuck is this in terms of mob defines?? this is stupid. var/storage_capacity = 2 * MOB_MEDIUM //This is so that someone can't pack hundreds of items in a locker/crate //then open it in a populated area to crash clients. var/storage_cost = 40 //How much space this closet takes up if it's stuffed in another closet @@ -52,6 +53,8 @@ //! legacy /// override attackby and anything else closet-like var/not_actually_a_closet = FALSE + /// was made at mapload + var/was_made_at_mapload //! end /obj/structure/closet/Initialize(mapload, singleton/closet_appearance/use_closet_appearance) @@ -61,6 +64,7 @@ if(!isnull(use_closet_appearance)) src.closet_appearance = use_closet_appearance legacy_spawn_contents() + was_made_at_mapload = mapload /* if(secure) lockerelectronics = new(src) @@ -79,6 +83,8 @@ icon = app.icon color = null update_icon() + if(was_made_at_mapload && !opened) + take_contents() /obj/structure/closet/proc/update_icon_old() if(!opened) diff --git a/code/modules/mob/mob-inventory-abstraction.dm b/code/modules/mob/mob-inventory-abstraction.dm index 410d4f5d9f1e..b9f6ee115cf1 100644 --- a/code/modules/mob/mob-inventory-abstraction.dm +++ b/code/modules/mob/mob-inventory-abstraction.dm @@ -179,7 +179,7 @@ else if(existing_slot) // already in inv - if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags, index)) + if(!_handle_item_reequip(I, SLOT_ID_HANDS, existing_slot, flags, src, index)) return FALSE log_inventory("equip-to-hand: keyname [key_name(src)] index [index] item [I]([ref(I)]) from slot [existing_slot]") else From 9fcf6ecdc2b2b1bf9e28e97a520e97676c8226f0 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:27:21 -0500 Subject: [PATCH 123/140] fix --- icons/mob/screen/orange.dmi | Bin 50872 -> 45900 bytes icons/mob/screen/white.dmi | Bin 45065 -> 41202 bytes icons/screen/hud/midnight/inventory.dmi | Bin 4188 -> 4241 bytes icons/screen/hud/orange/inventory.dmi | Bin 3237 -> 4439 bytes icons/screen/hud/white/inventory.dmi | Bin 2354 -> 1596 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/screen/orange.dmi b/icons/mob/screen/orange.dmi index fc98b1cedab873e53da1030debfeae084b85d054..3778a7fd9c89c1c356b1fdd7286bcc9b09a8e79d 100644 GIT binary patch literal 45900 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%0A_hXqKEfhY? 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 diff --git a/icons/mob/screen/white.dmi b/icons/mob/screen/white.dmi index 42cc4dc9cbbd11acc1f4ce0e63fc3cc5be5e2d3e..25eb215f36b21d839cb42ae81ee01b1011a30036 100644 GIT binary patch literal 41202 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 literal 4188 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 literal 3237 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 X%?2q-Tb==$00000NkvXXu0mjfmYqFK diff --git a/icons/screen/hud/white/inventory.dmi b/icons/screen/hud/white/inventory.dmi index 6666b8cf1f008c214bad2c655d773bf3dea82ddc..0bfcec299192fc5390eca63dd5ff2d6b674204b5 100644 GIT binary patch delta 1454 zcmV;f1yTC461)tM7k^*~0{{R3)kcR30001TP)t-sz`(#xPEN?k$T>MVadB}-NJv;% zSYu;jZEbD8zrS{NcEiKNe0+R;eSKzTW@>6`LqkKNqN1m#r=+B$x3{;ds;Y&Bg}J%8 zR#sN9u&|k#nZ3Qeo12>!78c&#-s|h@larH`m6eK$imk1!)*9B6jNNzj3PA5nAwAd6}ssULuvQj@E0R8e5#t z!{7MkJik5|Q2#XK8KZf({M6WbwIMK;2gVo#nvfVGY_I`Wc@UU?%0ZzQpfubCg?~~y z2vB6zR2s{J$QYvliFc6@Mv|Be0_4INyJ%_+<$*bWBG3SwSp*1!z&T1Y!gL500_GsN zun)2jq$#{jULhFrEd&w!b*3```~1buz6ls369HkD3mXX%j3We?uMkj-c@oYu0o8?z zK(mSn$+C=0Lyi4^oCvl951}Q{?QN;6H@JW2>;d+jslE`yD6srWA{2c+wa+ap) zt>Aa1hcf{ocV66}63eqVQ3$m8D*{S6mSc9o4FnM{raC;NDuI%(5+s>;q+_srT=Z*# zgnZ;|s__sX3V}XduOd2i;qgc-s6nr5f-6iBtFUYU(5<3v{(c{jdj+LXqhe__ba73c`HYE(DsvDCL`WYMJQVtUu*u&OBv}q+zi}m2H7AKeKzLo@8vG59 zd6w)6bomN@fw(aqe-^A?$-8|Jap+m`8FO|MdV)E>;+jriMP*qYz7I46aXg*)^TDY*O;@4b2fKXpjix8immeT7 zbaA=StmT2Zd=$`MSrE-2;3yA_2&3`(aqIZg=GPv7Csze`zQg~Y-VGw9lvPM1S95`!j*!|FhQ! zL|3=)12fP+cQ6S<|4%D|jsJg%pzOG;VQ_GNcyI7r%c3j$2{_FJMC<<#3beJ5FgRl} zypp1B$s#a}|JMJ%M9`r?x&#Vzr9z(-c-w%T)r{2ZOaaZqwMJC}ojneQZyoVujKjt#KmZ?(qbYd*mCJq(Oax6xzrVk!MF6j~ z!pr3fQfqlfYsfPosdt|2yWu z8CLJwxL48tA*=)BqkV_Je_z1i?>z{A*!{f^0jt0FAz=0QUI=Xd-V1@v-+Ljj`Fl?U zW`FOC!07LN2w45S7Xq8V_aR{Q_dW!y{@#ax)!+LNu=;x+0#<+TL%{0qe@wt9fz{vp z5U~1t9|Bf???b@q?|leZ{k;bPyT5;5z~S#bDEy>v{13!GJK7$g;dz@X0000907*qo IM6N<$f}gIiI{*Lx delta 2218 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 From 3bee49252dca3496402f220f43df3f6fb8285bf1 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 18:45:58 +0000 Subject: [PATCH 124/140] runtime fixes and markers --- code/__HELPERS/unsorted.dm | 3 ++- code/game/objects/items/weapons/implants/neuralbasic.dm | 2 +- code/modules/loadout/loadout_entry.dm | 2 ++ code/modules/tgui/tgui.dm | 2 ++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 33a67bc10f00..96cb0f30f932 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -406,7 +406,8 @@ var/list/creatures = list() var/list/namecounts = list() for(var/mob/M in mobs) - if(isobserver(M) && ghostfollow && M.client.is_under_stealthmin() && M.get_preference_toggle(/datum/game_preference_toggle/admin/stealth_hides_ghost)) + // todo: stealthmin will **break** when they're logged out. we don't want this! it's a hard tell. + if(isobserver(M) && ghostfollow && M.client?.is_under_stealthmin() && M.get_preference_toggle(/datum/game_preference_toggle/admin/stealth_hides_ghost)) continue var/name = M.name if (name in names) diff --git a/code/game/objects/items/weapons/implants/neuralbasic.dm b/code/game/objects/items/weapons/implants/neuralbasic.dm index 30d050a315c2..5b97874c9825 100644 --- a/code/game/objects/items/weapons/implants/neuralbasic.dm +++ b/code/game/objects/items/weapons/implants/neuralbasic.dm @@ -16,7 +16,7 @@ my_brain.implant_assist(target_state) if(H.isSynthetic() && H.get_FBP_type() != FBP_CYBORG) //If this on an FBP, it's just an extra inefficient attachment to whatever their brain is. robotic_brain = TRUE - if(my_brain && my_brain.can_assist()) + if(istype(my_brain) && my_brain.can_assist()) START_PROCESSING(SSobj, src) /obj/item/implant/neural/Destroy() diff --git a/code/modules/loadout/loadout_entry.dm b/code/modules/loadout/loadout_entry.dm index de91d7ea0b29..213281ef066c 100644 --- a/code/modules/loadout/loadout_entry.dm +++ b/code/modules/loadout/loadout_entry.dm @@ -95,6 +95,8 @@ var/list/gear_datums = list() where = tweak.tweak_spawn_location(where, tweak_data) path = tweak.tweak_spawn_path(path, tweak_data) tweak_assembled[tweak] = tweak_data + if(!path) + CRASH("[src] ([src.type]) attempted to spawn a null path with data: '[json_encode(entry_data)]'.") var/obj/item/spawned = new path(where) if((loadout_customize_flags & LOADOUT_CUSTOMIZE_NAME) && entry_data[LOADOUT_ENTRYDATA_RENAME]) spawned.name = entry_data[LOADOUT_ENTRYDATA_RENAME] diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 533d3ecb9df4..90fcaa9f82db 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -135,6 +135,8 @@ * * Separate from open() so that open() can be non-blocking. */ /datum/tgui/proc/initialize(data, modules) + // todo: this is a blocking proc. src_object can be deleted at any time between the blocking procs. + // we need sane handling of deletion order, of runtimes happen. if(!window.is_ready()) window.initialize( strict_mode = TRUE, From 6a33d4e44461c08f55b7c791fb7d7a6ccc8ca803 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 18:50:31 +0000 Subject: [PATCH 125/140] lohikar was right --- citadel.dme | 1 - code/__DEFINES/datums/event_args.dm | 5 ----- code/game/click/context.dm | 2 -- code/game/objects/items/melee/types/transforming.dm | 4 ---- code/game/objects/items/shield/types/transforming.dm | 4 ---- code/modules/mob/mob-inventory.dm | 2 +- 6 files changed, 1 insertion(+), 17 deletions(-) delete mode 100644 code/__DEFINES/datums/event_args.dm diff --git a/citadel.dme b/citadel.dme index 34b88ce7c205..acc366200deb 100644 --- a/citadel.dme +++ b/citadel.dme @@ -169,7 +169,6 @@ #include "code\__DEFINES\controllers\timer.dm" #include "code\__DEFINES\datums\beam.dm" #include "code\__DEFINES\datums\design.dm" -#include "code\__DEFINES\datums\event_args.dm" #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\components\riding.dm" diff --git a/code/__DEFINES/datums/event_args.dm b/code/__DEFINES/datums/event_args.dm deleted file mode 100644 index 2fa589bf4e6f..000000000000 --- a/code/__DEFINES/datums/event_args.dm +++ /dev/null @@ -1,5 +0,0 @@ -//* This file is explicitly licensed under the MIT license. *// -//* Copyright (c) 2024 silicons *// - -// make sure a var that is either event_args/actor or a single mob/user is event args; if it's not -#define E_ARGS_WRAP_USER_TO_ACTOR(USER) USER = ismob(USER)? new /datum/event_args/actor(USER) : USER diff --git a/code/game/click/context.dm b/code/game/click/context.dm index e9ab863450c5..72d679aa17f7 100644 --- a/code/game/click/context.dm +++ b/code/game/click/context.dm @@ -31,8 +31,6 @@ */ /atom/proc/context_menu(datum/event_args/actor/e_args) set waitfor = FALSE - // admin proccall support - E_ARGS_WRAP_USER_TO_ACTOR(e_args) // todo: dynamically rebuild menu based on distance? var/client/receiving = e_args.initiator.client if(isnull(receiving)) diff --git a/code/game/objects/items/melee/types/transforming.dm b/code/game/objects/items/melee/types/transforming.dm index 837f697309d9..940112738ae3 100644 --- a/code/game/objects/items/melee/types/transforming.dm +++ b/code/game/objects/items/melee/types/transforming.dm @@ -128,8 +128,6 @@ * actor can be /datum/event_args/actor or a single mob. */ /obj/item/melee/transforming/proc/on_activate(datum/event_args/actor/actor, silent) - E_ARGS_WRAP_USER_TO_ACTOR(actor) - damage_force = VALUE_OR_DEFAULT(active_damage_force, initial(damage_force)) damage_tier = VALUE_OR_DEFAULT(active_damage_tier, initial(damage_tier)) damage_mode = VALUE_OR_DEFAULT(active_damage_mode, initial(damage_mode)) @@ -154,8 +152,6 @@ * actor can be /datum/event_args/actor or a single mob. */ /obj/item/melee/transforming/proc/on_deactivate(datum/event_args/actor/actor, silent) - E_ARGS_WRAP_USER_TO_ACTOR(actor) - damage_force = VALUE_OR_DEFAULT(inactive_damage_force, initial(damage_force)) damage_tier = VALUE_OR_DEFAULT(inactive_damage_tier, initial(damage_tier)) damage_mode = VALUE_OR_DEFAULT(inactive_damage_mode, initial(damage_mode)) diff --git a/code/game/objects/items/shield/types/transforming.dm b/code/game/objects/items/shield/types/transforming.dm index d60a18805403..af589fbe73d6 100644 --- a/code/game/objects/items/shield/types/transforming.dm +++ b/code/game/objects/items/shield/types/transforming.dm @@ -81,8 +81,6 @@ * actor can be /datum/event_args/actor or a single mob. */ /obj/item/shield/transforming/proc/on_activate(datum/event_args/actor/actor, silent) - E_ARGS_WRAP_USER_TO_ACTOR(actor) - damage_force = VALUE_OR_DEFAULT(active_damage_force, initial(damage_force)) set_weight_class(VALUE_OR_DEFAULT(active_weight_class, initial(w_class))) @@ -97,8 +95,6 @@ * actor can be /datum/event_args/actor or a single mob. */ /obj/item/shield/transforming/proc/on_deactivate(datum/event_args/actor/actor, silent) - E_ARGS_WRAP_USER_TO_ACTOR(actor) - damage_force = VALUE_OR_DEFAULT(inactive_damage_force, initial(damage_force)) set_weight_class(VALUE_OR_DEFAULT(inactive_weight_class, initial(w_class))) diff --git a/code/modules/mob/mob-inventory.dm b/code/modules/mob/mob-inventory.dm index d9588ed4d031..a5c6fc71c5bc 100644 --- a/code/modules/mob/mob-inventory.dm +++ b/code/modules/mob/mob-inventory.dm @@ -378,7 +378,7 @@ // so this is just a wrapper to route stuff around while we slowly refactor inventory. /datum/inventory/proc/drop_item_to_ground(obj/item/I, inv_op_flags, datum/event_args/actor/actor) if(!actor) - actor = E_ARGS_WRAP_USER_TO_ACTOR(owner) + actor = new /datum/event_args/actor(owner) return owner.drop_item_to_ground(I, inv_op_flags, actor?.performer) /** From 7b623e5fe734807a35b5d2af4a751e67965a1e26 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 18:43:55 -0500 Subject: [PATCH 126/140] fixes a runtime and fixes inv --- code/__DEFINES/_planes+layers.dm | 1 + code/game/objects/items-interaction.dm | 2 ++ code/game/rendering/actor_huds/huds/inventory.dm | 2 ++ code/game/rendering/screen.dm | 2 ++ code/modules/mob/mob.dm | 2 +- 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/_planes+layers.dm b/code/__DEFINES/_planes+layers.dm index 4dad67ea7f6a..b14381857e10 100644 --- a/code/__DEFINES/_planes+layers.dm +++ b/code/__DEFINES/_planes+layers.dm @@ -403,6 +403,7 @@ *? Separate layer with which to apply colorblindness. */ #define INVENTORY_PLANE 96 + #define INVENTORY_PLATE_LAYER 100 /** *! -- Above HUD Plane diff --git a/code/game/objects/items-interaction.dm b/code/game/objects/items-interaction.dm index 3481c62b03b8..f5a298b4ed1e 100644 --- a/code/game/objects/items-interaction.dm +++ b/code/game/objects/items-interaction.dm @@ -187,6 +187,8 @@ /obj/item/proc/attack_self(mob/user, datum/event_args/actor/actor) // todo: this should realistically be SHOULD_NOT_OVERRIDE but there's a massive number of overrides (some unnecessary), so this is for a later date // SHOULD_NOT_OVERRIDE(TRUE) // may be re-evaluated later + if(isnull(actor)) + actor = new /datum/event_args/actor(user) SEND_SIGNAL(src, COMSIG_ITEM_ACTIVATE_INHAND, actor) if(on_attack_self(actor)) return TRUE diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 7b5281b29f21..43aaf59eb701 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -335,6 +335,8 @@ /atom/movable/screen/actor_hud/inventory name = "inventory" icon = 'icons/screen/hud/midnight/inventory.dmi' + plane = INVENTORY_PLANE + layer = INVENTORY_PLATE_LAYER /atom/movable/screen/actor_hud/inventory/on_click(mob/user, list/params) var/obj/item/held = user.get_active_held_item() diff --git a/code/game/rendering/screen.dm b/code/game/rendering/screen.dm index ab50acad8486..8a035b91b981 100644 --- a/code/game/rendering/screen.dm +++ b/code/game/rendering/screen.dm @@ -4,6 +4,8 @@ /atom/movable/screen appearance_flags = PIXEL_SCALE | NO_CLIENT_COLOR atom_colouration_system = FALSE + plane = HUD_PLANE + layer = HUD_LAYER_BASE var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. var/datum/hud/hud_legacy = null // A reference to the owner HUD, if any. diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 50ef8c0e05c9..2dfb74a08761 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -175,7 +175,7 @@ if(C.statpanel_tab("Status")) STATPANEL_DATA_ENTRY("Ping", "[round(client.lastping,1)]ms (Avg: [round(client.avgping,1)]ms)") STATPANEL_DATA_ENTRY("Map", "[(LEGACY_MAP_DATUM)?.name || "Loading..."]") - if(!isnull(SSmapping.next_station) && (SSmapping.next_station.name != SSmapping.loaded_station.name)) + if(!isnull(SSmapping.next_station) && !isnull(SSmapping.loaded_station) && (SSmapping.next_station.name != SSmapping.loaded_station.name)) STATPANEL_DATA_ENTRY("Next Map", "[SSmapping.next_station.name]") /// Message, type of message (1 or 2), alternative message, alt message type (1 or 2) From 8df6d5b8dd2080d6dc370b978c02ac998c54ea17 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:04:12 -0500 Subject: [PATCH 127/140] fix --- code/controllers/subsystem/statpanel.dm | 6 +++--- code/game/rendering/actor_huds/huds/inventory.dm | 5 +++-- code/modules/mob/mob-hands.dm | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 5c5ea3e4dfaf..83f13409a456 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -43,15 +43,15 @@ SUBSYSTEM_DEF(statpanels) // grab victim var/client/player = currentrun[length(currentrun)] --currentrun.len + // check listed turf, even if we're on JS stat + if(player.tgui_stat.byond_stat_turf && !player.list_turf_check(player.tgui_stat.byond_stat_turf)) + player.unlist_turf() // check if we're even on the js one if(player.tgui_stat.byond_stat_active) continue // check if ready if(!player.tgui_stat.ready) continue - // check listed turf - if(player.tgui_stat.byond_stat_turf && !player.list_turf_check(player.tgui_stat.byond_stat_turf)) - player.unlist_turf() // are they an admin? var/is_admin = !!player.holder // grab their mob data diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 43aaf59eb701..0a813e708f23 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -54,8 +54,9 @@ if(!item_in_slot) continue add_item(item_in_slot, resolve_inventory_slot(slot_id)) - var/atom/movable/screen/actor_hud/inventory/plate/hand/active_hand_plate = hands[inventory.owner.active_hand] - active_hand_plate.add_overlay("[active_hand_plate.icon_state]-active") + if(inventory.owner.active_hand) + var/atom/movable/screen/actor_hud/inventory/plate/hand/active_hand_plate = hands[inventory.owner.active_hand] + active_hand_plate.add_overlay("[active_hand_plate.icon_state]-active") /datum/actor_hud/inventory/proc/unbind_from_inventory(datum/inventory/inventory) for(var/i in 1 to length(inventory.held_items)) diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index 79767ea14944..95aa28d62df6 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -30,7 +30,7 @@ */ /mob/proc/has_hands() SHOULD_NOT_OVERRIDE(TRUE) - return !!!get_nominal_hand_count() + return !!get_nominal_hand_count() /** * get number of physical hands / arms / whatever that we have and should check for From 09acb45a16bcd86f08ad2970d949af1fa83549c3 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:05:17 -0500 Subject: [PATCH 128/140] fix --- code/game/objects/items/tools/switchtool.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/tools/switchtool.dm b/code/game/objects/items/tools/switchtool.dm index d2f4da5bdcf5..23786d32d925 100644 --- a/code/game/objects/items/tools/switchtool.dm +++ b/code/game/objects/items/tools/switchtool.dm @@ -161,7 +161,7 @@ to_chat(user, "\The [src] doesn't have any available modules!") return var/obj/item/choice - choice = show_radial_menu(user, src, options) + choice = show_radial_menu(user, user, options) if(deploy(choice)) to_chat(user, "You deploy \the [deployed].") return TRUE From 3fe8ee1b12106db0fa4f0a053cd238304fac8a46 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:10:02 -0500 Subject: [PATCH 129/140] fix that --- code/controllers/subsystem/statpanel.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 83f13409a456..e2be050be35b 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -43,15 +43,17 @@ SUBSYSTEM_DEF(statpanels) // grab victim var/client/player = currentrun[length(currentrun)] --currentrun.len + // check if ready + // this is not a client initialized check, it's a "exists and ready" check. + // we intentionally don't wait for full init + if(!player.tgui_stat?.ready) + continue // check listed turf, even if we're on JS stat if(player.tgui_stat.byond_stat_turf && !player.list_turf_check(player.tgui_stat.byond_stat_turf)) player.unlist_turf() // check if we're even on the js one if(player.tgui_stat.byond_stat_active) continue - // check if ready - if(!player.tgui_stat.ready) - continue // are they an admin? var/is_admin = !!player.holder // grab their mob data From da633341140d24fdef666baaf4c1246570a02870 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 19:14:16 -0500 Subject: [PATCH 130/140] that should e a float --- code/modules/mob/holder.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 13d7a7147657..f7971dab6c18 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -72,7 +72,8 @@ // appearance clone their ass var/mutable_appearance/MA = new MA.appearance = M - MA.plane = plane + MA.plane = FLOAT_PLANE + MA.layer = FLOAT_LAYER MA.dir = SOUTH add_overlay(MA) name = M.name From e26b95c7c8b34f8f0b984f91d0a379c2ef02d230 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 20:18:44 -0500 Subject: [PATCH 131/140] uh --- code/modules/clothing/clothing.dm | 2 +- code/modules/projectiles/guns/attachments/harness.dm | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 07075db41526..8d2de2bcc9d7 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -269,7 +269,7 @@ if(!length(available)) to_chat(user, SPAN_WARNING("[src] can only be worn one way.")) return - var/choice = show_radial_menu(user, src, assembled, radius = 48) + var/choice = show_radial_menu(user, loc == user ? user : src, assembled, radius = 48) if(isnull(choice)) return set_style(choice, user) diff --git a/code/modules/projectiles/guns/attachments/harness.dm b/code/modules/projectiles/guns/attachments/harness.dm index 6dc21922bdb9..a08a92cf1202 100644 --- a/code/modules/projectiles/guns/attachments/harness.dm +++ b/code/modules/projectiles/guns/attachments/harness.dm @@ -49,6 +49,9 @@ // don't react if it was already yanked if(attached.loc != user) return NONE + // don't react if it's not going to the turf + if(!isturf(new_loc)) + return NONE if(!snap_back_to_user(user)) return NONE return COMPONENT_ITEM_DROPPED_RELOCATE | COMPONENT_ITEM_DROPPED_SUPPRESS_SOUND @@ -64,6 +67,7 @@ var/target_slot_phrase for(var/slot_id in list( /datum/inventory_slot/inventory/suit_storage, + /datum/inventory_slot/inventory/belt, /datum/inventory_slot/inventory/back, )) if(!user.equip_to_slot_if_possible(attached, slot_id, INV_OP_SILENT)) From 779fedb78d099722571506468e08cfca493863dd Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:43:46 -0500 Subject: [PATCH 132/140] fix --- citadel.dme | 1 + .../rendering/actor_huds/huds/inventory.dm | 223 +++--------------- code/modules/mob/mob-hands.dm | 7 +- .../projectiles/guns/attachments/harness.dm | 2 +- 4 files changed, 39 insertions(+), 194 deletions(-) diff --git a/citadel.dme b/citadel.dme index fe2c2ab1d61b..39dfd4ec0cc3 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2023,6 +2023,7 @@ #include "code\game\rendering\actor_huds\actor_hud-screen_object.dm" #include "code\game\rendering\actor_huds\actor_hud.dm" #include "code\game\rendering\actor_huds\actor_hud_holder.dm" +#include "code\game\rendering\actor_huds\huds\inventory-screen_object.dm" #include "code\game\rendering\actor_huds\huds\inventory.dm" #include "code\game\rendering\atom_huds\atom_hud.dm" #include "code\game\rendering\atom_huds\atom_hud_provider.dm" diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 0a813e708f23..4f5046dea54b 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -19,6 +19,8 @@ var/list/atom/movable/screen/actor_hud/inventory/plate/slot/slots /// ordered hand objects var/list/atom/movable/screen/actor_hud/inventory/plate/hand/hands + /// current active hand + var/applied_active_hand /// drawer object var/atom/movable/screen/actor_hud/inventory/drawer/button_drawer @@ -27,6 +29,12 @@ /// equip object var/atom/movable/screen/actor_hud/inventory/equip_hand/button_equip_hand +/datum/actor_hud/inventoryc/sync_to_preferences(datum/hud_preferences/preference_set) + var/old_active_hand = applied_active_hand + set_active_hand(null) + . = ..() + set_active_hand(old_active_hand) + /datum/actor_hud/inventory/on_mob_bound(mob/target) // we don't have a hook for 'on inventory init', // so we can't init it lazily; we init it immediately. @@ -55,8 +63,7 @@ continue add_item(item_in_slot, resolve_inventory_slot(slot_id)) if(inventory.owner.active_hand) - var/atom/movable/screen/actor_hud/inventory/plate/hand/active_hand_plate = hands[inventory.owner.active_hand] - active_hand_plate.add_overlay("[active_hand_plate.icon_state]-active") + set_active_hand(inventory.owner.active_hand) /datum/actor_hud/inventory/proc/unbind_from_inventory(datum/inventory/inventory) for(var/i in 1 to length(inventory.held_items)) @@ -96,6 +103,7 @@ remove_screen(hand_objects) QDEL_LIST(hand_objects) hands = null + applied_active_hand = null // buttons var/list/atom/movable/screen/actor_hud/inventory/button_objects = all_button_screen_objects() @@ -107,6 +115,8 @@ * INVENTORY_SLOT_REMAP_*'s. */ /datum/actor_hud/inventory/proc/rebuild(list/inventory_slots_with_mappings = host.build_inventory_slots_with_remappings(), number_of_hands = host.get_hand_count()) + var/old_active_hand = applied_active_hand + cleanup() // buttons @@ -120,6 +130,9 @@ // hands rebuild_hands(number_of_hands) + if(length(hands)) + set_active_hand(old_active_hand > length(hands) ? 1 : old_active_hand) + /** * Rebuilds our slots. Doesn't rebuild anything else. Doesn't wipe old objects. */ @@ -305,6 +318,22 @@ return toggle_hidden_class(class, source) +//* Hands *// + +/datum/actor_hud/inventory/proc/set_active_hand(to_index) + if(to_index == applied_active_hand) + return + var/atom/movable/screen/actor_hud/inventory/plate/hand/old_hand = hands[applied_active_hand] + old_hand.cut_overlay("[old_hand.icon_state]-active") + // this is because if this gets set out of bounds the inventory is stuck; we want error reporting, but not to brick the player while doing so. + if(to_index < 1 || to_index > length(hands)) + CRASH("attempted to set hand active out of bounds") + applied_active_hand = to_index + if(!to_index) + return + var/atom/movable/screen/actor_hud/inventory/plate/hand/new_hand = hands[to_index] + new_hand.add_overlay("[new_hand.icon_state]-active") + //* Hooks *// /datum/actor_hud/inventory/proc/add_item(obj/item/item, datum/inventory_slot/slot_or_index) @@ -322,192 +351,4 @@ new_screen_obj.bind_item(item) /datum/actor_hud/inventory/proc/swap_active_hand(from_index, to_index) - var/atom/movable/screen/actor_hud/inventory/plate/hand/old_hand = hands[from_index] - var/atom/movable/screen/actor_hud/inventory/plate/hand/new_hand = hands[to_index] - - old_hand.cut_overlay("[old_hand.icon_state]-active") - new_hand.add_overlay("[new_hand.icon_state]-active") - -//* Inventory Screen Objects *// - -/** - * Base type of inventory screen objects. - */ -/atom/movable/screen/actor_hud/inventory - name = "inventory" - icon = 'icons/screen/hud/midnight/inventory.dmi' - plane = INVENTORY_PLANE - layer = INVENTORY_PLATE_LAYER - -/atom/movable/screen/actor_hud/inventory/on_click(mob/user, list/params) - var/obj/item/held = user.get_active_held_item() - handle_inventory_click(user, held) - -/atom/movable/screen/actor_hud/inventory/sync_to_preferences(datum/hud_preferences/preference_set) - sync_style(preference_set.hud_style, preference_set.hud_alpha, preference_set.hud_color) - -/atom/movable/screen/actor_hud/inventory/proc/sync_style(datum/hud_style/style, style_alpha, style_color) - alpha = style_alpha - color = style_color - -/** - * handle an inventory operation - * - * @params - * * user - clicking user; not necessarily the inventory's owner - * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. - */ -/atom/movable/screen/actor_hud/inventory/proc/handle_inventory_click(mob/user, obj/item/with_item) - return - -/** - * Base type of item-holding screen objects - */ -/atom/movable/screen/actor_hud/inventory/plate - -/atom/movable/screen/actor_hud/inventory/plate/Destroy() - if(length(vis_contents) != 0) - vis_contents.len = 0 - return ..() - -/atom/movable/screen/actor_hud/inventory/plate/proc/bind_item(obj/item/item) - vis_contents += item - -/atom/movable/screen/actor_hud/inventory/plate/proc/unbind_item(obj/item/item) - vis_contents -= item - -/** - * Slot screen objects - * - * * Stores remappings so we don't have to do it separately - * * Stores calculated screen_loc so we don't have to recalculate unless slots are mutated. - */ -/atom/movable/screen/actor_hud/inventory/plate/slot - /// our inventory slot id - var/inventory_slot_id - /// our (potentially remapped) class - var/inventory_hud_class = INVENTORY_HUD_CLASS_ALWAYS - /// our (potentially remapped) main axis - var/inventory_hud_main_axis = 0 - /// our (potentially remapped) cross axis - var/inventory_hud_cross_axis = 0 - /// our (potentially remapped) anchor - var/inventory_hud_anchor = INVENTORY_HUD_ANCHOR_AUTOMATIC - -/atom/movable/screen/actor_hud/inventory/plate/slot/Initialize(mapload, datum/actor_hud/inventory/hud, datum/inventory_slot/slot, list/slot_remappings) - . = ..() - inventory_slot_id = slot.id - icon_state = slot.inventory_hud_icon_state - inventory_hud_class = slot_remappings[INVENTORY_SLOT_REMAP_CLASS] || slot.inventory_hud_class - inventory_hud_main_axis = slot_remappings[INVENTORY_SLOT_REMAP_MAIN_AXIS] || slot.inventory_hud_main_axis - inventory_hud_cross_axis = slot_remappings[INVENTORY_SLOT_REMAP_CROSS_AXIS] || slot.inventory_hud_cross_axis - inventory_hud_anchor = slot_remappings[INVENTORY_SLOT_REMAP_ANCHOR] || slot.inventory_hud_anchor - name = slot_remappings[INVENTORY_SLOT_REMAP_NAME] || slot.display_name || slot.name - -/atom/movable/screen/actor_hud/inventory/plate/slot/sync_style(datum/hud_style/style, style_alpha, style_color) - ..() - icon = style.inventory_icons_slot - -/atom/movable/screen/actor_hud/inventory/plate/slot/handle_inventory_click(mob/user, obj/item/with_item) - var/obj/item/in_slot = user.item_by_slot_id(inventory_slot_id) - if(with_item) - if(in_slot) - with_item.melee_interaction_chain(in_slot, user, NONE, list()) - else - user.equip_to_slot_if_possible(with_item, inventory_slot_id, NONE, user) - else - in_slot?.attack_hand(user, new /datum/event_args/actor/clickchain(user)) - -/** - * Hand screen objects - */ -/atom/movable/screen/actor_hud/inventory/plate/hand - /// target hand index - var/hand_index - /// should we have handcuffed overlay? - var/handcuffed = FALSE - -/atom/movable/screen/actor_hud/inventory/plate/hand/Initialize(mapload, datum/inventory/host, hand_index) - . = ..() - src.hand_index = hand_index - sync_index(hand_index) - -/atom/movable/screen/actor_hud/inventory/plate/hand/sync_style(datum/hud_style/style, style_alpha, style_color) - ..() - icon = style.inventory_icons - -/atom/movable/screen/actor_hud/inventory/plate/hand/handle_inventory_click(mob/user, obj/item/with_item) - hud.owner.swap_hand(hand_index) - -/atom/movable/screen/actor_hud/inventory/plate/hand/proc/sync_index(index = hand_index) - screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND(index) - name = "[index % 2? "left" : "right"] hand[index > 2? " #[index]" : ""]" - icon_state = "hand-[index % 2? "left" : "right"]" - -/atom/movable/screen/actor_hud/inventory/plate/hand/proc/set_handcuffed(state) - if(state == handcuffed) - return - handcuffed = state - update_icon() - -/atom/movable/screen/actor_hud/inventory/plate/hand/update_overlays() - . = ..() - if(handcuffed) - . += image('icons/mob/screen_gen.dmi', "[hand_index % 2 ? "r_hand" : "l_hand"]_hud_handcuffs") - -/** - * Button: 'swap hand' - */ -/atom/movable/screen/actor_hud/inventory/drawer - name = "drawer" - icon_state = "drawer" - screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_DRAWER - -/atom/movable/screen/actor_hud/inventory/drawer/sync_style(datum/hud_style/style, style_alpha, style_color) - ..() - icon = style.inventory_icons - -/atom/movable/screen/actor_hud/inventory/drawer/on_click(mob/user, list/params) - // todo: remote control - hud.toggle_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_DRAWER) - -/atom/movable/screen/actor_hud/inventory/drawer/update_icon_state() - icon_state = "[(INVENTORY_HUD_CLASS_DRAWER in hud.hidden_classes) ? "drawer" : "drawer-active"]" - return ..() - -/** - * Button: 'swap hand' - */ -/atom/movable/screen/actor_hud/inventory/swap_hand - name = "swap active hand" - icon_state = "hand-swap" -/atom/movable/screen/actor_hud/inventory/swap_hand/Initialize(mapload, datum/inventory/host, hand_count) - . = ..() - screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(hand_count) - -/atom/movable/screen/actor_hud/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) - ..() - icon = style.inventory_icons_wide - -/atom/movable/screen/actor_hud/inventory/swap_hand/on_click(mob/user, list/params) - // todo: remote control - user.swap_hand() - -/** - * Button: 'auto equip' - */ -/atom/movable/screen/actor_hud/inventory/equip_hand - name = "equip held item" - icon_state = "button-equip" - -/atom/movable/screen/actor_hud/inventory/equip_hand/Initialize(mapload, datum/inventory/host, hand_count) - . = ..() - screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(hand_count) - -/atom/movable/screen/actor_hud/inventory/equip_hand/sync_style(datum/hud_style/style, style_alpha, style_color) - ..() - icon = style.inventory_icons - -/atom/movable/screen/actor_hud/inventory/equip_hand/on_click(mob/user, list/params) - // todo: remote control - user.attempt_smart_equip(user.get_active_held_item()) + set_active_hand(to_index) diff --git a/code/modules/mob/mob-hands.dm b/code/modules/mob/mob-hands.dm index 95aa28d62df6..01c3ad2253aa 100644 --- a/code/modules/mob/mob-hands.dm +++ b/code/modules/mob/mob-hands.dm @@ -102,6 +102,8 @@ /mob/proc/get_hand_manipulation_level(index) return HAND_MANIPULATION_PRECISE +// todo: can we combine all these procs? + /** * Checks if a hand can be used at a given manipulation level. */ @@ -134,9 +136,9 @@ */ /mob/proc/standard_hand_usability_check(atom/target, index, manipulation, datum/event_args/actor/actor, silent) if(is_hand_manipulation_sufficient(index, manipulation)) - return + return TRUE if(silent) - return + return FALSE var/list/reasons_we_cant = why_hand_manipulation_insufficient(index, manipulation) if(actor) actor.chat_feedback( @@ -148,6 +150,7 @@ SPAN_WARNING("You can't do that right now! ([length(reasons_we_cant) ? english_list(reasons_we_cant) : "hand nonfunctional for unknown reason"])"), target = target, ) + return FALSE //* Hands - Identity *// diff --git a/code/modules/projectiles/guns/attachments/harness.dm b/code/modules/projectiles/guns/attachments/harness.dm index ddf19718d33f..5996ac248bbc 100644 --- a/code/modules/projectiles/guns/attachments/harness.dm +++ b/code/modules/projectiles/guns/attachments/harness.dm @@ -71,13 +71,13 @@ /datum/inventory_slot/inventory/suit_storage, /datum/inventory_slot/inventory/belt, /datum/inventory_slot/inventory/back, - /datum/inventory_slot/inventory/belt )) if(!user.equip_to_slot_if_possible(attached, slot_id, INV_OP_SILENT)) continue var/datum/inventory_slot/slot = resolve_inventory_slot(slot_id) target_slot_phrase = slot.display_name . = TRUE + break if(!.) return attached.visible_message( From 9e315a5c530e5c16d389e88daea8c57804c73fbe Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:45:03 -0500 Subject: [PATCH 133/140] Fix --- code/game/rendering/actor_huds/huds/inventory.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 4f5046dea54b..788423c6023f 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -29,7 +29,7 @@ /// equip object var/atom/movable/screen/actor_hud/inventory/equip_hand/button_equip_hand -/datum/actor_hud/inventoryc/sync_to_preferences(datum/hud_preferences/preference_set) +/datum/actor_hud/inventory/sync_to_preferences(datum/hud_preferences/preference_set) var/old_active_hand = applied_active_hand set_active_hand(null) . = ..() From 191d8f41942e0900c772e19bde9eb116e8acc2ba Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:55:56 -0500 Subject: [PATCH 134/140] Fix --- code/game/rendering/actor_huds/huds/inventory.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index 788423c6023f..f2f52376304c 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -323,8 +323,10 @@ /datum/actor_hud/inventory/proc/set_active_hand(to_index) if(to_index == applied_active_hand) return - var/atom/movable/screen/actor_hud/inventory/plate/hand/old_hand = hands[applied_active_hand] - old_hand.cut_overlay("[old_hand.icon_state]-active") + if(applied_active_hand) + var/atom/movable/screen/actor_hud/inventory/plate/hand/old_hand = hands[applied_active_hand] + old_hand.cut_overlay("[old_hand.icon_state]-active") + applied_active_hand = null // this is because if this gets set out of bounds the inventory is stuck; we want error reporting, but not to brick the player while doing so. if(to_index < 1 || to_index > length(hands)) CRASH("attempted to set hand active out of bounds") From 7847cc8af6ba57e53401e3a543bec2074ff5e471 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 22:01:26 -0500 Subject: [PATCH 135/140] i forgot that one --- .../huds/inventory-screen_object.dm | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 code/game/rendering/actor_huds/huds/inventory-screen_object.dm diff --git a/code/game/rendering/actor_huds/huds/inventory-screen_object.dm b/code/game/rendering/actor_huds/huds/inventory-screen_object.dm new file mode 100644 index 000000000000..8d2b83c05123 --- /dev/null +++ b/code/game/rendering/actor_huds/huds/inventory-screen_object.dm @@ -0,0 +1,184 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 Citadel Station Developers *// + +/** + * Base type of inventory screen objects. + */ +/atom/movable/screen/actor_hud/inventory + name = "inventory" + icon = 'icons/screen/hud/midnight/inventory.dmi' + plane = INVENTORY_PLANE + layer = INVENTORY_PLATE_LAYER + +/atom/movable/screen/actor_hud/inventory/on_click(mob/user, list/params) + var/obj/item/held = user.get_active_held_item() + handle_inventory_click(user, held) + +/atom/movable/screen/actor_hud/inventory/sync_to_preferences(datum/hud_preferences/preference_set) + sync_style(preference_set.hud_style, preference_set.hud_alpha, preference_set.hud_color) + +/atom/movable/screen/actor_hud/inventory/proc/sync_style(datum/hud_style/style, style_alpha, style_color) + alpha = style_alpha + color = style_color + +/** + * handle an inventory operation + * + * @params + * * user - clicking user; not necessarily the inventory's owner + * * with_item - specifically attempting to swap an inventory object with an item, or interact with it with an item. + */ +/atom/movable/screen/actor_hud/inventory/proc/handle_inventory_click(mob/user, obj/item/with_item) + return + +/** + * Base type of item-holding screen objects + */ +/atom/movable/screen/actor_hud/inventory/plate + +/atom/movable/screen/actor_hud/inventory/plate/Destroy() + if(length(vis_contents) != 0) + vis_contents.len = 0 + return ..() + +/atom/movable/screen/actor_hud/inventory/plate/proc/bind_item(obj/item/item) + vis_contents += item + +/atom/movable/screen/actor_hud/inventory/plate/proc/unbind_item(obj/item/item) + vis_contents -= item + +/** + * Slot screen objects + * + * * Stores remappings so we don't have to do it separately + * * Stores calculated screen_loc so we don't have to recalculate unless slots are mutated. + */ +/atom/movable/screen/actor_hud/inventory/plate/slot + /// our inventory slot id + var/inventory_slot_id + /// our (potentially remapped) class + var/inventory_hud_class = INVENTORY_HUD_CLASS_ALWAYS + /// our (potentially remapped) main axis + var/inventory_hud_main_axis = 0 + /// our (potentially remapped) cross axis + var/inventory_hud_cross_axis = 0 + /// our (potentially remapped) anchor + var/inventory_hud_anchor = INVENTORY_HUD_ANCHOR_AUTOMATIC + +/atom/movable/screen/actor_hud/inventory/plate/slot/Initialize(mapload, datum/actor_hud/inventory/hud, datum/inventory_slot/slot, list/slot_remappings) + . = ..() + inventory_slot_id = slot.id + icon_state = slot.inventory_hud_icon_state + inventory_hud_class = slot_remappings[INVENTORY_SLOT_REMAP_CLASS] || slot.inventory_hud_class + inventory_hud_main_axis = slot_remappings[INVENTORY_SLOT_REMAP_MAIN_AXIS] || slot.inventory_hud_main_axis + inventory_hud_cross_axis = slot_remappings[INVENTORY_SLOT_REMAP_CROSS_AXIS] || slot.inventory_hud_cross_axis + inventory_hud_anchor = slot_remappings[INVENTORY_SLOT_REMAP_ANCHOR] || slot.inventory_hud_anchor + name = slot_remappings[INVENTORY_SLOT_REMAP_NAME] || slot.display_name || slot.name + +/atom/movable/screen/actor_hud/inventory/plate/slot/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons_slot + +/atom/movable/screen/actor_hud/inventory/plate/slot/handle_inventory_click(mob/user, obj/item/with_item) + var/obj/item/in_slot = user.item_by_slot_id(inventory_slot_id) + if(with_item) + if(in_slot) + with_item.melee_interaction_chain(in_slot, user, NONE, list()) + else + user.equip_to_slot_if_possible(with_item, inventory_slot_id, NONE, user) + else + in_slot?.attack_hand(user, new /datum/event_args/actor/clickchain(user)) + +/** + * Hand screen objects + */ +/atom/movable/screen/actor_hud/inventory/plate/hand + /// target hand index + var/hand_index + /// should we have handcuffed overlay? + var/handcuffed = FALSE + +/atom/movable/screen/actor_hud/inventory/plate/hand/Initialize(mapload, datum/inventory/host, hand_index) + . = ..() + src.hand_index = hand_index + sync_index(hand_index) + +/atom/movable/screen/actor_hud/inventory/plate/hand/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons + +/atom/movable/screen/actor_hud/inventory/plate/hand/handle_inventory_click(mob/user, obj/item/with_item) + hud.owner.swap_hand(hand_index) + +/atom/movable/screen/actor_hud/inventory/plate/hand/proc/sync_index(index = hand_index) + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND(index) + name = "[index % 2? "left" : "right"] hand[index > 2? " #[index]" : ""]" + icon_state = "hand-[index % 2? "left" : "right"]" + +/atom/movable/screen/actor_hud/inventory/plate/hand/proc/set_handcuffed(state) + if(state == handcuffed) + return + handcuffed = state + update_icon() + +/atom/movable/screen/actor_hud/inventory/plate/hand/update_overlays() + . = ..() + if(handcuffed) + . += image('icons/mob/screen_gen.dmi', "[hand_index % 2 ? "r_hand" : "l_hand"]_hud_handcuffs") + +/** + * Button: 'swap hand' + */ +/atom/movable/screen/actor_hud/inventory/drawer + name = "drawer" + icon_state = "drawer" + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_DRAWER + +/atom/movable/screen/actor_hud/inventory/drawer/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons + +/atom/movable/screen/actor_hud/inventory/drawer/on_click(mob/user, list/params) + // todo: remote control + hud.toggle_hidden_class(INVENTORY_HUD_CLASS_DRAWER, INVENTORY_HUD_HIDE_SOURCE_DRAWER) + +/atom/movable/screen/actor_hud/inventory/drawer/update_icon_state() + icon_state = "[(INVENTORY_HUD_CLASS_DRAWER in hud.hidden_classes) ? "drawer" : "drawer-active"]" + return ..() + +/** + * Button: 'swap hand' + */ +/atom/movable/screen/actor_hud/inventory/swap_hand + name = "swap active hand" + icon_state = "hand-swap" +/atom/movable/screen/actor_hud/inventory/swap_hand/Initialize(mapload, datum/inventory/host, hand_count) + . = ..() + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_HAND_SWAP(hand_count) + +/atom/movable/screen/actor_hud/inventory/swap_hand/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons_wide + +/atom/movable/screen/actor_hud/inventory/swap_hand/on_click(mob/user, list/params) + // todo: remote control + user.swap_hand() + +/** + * Button: 'auto equip' + */ +/atom/movable/screen/actor_hud/inventory/equip_hand + name = "equip held item" + icon_state = "button-equip" + +/atom/movable/screen/actor_hud/inventory/equip_hand/Initialize(mapload, datum/inventory/host, hand_count) + . = ..() + screen_loc = SCREEN_LOC_MOB_HUD_INVENTORY_EQUIP_HAND(hand_count) + +/atom/movable/screen/actor_hud/inventory/equip_hand/sync_style(datum/hud_style/style, style_alpha, style_color) + ..() + icon = style.inventory_icons + +/atom/movable/screen/actor_hud/inventory/equip_hand/on_click(mob/user, list/params) + // todo: remote control + user.attempt_smart_equip(user.get_active_held_item()) From e0a8db6bfc898c0912166d01c499597a55fe2f74 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 22:08:45 -0500 Subject: [PATCH 136/140] Fix --- code/game/rendering/actor_huds/huds/inventory.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/rendering/actor_huds/huds/inventory.dm b/code/game/rendering/actor_huds/huds/inventory.dm index f2f52376304c..c60bf43489bf 100644 --- a/code/game/rendering/actor_huds/huds/inventory.dm +++ b/code/game/rendering/actor_huds/huds/inventory.dm @@ -327,12 +327,12 @@ var/atom/movable/screen/actor_hud/inventory/plate/hand/old_hand = hands[applied_active_hand] old_hand.cut_overlay("[old_hand.icon_state]-active") applied_active_hand = null + if(!to_index) + return // this is because if this gets set out of bounds the inventory is stuck; we want error reporting, but not to brick the player while doing so. if(to_index < 1 || to_index > length(hands)) CRASH("attempted to set hand active out of bounds") applied_active_hand = to_index - if(!to_index) - return var/atom/movable/screen/actor_hud/inventory/plate/hand/new_hand = hands[to_index] new_hand.add_overlay("[new_hand.icon_state]-active") From 13a84dffb4e4580e833a90a5acc6d57355a11b77 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 18 Nov 2024 23:45:51 -0500 Subject: [PATCH 137/140] oops --- code/modules/mob/living/carbon/human/examine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index ff5ba89adf81..8d423b44b084 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -182,7 +182,7 @@ if(isnull(inventory.held_items[i])) continue var/obj/item/held = inventory.held_items[i] - if(held.show_examine) + if(!held.show_examine) continue var/hand_str = (i % 2)? "left hand[i > 2? " #[round(i / 2)]" : ""]" : "right hand[i > 2? " #[round(i / 2)]" : ""]" if(held.blood_DNA) From 28c7541d63302037fe26c8ca43c40b30b5bc20c6 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 19 Nov 2024 09:56:18 -0500 Subject: [PATCH 138/140] div by zero --- code/modules/mob/movement.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/movement.dm b/code/modules/mob/movement.dm index e9a8621df515..2a083fe284fc 100644 --- a/code/modules/mob/movement.dm +++ b/code/modules/mob/movement.dm @@ -244,7 +244,7 @@ //? NOW we try to move. // get additional delay from this move - var/add_delay = mob.movement_delay() + var/add_delay = max(world.tick_lag, mob.movement_delay()) //! TODO: REMOVE ; COMPATABILITY LAYER TO USE NEW MOVESPEED. add_delay = min(10 / ((10 / add_delay) * (1 * mob.cached_movespeed_multiply)), 10 / MOVESPEED_ABSOLUTE_MINIMUM_TILES_PER_SECOND) //! END From f9e087ffc197ada1dd199e21a07bd13d858a1570 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 19 Nov 2024 10:05:47 -0500 Subject: [PATCH 139/140] holy FUCK this is stupid --- code/game/rendering/screen_legacy.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index a91aeee53c50..e48fb37ec2cc 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -167,9 +167,6 @@ if("walk") usr.m_intent = "walk" usr.m_int = "14,14" - if("face") - usr.m_intent = "face" - usr.m_int = "15,14" if("run") usr.m_intent = "run" usr.m_int = "13,14" From a1e29c07552ec691e073f915c69e8cbfd382ce00 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 19 Nov 2024 10:08:25 -0500 Subject: [PATCH 140/140] toss legacy code --- code/game/rendering/screen_legacy.dm | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/code/game/rendering/screen_legacy.dm b/code/game/rendering/screen_legacy.dm index e48fb37ec2cc..a73cce930e51 100644 --- a/code/game/rendering/screen_legacy.dm +++ b/code/game/rendering/screen_legacy.dm @@ -153,23 +153,6 @@ return 1 var/mob/living/L = usr L.toggle_move_intent() - if("m_intent") - if(!usr.m_int) - switch(usr.m_intent) - if("run") - usr.m_int = "13,14" - if("walk") - usr.m_int = "14,14" - if("face") - usr.m_int = "15,14" - else - usr.m_int = null - if("walk") - usr.m_intent = "walk" - usr.m_int = "14,14" - if("run") - usr.m_intent = "run" - usr.m_int = "13,14" if("Reset Machine") usr.unset_machine() if("internal")

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 literal 128274 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 z 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 rc$3h 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%0A@&5g?9uZ+ki*zTvB;JnxF~{%~=Z;PtG4Stu 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 diff --git a/icons/mob/screen1_old.dmi b/icons/mob/screen1_old.dmi index e24f995a5c321b33c314212051b0f299440b970d..4d023bdcf4cc3aabc8863080032bc18081064324 100644 GIT binary patch literal 115877 zcmZ^~XE>Zu*C;%LC<#FjEsPctB6_bIbES=Q`heUEdG0_r2@dYpuQ7UOs86E0Nt~xCsJ*$W)Z&UxGk*EWjU#m=I`b zxIe`W0^x&vwDsNPE!@mpZJgb0oE$+Q@APlUYHok{DME%X^a^_`^E(MYzZDmbSLF&_ z9dA&Ywkvs-D8*Bkj72lEOjC3`?!D+3SebZyxgYAw!<+?2G=3_WO4{Vhel;2PF&UFA zpBKgLd;hL!s$$;F@uK4f$j}RNQ&vaET&2r( z-IE$8<0T~bkbBW8H%}1E-!mbc$&3(OfB$5??#Vjp2{t%S>ieT#7S`D|B4+X;rIwLg zDVLt@7%SRjq-y}|rgxsLDX1uGf(r#^|G_or-9%m`>TKvwa6vq8embFX6$`-zz1s`Z zLF=v5Nu!*5-IF)(8}8l~Uj55fys>GFfF2L&`MaSP47cyP^xrfiaj)EaB0>4#P?D>% z@5@~`iA^V8_oSvQyKhJl`|KGqB8T)Yo5E_ML_8M_jYodpl-y5Ac{s}APXjvVM`sOK zU7misG!NLbr5SnagR6Y?4k@44=QE|xcb83NMVM({s*9WUbt0#c)J5QnAiKCp{s$)` z_jP7{2Ma}$G9uGk+<7d@2Ev7F;(P{|DnvrsX=2}$lEz}0CfO!wwvSN5e0Ky(mDUnO z+;2%`yYoq8SM_`-F3I-kpIUN{f@s#m7zs9B4{-(H_a2{RSnh5To%WS;92^{JTy$8` ztqAqf(S7*xOL5m=U9_^m;6-Nx?Y#zENx%S@=}!@pu1a>g9&g^Z>lcf|d>5X~h0Knz zofoH&+=J9zLC(Gl5Qqh&BL7U=JAF6f!xx%~j01#6ecF0X)N!n&zdRWM#j^?*HWjpM zB!`wFJG)D+b-Gr%WBIc?__+dg;Cp6l0i%m%-)8;uTt?(ggda2?i-++nlko;j`iB=j zpkS`v(#_6k(3po7d1e@1j-RCe`L%P3@|!HuIY93hNl#q9L12DwZ*QNPw1=3S@6XeT z+S3t|F$7boi-TP%VHosu)#sZ};lD^3MM;B*$Q5x|jM?ZL1gr@uW`%C>I_Mhz{>p6B z>&1(=2t;+Y=sj`gmU?)grb=BC?&|U!f;)n|ew6!IyNH@7GSr9|SfR@ZdrYgEE>1~w z`(Bv1&e0avQkHWLJm{qo@+aTa#?Y(%1B9)grBpwq4{joF&i?{Koc@j5qU!&CzP;>Y!a4U5I~C956AZp? zDR~F(YNhLi9IOBDNwfbl zCkX=K3d6-`^D+A1;xDlghwCfNLFKP!5tUwi0Ozm?uqJ|2#9i1x=Yrj}&TjsWto_-u zpUbkoZ16Fn@ot{opcYd>VG?#Ov#9-MMlQ1k&W(aoV*EawFMldBEUfjY|8?+5a&n3B z!;+nBKJQ)y&HR-k?4WVwrTtP%0RHnoKO+inKP~>P(RY$W<_AXUU1>ji34^bpv0Ms9 zq5z6cFkV3^F}n>!CEu4Px4d(0lQ!OuC36q~HWp_Id-ij!s!4nQyNM zNqbP3`zUO`;Wem9U6%-_gLkUaE~L}dR8A?goCt4P<1cP3vDwS+Z@Km_wbNbN5EUs!Yr3^amgLSP}}GajsKIWKFnUI4+6L zsI2Li84*AbO+CHP;nKgKdij_;46HIfUY8rX2UTZ4f9M3qdGqD|7(xiG@L?4n(#5EpF6l`1gkVVW><_?zRJC?F&MC12A zYTiG%^*{ySFJD~z*MIzVj+LzRMY%c*&DH%0A!9r|?&n+iHTACDO8SIe3OW8t{A56= z(xjbmAVpH|O|x%Z7kAP&Q)%sS+zJ?ksQ0$ZM2$$kJ_=1Ma=82Tj=zI3dt5C~PSIoh zS2^X!sBVCN?w6B_|F0cCw1(^b-m1C{;zL{s{+XRE-5c<=zgPl+WajrulYboBH@YIT zj;5=)4of{e%GUAu$%vs9aTgj79QBIOOU3^=%S52YUs}yM1cJj#cCGAx&O*c*-@BSZ zq`P$b4Ha@^%t;`@Z?QJxZU5Ⓢ+Yz40gy94J;R7JiQq{PVUcu;dlz4;dpZLDTpHx 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 literal 114287 zcmZ^~cU)7=vp=3dr~(1$y(!q~0wM&YDN+SQlwPEF>5$NyR8e|I>C$^IN|D}s6M@ic zfP|D^d_K>;zkBcN_5I@{yK`pu%^r0DwRie{qo# z<0%e~Gxh)gp^lHvn-2<>Zsx8w&L3=?9035YjBhDwZs~&5VWV4mMFUlhVsq-QC%LH> zPb6;@t}p{{SU$Y<*VV3XA{A1B1%iGb?$vI<37yO3auvMXW*G9Yv8h zJH}gTxL^P9z<8M6St;Mav>BdVTzaV8|F&0`_2<@1z*Ku~=AtXx<>NaC>tXpCUOj55 zOVIDj*%?9h%%F=OlU}k~)3|ng% zRxlsDV33h_{^iZE%UWAH^m_Vst!dZog;>zKQw3Zmi_>D_!I;R)n*(ybH+Su;KrD7& z?}}JjtWV!Rw&r^ma1v1FwDi0OPE4X{qOE_m4;LIsF|TE?QF-!WR#c8PA;QBwE$v7| zVqRxNB1VbyzU42l``lRSTbrFUfS6vS#6euK&D|pmv@>gOTf4Y zbw=UcJ=U;1I|t*g@hq_J$NvDmpE>a3>m`r8l7Pb*c8tf&!96$AC1_nKzLvp~~=2F}GU zMGaBgGS5te8TThq^~v>Hj%BX7G|KA_InlZ2Fb+!|c;OmlHt%4Nj1_!{@EuG2zDVn%P}o7!v5tW{g4o((3w zj}baDa^A<*5DSxhuy%(GeUg1LE6uw{{#o}J>-&(ynBzy!nf5v7>iyS;MzmqN000-@ zg@T-pSH^yuZwB3T<|VE;i`g+>L_)Apn0JLMh?GF&{SV5QE%6F3TAwm;^0HJ%-O$h9 zm!T07x+Y~Z=izqbh(;2%Iz-FW+$-hIiyRm2zLzK%9R!*J(lZR1Cjl$1pk70M0{4tIR)X3B&*+zL8;FCA60o=VdBH<**{q4sunyRn$- zVKi-s>TeI++2tx2dQ5nmZam`E-D>~~3kx~Qz~5im$oD`jnpK?Y`tk^TRn$Eh_l#Q; z?y0%kFLUW4ee~3&182D>vcakh$MSz=<*N8NwnMz_1TEwQ)=QIG?1d}(`?u}OlhPMH z%P%dxFX}%JY1axo#96~9F&dXJHWyJ@QzOzQgUUt4Y8VbWo4$I~j-d`~PgF|T&Q|_F znlhSfcz^bBLZ4}2eLaJrq2aUDz8Kc+6lML@7WQV`M*gVX*x!zp`k8?@-D!@mIi7ks zCmjY7k__RNvn=Lf_G*{0J?mc+J_;h-q{%{DuswXqVbL!vyT4UhQNf7Xtid6PlP?7L`=7k>?NKizkgb=Y#v;M#2F=w@BZ65^ z+n^y=2g1B;@hvSF0bPt9cFtpdwWWV=bdRmS9rwFj;AS&!a}|fo*l2RwwoT+y zt1gp5{z(+_JT!PnL3``%s#(C5qj$B5cwiZ;UICPDq{BK74PqijJ_UxU(Uo^dtm3rB z7%7)=<88QuBQDcjV^$ty^NmjVPH#WG^YGxGgJrP z51edlmDXfVVH5Rn55r0CKR$-x9KK$q65+hQIQ*HYE2ZVKDC)MD==r^O_M&?-MAdM@ zp|}|}*$QnRR-r~Edur6dA=5`1`a3uGvoY6~FPTTXWB1289$<TD{ z%J(u;o)_sAQHurZ10|V~5OMbx4F%_=!NS%V*j>G3%Ls*C;}vP$ms59(*a|ytx~n8{ z6Zl0F-a_R?FHA<+`%7s_WtrvjcTRW_ScLdLtv=)Q{6})kb+)4Mq10Fu)Jp6(T6iic)atOimb7`6$5_Y26K(7jO+JZ+rQ>{F5KX*mW5}AmL z_%GI`@_PaUJ6qCMdNwn)#bj>&u?gt*_*(5mFpu)cyHL=4a1MI&!~p;hnl=9X@57B* zE^+N`zC!gIOqK2=E5b8k9nJvOb_phb7EBZYIB{bz|gaLJDh zOIoML1M#bCink6|OWIOn=x(5DiXd=UfUR>oYr)jfw=}czqOp*+6hrPd@%wk7*6a6tP3y?og%yn

}k-}u(T0zaogp-Z~?V} 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 dX_lP=a@^> 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