diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 57f56f2db64..97a86538e3a 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -837,9 +837,6 @@ GLOBAL_LIST_INIT(layers_to_offset, list( /// The layer above mutant body parts #define ABOVE_BODY_FRONT_LAYER (BODY_FRONT_LAYER-1) -/// We need gloves to layer on top of modsuit chestplates because we need the hole in the suit filled in if the user lacks a limb -#define MOD_CHESTPLATE_LAYER (GLOVES_LAYER+0.5) - /// If gravity must be present to perform action (can't use pens without gravity) #define NEED_GRAVITY (1<<0) /// If reading is required to perform action (can't read a book if you are illiterate) diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index feda199d670..2cf18c0767a 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -171,6 +171,7 @@ arrived.item_flags |= IN_STORAGE refresh_views() arrived.on_enter_storage(src) + RegisterSignal(arrived, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(mousedrop_receive)) SEND_SIGNAL(arrived, COMSIG_ITEM_STORED, src) parent.update_appearance() @@ -184,6 +185,7 @@ gone.item_flags &= ~IN_STORAGE remove_and_refresh(gone) gone.on_exit_storage(src) + UnregisterSignal(gone, COMSIG_MOUSEDROPPED_ONTO) SEND_SIGNAL(gone, COMSIG_ITEM_UNSTORED, src) parent.update_appearance() @@ -451,7 +453,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) SEND_SIGNAL(parent, COMSIG_ATOM_STORED_ITEM, to_insert, user, force) SEND_SIGNAL(src, COMSIG_STORAGE_STORED_ITEM, to_insert, user, force) - RegisterSignal(to_insert, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(mousedrop_receive)) to_insert.forceMove(real_location) item_insertion_feedback(user, to_insert, override) parent.update_appearance() @@ -468,7 +469,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return if (target.loc != real_location) // what even - UnregisterSignal(target, COMSIG_MOUSEDROPPED_ONTO) return if(numerical_stacking) @@ -573,7 +573,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) refresh_views() parent.update_appearance() - UnregisterSignal(thing, COMSIG_MOUSEDROPPED_ONTO) SEND_SIGNAL(parent, COMSIG_ATOM_REMOVED_ITEM, thing, remove_to_loc, silent) SEND_SIGNAL(src, COMSIG_STORAGE_REMOVED_ITEM, thing, remove_to_loc, silent) return TRUE diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index a8ac2474142..ed19d0a4f6a 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -26,8 +26,7 @@ return var/parts_to_check = parts - part if(part.loc == src) - deploy(user, part) - if(active && !delayed_seal_part(part)) + if(!deploy(user, part) || (active && !delayed_seal_part(part))) return SEND_SIGNAL(src, COMSIG_MOD_DEPLOYED, user) for(var/obj/item/checking_part as anything in parts_to_check) @@ -36,9 +35,8 @@ choose_deploy(user) break else - if(active && !delayed_seal_part(part)) + if((active && !delayed_seal_part(part, silent = TRUE)) || !retract(user, part)) return - retract(user, part) SEND_SIGNAL(src, COMSIG_MOD_RETRACTED, user) for(var/obj/item/checking_part as anything in parts_to_check) if(checking_part.loc == src) @@ -49,28 +47,30 @@ /// Quickly deploys all parts (or retracts if all are on the wearer) /obj/item/mod/control/proc/quick_deploy(mob/user) if(activating) - balloon_alert(user, "currently sealing/unsealing!") + balloon_alert(user, "currently [active ? "unsealing" : "sealing"]!") playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE - var/deploy = TRUE + var/deploy = FALSE for(var/obj/item/part as anything in get_parts()) - if(part.loc == src) + if(part.loc != src) continue - deploy = FALSE + deploy = TRUE break + wearer.visible_message(span_notice("[wearer]'s [src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."), + span_notice("[src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."), + span_hear("You hear a mechanical hiss.")) + playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) for(var/obj/item/part as anything in get_parts()) if(deploy && part.loc == src) - deploy(null, part) + if(!deploy(null, part)) + continue if(active && !delayed_seal_part(part)) + retract(null, part) return else if(!deploy && part.loc != src) if(active && !delayed_seal_part(part)) return retract(null, part) - wearer.visible_message(span_notice("[wearer]'s [src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."), - span_notice("[src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."), - span_hear("You hear a mechanical hiss.")) - playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(deploy) SEND_SIGNAL(src, COMSIG_MOD_DEPLOYED, user) else @@ -96,6 +96,7 @@ RegisterSignal(part, COMSIG_ATOM_EXITED, PROC_REF(on_overslot_exit)) if(wearer.equip_to_slot_if_possible(part, part.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) ADD_TRAIT(part, TRAIT_NODROP, MOD_TRAIT) + wearer.update_clothing(slot_flags) if(!user) return TRUE wearer.visible_message(span_notice("[wearer]'s [part.name] deploy[part.p_s()] with a mechanical hiss."), @@ -105,6 +106,10 @@ SEND_SIGNAL(src, COMSIG_MOD_PART_DEPLOYED, user, part) return TRUE else + if(part_datum.overslotting) + var/obj/item/overslot = part_datum.overslotting + if(!wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE) if(!user) return FALSE balloon_alert(user, "bodypart clothed!") @@ -119,21 +124,22 @@ return FALSE balloon_alert(user, "[part.name] already retracted!") playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE REMOVE_TRAIT(part, TRAIT_NODROP, MOD_TRAIT) wearer.transferItemToLoc(part, src, force = TRUE) if(part_datum.overslotting) - UnregisterSignal(part, COMSIG_ATOM_EXITED) var/obj/item/overslot = part_datum.overslotting if(!QDELING(wearer) && !wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE) - part_datum.overslotting = null + wearer.update_clothing(slot_flags) SEND_SIGNAL(src, COMSIG_MOD_PART_RETRACTED, user, part) if(!user) - return + return TRUE wearer.visible_message(span_notice("[wearer]'s [part.name] retract[part.p_s()] back into [src] with a mechanical hiss."), span_notice("[part] retract[part.p_s()] back into [src] with a mechanical hiss."), span_hear("You hear a mechanical hiss.")) playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE /// Starts the activation sequence, where parts of the suit activate one by one until the whole suit is on. /obj/item/mod/control/proc/toggle_activate(mob/user, force_deactivate = FALSE) @@ -168,46 +174,71 @@ module.deactivate(display_message = FALSE) activating = TRUE mod_link.end_call() + var/original_active_status = active to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) //deploy the control unit - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)), hidden = TRUE)) - playsound(src, active ? 'sound/machines/synth/synth_no.ogg' : 'sound/machines/synth/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 8000) - else - activating = FALSE - return + if(original_active_status) + if(delayed_activation()) + playsound(src, 'sound/machines/synth/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) + to_chat(wearer, span_notice("Control unit offline. Module capability removed.")) + else + activating = FALSE + return + + var/list/sealed_parts = list() for(var/obj/item/part as anything in get_parts()) //seals/unseals all deployed parts if(part.loc == src) continue - delayed_seal_part(part, no_activation = TRUE) + if(!delayed_seal_part(part)) //shit something broke, revert it all + activating = FALSE + for(var/obj/item/sealed_part as anything in sealed_parts) + seal_part(sealed_part, is_sealed = !get_part_datum(sealed_part).sealed) + if(original_active_status) + control_activation(is_on = TRUE) + to_chat(wearer, span_notice("Critical error in sealing systems. Reverting process.")) + playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + sealed_parts += part - //finish activation - to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer].")) + if(!original_active_status) + if(delayed_activation()) + playsound(src, 'sound/machines/synth/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) + if(!malfunctioning) + wearer.playsound_local(get_turf(src), 'sound/vehicles/mecha/nominal.ogg', 50) + else + activating = FALSE + for(var/obj/item/sealed_part as anything in sealed_parts) + seal_part(sealed_part, is_sealed = !get_part_datum(sealed_part).sealed) + to_chat(wearer, span_notice("Critical error in sealing systems. Reverting process.")) + playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + + to_chat(wearer, span_notice("Systems [active ? "started up. Parts sealed. Welcome" : "shut down. Parts unsealed. Goodbye"], [wearer].")) if(ai_assistant) - to_chat(ai_assistant, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai_assistant]\"")) - finish_activation(is_on = !active) - if(active) - playsound(src, 'sound/machines/synth/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) - if(!malfunctioning) - wearer.playsound_local(get_turf(src), 'sound/vehicles/mecha/nominal.ogg', 50) - else - playsound(src, 'sound/machines/synth/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) - + to_chat(ai_assistant, span_notice("SYSTEMS [active ? "ACTIVATED. WELCOME" : "DEACTIVATED. GOODBYE"]: \"[ai_assistant]\"")) activating = FALSE SEND_SIGNAL(src, COMSIG_MOD_TOGGLED, user) return TRUE -/obj/item/mod/control/proc/delayed_seal_part(obj/item/clothing/part, no_activation = FALSE) +/obj/item/mod/control/proc/delayed_seal_part(obj/item/clothing/part, silent = FALSE) . = FALSE var/datum/mod_part/part_datum = get_part_datum(part) if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)), hidden = TRUE)) - to_chat(wearer, span_notice("[part] [!part_datum.sealed ? part_datum.sealed_message : part_datum.unsealed_message].")) - playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - seal_part(part, is_sealed = !part_datum.sealed, no_activation = no_activation) + if(!silent) + to_chat(wearer, span_notice("[part] [!part_datum.sealed ? part_datum.sealed_message : part_datum.unsealed_message].")) + playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + seal_part(part, is_sealed = !part_datum.sealed) + return TRUE + +/obj/item/mod/control/proc/delayed_activation() + . = FALSE + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)), hidden = TRUE)) + control_activation(is_on = !active) return TRUE ///Seals or unseals the given part. -/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, is_sealed, no_activation = FALSE) +/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, is_sealed) var/datum/mod_part/part_datum = get_part_datum(part) part_datum.sealed = is_sealed if(part_datum.sealed) @@ -231,38 +262,41 @@ wearer.update_obscured_slots(part.visor_flags_inv) if((part.clothing_flags & (MASKINTERNALS|HEADINTERNALS)) && wearer.invalid_internals()) wearer.cutoff_internals() - if(!active || no_activation) + if(!active) return - // these only matter during sealing and unsealing while active via deployment if(is_sealed) for(var/obj/item/mod/module/module as anything in modules) - if(!module.has_required_parts(list("[part.slot_flags]" = part_datum), need_extended = TRUE)) + if(module.part_activated || !module.has_required_parts(mod_parts, need_active = TRUE)) continue - module.on_suit_activation() + module.on_part_activation() + module.part_activated = TRUE else for(var/obj/item/mod/module/module as anything in modules) - if(!module.has_required_parts(list("[part.slot_flags]" = part_datum), need_extended = TRUE)) + if(!module.part_activated || module.has_required_parts(mod_parts, need_active = TRUE)) continue - module.on_suit_deactivation() + module.on_part_deactivation() + module.part_activated = FALSE if(!module.active || (module.allow_flags & MODULE_ALLOW_INACTIVE)) continue module.deactivate(display_message = FALSE) /// Finishes the suit's activation -/obj/item/mod/control/proc/finish_activation(is_on) +/obj/item/mod/control/proc/control_activation(is_on) var/datum/mod_part/part_datum = get_part_datum(src) part_datum.sealed = is_on active = is_on if(active) for(var/obj/item/mod/module/module as anything in modules) - if(!module.has_required_parts(mod_parts, need_extended = TRUE)) + if(module.part_activated || !module.has_required_parts(mod_parts, need_active = TRUE)) continue - module.on_suit_activation() + module.on_part_activation() + module.part_activated = TRUE else for(var/obj/item/mod/module/module as anything in modules) - if(!module.has_required_parts(mod_parts, need_extended = TRUE)) //it probably will runtime if we dont do this + if(!module.part_activated || module.has_required_parts(mod_parts, need_active = TRUE)) continue - module.on_suit_deactivation() + module.on_part_deactivation() + module.part_activated = FALSE update_speed() update_charge_alert() update_appearance(UPDATE_ICON_STATE) @@ -271,14 +305,12 @@ /// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits. /obj/item/mod/control/proc/quick_activation() - var/seal = TRUE for(var/obj/item/part as anything in get_parts()) - if(!deploy(null, part)) - seal = FALSE - if(!seal) - return + deploy(null, part) for(var/obj/item/part as anything in get_parts()) + if(part.loc == src) + continue seal_part(part, is_sealed = TRUE) - finish_activation(is_on = TRUE) + control_activation(is_on = TRUE) #undef MOD_ACTIVATION_STEP_FLAGS diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 18ecd44c3e7..0f521e40691 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -513,7 +513,7 @@ for(var/obj/item/part as anything in get_parts()) retract(null, part) if(active) - finish_activation(is_on = FALSE) + control_activation(is_on = FALSE) mod_link?.end_call() var/mob/old_wearer = wearer unset_wearer() @@ -607,8 +607,9 @@ new_module.on_install() if(wearer) new_module.on_equip() - if(active && new_module.has_required_parts(mod_parts, need_extended = TRUE)) - new_module.on_suit_activation() + if(active && new_module.has_required_parts(mod_parts, need_active = TRUE)) + new_module.on_part_activation() + new_module.part_activated = TRUE if(user) balloon_alert(user, "[new_module] added") playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) @@ -619,7 +620,7 @@ if(wearer) old_module.on_unequip() if(active) - old_module.on_suit_deactivation(deleting = deleting) + old_module.on_part_deactivation(deleting = deleting) if(old_module.active) old_module.deactivate(display_message = !deleting, deleting = deleting) old_module.UnregisterSignal(src, COMSIG_ITEM_GET_WORN_OVERLAYS) @@ -678,7 +679,7 @@ /obj/item/mod/control/proc/update_speed() for(var/obj/item/part as anything in get_parts(all = TRUE)) - part.slowdown = (active ? slowdown_active : slowdown_inactive) / length(mod_parts) + part.slowdown = (get_part_datum(part).sealed ? slowdown_active : slowdown_inactive) / length(mod_parts) wearer?.update_equipment_speed_mods() /obj/item/mod/control/proc/power_off() @@ -705,6 +706,9 @@ uninstall(part) return if(part in get_parts()) + var/datum/mod_part/part_datum = get_part_datum(part) + if(part_datum.sealed) + seal_part(part, is_sealed = FALSE) if(isnull(part.loc)) return if(!wearer) @@ -733,6 +737,7 @@ var/datum/mod_part/part_datum = get_part_datum(part) if(overslot != part_datum.overslotting) return + UnregisterSignal(part, COMSIG_ATOM_EXITED) part_datum.overslotting = null /obj/item/mod/control/proc/on_potion(atom/movable/source, obj/item/slimepotion/speed/speed_potion, mob/living/user) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 664f9118b83..76f9063df0b 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -62,8 +62,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -205,8 +203,6 @@ SEALED_COVER = HEADCOVERSEYES, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_INVISIBILITY = HIDEJUMPSUIT, UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE, @@ -270,8 +266,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -340,8 +334,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -414,8 +406,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -490,8 +480,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEBELT, @@ -524,8 +512,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEBELT, @@ -602,8 +588,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE, SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE, @@ -676,8 +660,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -711,8 +693,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -793,8 +773,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -867,8 +845,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -936,8 +912,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1005,8 +979,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1080,8 +1052,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1150,8 +1120,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1227,8 +1195,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1262,8 +1228,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1337,8 +1301,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1414,8 +1376,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEMUTWINGS, CAN_OVERSLOT = TRUE, @@ -1501,8 +1461,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1573,8 +1531,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL|CASTING_CLOTHES, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1644,8 +1600,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1717,8 +1671,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1787,8 +1739,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1856,8 +1806,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1889,8 +1837,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -1973,8 +1919,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -2044,8 +1988,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -2110,8 +2052,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -2178,8 +2118,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, @@ -2245,8 +2183,6 @@ SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), /obj/item/clothing/suit/mod = list( - UNSEALED_LAYER = MOD_CHESTPLATE_LAYER, - SEALED_LAYER = MOD_CHESTPLATE_LAYER, UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE, diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index ad0ca106bd1..391eef60eb4 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -39,6 +39,10 @@ var/cooldown_time = 0 /// The mouse button needed to use this module var/used_signal + /// Are all parts needed active- have we ran on_part_activation + var/part_activated = FALSE + /// Do we need the parts to be extended to run process + var/part_process = TRUE /// List of REF()s mobs we are pinned to, linked with their action buttons var/list/pinned_to = list() /// flags that let the module ability be used in odd circumstances @@ -79,14 +83,14 @@ . += span_notice("Complexity level: [complexity]") /// Looks through the MODsuit's parts to see if it has the parts required to support this module -/obj/item/mod/module/proc/has_required_parts(list/parts, need_extended = FALSE) +/obj/item/mod/module/proc/has_required_parts(list/parts, need_active = FALSE) if(!length(required_slots)) return TRUE var/total_slot_flags = NONE for(var/part_slot in parts) - if(need_extended) + if(need_active) var/datum/mod_part/part_datum = parts[part_slot] - if(part_datum.part_item.loc == mod) + if(!part_datum.sealed) continue total_slot_flags |= text2num(part_slot) var/list/needed_slots = required_slots.Copy() @@ -110,7 +114,7 @@ if(mod.wearer) balloon_alert(mod.wearer, "not active!") return - if(!has_required_parts(mod.mod_parts, need_extended = TRUE)) + if(!has_required_parts(mod.mod_parts, need_active = TRUE)) if(mod.wearer) balloon_alert(mod.wearer, "required parts inactive!") var/list/slot_strings = list() @@ -231,6 +235,8 @@ /// Called on the MODsuit's process /obj/item/mod/module/proc/on_process(seconds_per_tick) + if(part_process && !part_activated) + return FALSE if(active) if(!drain_power(active_power_cost * seconds_per_tick)) deactivate() @@ -265,11 +271,11 @@ return /// Called when the MODsuit is activated -/obj/item/mod/module/proc/on_suit_activation() +/obj/item/mod/module/proc/on_part_activation() return /// Called when the MODsuit is deactivated -/obj/item/mod/module/proc/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/proc/on_part_deactivation(deleting = FALSE) return /// Called when the MODsuit is equipped @@ -337,7 +343,7 @@ /// Generates an icon to be used for the suit's worn overlays /obj/item/mod/module/proc/generate_worn_overlay(mutable_appearance/standing) . = list() - if(!mod.active || !has_required_parts(mod.mod_parts, need_extended = TRUE)) + if(!mod.active || !has_required_parts(mod.mod_parts, need_active = TRUE)) return var/used_overlay = get_current_overlay_state() if (!used_overlay) diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index d1394ad3d7e..e2ec36fe377 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -37,12 +37,12 @@ laser = 15 energy = 15 -/obj/item/mod/module/armor_booster/on_suit_activation() +/obj/item/mod/module/armor_booster/on_part_activation() var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) if(istype(head_cover)) head_cover.flash_protect = FLASH_PROTECTION_WELDER -/obj/item/mod/module/armor_booster/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/armor_booster/on_part_deactivation(deleting = FALSE) if(deleting) return var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) @@ -53,36 +53,38 @@ playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) balloon_alert(mod.wearer, "armor boosted, EVA lost") actual_speed_added = max(0, min(mod.slowdown_active, speed_added)) - mod.slowdown -= actual_speed_added - mod.wearer.update_equipment_speed_mods() var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) if(istype(head_cover)) ADD_TRAIT(mod.wearer, TRAIT_HEAD_INJURY_BLOCKED, MOD_TRAIT) + var/list/mod_parts = mod.get_parts(all = TRUE) for(var/obj/item/part as anything in mod.get_parts(all = TRUE)) part.set_armor(part.get_armor().add_other_armor(armor_mod)) + part.slowdown -= speed_added / length(mod_parts) if(!remove_pressure_protection || !isclothing(part)) continue var/obj/item/clothing/clothing_part = part if(clothing_part.clothing_flags & STOPSPRESSUREDAMAGE) clothing_part.clothing_flags &= ~STOPSPRESSUREDAMAGE spaceproofed[clothing_part] = TRUE + mod.wearer.update_equipment_speed_mods() /obj/item/mod/module/armor_booster/on_deactivation(display_message = TRUE, deleting = FALSE) if(!deleting) playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) balloon_alert(mod.wearer, "armor retracts, EVA ready") - mod.slowdown += actual_speed_added - mod.wearer.update_equipment_speed_mods() var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) if(istype(head_cover)) REMOVE_TRAIT(mod.wearer, TRAIT_HEAD_INJURY_BLOCKED, MOD_TRAIT) + var/list/mod_parts = mod.get_parts(all = TRUE) for(var/obj/item/part as anything in mod.get_parts(all = TRUE)) part.set_armor(part.get_armor().subtract_other_armor(armor_mod)) + part.slowdown += speed_added / length(mod_parts) if(!remove_pressure_protection || !isclothing(part)) continue var/obj/item/clothing/clothing_part = part if(spaceproofed[clothing_part]) clothing_part.clothing_flags |= STOPSPRESSUREDAMAGE + mod.wearer.update_equipment_speed_mods() spaceproofed = list() /obj/item/mod/module/armor_booster/generate_worn_overlay(mutable_appearance/standing) @@ -126,12 +128,12 @@ . = ..() charges = max_charges -/obj/item/mod/module/energy_shield/on_suit_activation() +/obj/item/mod/module/energy_shield/on_part_activation() mod.AddComponent(/datum/component/shielded, max_charges = max_charges, recharge_start_delay = recharge_start_delay, charge_increment_delay = charge_increment_delay, \ charge_recovery = charge_recovery, lose_multiple_charges = lose_multiple_charges, recharge_path = recharge_path, starting_charges = charges, shield_icon_file = shield_icon_file, shield_icon = shield_icon) RegisterSignal(mod.wearer, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(shield_reaction)) -/obj/item/mod/module/energy_shield/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/energy_shield/on_part_deactivation(deleting = FALSE) var/datum/component/shielded/shield = mod.GetComponent(/datum/component/shielded) charges = shield.current_charges qdel(shield) @@ -182,10 +184,10 @@ incompatible_modules = list(/obj/item/mod/module/anti_magic) required_slots = list(ITEM_SLOT_BACK) -/obj/item/mod/module/anti_magic/on_suit_activation() +/obj/item/mod/module/anti_magic/on_part_activation() mod.wearer.add_traits(list(TRAIT_ANTIMAGIC, TRAIT_HOLY), MOD_TRAIT) -/obj/item/mod/module/anti_magic/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/anti_magic/on_part_deactivation(deleting = FALSE) mod.wearer.remove_traits(list(TRAIT_ANTIMAGIC, TRAIT_HOLY), MOD_TRAIT) /obj/item/mod/module/anti_magic/wizard @@ -197,10 +199,10 @@ icon_state = "magic_neutralizer" required_slots = list() -/obj/item/mod/module/anti_magic/wizard/on_suit_activation() +/obj/item/mod/module/anti_magic/wizard/on_part_activation() mod.wearer.add_traits(list(TRAIT_ANTIMAGIC, TRAIT_ANTIMAGIC_NO_SELFBLOCK), MOD_TRAIT) -/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/anti_magic/wizard/on_part_deactivation(deleting = FALSE) mod.wearer.remove_traits(list(TRAIT_ANTIMAGIC, TRAIT_ANTIMAGIC_NO_SELFBLOCK), MOD_TRAIT) ///Insignia - Gives you a skin specific stripe. @@ -260,10 +262,10 @@ incompatible_modules = list(/obj/item/mod/module/noslip) required_slots = list(ITEM_SLOT_FEET) -/obj/item/mod/module/noslip/on_suit_activation() +/obj/item/mod/module/noslip/on_part_activation() ADD_TRAIT(mod.wearer, TRAIT_NO_SLIP_WATER, MOD_TRAIT) -/obj/item/mod/module/noslip/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/noslip/on_part_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_NO_SLIP_WATER, MOD_TRAIT) //Bite of 87 Springlock - Equips faster, disguised as DNA lock. @@ -279,7 +281,7 @@ complexity = initial(the_dna_lock_behind_the_slaughter.complexity) use_energy_cost = initial(the_dna_lock_behind_the_slaughter.use_energy_cost) -/obj/item/mod/module/springlock/bite_of_87/on_suit_activation() +/obj/item/mod/module/springlock/bite_of_87/on_part_activation() ..() if(check_holidays(APRIL_FOOLS) || prob(1)) mod.set_mod_color("#b17f00") @@ -485,11 +487,11 @@ required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT) var/datum/proximity_monitor/advanced/demoraliser/demoralizer -/obj/item/mod/module/demoralizer/on_suit_activation() +/obj/item/mod/module/demoralizer/on_part_activation() var/datum/demoralise_moods/module/mood_category = new() demoralizer = new(mod.wearer, 7, TRUE, mood_category) -/obj/item/mod/module/demoralizer/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/demoralizer/on_part_deactivation(deleting = FALSE) QDEL_NULL(demoralizer) /obj/item/mod/module/infiltrator @@ -512,7 +514,7 @@ /obj/item/mod/module/infiltrator/on_uninstall(deleting = FALSE) mod.item_flags &= ~EXAMINE_SKIP -/obj/item/mod/module/infiltrator/on_suit_activation() +/obj/item/mod/module/infiltrator/on_part_activation() mod.wearer.add_traits(traits_to_add, MOD_TRAIT) RegisterSignal(mod.wearer, COMSIG_TRY_MODIFY_SPEECH, PROC_REF(on_speech_modification)) var/obj/item/organ/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE) @@ -521,7 +523,7 @@ if(istype(head_cover)) head_cover.flash_protect = FLASH_PROTECTION_WELDER_HYPER_SENSITIVE -/obj/item/mod/module/infiltrator/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/infiltrator/on_part_deactivation(deleting = FALSE) mod.wearer.remove_traits(traits_to_add, MOD_TRAIT) UnregisterSignal(mod.wearer, COMSIG_TRY_MODIFY_SPEECH) var/obj/item/organ/tongue/user_tongue = mod.wearer.get_organ_slot(ORGAN_SLOT_TONGUE) @@ -584,7 +586,16 @@ if(disrupted.on_saboteur(src, 1 MINUTES)) mod.add_charge(DEFAULT_CHARGE_DRAIN * 250) -/obj/item/mod/module/stealth/wraith/on_suit_activation() +/obj/item/mod/module/stealth/wraith/on_part_activation() + start_stealth() + +/obj/item/mod/module/stealth/wraith/on_part_deactivation(deleting) + if(bumpoff) + UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) + UnregisterSignal(mod.wearer, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED)) + animate(mod.wearer, alpha = 255, time = 1.5 SECONDS) + +/obj/item/mod/module/stealth/wraith/proc/start_stealth() if(bumpoff) RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, PROC_REF(unstealth)) RegisterSignal(mod.wearer, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) @@ -593,16 +604,10 @@ animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) drain_power(use_energy_cost) -/obj/item/mod/module/stealth/wraith/on_suit_deactivation(deleting) - if(bumpoff) - UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) - UnregisterSignal(mod.wearer, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED)) - animate(mod.wearer, alpha = 255, time = 1.5 SECONDS) - /obj/item/mod/module/stealth/wraith/unstealth(datum/source) . = ..() if(mod.active) - addtimer(CALLBACK(src, PROC_REF(on_suit_activation)), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(start_stealth)), 5 SECONDS) /obj/item/mod/module/stealth/wraith/examine_more(mob/user) . = ..() diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 9ddb0f9351c..f65fbbffe90 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -12,13 +12,13 @@ overlay_state_inactive = "module_welding" required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK) -/obj/item/mod/module/welding/on_suit_activation() +/obj/item/mod/module/welding/on_part_activation() var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) if(istype(head_cover)) //this is a screen that displays an image, so flash sensitives can use this to protect against flashes. head_cover.flash_protect = FLASH_PROTECTION_WELDER_HYPER_SENSITIVE -/obj/item/mod/module/welding/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/welding/on_part_deactivation(deleting = FALSE) if(deleting) return var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) @@ -244,13 +244,13 @@ target.AddComponent(/datum/component/tether, src, 7, "tether") /datum/embed_data/tether_projectile - embed_chance=65 // spiky - fall_chance=2 - ignore_throwspeed_threshold=TRUE - pain_stam_pct=0.4 - pain_mult=3 - jostle_pain_mult=2 - rip_time=1 SECONDS + embed_chance = 65 //spiky + fall_chance = 2 + ignore_throwspeed_threshold = TRUE + pain_stam_pct = 0.4 + pain_mult = 3 + jostle_pain_mult = 2 + rip_time = 1 SECONDS ///Radiation Protection - Protects the user from radiation, gives them a geiger counter and rad info in the panel. /obj/item/mod/module/rad_protection @@ -263,17 +263,18 @@ idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/rad_protection) tgui_id = "rad_counter" + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET) /// Radiation threat level being perceived. var/perceived_threat_level -/obj/item/mod/module/rad_protection/on_suit_activation() +/obj/item/mod/module/rad_protection/on_part_activation() AddComponent(/datum/component/geiger_sound) ADD_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) RegisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION, PROC_REF(on_pre_potential_irradiation)) for(var/obj/item/part in mod.get_parts(all = TRUE)) ADD_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) -/obj/item/mod/module/rad_protection/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/rad_protection/on_part_deactivation(deleting = FALSE) qdel(GetComponent(/datum/component/geiger_sound)) REMOVE_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) UnregisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION) @@ -309,10 +310,10 @@ cooldown_time = 11 SECONDS required_slots = list(ITEM_SLOT_GLOVES) -/obj/item/mod/module/constructor/on_suit_activation() +/obj/item/mod/module/constructor/on_part_activation() ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) -/obj/item/mod/module/constructor/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/constructor/on_part_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) /obj/item/mod/module/constructor/on_use() @@ -332,10 +333,10 @@ incompatible_modules = list(/obj/item/mod/module/armor_booster, /obj/item/mod/module/infiltrator) required_slots = list(ITEM_SLOT_HEAD) -/obj/item/mod/module/headprotector/on_suit_activation() +/obj/item/mod/module/headprotector/on_part_activation() ADD_TRAIT(mod.wearer, TRAIT_HEAD_INJURY_BLOCKED, MOD_TRAIT) -/obj/item/mod/module/headprotector/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/headprotector/on_part_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_HEAD_INJURY_BLOCKED, MOD_TRAIT) ///Mister - Sprays water over an area. diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 72de7a22b49..f8efae8ea24 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -297,10 +297,10 @@ if("display_dna") display_dna = text2num(value) -/obj/item/mod/module/status_readout/on_suit_activation() +/obj/item/mod/module/status_readout/on_part_activation() RegisterSignal(mod.wearer, COMSIG_LIVING_DEATH, PROC_REF(death_sound)) -/obj/item/mod/module/status_readout/on_suit_deactivation(deleting) +/obj/item/mod/module/status_readout/on_part_deactivation(deleting) UnregisterSignal(mod.wearer, COMSIG_LIVING_DEATH) /obj/item/mod/module/status_readout/proc/death_sound(mob/living/carbon/human/wearer) @@ -387,10 +387,10 @@ including augmentations. However, it will take from the suit's power to do so." complexity = 2 -/obj/item/mod/module/emp_shield/advanced/on_suit_activation() +/obj/item/mod/module/emp_shield/advanced/on_part_activation() mod.wearer.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) -/obj/item/mod/module/emp_shield/advanced/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/emp_shield/advanced/on_part_deactivation(deleting = FALSE) mod.wearer.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) ///Flashlight - Gives the suit a customizable flashlight. @@ -524,10 +524,10 @@ incompatible_modules = list(/obj/item/mod/module/longfall) required_slots = list(ITEM_SLOT_FEET) -/obj/item/mod/module/longfall/on_suit_activation() +/obj/item/mod/module/longfall/on_part_activation() RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, PROC_REF(z_impact_react)) -/obj/item/mod/module/longfall/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/longfall/on_part_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT) /obj/item/mod/module/longfall/proc/z_impact_react(datum/source, levels, turf/fell_on) @@ -698,13 +698,13 @@ var/former_flags var/former_visor_flags -/obj/item/mod/module/hat_stabilizer/on_suit_activation() +/obj/item/mod/module/hat_stabilizer/on_part_activation() var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) if(!istype(helmet)) return helmet.AddComponent(/datum/component/hat_stabilizer) -/obj/item/mod/module/hat_stabilizer/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/hat_stabilizer/on_part_deactivation(deleting = FALSE) if(deleting) return var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) @@ -733,10 +733,10 @@ incompatible_modules = list(/obj/item/mod/module/signlang_radio) required_slots = list(ITEM_SLOT_GLOVES) -/obj/item/mod/module/signlang_radio/on_suit_activation() +/obj/item/mod/module/signlang_radio/on_part_activation() ADD_TRAIT(mod.wearer, TRAIT_CAN_SIGN_ON_COMMS, MOD_TRAIT) -/obj/item/mod/module/signlang_radio/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/signlang_radio/on_part_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_CAN_SIGN_ON_COMMS, MOD_TRAIT) ///A module that recharges the suit by an itsy tiny bit whenever the user takes a step. Originally called "magneto module" but the videogame reference sounds cooler. @@ -749,14 +749,14 @@ required_slots = list(ITEM_SLOT_FEET) var/power_per_step = DEFAULT_CHARGE_DRAIN * 0.3 -/obj/item/mod/module/joint_torsion/on_suit_activation() +/obj/item/mod/module/joint_torsion/on_part_activation() if(!(mod.wearer.movement_type & (FLOATING|FLYING))) RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) /// This way we don't even bother to call on_moved() while flying/floating RegisterSignal(mod.wearer, COMSIG_MOVETYPE_FLAG_ENABLED, PROC_REF(on_movetype_flag_enabled)) RegisterSignal(mod.wearer, COMSIG_MOVETYPE_FLAG_DISABLED, PROC_REF(on_movetype_flag_disabled)) -/obj/item/mod/module/joint_torsion/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/joint_torsion/on_part_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVETYPE_FLAG_ENABLED, COMSIG_MOVETYPE_FLAG_DISABLED)) /obj/item/mod/module/joint_torsion/proc/on_movetype_flag_enabled(datum/source, flag, old_state) @@ -982,7 +982,7 @@ qdel(gloves.GetComponent(/datum/component/profound_fisher)) return ..() -/obj/item/mod/module/fishing_glove/on_suit_activation() +/obj/item/mod/module/fishing_glove/on_part_activation() var/obj/item/gloves = mod.get_part_from_slot(ITEM_SLOT_GLOVES) if(!gloves) return @@ -990,7 +990,7 @@ if(equipped) gloves.AddComponent(/datum/component/profound_fisher, equipped) -/obj/item/mod/module/fishing_glove/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/fishing_glove/on_part_deactivation(deleting = FALSE) var/obj/item/gloves = mod.get_part_from_slot(ITEM_SLOT_GLOVES) if(gloves && !deleting) qdel(gloves.GetComponent(/datum/component/adjust_fishing_difficulty)) @@ -1005,12 +1005,12 @@ incompatible_modules = list(/obj/item/mod/module/shock_absorber) required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT) -/obj/item/mod/module/shock_absorber/on_suit_activation() +/obj/item/mod/module/shock_absorber/on_part_activation() . = ..() ADD_TRAIT(mod.wearer, TRAIT_BATON_RESISTANCE, REF(src)) RegisterSignal(mod.wearer, COMSIG_MOB_BATONED, PROC_REF(mob_batoned)) -/obj/item/mod/module/shock_absorber/on_suit_deactivation(deleting) +/obj/item/mod/module/shock_absorber/on_part_deactivation(deleting) . = ..() REMOVE_TRAIT(mod.wearer, TRAIT_BATON_RESISTANCE, REF(src)) UnregisterSignal(mod.wearer, COMSIG_MOB_BATONED) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 69a2cbd87b2..24a0d2822f1 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -22,11 +22,11 @@ /obj/item/mod/module/springlock/on_uninstall(deleting = FALSE) mod.activation_step_time /= step_change -/obj/item/mod/module/springlock/on_suit_activation() +/obj/item/mod/module/springlock/on_part_activation() RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_wearer_exposed)) AddComponent(/datum/component/connect_loc_behalf, mod.wearer, gas_connections) -/obj/item/mod/module/springlock/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/springlock/on_part_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS) qdel(GetComponent(/datum/component/connect_loc_behalf)) diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index a0cf2408860..154717cbcc1 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -75,12 +75,12 @@ required_slots = list(ITEM_SLOT_GLOVES) var/quick_carry_trait = TRAIT_QUICK_CARRY -/obj/item/mod/module/quick_carry/on_suit_activation() +/obj/item/mod/module/quick_carry/on_part_activation() . = ..() ADD_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) ADD_TRAIT(mod.wearer, quick_carry_trait, MOD_TRAIT) -/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/quick_carry/on_part_deactivation(deleting = FALSE) . = ..() REMOVE_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) REMOVE_TRAIT(mod.wearer, quick_carry_trait, MOD_TRAIT) @@ -370,7 +370,7 @@ playsound(src, 'sound/items/zip/zip.ogg', 25, TRUE) balloon_alert(mod.wearer, "clothing mended") -/obj/item/mod/module/thread_ripper/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/thread_ripper/on_part_deactivation(deleting = FALSE) if(!length(ripped_clothing)) return for(var/obj/item/clothing as anything in ripped_clothing) diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index bce377c71e9..c4e8962c447 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -13,7 +13,7 @@ use_energy_cost = DEFAULT_CHARGE_DRAIN * 10 incompatible_modules = list(/obj/item/mod/module/stealth) cooldown_time = 5 SECONDS - required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT) + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET) /// Whether or not the cloak turns off on bumping. var/bumpoff = TRUE /// The alpha applied when the cloak is on. @@ -92,11 +92,11 @@ overlay_state_inactive = null required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK) -/obj/item/mod/module/welding/camera_vision/on_suit_activation() +/obj/item/mod/module/welding/camera_vision/on_part_activation() . = ..() RegisterSignal(mod.wearer, COMSIG_LIVING_CAN_TRACK, PROC_REF(can_track)) -/obj/item/mod/module/welding/camera_vision/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/welding/camera_vision/on_part_deactivation(deleting = FALSE) . = ..() UnregisterSignal(mod.wearer, COMSIG_LIVING_CAN_TRACK) @@ -131,10 +131,10 @@ /// How many times the module has been used to force open doors. var/door_hack_counter = 0 -/obj/item/mod/module/hacker/on_suit_activation() +/obj/item/mod/module/hacker/on_part_activation() RegisterSignal(mod.wearer, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(hack)) -/obj/item/mod/module/hacker/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/hacker/on_part_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_LIVING_UNARMED_ATTACK) /obj/item/mod/module/hacker/proc/hack(mob/living/carbon/human/source, atom/target, proximity, modifiers) @@ -172,10 +172,10 @@ /// The accepted typepath we can link to. var/accepted_type = /obj/item/energy_katana -/obj/item/mod/module/weapon_recall/on_suit_activation() +/obj/item/mod/module/weapon_recall/on_part_activation() mod.wearer.add_traits(list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD), MOD_TRAIT) -/obj/item/mod/module/weapon_recall/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/weapon_recall/on_part_deactivation(deleting = FALSE) mod.wearer.remove_traits(list(TRAIT_NOGUNS, TRAIT_TOSS_GUN_HARD), MOD_TRAIT) /obj/item/mod/module/weapon_recall/on_use() @@ -312,7 +312,7 @@ /// List of all energy nets this module made. var/list/energy_nets = list() -/obj/item/mod/module/energy_net/on_suit_deactivation(deleting) +/obj/item/mod/module/energy_net/on_part_deactivation(deleting) for(var/obj/structure/energy_net/net as anything in energy_nets) net.atom_destruction(ENERGY) diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 8edcaff7715..3d1430d6dc6 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -36,10 +36,10 @@ return suit.allowed -= (guns_typecache - already_allowed_guns) -/obj/item/mod/module/magnetic_harness/on_suit_activation() +/obj/item/mod/module/magnetic_harness/on_part_activation() RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(check_dropped_item)) -/obj/item/mod/module/magnetic_harness/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/magnetic_harness/on_part_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM) /obj/item/mod/module/magnetic_harness/proc/check_dropped_item(datum/source, obj/item/dropped_item, force, new_location) @@ -74,10 +74,10 @@ overlay_state_use = "module_pepper_used" required_slots = list(ITEM_SLOT_OCLOTHING) -/obj/item/mod/module/pepper_shoulders/on_suit_activation() +/obj/item/mod/module/pepper_shoulders/on_part_activation() RegisterSignal(mod.wearer, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(on_check_block)) -/obj/item/mod/module/pepper_shoulders/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/pepper_shoulders/on_part_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_LIVING_CHECK_BLOCK) /obj/item/mod/module/pepper_shoulders/on_use() @@ -387,10 +387,10 @@ for(var/i in 1 to radar_slices) sorted_creatures += list(list()) -/obj/item/mod/module/active_sonar/on_suit_activation() +/obj/item/mod/module/active_sonar/on_part_activation() RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(sort_all_creatures)) -/obj/item/mod/module/active_sonar/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/active_sonar/on_part_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) /// Detects all living creatures within world.view, and returns the amount. @@ -547,10 +547,10 @@ if(!.) set_shooting_mode(SHOOTING_ASSISTANT_OFF) -/obj/item/mod/module/shooting_assistant/on_suit_activation() +/obj/item/mod/module/shooting_assistant/on_part_activation() apply_mode_effects() -/obj/item/mod/module/shooting_assistant/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/shooting_assistant/on_part_deactivation(deleting = FALSE) remove_mode_effects() /obj/item/mod/module/shooting_assistant/proc/stormtrooper_fired_gun(mob/user, obj/item/gun/gun_fired, target, params, zone_override, list/bonus_spread_values) @@ -582,10 +582,10 @@ incompatible_modules = list(/obj/item/mod/module/shove_blocker) required_slots = list(ITEM_SLOT_OCLOTHING) -/obj/item/mod/module/shove_blocker/on_suit_activation() +/obj/item/mod/module/shove_blocker/on_part_activation() mod.wearer.add_traits(list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH), MOD_TRAIT) -/obj/item/mod/module/shove_blocker/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/shove_blocker/on_part_deactivation(deleting = FALSE) mod.wearer.remove_traits(list(TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, TRAIT_NO_STAGGER, TRAIT_NO_THROW_HITPUSH), MOD_TRAIT) /obj/item/mod/module/shove_blocker/locked @@ -601,10 +601,10 @@ complexity = 0 required_slots = list(ITEM_SLOT_GLOVES) -/obj/item/mod/module/quick_cuff/on_suit_activation() +/obj/item/mod/module/quick_cuff/on_part_activation() . = ..() ADD_TRAIT(mod.wearer, TRAIT_FAST_CUFFING, MOD_TRAIT) -/obj/item/mod/module/quick_cuff/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/quick_cuff/on_part_deactivation(deleting = FALSE) . = ..() REMOVE_TRAIT(mod.wearer, TRAIT_FAST_CUFFING, MOD_TRAIT) diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 4d2650585b1..ad559a07ccf 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -76,7 +76,7 @@ incompatible_modules = list(/obj/item/mod/module/waddle) required_slots = list(ITEM_SLOT_FEET) -/obj/item/mod/module/waddle/on_suit_activation() +/obj/item/mod/module/waddle/on_part_activation() var/obj/item/shoes = mod.get_part_from_slot(ITEM_SLOT_FEET) if(shoes) shoes.AddComponent(/datum/component/squeak, list('sound/effects/footstep/clownstep1.ogg'=1,'sound/effects/footstep/clownstep2.ogg'=1), 50, falloff_exponent = 20) //die off quick please @@ -84,7 +84,7 @@ if(is_clown_job(mod.wearer.mind?.assigned_role)) mod.wearer.add_mood_event("clownshoes", /datum/mood_event/clownshoes) -/obj/item/mod/module/waddle/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/waddle/on_part_deactivation(deleting = FALSE) var/obj/item/shoes = mod.get_part_from_slot(ITEM_SLOT_FEET) if(shoes && !deleting) qdel(shoes.GetComponent(/datum/component/squeak)) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 1ce0a2f316d..8be66e0b3e3 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -80,7 +80,7 @@ else balloon_alert(mod.wearer, "invalid target!") -/obj/item/mod/module/clamp/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/clamp/on_part_deactivation(deleting = FALSE) if(deleting) return for(var/atom/movable/crate as anything in stored_crates) @@ -275,10 +275,10 @@ . = ..() disposal_tag = pick(GLOB.TAGGERLOCATIONS) -/obj/item/mod/module/disposal_connector/on_suit_activation() +/obj/item/mod/module/disposal_connector/on_part_activation() RegisterSignal(mod.wearer, COMSIG_MOVABLE_DISPOSING, PROC_REF(disposal_handling)) -/obj/item/mod/module/disposal_connector/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/disposal_connector/on_part_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_DISPOSING) /obj/item/mod/module/disposal_connector/get_configuration() @@ -361,7 +361,7 @@ incompatible_modules = list(/obj/item/mod/module/ash_accretion) overlay_state_inactive = "module_ash" use_mod_colors = TRUE - required_slots = list(ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING) + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET) /// How many tiles we can travel to max out the armor. var/max_traveled_tiles = 10 /// How many tiles we traveled through. @@ -406,11 +406,11 @@ /turf/open/water, )) -/obj/item/mod/module/ash_accretion/on_suit_activation() +/obj/item/mod/module/ash_accretion/on_part_activation() mod.wearer.add_traits(list(TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), MOD_TRAIT) RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) -/obj/item/mod/module/ash_accretion/on_suit_deactivation(deleting = FALSE) +/obj/item/mod/module/ash_accretion/on_part_deactivation(deleting = FALSE) mod.wearer.remove_traits(list(TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), MOD_TRAIT) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) if(!traveled_tiles) @@ -471,7 +471,7 @@ use_energy_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/sphere_transform) cooldown_time = 1.25 SECONDS - required_slots = list(ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING, ITEM_SLOT_HEAD|ITEM_SLOT_MASK) + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET) /// Time it takes us to complete the animation. var/animate_time = 0.25 SECONDS /// List of traits to add/remove from our subject as needed. diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 16f8d771c4a..f4724db3b69 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -193,14 +193,13 @@ /obj/item/bodypart/arm/drop_limb(special, dismembered, move_to_floor = TRUE) var/mob/living/carbon/arm_owner = owner - if(special || !arm_owner) return ..() - if(arm_owner.hand_bodyparts[held_index] == src) // We only want to do this if the limb being removed is the active hand part. // This catches situations where limbs are "hot-swapped" such as augmentations and roundstart prosthetics. arm_owner.dropItemToGround(arm_owner.get_item_for_held_index(held_index), 1) + . = ..() if(arm_owner.handcuffed) arm_owner.handcuffed.forceMove(drop_location()) arm_owner.handcuffed.dropped(arm_owner) @@ -209,21 +208,22 @@ if(arm_owner.hud_used) var/atom/movable/screen/inventory/hand/associated_hand = arm_owner.hud_used.hand_slots["[held_index]"] associated_hand?.update_appearance() - . = ..() if(arm_owner.num_hands == 0) - arm_owner.dropItemToGround(arm_owner.gloves, TRUE) + arm_owner.dropItemToGround(arm_owner.gloves, force = TRUE) arm_owner.update_worn_gloves() //to remove the bloody hands overlay /obj/item/bodypart/leg/drop_limb(special, dismembered, move_to_floor = TRUE) - if(owner && !special) - if(owner.legcuffed) - owner.legcuffed.forceMove(owner.drop_location()) //At this point bodypart is still in nullspace - owner.legcuffed.dropped(owner) - owner.legcuffed = null - owner.update_worn_legcuffs() - if(owner.shoes) - owner.dropItemToGround(owner.shoes, TRUE) - return ..() + var/mob/living/carbon/leg_owner = owner + . = ..() + if(special || !leg_owner) + return + if(leg_owner.legcuffed) + leg_owner.legcuffed.forceMove(drop_location()) + leg_owner.legcuffed.dropped(leg_owner) + leg_owner.legcuffed = null + leg_owner.update_worn_legcuffs() + if(leg_owner.shoes) + leg_owner.dropItemToGround(leg_owner.shoes, force = TRUE) /obj/item/bodypart/head/drop_limb(special, dismembered, move_to_floor = TRUE) if(!special) diff --git a/code/modules/unit_tests/dismemberment.dm b/code/modules/unit_tests/dismemberment.dm index d8ce43b960e..06c8707af20 100644 --- a/code/modules/unit_tests/dismemberment.dm +++ b/code/modules/unit_tests/dismemberment.dm @@ -14,7 +14,7 @@ // Abnormal situation: We're holding an undroppable item and get dismembered. ADD_TRAIT(testing_item, TRAIT_NODROP, TRAIT_GENERIC) - test_item(dummy, testing_item, status_text = "after applying TRAIT_NODROP to the testing item") + test_item(dummy, testing_item, status_text = " after applying TRAIT_NODROP to the testing item") /datum/unit_test/dismemberment/proc/test_item(mob/living/carbon/human/dummy, obj/item/testing_item, status_text = "") @@ -31,7 +31,7 @@ var/obj/item/held_item = dummy.get_item_for_held_index(dismembered_limb.held_index) dismembered_limb.dismember() - TEST_ASSERT(held_item in dummy.loc, "Dummy did not drop [held_item] when [dismembered_limb] was dismembered [status_text].") + TEST_ASSERT(held_item in dummy.loc, "Dummy did not drop [held_item] when [dismembered_limb] was dismembered[status_text].") // Clean up after ourselves qdel(dismembered_limb) dummy.fully_heal(HEAL_ALL)