From 6aebab214626ec88a45b9b1219b0058905ee04de Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 19 Apr 2022 05:34:32 +0200 Subject: [PATCH] [MIRROR] MODsuit module update: clamp nerf, replacement of holster and pepper spray modules, some tweaks to suit starting modules [MDB IGNORE] (#12783) * MODsuit module update: clamp nerf, replacement of holster and pepper spray modules, some tweaks to suit starting modules * Update mod_control.dm * fixes * fix2 Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com> Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- code/__DEFINES/dcs/signals/signals_object.dm | 2 + .../effects/effect_system/effects_smoke.dm | 8 + code/modules/mob/inventory.dm | 1 + code/modules/mod/adding_new_mod.md | 7 +- code/modules/mod/mod_control.dm | 20 ++- code/modules/mod/mod_theme.dm | 1 + code/modules/mod/mod_types.dm | 29 ++-- code/modules/mod/modules/_module.dm | 8 +- code/modules/mod/modules/module_kinesis.dm | 7 +- code/modules/mod/modules/modules_antag.dm | 24 +-- .../mod/modules/modules_engineering.dm | 10 +- code/modules/mod/modules/modules_general.dm | 40 ++--- code/modules/mod/modules/modules_maint.dm | 15 +- code/modules/mod/modules/modules_medical.dm | 4 +- code/modules/mod/modules/modules_science.dm | 8 +- code/modules/mod/modules/modules_security.dm | 146 +++++++++++------- code/modules/mod/modules/modules_service.dm | 7 +- code/modules/mod/modules/modules_supply.dm | 39 +++-- code/modules/mod/modules/modules_timeline.dm | 47 +++--- code/modules/mod/modules/modules_visor.dm | 2 +- .../designs/mechfabricator_designs.dm | 10 +- code/modules/research/techweb/all_nodes.dm | 2 +- code/modules/wiremod/shell/module.dm | 6 +- icons/mob/clothing/modsuit/mod_modules.dmi | Bin 12312 -> 12604 bytes icons/obj/clothing/modsuit/mod_modules.dmi | Bin 41257 -> 41492 bytes .../contractor/code/items/modsuit/modsuit.dm | 4 +- .../contractor/code/items/modsuit/modules.dm | 6 +- sound/items/modsuit/magnetic_harness.ogg | Bin 0 -> 6981 bytes 28 files changed, 262 insertions(+), 191 deletions(-) create mode 100644 sound/items/modsuit/magnetic_harness.ogg diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index f978c0ff77d..edec22ac708 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -96,6 +96,8 @@ #define COMSIG_ITEM_EQUIPPED "item_equip" /// A mob has just equipped an item. Called on [/mob] from base of [/obj/item/equipped()]: (/obj/item/equipped_item, slot) #define COMSIG_MOB_EQUIPPED_ITEM "mob_equipped_item" +/// A mob has just unequipped an item. +#define COMSIG_MOB_UNEQUIPPED_ITEM "mob_unequipped_item" ///called on [/obj/item] before unequip from base of [mob/proc/doUnEquip]: (force, atom/newloc, no_move, invdrop, silent) #define COMSIG_ITEM_PRE_UNEQUIP "item_pre_unequip" ///only the pre unequip can be cancelled diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 24b1af4ee2a..69609a41026 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -371,3 +371,11 @@ /datum/effect_system/smoke_spread/quick effect_type = /obj/effect/particle_effect/smoke/quick + +/obj/effect/particle_effect/smoke/chem/quick + lifetime = 2 //under lifetime 1, this kills itself the first time it processes, not working. i hate smoke code + opaque = FALSE + alpha = 100 + +/datum/effect_system/smoke_spread/chem/quick + effect_type = /obj/effect/particle_effect/smoke/chem/quick diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index d7b8327fbd2..f9407e17bab 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -331,6 +331,7 @@ I.forceMove(newloc) I.dropped(src, silent) SEND_SIGNAL(I, COMSIG_ITEM_POST_UNEQUIP, force, newloc, no_move, invdrop, silent) + SEND_SIGNAL(src, COMSIG_MOB_UNEQUIPPED_ITEM, I, force, newloc, no_move, invdrop, silent) return TRUE /** diff --git a/code/modules/mod/adding_new_mod.md b/code/modules/mod/adding_new_mod.md index 657e3d8d52a..1f18f3c4443 100644 --- a/code/modules/mod/adding_new_mod.md +++ b/code/modules/mod/adding_new_mod.md @@ -29,7 +29,7 @@ For people that want to see additional stuff, we add an extended description wit ``` Next we want to set the statistics, you can view them all in the theme file, so let's just grab our relevant ones, armor, charge and capacity and set them to what we establilished. \ -Currently crew MODsuits should be unarmored in combat relevant stats. +Currently crew MODsuits should be lightly armored in combat relevant stats. ```dm /datum/mod_theme/psychological @@ -40,7 +40,7 @@ Currently crew MODsuits should be unarmored in combat relevant stats. for operating at lower power levels, keeping people sane. As consequence, the capacity \ of the suit has decreased, not being able to fit many modules at all." default_skin = "psychological" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, WOUND = 5) + armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, WOUND = 5) complexity_max = DEFAULT_MAX_COMPLEXITY - 7 charge_drain = DEFAULT_CHARGE_DRAIN * 0.5 ``` @@ -206,6 +206,7 @@ As we want this effect to be on demand, we probably want this to be an usable mo - Togglable: You can turn these on and off. - Usable: You can use these for a one time effect. - Active: You can only have one selected at a time. It gives you a special click effect. + As we have an usable module, we want to set a cooldown time. All modules are also incompatible with themselves, have a specific power cost and complexity varying on how powerful they are, so let's update our definition, and also add a new variable for how much brain damage we'll heal. ```dm @@ -320,4 +321,4 @@ Now we want to add it to the psychological theme, which is very simple, finishin ``` ## Ending -This finishes this hopefully easy to follow along tutorial. You should now know how to make a basic theme a skin for it and a module. +This finishes this hopefully easy to follow along tutorial. You should now know how to make a basic theme, a skin for it, and a module. diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index b307fa2018b..607392b3a91 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -114,7 +114,7 @@ mod_parts += helmet chestplate = new /obj/item/clothing/suit/mod(src) chestplate.mod = src - chestplate.allowed = theme.allowed_suit_storage.Copy() + chestplate.allowed = typecacheof(theme.allowed_suit_storage) mod_parts += chestplate gauntlets = new /obj/item/clothing/gloves/mod(src) gauntlets.mod = src @@ -148,8 +148,7 @@ if(active) STOP_PROCESSING(SSobj, src) for(var/obj/item/mod/module/module as anything in modules) - module.mod = null - modules -= module + uninstall(module, deleting = TRUE) var/atom/deleting_atom if(!QDELETED(helmet)) deleting_atom = helmet @@ -184,6 +183,7 @@ for(var/obj/item/mod/module/module as anything in modules) for(var/obj/item/item in module) item.forceMove(drop_location()) + uninstall(module) remove_pai(forced = TRUE) // SKYRAT EDIT - pAIs in MODsuits return ..() @@ -529,15 +529,14 @@ var/check_range = TRUE return electrocute_mob(user, get_charge_source(), src, 0.7, check_range) -/obj/item/mod/control/proc/install(module, mob/user) - var/obj/item/mod/module/new_module = module +/obj/item/mod/control/proc/install(obj/item/mod/module/new_module, mob/user) for(var/obj/item/mod/module/old_module as anything in modules) if(is_type_in_list(new_module, old_module.incompatible_modules) || is_type_in_list(old_module, new_module.incompatible_modules)) if(user) balloon_alert(user, "[new_module] incompatible with [old_module]!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return - if(is_type_in_list(module, theme.module_blacklist)) + if(is_type_in_list(new_module, theme.module_blacklist)) if(user) balloon_alert(user, "[src] doesn't accept [new_module]!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) @@ -569,16 +568,15 @@ balloon_alert(user, "[new_module] added") playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) -/obj/item/mod/control/proc/uninstall(module) - var/obj/item/mod/module/old_module = module +/obj/item/mod/control/proc/uninstall(obj/item/mod/module/old_module, deleting = FALSE) modules -= old_module complexity -= old_module.complexity if(active) - old_module.on_suit_deactivation() + old_module.on_suit_deactivation(deleting = deleting) if(old_module.active) - old_module.on_deactivation(display_message = TRUE) + old_module.on_deactivation(display_message = !deleting, deleting = deleting) + old_module.on_uninstall(deleting = deleting) QDEL_LIST(old_module.pinned_to) - old_module.on_uninstall() old_module.mod = null /obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 7086ddf1aab..c17bf2f0166 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -947,6 +947,7 @@ /obj/item/tank/internals, /obj/item/teleportation_scroll, /obj/item/highfrequencyblade/wizard, + /obj/item/gun/magic, ) skins = list( "enchanted" = list( diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index a1941dbded8..ab1365ba36d 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -106,9 +106,9 @@ theme = /datum/mod_theme/security initial_modules = list( /obj/item/mod/module/storage, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, - /obj/item/mod/module/mister/security, + /obj/item/mod/module/pepper_shoulders, ) /obj/item/mod/control/pre_equipped/safeguard @@ -116,10 +116,10 @@ applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( /obj/item/mod/module/storage/large_capacity, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, - /obj/item/mod/module/holster, - /obj/item/mod/module/mister/security, + /obj/item/mod/module/pepper_shoulders, ) /obj/item/mod/control/pre_equipped/magnate @@ -128,8 +128,8 @@ initial_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/hat_stabilizer, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, - /obj/item/mod/module/holster, /obj/item/mod/module/pathfinder, ) @@ -137,6 +137,7 @@ theme = /datum/mod_theme/cosmohonk initial_modules = list( /obj/item/mod/module/storage, + /obj/item/mod/module/waddle, /obj/item/mod/module/bikehorn, ) @@ -145,11 +146,11 @@ applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack, /obj/item/mod/module/pathfinder, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, - /obj/item/mod/module/holster, ) /obj/item/mod/control/pre_equipped/nuclear @@ -158,10 +159,9 @@ req_access = list(ACCESS_SYNDICATE) initial_modules = list( /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, - /obj/item/mod/module/injector, ) /obj/item/mod/control/pre_equipped/elite @@ -171,20 +171,19 @@ initial_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, - /obj/item/mod/module/injector, ) /obj/item/mod/control/pre_equipped/elite/flamethrower initial_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/thermal_regulator, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, /obj/item/mod/module/flamethrower, ) @@ -216,8 +215,8 @@ /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, ) /// The insignia type, insignias show what sort of member of the ERT you're dealing with. var/insignia_type = /obj/item/mod/module/insignia @@ -264,8 +263,8 @@ /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, ) /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander @@ -292,8 +291,8 @@ /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack, - /obj/item/mod/module/holster, ) /obj/item/mod/control/pre_equipped/corporate @@ -303,7 +302,7 @@ initial_modules = list( /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/hat_stabilizer, - /obj/item/mod/module/holster, + /obj/item/mod/module/magnetic_harness, ) /obj/item/mod/control/pre_equipped/timeline diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index f352abc6983..2ec7b5226ad 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -73,7 +73,7 @@ return /// Called from MODsuit's uninstall() proc, so when the module is uninstalled. -/obj/item/mod/module/proc/on_uninstall() +/obj/item/mod/module/proc/on_uninstall(deleting = FALSE) return /// Called when the MODsuit is activated @@ -81,7 +81,7 @@ return /// Called when the MODsuit is deactivated -/obj/item/mod/module/proc/on_suit_deactivation() +/obj/item/mod/module/proc/on_suit_deactivation(deleting = FALSE) return /// Called when the MODsuit is equipped @@ -145,7 +145,7 @@ return TRUE /// Called when the module is deactivated -/obj/item/mod/module/proc/on_deactivation(display_message = TRUE) +/obj/item/mod/module/proc/on_deactivation(display_message = TRUE, deleting = FALSE) active = FALSE if(module_type == MODULE_ACTIVE) mod.selected_module = null @@ -177,7 +177,7 @@ if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE) return FALSE COOLDOWN_START(src, cooldown_timer, cooldown_time) - addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time) + addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time+1) //need to run it a bit after the cooldown starts to avoid conflicts mod.wearer.update_inv_back() SEND_SIGNAL(src, COMSIG_MODULE_USED) return TRUE diff --git a/code/modules/mod/modules/module_kinesis.dm b/code/modules/mod/modules/module_kinesis.dm index e90170c2873..840ae7d45fc 100644 --- a/code/modules/mod/modules/module_kinesis.dm +++ b/code/modules/mod/modules/module_kinesis.dm @@ -66,11 +66,11 @@ kinesis_catcher.RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, /atom/movable/screen/fullscreen/kinesis.proc/on_move) soundloop.start() -/obj/item/mod/module/anomaly_locked/kinesis/on_deactivation(display_message = TRUE) +/obj/item/mod/module/anomaly_locked/kinesis/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return - clear_grab() + clear_grab(playsound = !deleting) /obj/item/mod/module/anomaly_locked/kinesis/process(delta_time) if(!mod.wearer.client || mod.wearer.incapacitated(IGNORE_GRAB)) @@ -97,6 +97,7 @@ if(grabbed_atom.Move(next_turf)) if(isitem(grabbed_atom) && (mod.wearer in next_turf)) var/obj/item/grabbed_item = grabbed_atom + clear_grab() grabbed_item.pickup(mod.wearer) mod.wearer.put_in_hands(grabbed_item) return @@ -219,6 +220,8 @@ COOLDOWN_DECLARE(coordinate_cooldown) /atom/movable/screen/fullscreen/kinesis/proc/on_move(atom/source, atom/oldloc, dir, forced) + SIGNAL_HANDLER + if(given_turf) var/x_offset = source.loc.x - oldloc.x var/y_offset = source.loc.y - oldloc.y diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index 5d9fd9b54b1..5867d8fd991 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -28,7 +28,9 @@ /obj/item/mod/module/armor_booster/on_suit_activation() mod.helmet.flash_protect = FLASH_PROTECTION_WELDER -/obj/item/mod/module/armor_booster/on_suit_deactivation() +/obj/item/mod/module/armor_booster/on_suit_deactivation(deleting = FALSE) + if(deleting) + return mod.helmet.flash_protect = initial(mod.helmet.flash_protect) /obj/item/mod/module/armor_booster/on_activation() @@ -48,11 +50,12 @@ clothing_part.clothing_flags &= ~STOPSPRESSUREDAMAGE spaceproofed[clothing_part] = TRUE -/obj/item/mod/module/armor_booster/on_deactivation(display_message = TRUE) +/obj/item/mod/module/armor_booster/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + if(!deleting) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) mod.slowdown -= added_slowdown mod.wearer.update_equipment_speed_mods() var/list/parts = mod.mod_parts + mod @@ -113,7 +116,7 @@ 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_HUMAN_CHECK_SHIELDS, .proc/shield_reaction) -/obj/item/mod/module/energy_shield/on_suit_deactivation() +/obj/item/mod/module/energy_shield/on_suit_deactivation(deleting = FALSE) var/datum/component/shielded/shield = mod.GetComponent(/datum/component/shielded) charges = shield.current_charges qdel(shield) @@ -157,7 +160,7 @@ ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) ADD_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) -/obj/item/mod/module/anti_magic/on_suit_deactivation() +/obj/item/mod/module/anti_magic/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) REMOVE_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) @@ -172,7 +175,7 @@ /obj/item/mod/module/anti_magic/wizard/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) -/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation() +/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) ///Insignia - Gives you a skin specific stripe. @@ -230,7 +233,7 @@ /obj/item/mod/module/noslip/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) -/obj/item/mod/module/noslip/on_suit_deactivation() +/obj/item/mod/module/noslip/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) /obj/item/mod/module/springlock/bite_of_87 @@ -247,16 +250,13 @@ /obj/item/mod/module/springlock/bite_of_87/on_install() mod.activation_step_time *= 0.1 -/obj/item/mod/module/springlock/bite_of_87/on_uninstall() +/obj/item/mod/module/springlock/bite_of_87/on_uninstall(deleting = FALSE) mod.activation_step_time *= 10 /obj/item/mod/module/springlock/bite_of_87/on_suit_activation() ..() if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS] || prob(1)) - var/list/all_parts = mod.mod_parts.Copy() + mod - for(var/obj/item/part in all_parts) // turns the suit yellow - part.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - part.add_atom_colour("#b17f00", FIXED_COLOUR_PRIORITY) + mod.set_mod_color("#b17f00") mod.wearer.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) // turns purple guy purple mod.wearer.add_atom_colour("#704b96", FIXED_COLOUR_PRIORITY) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index cafa27d2e22..343000e19dd 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -14,7 +14,9 @@ /obj/item/mod/module/welding/on_suit_activation() mod.helmet.flash_protect = FLASH_PROTECTION_WELDER -/obj/item/mod/module/welding/on_suit_deactivation() +/obj/item/mod/module/welding/on_suit_deactivation(deleting = FALSE) + if(deleting) + return mod.helmet.flash_protect = initial(mod.helmet.flash_protect) ///T-Ray Scan - Scans the terrain for undertile objects. @@ -61,7 +63,7 @@ mod.wearer.update_gravity(mod.wearer.has_gravity()) mod.wearer.update_equipment_speed_mods() -/obj/item/mod/module/magboot/on_deactivation(display_message = TRUE) +/obj/item/mod/module/magboot/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -156,7 +158,7 @@ for(var/obj/item/part in mod.mod_parts) ADD_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) -/obj/item/mod/module/rad_protection/on_suit_deactivation() +/obj/item/mod/module/rad_protection/on_suit_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) @@ -194,7 +196,7 @@ /obj/item/mod/module/constructor/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) -/obj/item/mod/module/constructor/on_suit_deactivation() +/obj/item/mod/module/constructor/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) /obj/item/mod/module/constructor/on_use() diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index e7c5649a313..5e3dfcfc3ff 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -34,14 +34,14 @@ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) RegisterSignal(mod.chestplate, COMSIG_ITEM_PRE_UNEQUIP, .proc/on_chestplate_unequip) -/obj/item/mod/module/storage/on_uninstall() +/obj/item/mod/module/storage/on_uninstall(deleting = FALSE) var/datum/component/storage/modstorage = mod.GetComponent(/datum/component/storage) storage.slaves -= modstorage qdel(modstorage) - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) UnregisterSignal(mod.chestplate, COMSIG_ITEM_PRE_UNEQUIP) - + if(!deleting) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) /obj/item/mod/module/storage/proc/on_chestplate_unequip(obj/item/source, force, atom/newloc, no_move, invdrop, silent) if(QDELETED(source) || newloc == mod.wearer || !mod.wearer.s_store) return @@ -119,7 +119,7 @@ if(full_speed) mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) -/obj/item/mod/module/jetpack/on_deactivation(display_message = TRUE) +/obj/item/mod/module/jetpack/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -199,16 +199,14 @@ /obj/item/mod/module/mouthhole/on_install() former_flags = mod.helmet.flags_cover former_visor_flags = mod.helmet.visor_flags_cover - if(former_flags & HEADCOVERSMOUTH) - mod.helmet.flags_cover &= ~HEADCOVERSMOUTH - if(former_visor_flags & HEADCOVERSMOUTH) - mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH + mod.helmet.flags_cover &= ~HEADCOVERSMOUTH|PEPPERPROOF + mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH|PEPPERPROOF -/obj/item/mod/module/mouthhole/on_uninstall() - if(former_flags & HEADCOVERSMOUTH) - mod.helmet.flags_cover |= HEADCOVERSMOUTH - if(former_visor_flags & HEADCOVERSMOUTH) - mod.helmet.visor_flags_cover |= HEADCOVERSMOUTH +/obj/item/mod/module/mouthhole/on_uninstall(deleting = FALSE) + if(deleting) + return + mod.helmet.flags_cover |= former_flags + mod.helmet.visor_flags_cover |= former_visor_flags ///EMP Shield - Protects the suit from EMPs. /obj/item/mod/module/emp_shield @@ -224,7 +222,7 @@ /obj/item/mod/module/emp_shield/on_install() mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) -/obj/item/mod/module/emp_shield/on_uninstall() +/obj/item/mod/module/emp_shield/on_uninstall(deleting = FALSE) mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) ///Flashlight - Gives the suit a customizable flashlight. @@ -260,7 +258,7 @@ set_light_on(active) active_power_cost = base_power * light_range -/obj/item/mod/module/flashlight/on_deactivation(display_message = TRUE) +/obj/item/mod/module/flashlight/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -347,7 +345,7 @@ /obj/item/mod/module/longfall/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, .proc/z_impact_react) -/obj/item/mod/module/longfall/on_suit_deactivation() +/obj/item/mod/module/longfall/on_suit_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) @@ -410,7 +408,7 @@ RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, .proc/on_emp) RegisterSignal(mod, COMSIG_ATOM_EMAG_ACT, .proc/on_emag) -/obj/item/mod/module/dna_lock/on_uninstall() +/obj/item/mod/module/dna_lock/on_uninstall(deleting = FALSE) UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL) UnregisterSignal(mod, COMSIG_ATOM_EMP_ACT) @@ -535,7 +533,9 @@ RegisterSignal(mod.helmet, COMSIG_PARENT_ATTACKBY, .proc/place_hat) RegisterSignal(mod.helmet, COMSIG_ATOM_ATTACK_HAND_SECONDARY, .proc/remove_hat) -/obj/item/mod/module/hat_stabilizer/on_suit_deactivation() +/obj/item/mod/module/hat_stabilizer/on_suit_deactivation(deleting = FALSE) + if(deleting) + return if(attached_hat) //knock off the helmet if its on their head. Or, technically, auto-rightclick it for them; that way it saves us code, AND gives them the bubble remove_hat(src, mod.wearer) UnregisterSignal(mod.helmet, COMSIG_PARENT_EXAMINE) @@ -599,5 +599,5 @@ /obj/item/mod/module/signlang_radio/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_CAN_SIGN_ON_COMMS, MOD_TRAIT) -/obj/item/mod/module/signlang_radio/on_suit_deactivation() +/obj/item/mod/module/signlang_radio/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_CAN_SIGN_ON_COMMS, MOD_TRAIT) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 61f676827d7..3b9f075b585 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -14,13 +14,13 @@ /obj/item/mod/module/springlock/on_install() mod.activation_step_time *= 0.5 -/obj/item/mod/module/springlock/on_uninstall() +/obj/item/mod/module/springlock/on_uninstall(deleting = FALSE) mod.activation_step_time *= 2 /obj/item/mod/module/springlock/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, .proc/on_wearer_exposed) -/obj/item/mod/module/springlock/on_suit_deactivation() +/obj/item/mod/module/springlock/on_suit_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS) ///Signal fired when wearer is exposed to reagents @@ -107,13 +107,15 @@ if(selection) SEND_SOUND(mod.wearer, sound(selection.song_path, volume = 50, channel = CHANNEL_JUKEBOX)) -/obj/item/mod/module/visor/rave/on_deactivation(display_message = TRUE) +/obj/item/mod/module/visor/rave/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return QDEL_NULL(rave_screen) if(selection) mod.wearer.stop_sound_channel(CHANNEL_JUKEBOX) + if(deleting) + return SEND_SOUND(mod.wearer, sound('sound/machines/terminal_off.ogg', volume = 50, channel = CHANNEL_JUKEBOX)) /obj/item/mod/module/visor/rave/generate_worn_overlay(mutable_appearance/standing) @@ -286,14 +288,15 @@ ADD_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) check_upstairs() //todo at some point flip your screen around -/obj/item/mod/module/atrocinator/on_deactivation(display_message = TRUE) - if(you_fucked_up) +/obj/item/mod/module/atrocinator/on_deactivation(display_message = TRUE, deleting = FALSE) + if(you_fucked_up && !deleting) to_chat(mod.wearer, span_danger("It's too late.")) return FALSE . = ..() if(!.) return - playsound(src, 'sound/effects/curseattack.ogg', 50) + if(deleting) + playsound(src, 'sound/effects/curseattack.ogg', 50) qdel(mod.wearer.RemoveElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY)) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) step_count = 0 diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index 9f42354b48f..40a110c8bb4 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -73,7 +73,7 @@ /obj/item/mod/module/quick_carry/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) -/obj/item/mod/module/quick_carry/on_suit_deactivation() +/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) /obj/item/mod/module/quick_carry/advanced @@ -85,7 +85,7 @@ ADD_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) ADD_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) -/obj/item/mod/module/quick_carry/on_suit_deactivation() +/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) REMOVE_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm index dfed572fe7c..1db740b9791 100644 --- a/code/modules/mod/modules/modules_science.dm +++ b/code/modules/mod/modules/modules_science.dm @@ -19,7 +19,7 @@ return ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) -/obj/item/mod/module/reagent_scanner/on_deactivation(display_message = TRUE) +/obj/item/mod/module/reagent_scanner/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -38,7 +38,7 @@ mod.wearer.research_scanner++ RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion) -/obj/item/mod/module/reagent_scanner/advanced/on_deactivation(display_message = TRUE) +/obj/item/mod/module/reagent_scanner/advanced/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -77,12 +77,14 @@ mod.wearer.update_gravity(mod.wearer.has_gravity()) playsound(src, 'sound/effects/gravhit.ogg', 50) -/obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(display_message = TRUE) +/obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return mod.wearer.RemoveElement(/datum/element/forced_gravity, 0) mod.wearer.update_gravity(mod.wearer.has_gravity()) + if(deleting) + return if(mod.wearer.has_gravity()) new /obj/effect/temp_visual/mook_dust(get_turf(src)) playsound(src, 'sound/effects/gravhit.ogg', 50) diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 17bc3dc7b60..067735b092d 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -30,7 +30,7 @@ animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) drain_power(use_power_cost) -/obj/item/mod/module/stealth/on_deactivation(display_message = TRUE) +/obj/item/mod/module/stealth/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -45,7 +45,7 @@ to_chat(mod.wearer, span_warning("[src] gets discharged from contact!")) do_sparks(2, TRUE, src) drain_power(use_power_cost) - on_deactivation(display_message = TRUE) + on_deactivation(display_message = TRUE, deleting = FALSE) /obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target) SIGNAL_HANDLER @@ -75,67 +75,95 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 5 cooldown_time = 3 SECONDS -///Holster - Instantly holsters any not huge gun. -/obj/item/mod/module/holster - name = "MOD holster module" - desc = "Based off typical storage compartments, this system allows the suit to holster a \ - standard firearm across its surface and allow for extremely quick retrieval. \ - While some users prefer the chest, others the forearm for quick deployment, \ - some law enforcement prefer the holster to extend from the thigh." - icon_state = "holster" - module_type = MODULE_USABLE +///Magnetic Harness - Automatically puts guns in your suit storage when you drop them. +/obj/item/mod/module/magnetic_harness + name = "MOD magnetic harness module" + desc = "Based off old TerraGov harness kits, this magnetic harness automatically attaches dropped guns back to the wearer." + icon_state = "mag_harness" complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/holster) - cooldown_time = 0.5 SECONDS - /// Gun we have holstered. - var/obj/item/gun/holstered + use_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/magnetic_harness) + /// Time before we activate the magnet. + var/magnet_delay = 0.8 SECONDS + /// The typecache of all guns we allow. + var/static/list/guns_typecache + /// The guns already allowed by the modsuit chestplate. + var/list/already_allowed_guns = list() -/obj/item/mod/module/holster/on_use() +/obj/item/mod/module/magnetic_harness/Initialize(mapload) + . = ..() + if(!guns_typecache) + guns_typecache = typecacheof(list(/obj/item/gun/ballistic, /obj/item/gun/energy, /obj/item/gun/grenadelauncher, /obj/item/gun/chem, /obj/item/gun/syringe)) + +/obj/item/mod/module/magnetic_harness/on_install() + already_allowed_guns = guns_typecache & mod.chestplate.allowed + mod.chestplate.allowed |= guns_typecache + +/obj/item/mod/module/magnetic_harness/on_uninstall(deleting = FALSE) + if(deleting) + return + mod.chestplate.allowed -= (guns_typecache - already_allowed_guns) + +/obj/item/mod/module/magnetic_harness/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, .proc/check_dropped_item) + +/obj/item/mod/module/magnetic_harness/on_suit_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) + SIGNAL_HANDLER + + if(!is_type_in_typecache(dropped_item, guns_typecache)) + return + if(new_location != get_turf(src)) + return + addtimer(CALLBACK(src, .proc/pick_up_item, dropped_item), magnet_delay) + +/obj/item/mod/module/magnetic_harness/proc/pick_up_item(obj/item/item) + if(!isturf(item.loc) || !item.Adjacent(mod.wearer)) + return + if(!mod.wearer.equip_to_slot_if_possible(item, ITEM_SLOT_SUITSTORE, qdel_on_fail = FALSE, disable_warning = TRUE)) + return + playsound(src, 'sound/items/modsuit/magnetic_harness.ogg', 50, TRUE) + balloon_alert(mod.wearer, "[item] reattached") + drain_power(use_power_cost) + +///Pepper Shoulders - When hit, reacts with a spray of pepper spray around the user. +/obj/item/mod/module/pepper_shoulders + name = "MOD pepper shoulders module" + desc = "A module that attaches two pepper sprayers on shoulders of a MODsuit, reacting to touch with a spray around the user." + icon_state = "pepper_shoulder" + module_type = MODULE_USABLE + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/pepper_shoulders) + cooldown_time = 5 SECONDS + overlay_state_inactive = "module_pepper" + overlay_state_use = "module_pepper_used" + +/obj/item/mod/module/pepper_shoulders/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, .proc/on_check_shields) + +/obj/item/mod/module/pepper_shoulders/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS) + +/obj/item/mod/module/pepper_shoulders/on_use() . = ..() if(!.) return - if(!holstered) - var/obj/item/gun/holding = mod.wearer.get_active_held_item() - if(!holding) - balloon_alert(mod.wearer, "nothing to holster!") - return - if(!istype(holding) || holding.w_class > WEIGHT_CLASS_BULKY) - balloon_alert(mod.wearer, "it doesn't fit!") - return - if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) - holstered = holding - balloon_alert(mod.wearer, "weapon holstered") - playsound(src, 'sound/weapons/gun/revolver/empty.ogg', 100, TRUE) - drain_power(use_power_cost) - else if(mod.wearer.put_in_active_hand(holstered, forced = FALSE, ignore_animation = TRUE)) - balloon_alert(mod.wearer, "weapon drawn") - holstered = null - playsound(src, 'sound/weapons/gun/revolver/empty.ogg', 100, TRUE) - drain_power(use_power_cost) - else - balloon_alert(mod.wearer, "holster full!") + playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) + var/datum/reagents/capsaicin_holder = new(10) + capsaicin_holder.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 10) + var/datum/effect_system/smoke_spread/chem/quick/smoke = new + smoke.set_up(capsaicin_holder, 1, get_turf(src)) + smoke.start() -/obj/item/mod/module/holster/on_uninstall() - if(holstered) - holstered.forceMove(drop_location()) - holstered = null +/obj/item/mod/module/pepper_shoulders/proc/on_check_shields() + SIGNAL_HANDLER -/obj/item/mod/module/holster/Destroy() - QDEL_NULL(holstered) - return ..() - -///Pepper Spray Mister - Sprays pepper spray over criminals. -/obj/item/mod/module/mister/security - name = "MOD pepper spray mister module" - desc = "A module containing a container of pepper spray to spray over areas." - device = /obj/item/reagent_containers/spray/mister/pepperspray/mod - complexity = 1 - -/obj/item/mod/module/mister/security/Initialize(mapload) - . = ..() - reagents.add_reagent(/datum/reagent/consumable/condensedcapsaicin, volume) - -/obj/item/reagent_containers/spray/mister/pepperspray/mod - name = "MOD pepper spray mister" - desc = "A mister full of pepper spray, perfect for riots." + if(!COOLDOWN_FINISHED(src, cooldown_timer)) + return + if(!check_power(use_power_cost)) + return + mod.wearer.visible_message(span_warning("[src] reacts to the attack with a smoke of pepper spray!"), span_notice("Your [src] releases a cloud of pepper spray!")) + on_use() diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 3c5526232b6..210472cfb4a 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -58,7 +58,7 @@ //Waddle - Makes you waddle and squeak. /obj/item/mod/module/waddle name = "MOD waddle module" - desc = "Some of the most primitive technology in use by HonkCo. This module works off an automatic intention system, \ + desc = "Some of the most primitive technology in use by Honk Co. This module works off an automatic intention system, \ utilizing its' sensitivity to the pilot's often-limited brainwaves to directly read their next step, \ affecting the boots they're installed in. Employing a twin-linked gravitonic drive to create \ miniaturized etheric blasts of space-time beneath the user's feet, this enables them to... \ @@ -74,8 +74,9 @@ if(is_clown_job(mod.wearer.mind?.assigned_role)) SEND_SIGNAL(mod.wearer, COMSIG_ADD_MOOD_EVENT, "clownshoes", /datum/mood_event/clownshoes) -/obj/item/mod/module/waddle/on_suit_deactivation() - qdel(mod.boots.GetComponent(/datum/component/squeak)) +/obj/item/mod/module/waddle/on_suit_deactivation(deleting = FALSE) + if(!deleting) + qdel(mod.boots.GetComponent(/datum/component/squeak)) mod.wearer.RemoveElement(/datum/element/waddling) if(is_clown_job(mod.wearer.mind?.assigned_role)) SEND_SIGNAL(mod.wearer, COMSIG_CLEAR_MOOD_EVENT, "clownshoes") diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 32abb6cddd2..79b2300b4eb 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -52,17 +52,19 @@ return if(istype(target, /obj/structure/closet/crate) || istype(target, /obj/item/delivery/big)) var/atom/movable/picked_crate = target - if(length(stored_crates) >= max_crates) - balloon_alert(mod.wearer, "too many crates!") + if(!check_crate_pickup(picked_crate)) return playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) if(!do_after(mod.wearer, load_time, target = target)) balloon_alert(mod.wearer, "interrupted!") return + if(!check_crate_pickup(picked_crate)) + return stored_crates += picked_crate picked_crate.forceMove(src) balloon_alert(mod.wearer, "picked up [picked_crate]") drain_power(use_power_cost) + mod.wearer.update_inv_back() else if(length(stored_crates)) var/turf/target_turf = get_turf(target) if(target_turf.is_blocked_turf()) @@ -77,14 +79,28 @@ dropped_crate.forceMove(target_turf) balloon_alert(mod.wearer, "dropped [dropped_crate]") drain_power(use_power_cost) + mod.wearer.update_inv_back() else balloon_alert(mod.wearer, "invalid target!") -/obj/item/mod/module/clamp/on_suit_deactivation() +/obj/item/mod/module/clamp/on_suit_deactivation(deleting = FALSE) + if(deleting) + return for(var/atom/movable/crate as anything in stored_crates) crate.forceMove(drop_location()) stored_crates -= crate +/obj/item/mod/module/clamp/proc/check_crate_pickup(atom/movable/target) + if(length(stored_crates) >= max_crates) + balloon_alert(mod.wearer, "too many crates!") + return FALSE + for(var/mob/living/mob in target.get_all_contents()) + if(mob.mob_size < MOB_SIZE_HUMAN) + continue + balloon_alert(mod.wearer, "crate too heavy!") + return FALSE + return TRUE + /obj/item/mod/module/clamp/loader name = "MOD loader hydraulic clamp module" icon_state = "clamp_loader" @@ -115,7 +131,7 @@ return RegisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP, .proc/bump_mine) -/obj/item/mod/module/drill/on_deactivation(display_message = TRUE) +/obj/item/mod/module/drill/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -210,11 +226,11 @@ var/launch_time = 2 SECONDS /// User overlay var/mutable_appearance/lightning - + /obj/item/mod/module/hydraulic/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_TRASHMAN, MOD_TRAIT) -/obj/item/mod/module/hydraulic/on_suit_deactivation() +/obj/item/mod/module/hydraulic/on_suit_deactivation(deleting = FALSE) //SKYRAT EDIT REMOVE_TRAIT(mod.wearer, TRAIT_TRASHMAN, MOD_TRAIT) /obj/item/mod/module/hydraulic/on_select_use(atom/target) @@ -269,7 +285,7 @@ /obj/item/mod/module/disposal_connector/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_MOVABLE_DISPOSING, .proc/disposal_handling) -/obj/item/mod/module/disposal_connector/on_suit_deactivation() +/obj/item/mod/module/disposal_connector/on_suit_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_DISPOSING) /obj/item/mod/module/disposal_connector/get_configuration() @@ -323,7 +339,7 @@ locker.throw_at(mod.wearer, range = 7, speed = 3, force = MOVE_FORCE_WEAK, \ callback = CALLBACK(src, .proc/check_locker, locker)) -/obj/item/mod/module/magnet/on_deactivation(display_message = TRUE) +/obj/item/mod/module/magnet/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -394,7 +410,7 @@ ADD_TRAIT(mod.wearer, TRAIT_SNOWSTORM_IMMUNE, MOD_TRAIT) RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/on_move) -/obj/item/mod/module/ash_accretion/on_suit_deactivation() +/obj/item/mod/module/ash_accretion/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_ASHSTORM_IMMUNE, MOD_TRAIT) REMOVE_TRAIT(mod.wearer, TRAIT_SNOWSTORM_IMMUNE, MOD_TRAIT) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) @@ -490,11 +506,12 @@ mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/sphere) RegisterSignal(mod.wearer, COMSIG_MOB_STATCHANGE, .proc/on_statchange) -/obj/item/mod/module/sphere_transform/on_deactivation(display_message = TRUE) +/obj/item/mod/module/sphere_transform/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return - playsound(src, 'sound/items/modsuit/ballout.ogg', 100) + if(!deleting) + playsound(src, 'sound/items/modsuit/ballout.ogg', 100) mod.wearer.base_pixel_y = 0 animate(mod.wearer, animate_time, pixel_y = mod.wearer.base_pixel_y) addtimer(CALLBACK(mod.wearer, /atom.proc/remove_filter, list("mod_ball", "mod_blur", "mod_outline")), animate_time) diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 69bcbe667c2..b52f2dfbfb0 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -16,14 +16,14 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/eradication_lock, /obj/item/mod/module/dna_lock) cooldown_time = 0.5 SECONDS - /// The ckey we lock with, to allow all alternate versions of the user, huhehuehe + /// The ckey we lock with, to allow all alternate versions of the user. var/true_owner_ckey /obj/item/mod/module/eradication_lock/on_install() RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_mod_activation) RegisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL, .proc/on_mod_removal) -/obj/item/mod/module/eradication_lock/on_uninstall() +/obj/item/mod/module/eradication_lock/on_uninstall(deleting = FALSE) UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL) @@ -109,7 +109,7 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/timestopper) cooldown_time = 60 SECONDS - ///the current timestop in progress + ///The current timestop in progress. var/obj/effect/timestop/channelled/timestop /obj/item/mod/module/timestopper/on_use() @@ -157,7 +157,7 @@ incompatible_modules = list(/obj/item/mod/module/timeline_jumper) cooldown_time = 5 SECONDS allowed_in_phaseout = TRUE - ///the dummy for phasing from this module, the wearer is phased out while this exists. + ///The dummy for phasing from this module, the wearer is phased out while this exists. var/obj/effect/dummy/phased_mob/chrono/phased_mob /obj/item/mod/module/timeline_jumper/on_use() @@ -190,7 +190,7 @@ /obj/item/mod/module/timeline_jumper/proc/on_activate_block(datum/source, user) SIGNAL_HANDLER //has to be a to_chat because you're phased out. - to_chat(user, span_boldwarning("Deactivating your suit while inbetween timelines would be a very bad idea.")) + to_chat(user, span_warning("Deactivating your suit while inbetween timelines would be a very bad idea.")) return MOD_CANCEL_ACTIVATE ///special subtype for phased mobs. @@ -210,9 +210,9 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/tem) cooldown_time = 0.5 SECONDS - ///reference to the chrono field being controlled by this module + ///Reference to the chrono field being controlled by this module var/obj/structure/chrono_field/field = null - ///where the chronofield maker was when the field went up + ///Where the chronofield maker was when the field went up var/turf/startpos /obj/item/mod/module/tem/on_select_use(atom/target) @@ -223,16 +223,17 @@ if(field) field_disconnect(field) //fire projectile - var/obj/projectile/energy/chrono_beam/projectile = new /obj/projectile/energy/chrono_beam(get_turf(src)) + var/obj/projectile/energy/chrono_beam/chrono_beam = new /obj/projectile/energy/chrono_beam(get_turf(src)) + chrono_beam.tem_weakref = WEAKREF(src) + chrono_beam.preparePixelProjectile(target, mod.wearer) + chrono_beam.firer = mod.wearer playsound(src, 'sound/items/modsuit/time_anchor_set.ogg', 50, TRUE) - projectile.tem_weakref = WEAKREF(src) - projectile.firer = mod.wearer - projectile.fired_from = src - projectile.fire(get_angle(mod.wearer, target), target) + INVOKE_ASYNC(chrono_beam, /obj/projectile.proc/fire) -/obj/item/mod/module/tem/on_uninstall() - if(field) - field_disconnect(field) +/obj/item/mod/module/tem/on_uninstall(deleting = FALSE) + if(!field) + return + field_disconnect(field) /** * ### field_connect @@ -246,14 +247,14 @@ /obj/item/mod/module/tem/proc/field_connect(obj/structure/chrono_field/field) if(field.tem) if(field.captured) - to_chat(mod.wearer, span_alert("FAIL: [field.captured] already has an existing connection.")) + balloon_alert(mod.wearer, "already has connection!") field_disconnect(field) return startpos = get_turf(mod.wearer) src.field = field field.tem = src if(field.captured) - to_chat(mod.wearer, span_notice("Connection established with target: [field.captured]")) + balloon_alert(mod.wearer, "connection estabilished") /** * ### field_disconnect @@ -268,7 +269,7 @@ if(field.tem == src) field.tem = null if(field.captured) - to_chat(mod.wearer, span_alert("Disconnected from target: [field.captured]")) + balloon_alert(mod.wearer, "connection lost!") field = null startpos = null @@ -294,7 +295,7 @@ icon_state = "chronobolt" range = CHRONO_BEAM_RANGE nodamage = TRUE - ///reference to the tem... given by the tem! weakref because back in the day we didn't know about harddels- or maybe we didn't care. + ///Reference to the tem... given by the tem! weakref because back in the day we didn't know about harddels- or maybe we didn't care. var/datum/weakref/tem_weakref /obj/projectile/energy/chrono_beam/on_hit(atom/target) @@ -318,7 +319,7 @@ ///linked module. while this exists, the field will progress towards eradication. while it isn't, the field progresses away until it disappears. see attached for a special case var/obj/item/mod/module/tem/tem ///time in seconds before someone is eradicated, assuming progress isn't interrupted - var/timetokill = 30 + var/timetokill = 3 SECONDS ///the eradication appearance var/mutable_appearance/mob_underlay ///the actual frame the animation is at in eradication, only changing when the progress towards eradication progresses enough to move to the next frame. @@ -373,15 +374,15 @@ freed_movable.forceMove(drop_location()) qdel(src) else if(timetokill <= 0) - to_chat(captured, span_boldnotice("As the last essence of your being is erased from time, you are taken back to your most enjoyable memory. You feel happy...")) - var/mob/dead/observer/ghost = captured.ghostize(1) + to_chat(captured, span_notice("As the last essence of your being is erased from time, you are taken back to your most enjoyable memory. You feel happy...")) + var/mob/dead/observer/ghost = captured.ghostize(can_reenter_corpse = TRUE) if(captured.mind) if(ghost) ghost.mind = null qdel(captured) qdel(src) else - captured.Unconscious(80) + captured.Unconscious(8 SECONDS) if(captured.loc != src) captured.forceMove(src) update_appearance() diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm index 82808568189..740489b5645 100644 --- a/code/modules/mod/modules/modules_visor.dm +++ b/code/modules/mod/modules/modules_visor.dm @@ -25,7 +25,7 @@ ADD_TRAIT(mod.wearer, trait, MOD_TRAIT) mod.wearer.update_sight() -/obj/item/mod/module/visor/on_deactivation(display_message = TRUE) +/obj/item/mod/module/visor/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index b2b68f91065..c993b3f5b05 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1186,11 +1186,11 @@ build_path = /obj/item/mod/module/magboot department_type = MODULE_ENGINEERING -/datum/design/module/mod_holster - name = "MOD Module: Holster" - id = "mod_holster" - materials = list(/datum/material/iron = 1500, /datum/material/glass = 500) - build_path = /obj/item/mod/module/holster +/datum/design/module/mod_mag_harness + name = "MOD Module: Magnetic Harness" + id = "mod_mag_harness" + materials = list(/datum/material/iron = 1500, /datum/material/silver = 500) + build_path = /obj/item/mod/module/magnetic_harness department_type = MODULE_SECURITY /datum/design/module/mod_tether diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index f4fdaedc702..5f5ed5385e7 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1609,7 +1609,7 @@ "mod_plating_security", "mod_visor_sechud", "mod_stealth", - "mod_holster", + "mod_mag_harness", "mod_pathfinder", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/wiremod/shell/module.dm b/code/modules/wiremod/shell/module.dm index b3a8275d607..5bb837134b3 100644 --- a/code/modules/wiremod/shell/module.dm +++ b/code/modules/wiremod/shell/module.dm @@ -23,9 +23,13 @@ . = COMPONENT_OVERRIDE_POWER_USAGE /obj/item/mod/module/circuit/on_install() + if(!shell?.attached_circuit) + return RegisterSignal(shell?.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE, .proc/override_power_usage) -/obj/item/mod/module/circuit/on_uninstall() +/obj/item/mod/module/circuit/on_uninstall(deleting = FALSE) + if(!shell?.attached_circuit) + return UnregisterSignal(shell?.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE) /obj/item/mod/module/circuit/on_use() diff --git a/icons/mob/clothing/modsuit/mod_modules.dmi b/icons/mob/clothing/modsuit/mod_modules.dmi index e37f3e4641602deea4a6bba569a45d08d3a1907e..aaf9541d5b78ad62bbe8f61b3778da2483956240 100644 GIT binary patch literal 12604 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

F(|}+U5N(^a6Ou@KP*F{l8F^ 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 beJ79~d~uoj^#U0Rfxr6->hgtmp9TIusTJvN literal 12312 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 diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index f838dbd4aeb30b20be49903f20f36e741f22500f..7a226fb59b5202d851eb392060ec49da424b6071 100644 GIT binary patch delta 21373 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 delta 21116 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 K^>S6K(Ek9wZ>JLg diff --git a/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm b/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm index 97761b3a4f1..66523e225f7 100644 --- a/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm +++ b/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm @@ -9,7 +9,7 @@ /obj/item/mod/module/tether, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, - /obj/item/mod/module/holster, + /obj/item/mod/module/magnetic_harness, ) /obj/item/mod/control/pre_equipped/contractor/upgraded @@ -18,7 +18,7 @@ /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/jetpack, /obj/item/mod/module/dna_lock, - /obj/item/mod/module/holster, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/baton_holster/preloaded, ) diff --git a/modular_skyrat/modules/contractor/code/items/modsuit/modules.dm b/modular_skyrat/modules/contractor/code/items/modsuit/modules.dm index 47f6dc32ad0..a5e845bbe31 100644 --- a/modular_skyrat/modules/contractor/code/items/modsuit/modules.dm +++ b/modular_skyrat/modules/contractor/code/items/modsuit/modules.dm @@ -133,7 +133,7 @@ chameleon_right = initial(mod.righthand_file) RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/reset_chameleon) -/obj/item/mod/module/chameleon/on_uninstall() +/obj/item/mod/module/chameleon/on_uninstall(deleting = FALSE) UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) reset_chameleon() @@ -220,14 +220,14 @@ /obj/item/mod/module/springlock/on_suit_activation() // This module is actually *not* a death trap return -/obj/item/mod/module/springlock/on_suit_deactivation() +/obj/item/mod/module/springlock/on_suit_deactivation(deleting = FALSE) return /obj/item/mod/module/storage/syndicate var/chameleon_disguised = FALSE -/obj/item/mod/module/storage/syndicate/on_uninstall() +/obj/item/mod/module/storage/syndicate/on_uninstall(deleting = FALSE) if(chameleon_disguised) name = initial(name) chameleon_disguised = FALSE diff --git a/sound/items/modsuit/magnetic_harness.ogg b/sound/items/modsuit/magnetic_harness.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3d19fccc569882225a43afbd620790f87e8662ed GIT binary patch literal 6981 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 literal 0 HcmV?d00001