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)