diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index cf241435d6..ce4e4f2ce6 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -22,6 +22,7 @@
if(!stage || stage==1)
if(detonator)
// detonator.loc=src.loc
+ detonator.detached()
usr.put_in_hands(detonator)
detonator=null
stage=0
@@ -69,17 +70,14 @@
path = 1
if(beakers.len)
user << "\blue You lock the assembly."
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
name = "grenade"
- icon_state = initial(icon_state) +"_locked"
- stage = 2
else
// user << "\red You need to add at least one beaker before locking the assembly."
user << "\blue You lock the empty assembly."
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
name = "fake grenade"
- icon_state = initial(icon_state) +"_locked"
- stage = 2
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
+ icon_state = initial(icon_state) +"_locked"
+ stage = 2
else if(stage == 2)
if(active && prob(95))
user << "\red You trigger the assembly!"
@@ -114,8 +112,9 @@
if(detonator)
usr << "With attached [detonator.name]"
- activate()
+ activate(mob/user as mob)
if(active) return
+
if(detonator)
if(!isigniter(detonator.a_left))
detonator.a_left.activate()
@@ -126,6 +125,11 @@
if(active)
icon_state = initial(icon_state) + "_active"
+ if(user)
+ log_attack("[user.name] ([user.ckey]) primed \a [src]")
+ log_admin("ATTACK: [user] ([user.ckey]) primed \a [src]")
+ message_admins("ATTACK: [user] ([user.ckey]) primed \a [src]")
+
return
proc/primed(var/primed = 1)
@@ -195,9 +199,11 @@
B2.reagents.add_reagent("foaming_agent", 10)
B2.reagents.add_reagent("pacid", 10)
+ detonator = new/obj/item/device/assembly_holder/timer_igniter(src)
+
beakers += B1
beakers += B2
- icon_state = "grenade"
+ icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/incendiary
name = "Incendiary Grenade"
@@ -214,9 +220,11 @@
B2.reagents.add_reagent("plasma", 25)
B2.reagents.add_reagent("sacid", 25)
+ detonator = new/obj/item/device/assembly_holder/timer_igniter(src)
+
beakers += B1
beakers += B2
- icon_state = "grenade"
+ icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/cleaner
name = "Cleaner Grenade"
@@ -233,6 +241,8 @@
B2.reagents.add_reagent("water", 40)
B2.reagents.add_reagent("cleaner", 10)
+ detonator = new/obj/item/device/assembly_holder/timer_igniter(src)
+
beakers += B1
beakers += B2
- icon_state = "grenade"
+ icon_state = initial(icon_state) +"_locked"
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index c381a8d513..99466a9d2a 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -16,11 +16,7 @@
if((CLUMSY in user.mutations) && prob(50))
user << "Huh? How does this thing work?"
- log_attack("[user.name] ([user.ckey]) clumsily primed \a [src]")
- log_admin("ATTACK: [user] ([user.ckey]) clumsily primed \a [src]")
- message_admins("ATTACK: [user] ([user.ckey]) clumsily primed \a [src]")
-
- activate()
+ activate(user)
add_fingerprint(user)
spawn(5)
prime()
@@ -60,11 +56,7 @@
if(clown_check(user))
user << "You prime \the [name]! [det_time/10] seconds!"
- log_attack("[user.name] ([user.ckey]) primed \a [src].")
- log_admin("ATTACK: [user] ([user.ckey]) primed \a [src].")
- message_admins("ATTACK: [user] ([user.ckey]) primed \a [src].")
-
- activate()
+ activate(user)
add_fingerprint(user)
if(iscarbon(user))
var/mob/living/carbon/C = user
@@ -72,10 +64,15 @@
return
-/obj/item/weapon/grenade/proc/activate()
+/obj/item/weapon/grenade/proc/activate(mob/user as mob)
if(active)
return
+ if(user)
+ log_attack("[user.name] ([user.ckey]) primed \a [src]")
+ log_admin("ATTACK: [user] ([user.ckey]) primed \a [src]")
+ message_admins("ATTACK: [user] ([user.ckey]) primed \a [src]")
+
icon_state = initial(icon_state) + "_active"
active = 1
playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index e021cd4158..b8fd910719 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -23,6 +23,8 @@
proc/process_activation(var/obj/item/device/D)
return
+ proc/detached()
+ return
IsAssemblyHolder()
@@ -196,6 +198,58 @@
+/obj/item/device/assembly_holder/timer_igniter
+ name = "timer-igniter assembly"
+ New()
+ ..()
+ var/obj/item/device/assembly/igniter/ign = new(src)
+ ign.secured = 1
+ ign.holder = src
+ var/obj/item/device/assembly/timer/tmr = new(src)
+ tmr.time=5
+ tmr.secured = 1
+ tmr.holder = src
+ processing_objects.Add(tmr)
+ a_left = tmr
+ a_right = ign
+ secured = 1
+ update_icon()
+ name = initial(name) + " ([tmr.time] secs)"
+ loc.verbs += /obj/item/device/assembly_holder/timer_igniter/verb/configure
+
+ detached()
+ loc.verbs -= /obj/item/device/assembly_holder/timer_igniter/verb/configure
+ ..()
+
+ verb/configure()
+ set name = "Set Timer"
+ set category = "Object"
+ set src in usr
+
+ if ( !(usr.stat || usr.restrained()) )
+ var/obj/item/device/assembly_holder/holder
+ if(istype(src,/obj/item/weapon/grenade/chem_grenade))
+ var/obj/item/weapon/grenade/chem_grenade/gren = src
+ holder=gren.detonator
+ var/obj/item/device/assembly/timer/tmr = holder.a_left
+ if(!istype(tmr,/obj/item/device/assembly/timer))
+ tmr = holder.a_right
+ if(!istype(tmr,/obj/item/device/assembly/timer))
+ usr << "This detonator has no timer."
+ return
+
+ if(tmr.timing)
+ usr << "Clock is ticking already."
+ else
+ var/ntime = input("Enter desired time in seconds", "Time", "5") as num
+ if (ntime>0 && ntime<1000)
+ tmr.time = ntime
+ name = initial(name) + "([tmr.time] secs)"
+ usr << "Timer set to [tmr.time] seconds."
+ else
+ usr << "Timer can't be [ntime<=0?"negative":"more than 1000 seconds"]."
+ else
+ usr << "You cannot do this while [usr.stat?"unconscious/dead":"restrained"]."
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index 3549fe9954..c54afdc0c6 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -48,8 +48,7 @@
sense()
- var/obj/mainloc = loc
- if(holder) mainloc=holder.loc
+ var/turf/mainloc = get_turf(src)
// if(scanning && cooldown <= 0)
// mainloc.visible_message("\icon[src] *boop* *boop*", "*boop* *boop*")
if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0
@@ -64,8 +63,7 @@
process()
if(scanning)
- var/obj/mainloc = loc
- if(holder) mainloc=holder.loc
+ var/turf/mainloc = get_turf(src)
for(var/mob/living/A in range(range,mainloc))
if (A.move_speed < 12)
sense()
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index fc7c65b39b..5ed584eecb 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -20,7 +20,9 @@
activate()
if(!..()) return 0//Cooldown check
+
timing = !timing
+
update_icon()
return 0
@@ -37,7 +39,7 @@
timer_end()
- if((!secured)||(cooldown > 0)) return 0
+ if(!secured) return 0
pulse(0)
if(!holder)
visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")