diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 3ea47c398ae..5e8ceba95ba 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -535,6 +535,14 @@ Turf and target are seperate in case you want to teleport some distance from a t /proc/key_name_admin(var/whom, var/include_name = 1) return key_name(whom, 1, include_name) +/proc/get_mob_by_ckey(var/key) + if(!key) + return + var/list/mobs = sortmobs() + for(var/mob/M in mobs) + if(M.ckey == key) + return M + // Returns the atom sitting on the turf. // For example, using this on a disk, which is in a bag, on a mob, will return the mob because it's on the turf. /proc/get_atom_on_turf(var/atom/movable/M) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index a75c08fecf2..54433b17d90 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -14,7 +14,7 @@ var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle) var/affected_area = 3 var/obj/item/device/assembly_holder/nadeassembly = null - + var/assemblyattacher /obj/item/weapon/grenade/chem_grenade/New() create_reagents(1000) @@ -28,13 +28,13 @@ /obj/item/weapon/grenade/chem_grenade/attack_self(mob/user) if(stage == READY && !active) - var/turf/bombturf = get_turf(src) - var/area/A = get_area(bombturf) - message_admins("[key_name(usr)]? has primed a [name] for detonation at [A.name] (JMP).") - log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).") if(nadeassembly) nadeassembly.attack_self(user) else if(clown_check(user)) + var/turf/bombturf = get_turf(src) + var/area/A = get_area(bombturf) + message_admins("[key_name(usr)]? has primed a [name] for detonation at [A.name] (JMP).") + log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).") user << "You prime the [name]! [det_time / 10] second\s!" active = 1 icon_state = initial(icon_state) + "_active" @@ -86,6 +86,7 @@ nadeassembly = A A.master = src A.loc = src + assemblyattacher = user.ckey stage = WIRED icon_state = initial(icon_state) + "_ass" @@ -145,21 +146,28 @@ if(stage != READY) return - var/has_reagents = 0 - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - if(G.reagents.total_volume) + var/has_reagents + for(var/obj/item/I in beakers) + if(I.reagents.total_volume) has_reagents = 1 if(!has_reagents) playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1) return + if(nadeassembly) + var/mob/M = get_mob_by_ckey(assemblyattacher) + var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast) + var/turf/T = get_turf(src) + var/area/A = get_area(T) + message_admins("grenade primed by an assembly, attached by [M.key]/[M](?) and last touched by [last.key]/[last](?) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] (JMP).") + log_game("grenade primed by an assembly, attached by [M.key]/[M] and last touched by [last.key]/[last] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])") + playsound(loc, 'sound/effects/bamf.ogg', 50, 1) update_mob() - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(src, G.reagents.total_volume) + mix_reagents() if(reagents.total_volume) //The possible reactions didnt use up all reagents. var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() @@ -167,16 +175,18 @@ steam.attach(src) steam.start() - for(var/atom/A in view(affected_area, loc)) - if(A == src) - continue - reagents.reaction(A, 1, 10) + for(var/atom/A in view(affected_area, loc)) + if(A == src) + continue + reagents.reaction(A, 1, 10) invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? spawn(50) //To make sure all reagents can work qdel(src) //correctly before deleting the grenade. - +/obj/item/weapon/grenade/chem_grenade/proc/mix_reagents() + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + G.reagents.trans_to(src, G.reagents.total_volume) //Large chem grenades accept slime cores and use the appropriately. /obj/item/weapon/grenade/chem_grenade/large @@ -188,56 +198,19 @@ origin_tech = "combat=3;materials=3" affected_area = 4 -/obj/item/weapon/grenade/chem_grenade/large/prime() - if(stage != READY) - return +/obj/item/weapon/grenade/chem_grenade/large/mix_reagents() + for(var/obj/item/slime_extract/S in beakers) + if(S.Uses) + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) + G.reagents.trans_to(S, G.reagents.total_volume) - var/has_reagents = 0 - var/obj/item/slime_extract/valid_core = null - - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - if(!istype(G)) continue - if(G.reagents.total_volume) has_reagents = 1 - for(var/obj/item/slime_extract/E in beakers) - if(!istype(E)) continue - if(E.Uses) valid_core = E - if(E.reagents.total_volume) has_reagents = 1 - - if(!has_reagents) - playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1) - return - - playsound(loc, 'sound/effects/bamf.ogg', 50, 1) - - update_mob() - - if(valid_core) - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(valid_core, G.reagents.total_volume) - - //If there is still a core (sometimes it's used up) - //and there are reagents left, behave normally - - if(valid_core && valid_core.reagents && valid_core.reagents.total_volume) - valid_core.reagents.trans_to(src,valid_core.reagents.total_volume) - else - for(var/obj/item/weapon/reagent_containers/glass/G in beakers) - G.reagents.trans_to(src, G.reagents.total_volume) - - if(reagents.total_volume) //The possible reactions didnt use up all reagents. - var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() - steam.set_up(10, 0, get_turf(src)) - steam.attach(src) - steam.start() - - for(var/atom/A in view(affected_area, loc)) - if( A == src ) continue - reagents.reaction(A, 1, 10) - - invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? - spawn(50) //To make sure all reagents can work - qdel(src) //correctly before deleting the grenade. + //If there is still a core (sometimes it's used up) + //and there are reagents left, behave normally + if(S && S.reagents && S.reagents.total_volume) + S.reagents.trans_to(src,S.reagents.total_volume) + return + ..() //I tried to just put it in the allowed_containers list but //if you do that it must have reagents. If you're going to diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index e4ca1654bde..26f00b7a44c 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -55,19 +55,19 @@ atom/proc/add_fibers(mob/living/carbon/human/M) if(!istype(H.dna, /datum/dna)) return 0 if(H.gloves) - if(fingerprintslast != H.key) + if(fingerprintslast != H.ckey) fingerprintshidden += text("\[[time_stamp()]\] (Wearing gloves). Real name: [], Key: []",H.real_name, H.key) - fingerprintslast = H.key + fingerprintslast = H.ckey return 0 if(!( fingerprints )) - if(fingerprintslast != H.key) + if(fingerprintslast != H.ckey) fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []",H.real_name, H.key) - fingerprintslast = H.key + fingerprintslast = H.ckey return 1 else - if(fingerprintslast != M.key) + if(fingerprintslast != M.ckey) fingerprintshidden += text("\[[time_stamp()]\] Real name: [], Key: []",M.real_name, M.key) - fingerprintslast = M.key + fingerprintslast = M.ckey return //Set ignoregloves to add prints irrespective of the mob having gloves on. @@ -90,9 +90,9 @@ atom/proc/add_fibers(mob/living/carbon/human/M) //Now, deal with gloves. if(!ignoregloves) if(H.gloves && H.gloves != src) - if(fingerprintslast != H.key) + if(fingerprintslast != H.ckey) fingerprintshidden += text("\[[]\](Wearing gloves). Real name: [], Key: []",time_stamp(), H.real_name, H.key) - fingerprintslast = H.key + fingerprintslast = H.ckey H.gloves.add_fingerprint(M) //Deal with gloves the pass finger/palm prints. @@ -103,9 +103,9 @@ atom/proc/add_fibers(mob/living/carbon/human/M) return 0 //More adminstuffz - if(fingerprintslast != H.key) + if(fingerprintslast != H.ckey) fingerprintshidden += text("\[[]\]Real name: [], Key: []",time_stamp(), H.real_name, H.key) - fingerprintslast = H.key + fingerprintslast = H.ckey //Make the list if it does not exist. if(!fingerprints) @@ -120,9 +120,9 @@ atom/proc/add_fibers(mob/living/carbon/human/M) return 1 else //Smudge up dem prints some - if(fingerprintslast != M.key) + if(fingerprintslast != M.ckey) fingerprintshidden += text("\[[]\]Real name: [], Key: []",time_stamp(), M.real_name, M.key) - fingerprintslast = M.key + fingerprintslast = M.ckey return