From d881920e0c429e40f39e12f4e7e59ed12e759e2a Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sat, 10 Sep 2022 20:43:51 -0400 Subject: [PATCH] Improves mecha / projectile logging (#69805) fix: Projectiles fired by non-mob sources (IE turrets) now log reagents contained after hitting a target. admin: Cleaned up projectile reagent logging a little. admin: Projectiles fired from mecha will now combat log on the target AND the firer. admin: Mecha chassis logs will now contain the name/ckey of the person who fired the mecha's weapon. admin: Projectiles fired from vehicles are now more likely to be combat logged properly after hitting a target (this logs for all people with control of the mecha which is a little messy with multi-seat mecha. Check the vehicle's logs or a user's combat logs for the person that actually SHOT the projectile.) --- code/modules/projectiles/projectile.dm | 19 ++++++++++++++----- .../mecha/equipment/weapons/weapons.dm | 5 ++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 77c89d45051..14bf92fdcb2 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -319,15 +319,23 @@ var/reagent_note if(reagents?.reagent_list) - reagent_note = " REAGENTS:" - for(var/datum/reagent/R in reagents.reagent_list) - reagent_note += "[R.name] ([num2text(R.volume)])" + reagent_note = "REAGENTS: [pretty_string_from_reagent_list(reagents.reagent_list)]" if(ismob(firer)) log_combat(firer, L, "shot", src, reagent_note) - else - L.log_message("has been shot by [firer] with [src]", LOG_ATTACK, color="orange") + return BULLET_ACT_HIT + if(isvehicle(firer)) + var/obj/vehicle/firing_vehicle = firer + + var/list/logging_mobs = firing_vehicle.return_controllers_with_flag(VEHICLE_CONTROL_EQUIPMENT) + if(!LAZYLEN(logging_mobs)) + logging_mobs = firing_vehicle.return_drivers() + for(var/mob/logged_mob as anything in logging_mobs) + log_combat(logged_mob, L, "shot", src, "from inside [firing_vehicle][logging_mobs.len > 1 ? " with multiple occupants" : null][reagent_note ? " and contained [reagent_note]" : null]") + return BULLET_ACT_HIT + + L.log_message("has been shot by [firer] with [src][reagent_note ? " containing [reagent_note]" : null]", LOG_VICTIM, color="orange", log_globally=FALSE) return BULLET_ACT_HIT /obj/projectile/proc/vol_by_damage() @@ -698,6 +706,7 @@ AddElement(/datum/element/embed, projectile_payload = shrapnel_type) if(!log_override && firer && original) log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]") + //note: mecha projectile logging is handled in /obj/item/mecha_parts/mecha_equipment/weapon/action(). try to keep these messages roughly the sameish just for consistency's sake. if(direct_target && (get_dist(direct_target, get_turf(src)) <= 1)) // point blank shots process_hit(get_turf(direct_target), direct_target) if(QDELETED(src)) diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index 20ea8d5913e..2c9d9d0113d 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -63,6 +63,7 @@ spread = round((i / projectiles_per_shot - 0.5) * variance) var/obj/projectile/projectile_obj = new projectile(get_turf(src)) + projectile_obj.log_override = TRUE //we log being fired ourselves a little further down. projectile_obj.firer = chassis projectile_obj.preparePixelProjectile(target, source, modifiers, spread) if(source.client && isliving(source)) //dont want it to happen from syndie mecha npc mobs, they do direct fire anyways @@ -73,11 +74,13 @@ new firing_effect_type(get_turf(src), chassis.dir) playsound(chassis, fire_sound, 50, TRUE) + log_combat(source, target, "fired [projectile_obj] at", src, "from [chassis] at [get_area_name(src, TRUE)]") + sleep(max(0, projectile_delay)) if(kickback) chassis.newtonian_move(newtonian_target) - chassis.log_message("Fired from [name], targeting [target].", LOG_ATTACK) + chassis.log_message("[key_name(source)] fired [src], targeting [target].", LOG_ATTACK) //Base energy weapon type /obj/item/mecha_parts/mecha_equipment/weapon/energy