diff --git a/code/datums/components/cell_component.dm b/code/datums/components/cell_component.dm index e5ad4ae49626..3406389beb58 100644 --- a/code/datums/components/cell_component.dm +++ b/code/datums/components/cell_component.dm @@ -25,16 +25,20 @@ component_cell_out_of_charge/component_cell_removed proc using loc where necessa var/obj/item/equipment /// How much power do we use each process? var/power_use_amount = POWER_CELL_USE_NORMAL - /// Are we using a robot's powersource? - var/inside_robot = FALSE /// Callback interaction for when the cell is removed. var/datum/callback/on_cell_removed = null ///Can this cell be removed from the parent? var/cell_can_be_removed = TRUE ///Our reference to the cell overlay var/mutable_appearance/cell_overlay = null + ///Do we have cell overlays to be applied? + var/has_cell_overlays + +/datum/component/cell/Initialize(cell_override, _on_cell_removed, _power_use_amount, start_with_cell = TRUE, _cell_can_be_removed, _has_cell_overlays = TRUE) + if(QDELETED(parent)) + qdel(src) + return -/datum/component/cell/Initialize(cell_override, _on_cell_removed, _power_use_amount, start_with_cell = TRUE, _cell_can_be_removed) if(!isitem(parent)) //Currently only compatable with items. return COMPONENT_INCOMPATIBLE @@ -43,6 +47,8 @@ component_cell_out_of_charge/component_cell_removed proc using loc where necessa if(_on_cell_removed) src.on_cell_removed = _on_cell_removed + has_cell_overlays = _has_cell_overlays + if(_power_use_amount) power_use_amount = _power_use_amount else @@ -53,10 +59,10 @@ component_cell_out_of_charge/component_cell_removed proc using loc where necessa if(start_with_cell) var/obj/item/stock_parts/cell/new_cell - if(cell_override) - new_cell = new cell_override() - else + if(!cell_override) new_cell = new /obj/item/stock_parts/cell/upgraded() + else + new_cell = new cell_override() inserted_cell = new_cell new_cell.forceMove(parent) //We use the parents location so things like EMP's can interact with the cell. handle_cell_overlays() @@ -75,17 +81,23 @@ component_cell_out_of_charge/component_cell_removed proc using loc where necessa UnregisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT) UnregisterSignal(parent, COMSIG_PARENT_EXAMINE) -/datum/component/cell/Destroy(force, silent) +/datum/component/cell/Destroy(force) if(on_cell_removed) - QDEL_NULL(on_cell_removed) + on_cell_removed = null if(inserted_cell) - if(!inside_robot) //We really don't want to be deleting the robot's cell. - QDEL_NULL(inserted_cell) + QDEL_NULL(inserted_cell) inserted_cell = null return ..() -/// This proc is the basic way of processing the cell, with included feedback. It will return a bitflag if it failed to use the power, or COMPONENT_POWER_SUCCESS if it succeeds. -/// The user is sent the feedback, use_amount is an override, check_only will only return if it can use the cell and feedback relating to that. +/** + * The basic way of processing the cell, with included feedback. + * + * This proc is the basic way of processing the cell, with included feedback. + * It will return a bitflag if it failed to use the power, or COMPONENT_POWER_SUCCESS if it succeeds. + * Arguments: + * * use_amount - an override + * * check_only - will only return if it can use the cell and feedback relating to that including any relevant detail + */ /datum/component/cell/proc/simple_power_use(datum/source, use_amount, mob/user, check_only) SIGNAL_HANDLER @@ -94,18 +106,18 @@ component_cell_out_of_charge/component_cell_removed proc using loc where necessa if(!inserted_cell) if(user) - to_chat(user, "There is no cell inside [equipment]") + to_chat(user, span_danger("There is no cell inside [equipment]")) return COMPONENT_NO_CELL if(check_only && inserted_cell.charge < use_amount) if(user) - to_chat(user, "The cell inside [equipment] does not have enough charge to perform this action!") + to_chat(user, span_danger("The cell inside [equipment] does not have enough charge to perform this action!")) return COMPONENT_NO_CHARGE if(!inserted_cell.use(use_amount)) inserted_cell.update_appearance() //Updates the attached cell sprite - Why does this not happen in cell.use? if(user) - to_chat(user, "The cell inside [equipment] does not have enough charge to perform this action!") + to_chat(user, span_danger("The cell inside [equipment] does not have enough charge to perform this action!")) return COMPONENT_NO_CHARGE inserted_cell.update_appearance() @@ -116,57 +128,57 @@ component_cell_out_of_charge/component_cell_removed proc using loc where necessa SIGNAL_HANDLER if(!inserted_cell) - examine_list += "It does not have a cell inserted!" - else if(!inside_robot) - examine_list += "It has [inserted_cell] inserted. It has [inserted_cell.percent()]% charge left." + examine_list += span_danger("It does not have a cell inserted!") else - examine_list += "It is drawing power from an external powersource, reading [inserted_cell.percent()]% charge." + examine_list += span_notice("It has [inserted_cell] inserted. It has [inserted_cell.percent()]% charge left. \ + Ctrl+Shift+Click to remove the [inserted_cell].") /// Handling of cell removal. /datum/component/cell/proc/remove_cell(datum/source, mob/user) + SIGNAL_HANDLER if(!equipment.can_interact(user)) return - if(inside_robot) + if(!cell_can_be_removed) return - if(!cell_can_be_removed) + if(!isliving(user)) return if(inserted_cell) - to_chat(user, "You remove [inserted_cell] from [equipment]!") + to_chat(user, span_notice("You remove [inserted_cell] from [equipment]!")) playsound(equipment, 'sound/weapons/magout.ogg', 40, TRUE) inserted_cell.forceMove(get_turf(equipment)) - INVOKE_ASYNC(user, /mob/living.proc/put_in_hands, inserted_cell) + INVOKE_ASYNC(user, TYPE_PROC_REF(/mob/living, put_in_hands), inserted_cell) inserted_cell = null if(on_cell_removed) on_cell_removed.Invoke() handle_cell_overlays(TRUE) else - to_chat(user, "There is no cell inserted in [equipment]!") + to_chat(user, span_danger("There is no cell inserted in [equipment]!")) /// Handling of cell insertion. /datum/component/cell/proc/insert_cell(datum/source, obj/item/inserting_item, mob/living/user, params) + SIGNAL_HANDLER if(!equipment.can_interact(user)) return - if(inside_robot) //More robot shitcode, if we allowed them to remove the cell, it would cause the universe to implode. - return - if(!istype(inserting_item, /obj/item/stock_parts/cell)) return if(inserted_cell) //No quickswap compatibility - to_chat(user, "There is already a cell inserted in [equipment]!") + to_chat(user, span_danger("There is already a cell inserted in [equipment]!")) return - to_chat(user, "You insert [inserting_item] into [equipment]!") - playsound(equipment, 'sound/weapons/magin.ogg', 40, TRUE) + to_chat(user, span_notice("You insert [inserting_item] into [equipment]!")) + playsound(equipment, 'sound/weapons/magin.ogg', 40, TRUE) inserted_cell = inserting_item inserting_item.forceMove(parent) handle_cell_overlays(FALSE) /datum/component/cell/proc/handle_cell_overlays(update_overlays) + if(!has_cell_overlays) + return if(inserted_cell) cell_overlay = mutable_appearance(equipment.icon, "[initial(equipment.icon_state)]_cell") equipment.add_overlay(cell_overlay)