mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-25 17:12:12 +00:00
Fix assemblies not pick-upable after detaching from chemical grenade (#70956)
Assemblies (signallers, mousetraps, timers, etc.) can be picked up again after detaching from chemical grenade
(cherry picked from commit 372227bc56)
Co-authored-by: antropod <antropod@gmail.com>
151 lines
4.3 KiB
Plaintext
151 lines
4.3 KiB
Plaintext
/datum/wires/explosive
|
|
var/duds_number = 2 // All "dud" wires cause an explosion when cut or pulsed
|
|
proper_name = "Explosive Device"
|
|
randomize = TRUE // Prevents wires from showing up on blueprints
|
|
|
|
/datum/wires/explosive/New(atom/holder)
|
|
add_duds(duds_number) // Duds also explode here.
|
|
..()
|
|
|
|
/datum/wires/explosive/on_pulse(index)
|
|
explode()
|
|
|
|
/datum/wires/explosive/on_cut(index, mend)
|
|
explode()
|
|
|
|
/datum/wires/explosive/proc/explode()
|
|
return
|
|
|
|
/datum/wires/explosive/chem_grenade
|
|
duds_number = 1
|
|
holder_type = /obj/item/grenade/chem_grenade
|
|
var/fingerprint
|
|
|
|
/datum/wires/explosive/chem_grenade/interactable(mob/user)
|
|
if(!..())
|
|
return FALSE
|
|
var/obj/item/grenade/chem_grenade/G = holder
|
|
if(G.stage == GRENADE_WIRED)
|
|
return TRUE
|
|
|
|
/datum/wires/explosive/chem_grenade/on_pulse(index)
|
|
var/obj/item/grenade/chem_grenade/grenade = holder
|
|
if(grenade.stage != GRENADE_READY)
|
|
return
|
|
. = ..()
|
|
|
|
/datum/wires/explosive/chem_grenade/on_cut(index, mend)
|
|
var/obj/item/grenade/chem_grenade/grenade = holder
|
|
if(grenade.stage != GRENADE_READY)
|
|
return
|
|
. = ..()
|
|
|
|
/datum/wires/explosive/chem_grenade/attach_assembly(color, obj/item/assembly/S)
|
|
if(istype(S,/obj/item/assembly/timer))
|
|
var/obj/item/grenade/chem_grenade/G = holder
|
|
var/obj/item/assembly/timer/T = S
|
|
G.det_time = T.saved_time*10
|
|
else if(istype(S,/obj/item/assembly/prox_sensor))
|
|
var/obj/item/assembly/prox_sensor/sensor = S
|
|
var/obj/item/grenade/chem_grenade/grenade = holder
|
|
grenade.landminemode = sensor
|
|
sensor.proximity_monitor.set_ignore_if_not_on_turf(FALSE)
|
|
else if(istype(S,/obj/item/assembly/health))
|
|
var/obj/item/assembly/health/sensor = S
|
|
if(!sensor.secured)
|
|
sensor.toggle_secure()
|
|
if(!sensor.scanning)
|
|
sensor.toggle_scan()
|
|
fingerprint = S.fingerprintslast
|
|
return ..()
|
|
|
|
/datum/wires/explosive/chem_grenade/explode()
|
|
var/obj/item/grenade/chem_grenade/grenade = holder
|
|
var/obj/item/assembly/pulser = get_attached(get_wire(1))
|
|
var/message = "\An [pulser] has pulsed [grenade] ([grenade.type]), which was installed by [fingerprint]"
|
|
if(istype(pulser, /obj/item/assembly/voice))
|
|
var/obj/item/assembly/voice/spoken_trigger = pulser
|
|
message += " with the following activation message: \"[spoken_trigger.recorded]\""
|
|
if(!grenade.dud_flags)
|
|
message_admins(message)
|
|
log_game(message)
|
|
var/mob/M = get_mob_by_ckey(fingerprint)
|
|
grenade.log_grenade(M) //Used in arm_grenade() too but this one conveys where the mob who triggered the bomb is
|
|
if(grenade.landminemode)
|
|
grenade.detonate() ///already armed
|
|
else
|
|
grenade.arm_grenade() //The one here conveys where the bomb was when it went boom
|
|
|
|
|
|
/datum/wires/explosive/chem_grenade/detach_assembly(color)
|
|
var/obj/item/assembly/S = get_attached(color)
|
|
if(S && istype(S))
|
|
assemblies -= color
|
|
S.connected = null
|
|
S.holder = null
|
|
S.forceMove(holder.drop_location())
|
|
var/obj/item/grenade/chem_grenade/G = holder
|
|
G.landminemode = null
|
|
return S
|
|
|
|
/datum/wires/explosive/c4 // Also includes X4
|
|
holder_type = /obj/item/grenade/c4
|
|
|
|
/datum/wires/explosive/c4/explode()
|
|
var/obj/item/grenade/c4/P = holder
|
|
P.detonate()
|
|
|
|
/datum/wires/explosive/pizza
|
|
holder_type = /obj/item/pizzabox
|
|
|
|
/datum/wires/explosive/pizza/New(atom/holder)
|
|
wires = list(
|
|
WIRE_DISARM
|
|
)
|
|
add_duds(3) // Duds also explode here.
|
|
..()
|
|
|
|
/datum/wires/explosive/pizza/interactable(mob/user)
|
|
if(!..())
|
|
return FALSE
|
|
var/obj/item/pizzabox/P = holder
|
|
if(P.open && P.bomb)
|
|
return TRUE
|
|
|
|
/datum/wires/explosive/pizza/get_status()
|
|
var/obj/item/pizzabox/P = holder
|
|
var/list/status = list()
|
|
status += "The red light is [P.bomb_active ? "on" : "off"]."
|
|
status += "The green light is [P.bomb_defused ? "on": "off"]."
|
|
return status
|
|
|
|
/datum/wires/explosive/pizza/on_pulse(wire)
|
|
var/obj/item/pizzabox/P = holder
|
|
switch(wire)
|
|
if(WIRE_DISARM) // Pulse to toggle
|
|
P.bomb_defused = !P.bomb_defused
|
|
else // Boom
|
|
explode()
|
|
|
|
/datum/wires/explosive/pizza/on_cut(wire, mend)
|
|
var/obj/item/pizzabox/P = holder
|
|
switch(wire)
|
|
if(WIRE_DISARM) // Disarm and untrap the box.
|
|
if(!mend)
|
|
P.bomb_defused = TRUE
|
|
else
|
|
if(!mend && !P.bomb_defused)
|
|
explode()
|
|
|
|
/datum/wires/explosive/pizza/explode()
|
|
var/obj/item/pizzabox/P = holder
|
|
P.bomb.detonate()
|
|
|
|
|
|
/datum/wires/explosive/gibtonite
|
|
holder_type = /obj/item/gibtonite
|
|
|
|
/datum/wires/explosive/gibtonite/explode()
|
|
var/obj/item/gibtonite/P = holder
|
|
P.GibtoniteReaction(null, 2)
|