diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index bf6e68f127c..cf6a5a12ef7 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -280,3 +280,5 @@ #define COMSIG_LIVING_THROW_MODE_TOGGLE "living_throw_mode_toggle" ///From /datum/component/happiness() #define COMSIG_MOB_HAPPINESS_CHANGE "happiness_change" +/// From /obj/item/melee/baton/baton_effect(): (datum/source, mob/living/user, /obj/item/melee/baton) +#define COMSIG_MOB_BATONED "mob_batoned" diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index b576ef5d41c..112c527ec28 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -212,6 +212,7 @@ if(!trait_check) target.Knockdown((isnull(stun_override) ? knockdown_time : stun_override)) additional_effects_non_cyborg(target, user) + SEND_SIGNAL(target, COMSIG_MOB_BATONED, user, src) return TRUE /// Description for trying to stun when still on cooldown. diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 8843a811756..539237fa3e8 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -221,6 +221,7 @@ applied_cell = /obj/item/stock_parts/cell/super applied_modules = list( /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/shock_absorber, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack, @@ -241,6 +242,7 @@ applied_cell = /obj/item/stock_parts/cell/bluespace applied_modules = list( /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/shock_absorber, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, @@ -263,6 +265,7 @@ req_access = list(ACCESS_SYNDICATE) applied_modules = list( /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/shock_absorber, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, @@ -299,6 +302,7 @@ req_access = list(ACCESS_SYNDICATE) applied_modules = list( /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/shock_absorber, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, @@ -316,6 +320,7 @@ /obj/item/mod/control/pre_equipped/elite/flamethrower applied_modules = list( /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/shock_absorber, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/thermal_regulator, diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 87cab74b24f..3ef6b955871 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -979,3 +979,29 @@ attempt_insert_storage(product) balloon_alert(mod.wearer, "ammo box dispensed.") playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, TRUE) + +/obj/item/mod/module/shock_absorber + name = "MOD shock absorption module" + desc = "A module that makes the user resistant to the knockdown inflicted by Stun Batons." + icon_state = "no_baton" + complexity = 1 + use_energy_cost = DEFAULT_CHARGE_DRAIN + 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() + . = ..() + 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) + . = ..() + REMOVE_TRAIT(mod.wearer, TRAIT_BATON_RESISTANCE, REF(src)) + UnregisterSignal(mod.wearer, COMSIG_MOB_BATONED) + +/obj/item/mod/module/shock_absorber/proc/mob_batoned(datum/source) + SIGNAL_HANDLER + drain_power(use_energy_cost) + var/datum/effect_system/lightning_spread/sparks = new /datum/effect_system/lightning_spread + sparks.set_up(number = 5, cardinals_only = TRUE, location = mod.wearer.loc) + sparks.start() diff --git a/code/modules/uplink/uplink_items/suits.dm b/code/modules/uplink/uplink_items/suits.dm index 8e721274482..5d89f805061 100644 --- a/code/modules/uplink/uplink_items/suits.dm +++ b/code/modules/uplink/uplink_items/suits.dm @@ -64,6 +64,12 @@ item = /obj/item/mod/module/noslip cost = 2 +/datum/uplink_item/suits/shock_absorber + name = "MODsuit Shock-Absorber Module" + desc = "A MODsuit module preventing the user from getting knocked down by batons." + item = /obj/item/mod/module/shock_absorber + cost = 2 + /datum/uplink_item/suits/modsuit/elite_traitor name = "Elite Syndicate MODsuit" desc = "An upgraded, elite version of the Syndicate MODsuit. It features fireproofing, and also \ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index eb4b0c536ce..8b4b549eda2 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ