diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index 8e1b8516172..c30817ed5aa 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -185,4 +185,4 @@
return "[key_name(src)] ([mob.x],[mob.y],[mob.z])"
//this is only used here (for now)
-#undef RUST_G
\ No newline at end of file
+#undef RUST_G
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 3d495964cb0..4ebced1c973 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -255,8 +255,8 @@ This is always put in the attack log.
add_attack_logs(user, M, what_done, custom_level)
return
- var/user_str = key_name_log(user)
- var/target_str = key_name_log(target)
+ var/user_str = key_name_log(user) + COORD(user)
+ var/target_str = key_name_log(target) + COORD(target)
if(istype(user))
user.create_attack_log("Attacked [target_str]: [what_done]")
@@ -265,7 +265,6 @@ This is always put in the attack log.
log_attack(user_str, target_str, what_done)
var/loglevel = ATKLOG_MOST
-
if(!isnull(custom_level))
loglevel = custom_level
else if(istype(target))
@@ -503,4 +502,4 @@ This is always put in the attack log.
var/list/viewrangelist = splittext(view, "x")
viewX = text2num(viewrangelist[1])
viewY = text2num(viewrangelist[2])
- return list(viewX, viewY)
\ No newline at end of file
+ return list(viewX, viewY)
diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm
index 2188337ba77..3c26a850a9a 100644
--- a/code/game/objects/empulse.dm
+++ b/code/game/objects/empulse.dm
@@ -1,12 +1,12 @@
-/proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
+/proc/empulse(turf/epicenter, heavy_range, light_range, log=0, cause = null)
if(!epicenter) return
if(!istype(epicenter, /turf))
epicenter = get_turf(epicenter.loc)
if(log)
- message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [ADMIN_COORDJMP(epicenter)]")
- log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [COORD(epicenter)]")
+ message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])": ] [ADMIN_COORDJMP(epicenter)]")
+ log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [COORD(epicenter)]")
if(heavy_range > 1)
new/obj/effect/temp_visual/emp/pulse(epicenter)
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 8adb61dec93..48ebad7ea5d 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -1,6 +1,6 @@
//TODO: Flash range does nothing currently
-/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1)
+/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1, cause = null)
src = null //so we don't abort once src is deleted
epicenter = get_turf(epicenter)
@@ -25,8 +25,8 @@
var/list/cached_exp_block = list()
if(adminlog)
- message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (JMP)")
- log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])")
+ message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [ADMIN_COORDJMP(epicenter)] ")
+ log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] [cause ? "(Cause: [cause])" : ] [COORD(epicenter)] ")
// Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves.
// Stereo users will also hear the direction of the explosion!
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index e19cd1165b5..3aa2252ac92 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -28,16 +28,17 @@
var/speed = 1 //Amount of deciseconds it takes for projectile to travel
var/Angle = 0
var/spread = 0 //amount (in degrees) of projectile spread
- var/legacy = 0 //legacy projectile system
+ var/legacy = FALSE //legacy projectile system
animate_movement = 0
var/damage = 10
var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here
- var/nodamage = 0 //Determines if the projectile will skip any damage inflictions
+ var/nodamage = FALSE //Determines if the projectile will skip any damage inflictions
var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb //Cael - bio and rad are also valid
var/projectile_type = "/obj/item/projectile"
var/range = 50 //This will de-increment every step. When 0, it will delete the projectile.
var/is_reflectable = FALSE // Can it be reflected or not?
+ var/alwayslog = FALSE // ALWAYS log this projectile on hit even if it doesn't hit a living target. Useful for AOE explosion / EMP.
//Effects
var/stun = 0
var/weaken = 0
@@ -68,6 +69,8 @@
/obj/item/projectile/proc/on_hit(atom/target, blocked = 0, hit_zone)
var/turf/target_loca = get_turf(target)
+ if(alwayslog)
+ add_attack_logs(firer, target, "Shot with a [type]")
if(!isliving(target))
return 0
var/mob/living/L = target
@@ -121,7 +124,7 @@
reagent_note += R.id + " ("
reagent_note += num2text(R.volume) + ") "
has_reagents = TRUE
- if(!log_override && firer && original)
+ if(!log_override && firer && !alwayslog)
if(has_reagents)
add_attack_logs(firer, L, "Shot with a [type] (containing [reagent_note])")
else
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 2003e78b780..ef8a36f7f86 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -2,43 +2,46 @@
name = "ion bolt"
icon_state = "ion"
damage = 0
+ alwayslog = TRUE
damage_type = BURN
nodamage = 1
flag = "energy"
/obj/item/projectile/ion/on_hit(var/atom/target, var/blocked = 0)
..()
- empulse(target, 1, 1, 1)
+ empulse(target, 1, 1, 1, cause = "[type] fired by [key_name(firer)]")
return 1
/obj/item/projectile/ion/weak
/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = 0)
..()
- empulse(target, 0, 0, 1)
+ empulse(target, 0, 0, 1, cause = "[type] fired by [key_name(firer)]")
return 1
/obj/item/projectile/bullet/gyro
name ="explosive bolt"
icon_state= "bolter"
damage = 50
+ alwayslog = TRUE
flag = "bullet"
/obj/item/projectile/bullet/gyro/on_hit(var/atom/target, var/blocked = 0)
..()
- explosion(target, -1, 0, 2)
+ explosion(target, -1, 0, 2, cause = "[type] fired by [key_name(firer)]")
return 1
/obj/item/projectile/bullet/a40mm
name ="40mm grenade"
desc = "USE A WEEL GUN"
icon_state= "bolter"
+ alwayslog = TRUE
damage = 60
flag = "bullet"
/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0)
..()
- explosion(target, -1, 0, 2, 1, 0, flame_range = 3)
+ explosion(target, -1, 0, 2, 1, 0, flame_range = 3, cause = "[type] fired by [key_name(firer)]")
return 1
/obj/item/projectile/temp
@@ -229,6 +232,7 @@
name ="explosive slug"
damage = 25
weaken = 5
+ alwayslog = TRUE
/obj/item/projectile/bullet/frag12/on_hit(atom/target, blocked = 0)
..()
@@ -276,6 +280,7 @@
icon_state = "bluespace"
damage = 0
nodamage = 1
+ alwayslog = TRUE
var/teleport_target = null
/obj/item/projectile/energy/teleport/New(loc, tele_target)
@@ -289,6 +294,7 @@
do_teleport(target, teleport_target, 0)//teleport what's in the tile to the beacon
else
do_teleport(target, target, 15) //Otherwise it just warps you off somewhere.
+ add_attack_logs(firer, target, "Shot with a [type] [teleport_target ? "(Destination: [teleport_target])" : ""]")
/obj/item/projectile/snowball
name = "snowball"