From 1c42a5cec3e07ec8294b071bab41ceddd43d36cf Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 29 Dec 2020 03:38:55 +0100 Subject: [PATCH] [MIRROR] Fixes BRPED/rigged cell exploit and allows it to booby trap BRPEDs instead (#2357) * Fixes BRPED/rigged cell exploit and allows it to booby trap BRPEDs instead (#55447) BRPEDs can teleport rigged power cells. Through cameras. These rigged power cells will then pretty much immediately explode. This is a tad imbalanced. Behaviour modified. Attempting to use a BRPED on a machine and having it attempt to swap over a rigged cell will cause the rigged cell to immediately go to maximum charge and explode. Adds some logging to accompany it. Why It's Good For The Game Blowing things up from across the cosmos is bad. Rigging BRPEDs to be able to explode when some poor sucker uses it to change over a power cell is cool. * Fixes BRPED/rigged cell exploit and allows it to booby trap BRPEDs instead Co-authored-by: Timberpoes --- code/game/machinery/_machinery.dm | 7 +++++++ code/modules/power/cell.dm | 4 ++++ code/modules/research/stock_parts.dm | 16 ++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 1cf19da3c58..5a676786ca3 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -613,6 +613,13 @@ break for(var/obj/item/B in W.contents) if(istype(B, P) && istype(A, P)) + // If it's a corrupt or rigged cell, attempting to send it through Bluespace could have unforeseen consequences. + if(istype(B, /obj/item/stock_parts/cell) && W.works_from_distance) + var/obj/item/stock_parts/cell/checked_cell = B + // If it's rigged or corrupted, max the charge. Then explode it. + if(checked_cell.rigged || checked_cell.corrupted) + checked_cell.charge = checked_cell.maxcharge + checked_cell.explode() if(B.get_part_rating() > A.get_part_rating()) if(istype(B,/obj/item/stack)) //conveniently this will mean A is also a stack and I will kill the first person to prove me wrong var/obj/item/stack/SA = A diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 261aad8e259..d72e757c29c 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -115,6 +115,10 @@ rigged = FALSE corrupt() return + + message_admins("[ADMIN_LOOKUPFLW(usr)] has triggered a rigged/corrupted power cell explosion at [AREACOORD(T)].") + log_game("[key_name(usr)] has triggered a rigged/corrupted power cell explosion at [AREACOORD(T)].") + //explosion(T, 0, 1, 2, 2) explosion(T, devastation_range, heavy_impact_range, light_impact_range, flash_range) qdel(src) diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index f3d7d0d18df..ea64f22fe17 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -51,6 +51,22 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good alt_sound = 'sound/items/pshoom_2.ogg' component_type = /datum/component/storage/concrete/bluespace/rped +/obj/item/storage/part_replacer/bluespace/Initialize() + . = ..() + + RegisterSignal(src, COMSIG_ATOM_ENTERED, .proc/on_part_entered) + +/obj/item/storage/part_replacer/bluespace/proc/on_part_entered(datum/source, obj/item/I) + if(!istype(I, /obj/item/stock_parts/cell)) + return + + var/obj/item/stock_parts/cell/inserted_cell = I + + if(inserted_cell.rigged || inserted_cell.corrupted) + message_admins("[ADMIN_LOOKUPFLW(usr)] has inserted rigged/corrupted [inserted_cell] into [src].") + log_game("[key_name(usr)] has inserted rigged/corrupted [inserted_cell] into [src].") + usr.log_message("inserted rigged/corrupted [inserted_cell] into [src]", LOG_ATTACK) + /obj/item/storage/part_replacer/bluespace/tier1 /obj/item/storage/part_replacer/bluespace/tier1/PopulateContents()