From b272f1aa74d392b7a88ef6f6db9969ba3f71b6bf Mon Sep 17 00:00:00 2001 From: Fikou <23585223+Fikou@users.noreply.github.com> Date: Mon, 14 Feb 2022 00:09:50 +0100 Subject: [PATCH] Fixes modsuit charging and sphere transformation in 0 gravity (#64857) Handles modsuit borg recharging on the standard core itself instead of the modsuit modsuit, as it should. --- code/__DEFINES/dcs/signals/signals_mod.dm | 4 ++++ code/modules/mod/mod_control.dm | 14 +++--------- code/modules/mod/mod_core.dm | 25 +++++++++++++++++++++- code/modules/mod/modules/modules_supply.dm | 3 +++ 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_mod.dm index 4050481fb99..e5c27a902a6 100644 --- a/code/__DEFINES/dcs/signals/signals_mod.dm +++ b/code/__DEFINES/dcs/signals/signals_mod.dm @@ -19,3 +19,7 @@ #define COMSIG_MODULE_DEACTIVATED "mod_module_deactivated" /// Called when a module is used, after all checks have passed and cooldown started. #define COMSIG_MODULE_USED "mod_module_used" +/// Called when the MODsuit wearer is set. +#define COMSIG_MOD_WEARER_SET "mod_wearer_set" +/// Called when the MODsuit wearer is unset. +#define COMSIG_MOD_WEARER_UNSET "mod_wearer_unset" diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 1c3ef971831..590829efd38 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -439,8 +439,8 @@ /obj/item/mod/control/proc/set_wearer(mob/user) wearer = user + SEND_SIGNAL(src, COMSIG_MOD_WEARER_SET, wearer) RegisterSignal(wearer, COMSIG_ATOM_EXITED, .proc/on_exit) - RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/on_borg_charge) RegisterSignal(src, COMSIG_ITEM_PRE_UNEQUIP, .proc/on_unequip) update_charge_alert() for(var/obj/item/mod/module/module as anything in modules) @@ -452,6 +452,7 @@ UnregisterSignal(wearer, list(COMSIG_ATOM_EXITED, COMSIG_PROCESS_BORGCHARGER_OCCUPANT)) UnregisterSignal(src, COMSIG_ITEM_PRE_UNEQUIP) wearer.clear_alert("mod_charge") + SEND_SIGNAL(src, COMSIG_MOD_WEARER_UNSET, wearer) wearer = null /obj/item/mod/control/proc/on_unequip() @@ -536,7 +537,7 @@ return FALSE do_sparks(5, TRUE, src) var/check_range = TRUE - return electrocute_mob(user, get_cell(), src, 0.7, check_range) + 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 @@ -652,15 +653,6 @@ INVOKE_ASYNC(src, .proc/toggle_activate, wearer, TRUE) return -/obj/item/mod/control/proc/on_borg_charge(datum/source, amount) - SIGNAL_HANDLER - - update_charge_alert() - var/obj/item/stock_parts/cell/cell = get_cell() - if(!cell) - return - cell.give(amount) - /obj/item/mod/control/proc/on_potion(atom/movable/source, obj/item/slimepotion/speed/speed_potion, mob/living/user) SIGNAL_HANDLER diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm index 8e67945afd5..befb07002f9 100644 --- a/code/modules/mod/mod_core.dm +++ b/code/modules/mod/mod_core.dm @@ -85,11 +85,16 @@ RegisterSignal(mod, COMSIG_PARENT_EXAMINE, .proc/on_examine) RegisterSignal(mod, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) RegisterSignal(mod, COMSIG_PARENT_ATTACKBY, .proc/on_attackby) + RegisterSignal(mod, COMSIG_MOD_WEARER_SET, .proc/on_wearer_set) + if(mod.wearer) + on_wearer_set(mod, mod.wearer) /obj/item/mod/core/standard/uninstall() if(!QDELETED(cell)) cell.forceMove(drop_location()) - UnregisterSignal(mod, list(COMSIG_PARENT_EXAMINE, COMSIG_ATOM_ATTACK_HAND, COMSIG_PARENT_ATTACKBY)) + UnregisterSignal(mod, list(COMSIG_PARENT_EXAMINE, COMSIG_ATOM_ATTACK_HAND, COMSIG_PARENT_ATTACKBY, COMSIG_MOD_WEARER_SET)) + if(mod.wearer) + on_wearer_unset(mod, mod.wearer) return ..() /obj/item/mod/core/standard/charge_source() @@ -202,6 +207,24 @@ return COMPONENT_NO_AFTERATTACK return NONE +/obj/item/mod/core/standard/proc/on_wearer_set(datum/source, mob/user) + SIGNAL_HANDLER + + RegisterSignal(mod.wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/on_borg_charge) + RegisterSignal(mod, COMSIG_MOD_WEARER_UNSET, .proc/on_wearer_unset) + +/obj/item/mod/core/standard/proc/on_wearer_unset(datum/source, mob/user) + SIGNAL_HANDLER + + UnregisterSignal(mod.wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) + UnregisterSignal(mod, COMSIG_MOD_WEARER_UNSET) + +/obj/item/mod/core/standard/proc/on_borg_charge(datum/source, amount) + SIGNAL_HANDLER + + add_charge(amount) + mod.update_charge_alert() + /obj/item/mod/core/ethereal name = "MOD ethereal core" icon_state = "mod-core-ethereal" diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 957364ea72b..aba395da5c9 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -457,6 +457,9 @@ var/animate_time = 0.25 SECONDS /obj/item/mod/module/sphere_transform/on_activation() + if(!mod.wearer.has_gravity()) + balloon_alert(mod.wearer, "no gravity!") + return FALSE . = ..() if(!.) return