C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Rust;
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Oxide.Plugins {
[Info("Combat Logger", "Tori1157/RocketMyrr", "2.0.3")]
[Description("Logs everything related to combat.")]
class CombatLogger : RustPlugin {
#region Constants
private readonly List<string> DamageTypes = new List<string> // DamgeTypes Check and Blocking for Damage but shown for Wounded and Killed By
{
"Hunger", "Thirst", "Cold", "Drowned", "Heat", "Bleeding", "Poison", "Suicide", "Fall", "Radiation", "Explosion", "RadiationExposure", "ColdExposure", "Decay", "ElectricShock", "Arrow", "AntiVehicle", "Collision", "Fun_Water"
}
;
#endregion Constants
#region Hooks
private void OnServerInitialized() {
if (configData.LogMain.Damage.Log || configData.LogMain.Damage.Put) Subscribe(nameof(OnEntityTakeDamage));
if (configData.LogMain.Death.Log || configData.LogMain.Death.Put) Subscribe(nameof(OnEntityDeath));
if (configData.LogMain.Respawns.Log || configData.LogMain.Respawns.Put) Subscribe(nameof(OnPlayerRespawned));
if (configData.LogMain.Wound.Log || configData.LogMain.Wound.Put) Subscribe(nameof(OnPlayerWound));
if (configData.LogMain.Healing.Put || configData.LogMain.Healing.Log) {
Subscribe(nameof(OnHealingItemUse));
Subscribe(nameof(OnItemUse));
}
}
private void Init() {
Unsubscribe(nameof(OnHealingItemUse));
Unsubscribe(nameof(OnItemUse));
Unsubscribe(nameof(OnEntityTakeDamage));
Unsubscribe(nameof(OnEntityDeath));
Unsubscribe(nameof(OnPlayerRespawned));
Unsubscribe(nameof(OnPlayerWound));
}
#region Healing
private void OnHealingItemUse(MedicalTool item, BasePlayer target) {
if (item == null || target == null) return;
if (configData.LogMain.Healing.Log) Log(Lang("Log Player Healing1", target.displayName, target.userID, item.GetItem().info.displayName?.english, target.transform.position, target.health));
if (configData.LogMain.Healing.Put) Puts(Lang("Log Player Healing1", target.displayName, target.userID, item.GetItem().info.displayName?.english, target.transform.position, target.health));
}
private void OnItemUse(Item item, int amountToUse) {
if (item == null) return;
var player = item?.parent?.GetOwnerPlayer();
if (player == null) return;
if (item.info.shortname == "largemedkit") {
if (configData.LogMain.Healing.Log) Log(Lang("Log Player Healing1", player.displayName, player.userID, item.info.displayName?.english, $"{Lang("Log At")} {player.transform.position}", player.health));
if (configData.LogMain.Healing.Put) Puts(Lang("Log Player Healing1", player.displayName, player.userID, item.info.displayName?.english, $"{Lang("Log At")} {player.transform.position}", player.health));
}
}
#endregion Healing
#region Combat
private void OnEntityTakeDamage(BaseEntity entity, HitInfo info) {
if (entity == null || info == null) return;
if (info.InitiatorPlayer != null) {
if (info.InitiatorPlayer.userID.IsSteamId() && info.InitiatorPlayer != null) {
var dmg = Math.Round(info.damageTypes.Total(), 2).ToString();
// Round out Damage
if (entity is BasePlayer && entity.ToPlayer().UserIDString.IsSteamId() && !entity.IsNpc) {
var victim = entity as BasePlayer;
if (victim == null) return;
if (victim.lastDamage == DamageType.Bleeding) return;
// Don't track bleeding
if (victim == info.InitiatorPlayer) {
if (CheckDamageBL(victim)) return;
if (victim.lastDamage.ToString() == "Suicide" || info.damageTypes.Total() == 1000) return;
//Because Apparently Suicide doesnt always get caught
if (configData.HurtLog.PvP.Log && configData.LogMain.Damage.Log) Log(Lang("Log Player Hurt Himself1", CleanName(info.InitiatorPlayer), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? victim.lastDamage.ToString() ?? "Unknown"}' ", dmg, entity.transform.position));
if (configData.HurtLog.PvP.Put && configData.LogMain.Damage.Put) Puts(Lang("Log Player Hurt Himself1", CleanName(info.InitiatorPlayer), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? victim.lastDamage.ToString() ?? "Unknown"}' ", dmg, entity.transform.position));
if (configData.Debug) Log($"|SELF-HURT| Weapon: {info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? victim.lastDamage.ToString() ?? "Unknown"} | Weapon2: {info.WeaponPrefab} | Damage: {victim.lastDamage.ToString()} | Attacker: {info.InitiatorPlayer} | Victim: {victim}");
return;
}
var pvpmessage = Lang("Log Entity Attack1", CleanName(victim), CleanName(info.InitiatorPlayer), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? victim.lastDamage.ToString() ?? "Unknown"}' ", dmg, GetDistance(entity, info), entity.transform.position, info.InitiatorPlayer.transform.position, GetBodypartName(info));
if (configData.HurtLog.PvP.Log && configData.LogMain.Damage.Log) Log(pvpmessage);
if (configData.HurtLog.PvP.Put && configData.LogMain.Damage.Put) Puts(pvpmessage);
if (configData.Debug) Log($"|Player-Player| Damage: {victim.lastDamage.ToString() ?? "No Damage"} | Attacker: {info.InitiatorPlayer} | Victim: {victim} | Weapon: {info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.InitiatorPlayer.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? victim.lastDamage.ToString() ?? "Unknown"}");
return;
}
if (entity.IsNpc || (entity is BasePlayer && !entity.ToPlayer().UserIDString.IsSteamId())) //Some Plugins use Weird Classes that arent detected by IsNPC, I know IsSteamId is redundant but just covering basis
{
if (entity is BaseAnimalNPC) {
if (!configData.HurtLog.PvA.Put && !configData.HurtLog.PvA.Log) return;
var animalmessage = Lang("Log Entity Attack1", entity.ShortPrefabName + "[NPC]", CleanName(info.InitiatorPlayer), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? info.Initiator?.ShortPrefabName ?? info.damageTypes.GetMajorityDamageType().ToString() ?? "Unknown"}' ", dmg, GetDistance(entity, info), entity.transform.position, info.InitiatorPlayer.transform.position, "");
if (configData.HurtLog.PvA.Log && configData.LogMain.Damage.Log) Log(animalmessage);
if (configData.HurtLog.PvA.Put && configData.LogMain.Damage.Put) Puts(animalmessage);
if (configData.Debug) Log($"|PLAYER-ANIMAL| Weapon: {info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? info.Initiator?.ShortPrefabName} | Weapon2: {info.WeaponPrefab?.ToString() ?? "unable"} | Damage: {dmg} | Attacker: {info.InitiatorPlayer} {info.Initiator.transform.position} | Victim: {entity.ShortPrefabName ?? "No Victim"} {entity.transform.position} | Distance: {GetDistance(entity, info)}");
return;
}
var npc = entity as BasePlayer;
if (npc != null) {
if (!configData.HurtLog.PvN.Put && !configData.HurtLog.PvN.Log) return;
if (npc.lastDamage == DamageType.Bleeding) return;
// Don't track bleeding
var pvpmessage = Lang("Log Entity Attack1", npc.displayName + "[NPC]", CleanName(info.InitiatorPlayer), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? info.damageTypes.GetMajorityDamageType().ToString() ?? info.Initiator?.ShortPrefabName ?? "Unknown"}' ", dmg, GetDistance(entity, info), entity.transform.position, info.InitiatorPlayer.transform.position, GetBodypartName(info));
if (configData.HurtLog.PvN.Log && configData.LogMain.Damage.Log) Log(pvpmessage);
if (configData.HurtLog.PvN.Put && configData.LogMain.Damage.Put) Puts(pvpmessage);
if (configData.Debug) Log($"|PLAYER-NPC| Weapon: {info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? info.Initiator?.ShortPrefabName} | Weapon2: {info.WeaponPrefab?.ToString() ?? "unable"} | Damage: {dmg} | Attacker: {info.InitiatorPlayer} {info.Initiator.transform.position} | Victim: {entity.ShortPrefabName ?? "No Victim"} {entity.transform.position} | Distance: {GetDistance(entity, info)}");
return;
}
var npcp = entity as NPCPlayer;
if (npcp != null) {
if (!configData.HurtLog.PvN.Put && !configData.HurtLog.PvN.Log) return;
if (npcp.lastDamage == DamageType.Bleeding) return;
// Don't track bleeding
var pvpmessage = Lang("Log Entity Attack1", npcp.displayName + "[NPC]", CleanName(info.InitiatorPlayer), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? info.damageTypes.GetMajorityDamageType().ToString() ?? info.Initiator?.ShortPrefabName ?? "Unknown"}' ", dmg, GetDistance(entity, info), entity.transform.position, info.InitiatorPlayer.transform.position, GetBodypartName(info));
if (configData.HurtLog.PvN.Log && configData.LogMain.Damage.Log) Log(pvpmessage);
if (configData.HurtLog.PvN.Put && configData.LogMain.Damage.Put) Puts(pvpmessage);
if (configData.Debug) Log($"|PLAYER-NPC| Weapon: {info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? info.Initiator?.ShortPrefabName} | Weapon2: {info.WeaponPrefab?.ToString() ?? "unable"} | Damage: {dmg} | Attacker: {info.InitiatorPlayer} {info.Initiator.transform.position} | Victim: {entity.ShortPrefabName ?? "No Victim"} {entity.transform.position} | Distance: {GetDistance(entity, info)}");
return;
}
return;
}
}
}
var victimPlayer = entity as BasePlayer;
if (victimPlayer == null) return;
if (!victimPlayer.UserIDString.IsSteamId()) return;
if (CheckDamageBL(victimPlayer)) return;
if (victimPlayer.IsSleeping() && configData.LogMain.LogSleeping) return;
var dmgPlayer = Math.Round(info.damageTypes.Total(), 2).ToString();
if (info.Initiator is BaseAnimalNPC) {
var animalmessage = Lang("Log Entity Attack1", CleanName(victimPlayer), $"{info.Initiator?.ShortPrefabName ?? victimPlayer.lastAttacker?.ShortPrefabName ?? "Unknown"}[NPC]", "", dmgPlayer, GetDistance(victimPlayer, info), victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "", "");
if (configData.HurtLog.AvP.Log && configData.LogMain.Damage.Log) Log(animalmessage);
if (configData.HurtLog.AvP.Put && configData.LogMain.Damage.Put) Puts(animalmessage);
return;
}
if (info.Initiator is ScientistNPC || info.Initiator is Zombie || info.Initiator is ScarecrowNPC || info.Initiator is NPCPlayer) {
var scientistmessage = Lang("Log Entity Attack1", CleanName(victimPlayer), $"{info.InitiatorPlayer?.displayName ?? info.Initiator?.name ?? victimPlayer.lastAttacker?.name ?? victimPlayer.lastAttacker?.ShortPrefabName ?? "Unknown"}[NPC]", $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? info.WeaponPrefab?.ShortPrefabName ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? victimPlayer.lastDamage.ToString()}' ", dmgPlayer, GetDistance(victimPlayer, info), victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "", GetBodypartName(info));
if (configData.HurtLog.NvP.Log && configData.LogMain.Damage.Log) Log(scientistmessage);
if (configData.HurtLog.NvP.Put && configData.LogMain.Damage.Put) Puts(scientistmessage);
return;
}
if (info.Initiator is NPCAutoTurret) {
var npcturretmessage = Lang("Log Entity Attack1", CleanName(victimPlayer), "Outpost Sentry", "", dmgPlayer, info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "", GetBodypartName(info));
if (configData.HurtLog.EvP.Log && configData.LogMain.Damage.Log) Log(npcturretmessage);
if (configData.HurtLog.EvP.Put && configData.LogMain.Damage.Put) Puts(npcturretmessage);
return;
}
if (info.Initiator is AutoTurret) {
var Turret = info.Initiator as AutoTurret;
var turretMessage = Lang("Log Entity Attack1", CleanName(victimPlayer), "Auto Turret", $"{Lang("Log Weapon")} '{info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? Turret.AttachedWeapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.name}' ", dmgPlayer, info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "", GetBodypartName(info));
if (configData.HurtLog.EvP.Put && configData.LogMain.Damage.Put) Puts(turretMessage);
if (configData.HurtLog.EvP.Log && configData.LogMain.Damage.Log) Log(turretMessage);
return;
}
if (info.Initiator is BradleyAPC || info?.WeaponPrefab?.ShortPrefabName == "maincannonshell") {
var apcMessage = Lang("Log Entity Attack1", CleanName(victimPlayer), "Bradley APC", "", dmgPlayer, info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "", GetBodypartName(info));
if (configData.HurtLog.EvP.Put && configData.LogMain.Damage.Put) Puts(apcMessage);
if (configData.HurtLog.EvP.Log && configData.LogMain.Damage.Log) Log(apcMessage);
return;
}
if (info.Initiator is PatrolHelicopter || info?.WeaponPrefab?.ShortPrefabName == "rocket_heli") {
var heliMessage = Lang("Log Entity Attack1", CleanName(victimPlayer), "Patrol Helicopter", "", dmgPlayer, info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "", GetBodypartName(info));
if (configData.HurtLog.EvP.Put && configData.LogMain.Damage.Put) Puts(heliMessage);
if (configData.HurtLog.EvP.Log && configData.LogMain.Damage.Log) Log(heliMessage);
return;
}
if (info.Initiator is ModularCar) {
ModularCar vehicle = info.Initiator as ModularCar;
BasePlayer driver = vehicle.GetDriver();
if (driver != null) {
var carmessage = Lang("Log Entity Attack1", CleanName(victimPlayer), CleanName(driver), "Modular Car", dmgPlayer, "", victimPlayer.transform.position, driver.transform.position, GetBodypartName(info));
if (configData.HurtLog.PvP.Log && configData.LogMain.Damage.Log) Log(carmessage);
if (configData.HurtLog.PvP.Put && configData.LogMain.Damage.Put) Puts(carmessage);
return;
}
}
if (victimPlayer.lastAttacker != null) // For Somereason the above checks do not catch everything when the damage is less then 1.This will catch alot of it, but there still a very few that slip through
{
if (victimPlayer.lastAttacker is BaseAnimalNPC) {
var animalmessage = Lang("Log Entity Attack1", CleanName(victimPlayer), $"{victimPlayer.lastAttacker?.ShortPrefabName ?? victimPlayer.lastAttacker?.ShortPrefabName ?? "Unknown"}[NPC]", "", dmgPlayer, GetDistanceAttacker(victimPlayer, victimPlayer.lastAttacker), victimPlayer.transform.position, victimPlayer.lastAttacker.IsValid() ? victimPlayer.lastAttacker.transform.position.ToString() : "", "");
if (configData.HurtLog.AvP.Log && configData.LogMain.Damage.Log) Log(animalmessage);
if (configData.HurtLog.AvP.Put && configData.LogMain.Damage.Put) Puts(animalmessage);
return;
}
if (victimPlayer.lastAttacker is ScientistNPC || victimPlayer.lastAttacker is Zombie || victimPlayer.lastAttacker is ScarecrowNPC || victimPlayer.lastAttacker is NPCPlayer) {
var scientistmessage = Lang("Log Entity Attack1", CleanName(victimPlayer), $"{victimPlayer.lastAttacker.ToPlayer()?.displayName ?? victimPlayer.lastAttacker?.name ?? victimPlayer.lastAttacker?.name ?? victimPlayer.lastAttacker?.ShortPrefabName ?? "Unknown"}[NPC]", $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? info.WeaponPrefab?.ShortPrefabName ?? victimPlayer.lastAttacker.ToPlayer()?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? victimPlayer.lastDamage.ToString()}' ", dmgPlayer, GetDistanceAttacker(victimPlayer, victimPlayer.lastAttacker), victimPlayer.transform.position, victimPlayer.lastAttacker.IsValid() ? victimPlayer.lastAttacker.transform.position.ToString() : "", GetBodypartName(info));
if (configData.HurtLog.NvP.Log && configData.LogMain.Damage.Log) Log(scientistmessage);
if (configData.HurtLog.NvP.Put && configData.LogMain.Damage.Put) Puts(scientistmessage);
return;
}
if (victimPlayer.lastAttacker is NPCAutoTurret) {
var npcturretmessage = Lang("Log Entity Attack1", CleanName(victimPlayer), "Outpost Sentry", "", dmgPlayer, victimPlayer.lastAttacker.IsValid() ? GetDistanceAttacker(victimPlayer, victimPlayer.lastAttacker) : "", victimPlayer.transform.position, victimPlayer.lastAttacker.IsValid() ? victimPlayer.lastAttacker.transform.position.ToString() : "", GetBodypartName(info));
if (configData.HurtLog.EvP.Log && configData.LogMain.Damage.Log) Log(npcturretmessage);
if (configData.HurtLog.EvP.Put && configData.LogMain.Damage.Put) Puts(npcturretmessage);
return;
}
if (victimPlayer.lastAttacker is AutoTurret) {
var Turret = victimPlayer.lastAttacker as AutoTurret;
var turretMessage = Lang("Log Entity Attack1", CleanName(victimPlayer), "Auto Turret", $"{Lang("Log Weapon")} '{info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? Turret.AttachedWeapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.name}' ", dmgPlayer, victimPlayer.lastAttacker.IsValid() ? GetDistanceAttacker(victimPlayer, victimPlayer.lastAttacker) : "", victimPlayer.transform.position, victimPlayer.lastAttacker.IsValid() ? victimPlayer.lastAttacker.transform.position.ToString() : "", GetBodypartName(info));
if (configData.HurtLog.EvP.Put && configData.LogMain.Damage.Put) Puts(turretMessage);
if (configData.HurtLog.EvP.Log && configData.LogMain.Damage.Log) Log(turretMessage);
return;
}
if (victimPlayer.lastAttacker is BradleyAPC || victimPlayer.lastAttacker?.ShortPrefabName == "maincannonshell") {
var apcMessage = Lang("Log Entity Attack1", CleanName(victimPlayer), "Bradley APC", "", dmgPlayer, victimPlayer.lastAttacker.IsValid() ? GetDistanceAttacker(victimPlayer, victimPlayer.lastAttacker) : "", victimPlayer.transform.position, victimPlayer.lastAttacker.IsValid() ? victimPlayer.lastAttacker.transform.position.ToString() : "", GetBodypartName(info));
if (configData.HurtLog.EvP.Put && configData.LogMain.Damage.Put) Puts(apcMessage);
if (configData.HurtLog.EvP.Log && configData.LogMain.Damage.Log) Log(apcMessage);
return;
}
if (victimPlayer.lastAttacker is PatrolHelicopter || victimPlayer.lastAttacker?.ShortPrefabName == "rocket_heli") {
var heliMessage = Lang("Log Entity Attack1", CleanName(victimPlayer), "Patrol Helicopter", "", dmgPlayer, victimPlayer.lastAttacker.IsValid() ? GetDistanceAttacker(victimPlayer, victimPlayer.lastAttacker) : "", victimPlayer.transform.position, victimPlayer.lastAttacker.IsValid() ? victimPlayer.lastAttacker.transform.position.ToString() : "", GetBodypartName(info));
if (configData.HurtLog.EvP.Put && configData.LogMain.Damage.Put) Puts(heliMessage);
if (configData.HurtLog.EvP.Log && configData.LogMain.Damage.Log) Log(heliMessage);
return;
}
if (victimPlayer.lastAttacker is ModularCar) {
ModularCar vehicle = victimPlayer.lastAttacker as ModularCar;
BasePlayer driver = vehicle.GetDriver();
if (driver != null) {
var carmessage = Lang("Log Entity Attack1", CleanName(victimPlayer), CleanName(driver), "Modular Car", dmgPlayer, "", victimPlayer.transform.position, driver.transform.position, GetBodypartName(info));
if (configData.HurtLog.PvP.Log && configData.LogMain.Damage.Log) Log(carmessage);
if (configData.HurtLog.PvP.Put && configData.LogMain.Damage.Put) Puts(carmessage);
return;
}
}
}
if (victimPlayer.lastAttacker == null && info.Initiator == null) return;
string damage = info?.Initiator?.GetItem()?.info?.displayName?.english ?? info?.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? FireCheck(info) ?? info.Initiator?.ShortPrefabName ?? info?.WeaponPrefab?.ShortPrefabName ?? info?.InitiatorPlayer?.ToString() ?? victimPlayer.lastAttacker?.ShortPrefabName?.ToString() ?? info.Weapon?.GetParentEntity()?.ShortPrefabName ?? victimPlayer.lastAttacker?.ToString() ?? victimPlayer.lastDamage.ToString() ?? "Unknown";
var othermessage = Lang("Log Entity Attack1", CleanName(victimPlayer), info?.Initiator?.GetItem()?.info?.displayName?.english ?? info?.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? FireCheck(info) ?? info.Initiator?.ShortPrefabName ?? info?.WeaponPrefab?.ShortPrefabName ?? info?.InitiatorPlayer?.ToString() ?? victimPlayer.lastAttacker?.ShortPrefabName?.ToString() ?? info.Weapon?.GetParentEntity()?.ShortPrefabName ?? victimPlayer.lastAttacker?.ToString() ?? victimPlayer.lastDamage.ToString() ?? "Unknown", "", dmgPlayer, info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : victimPlayer.lastAttacker.IsValid() ? victimPlayer.lastAttacker.transform.position.ToString() : "", GetBodypartName(info));
if (damage == "Generic" || damage == "player") return;
// Catching Some random Damage that doest get caught above
if (configData.HurtLog.EvP.Log && configData.LogMain.Damage.Log) Log(othermessage);
if (configData.HurtLog.EvP.Put && configData.LogMain.Damage.Put) Puts(othermessage);
if (configData.Debug) Log($"|Other-Player| Damage: {victimPlayer.lastDamage.ToString() ?? "No Damage"} | Attacker: {info.Initiator?.ShortPrefabName} | Victim: {victimPlayer}");
}
private void OnEntityDeath(BaseCombatEntity entity, HitInfo info) {
if (entity == null || info == null) return;
if (info.InitiatorPlayer != null) {
if (info.InitiatorPlayer.userID.IsSteamId() && info.InitiatorPlayer != null) {
var dmg = Math.Round(info.damageTypes.Total(), 2).ToString();
if (entity is BasePlayer && entity.ToPlayer().UserIDString.IsSteamId() && !entity.IsNpc) {
var victim = entity as BasePlayer;
if (victim == null) return;
if (victim == info.InitiatorPlayer) {
if (configData.Debug) Log($"|SELF-Death| Weapon: {info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? victim.lastDamage.ToString() ?? "Unknown"} | Weapon2: {info.WeaponPrefab} | Damage: {victim.lastDamage.ToString()} | Attacker: {info.InitiatorPlayer} | Victim: {victim}");
if (configData.DeathLog.PvPD.Log && configData.LogMain.Death.Log) Log(Lang("Log Player Kill Himself1", CleanName(info.InitiatorPlayer), entity.lastDamage.ToString() == "Suicide" ? "" : $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? "Unknown"}' ", $"{(dmg == "1000" ? null : $" {
Lang("Log Damage")
}
{
dmg
}
{
Lang("Log Suicide")
}
")}", $"{Lang("Log At")} {victim.transform.position}"));
if (configData.DeathLog.PvPD.Put && configData.LogMain.Death.Put) Puts(Lang("Log Player Kill Himself1", CleanName(info.InitiatorPlayer), entity.lastDamage.ToString() == "Suicide" ? "" : $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? "Unknown"}' ", $"{(dmg == "1000" ? null : $" {
Lang("Log Damage")
}
{
dmg
}
{
Lang("Log Suicide")
}
")}", $"{Lang("Log At")} {victim.transform.position}"));
return;
}
var pvpmessage = Lang("Log Entity Death1", CleanName(victim), CleanName(info.InitiatorPlayer ?? victim.lastAttacker.ToPlayer()), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? victim.lastDamage.ToString() ?? "Unknown"}' ", GetDistance(entity, info), entity.transform.position, info.InitiatorPlayer.transform.position);
if (configData.DeathLog.PvPD.Log && configData.LogMain.Death.Log) Log(pvpmessage);
if (configData.DeathLog.PvPD.Put && configData.LogMain.Death.Put) Puts(pvpmessage);
if (configData.Debug) Log($"|Player-Player Death| Damage: {victim.lastDamage.ToString() ?? "No Damage"} | Attacker: {info.InitiatorPlayer} | Victim: {victim} | Weapon: {info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? victim.lastDamage.ToString() ?? "Unknown"}");
return;
}
if (entity.IsNpc || (entity is BasePlayer && !entity.ToPlayer().UserIDString.IsSteamId())) //Some Plugins use Weird Classes that arent detected by IsNPC, I know IsSteamId is redundant but just covering basis
{
if (entity is BaseAnimalNPC) {
if (!configData.DeathLog.PvAD.Put && !configData.DeathLog.PvAD.Log) return;
var animalmessage = Lang("Log Entity Death1", entity.ShortPrefabName + "[NPC]", CleanName(info.InitiatorPlayer ?? entity.lastAttacker.ToPlayer()), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.Initiator?.ShortPrefabName ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? info.damageTypes.GetMajorityDamageType().ToString() ?? "Unknown"}' ", GetDistance(entity, info), entity.transform.position, info.InitiatorPlayer.transform.position);
if (configData.DeathLog.PvAD.Log && configData.LogMain.Death.Log) Log(animalmessage);
if (configData.DeathLog.PvAD.Put && configData.LogMain.Death.Put) Puts(animalmessage);
return;
}
var npc = entity as BasePlayer;
if (npc != null) {
if (!configData.DeathLog.PvND.Put && !configData.DeathLog.PvND.Log) return;
var pvpmessage = Lang("Log Entity Death1", npc.displayName + "[NPC]", CleanName(info.InitiatorPlayer ?? entity.lastAttacker?.ToPlayer()), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.Initiator?.ShortPrefabName ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? info.damageTypes.GetMajorityDamageType().ToString() ?? "Unknown"}' ", GetDistance(entity, info), entity.transform.position, info.InitiatorPlayer.transform.position);
if (configData.DeathLog.PvND.Log && configData.LogMain.Death.Log) Log(pvpmessage);
if (configData.DeathLog.PvND.Put && configData.LogMain.Death.Put) Puts(pvpmessage);
if (configData.Debug) Log($"|PLAYER-NPC Death| Weapon: {info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? info.Initiator?.ShortPrefabName} | Weapon2: {info.WeaponPrefab?.ToString() ?? "unable"} | Damage: | Attacker: {info.InitiatorPlayer} {info.Initiator.transform.position} | Victim: {entity.ShortPrefabName ?? "No Victim"} {entity.transform.position} | Distance: {GetDistance(entity, info)}");
return;
}
var npcp = entity as NPCPlayer;
if (npcp != null) {
if (!configData.DeathLog.PvND.Put && !configData.DeathLog.PvND.Log) return;
var pvpmessage = Lang("Log Entity Death1", npcp.displayName + "[NPC]", CleanName(info.InitiatorPlayer ?? entity.lastAttacker?.ToPlayer()), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.Initiator?.ShortPrefabName ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? info.damageTypes.GetMajorityDamageType().ToString() ?? "Unknown"}' ", GetDistance(entity, info), entity.transform.position, info.InitiatorPlayer.transform.position);
if (configData.DeathLog.PvND.Log && configData.LogMain.Death.Log) Log(pvpmessage);
if (configData.DeathLog.PvND.Put && configData.LogMain.Death.Put) Puts(pvpmessage);
if (configData.Debug) Log($"|PLAYER-NPC Death| Weapon: {info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? info.Initiator?.ShortPrefabName} | Weapon2: {info.WeaponPrefab?.ToString() ?? "unable"} | Damage: | Attacker: {info.InitiatorPlayer} {info.Initiator.transform.position} | Victim: {entity.ShortPrefabName ?? "No Victim"} {entity.transform.position} | Distance: {GetDistance(entity, info)}");
return;
}
return;
}
}
}
var victimPlayer = entity as BasePlayer;
if (victimPlayer == null) return;
if (!victimPlayer.UserIDString.IsSteamId()) return;
if (info.Initiator is BaseAnimalNPC) {
var animalmessage = Lang("Log Entity Death1", CleanName(victimPlayer), $"{info.Initiator?.ShortPrefabName ?? victimPlayer.lastAttacker?.ShortPrefabName ?? "Unknown"}[NPC]", "", GetDistance(victimPlayer, info), victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "");
if (configData.DeathLog.AvPD.Log && configData.LogMain.Death.Log) Log(animalmessage);
if (configData.DeathLog.AvPD.Put && configData.LogMain.Death.Put) Puts(animalmessage);
return;
}
if (info.Initiator is ScientistNPC || info.Initiator is Zombie || info.Initiator is ScarecrowNPC || info.Initiator is NPCPlayer) {
var scientistmessage = Lang("Log Entity Death1", CleanName(victimPlayer), $"{info.InitiatorPlayer?.displayName ?? info.Initiator?.name ?? victimPlayer.lastAttacker?.name ?? victimPlayer.lastAttacker?.ShortPrefabName ?? "Unknown"}[NPC]", $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? victimPlayer.lastDamage.ToString()}' ", GetDistance(victimPlayer, info), victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "");
if (configData.DeathLog.NvPD.Log && configData.LogMain.Death.Log) Log(scientistmessage);
if (configData.DeathLog.NvPD.Put && configData.LogMain.Death.Put) Puts(scientistmessage);
return;
}
if (info.Initiator is NPCAutoTurret) {
var npcturretmessage = Lang("Log Entity Death1", CleanName(victimPlayer), "Outpost Sentry", "", info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "");
if (configData.DeathLog.EvPD.Log && configData.LogMain.Death.Log) Log(npcturretmessage);
if (configData.DeathLog.EvPD.Put && configData.LogMain.Death.Put) Puts(npcturretmessage);
return;
}
if (info.Initiator is AutoTurret) {
var turret = info.Initiator as AutoTurret;
var turretMessage = Lang("Log Entity Death1", CleanName(victimPlayer), "Auto Turret", $"{Lang("Log Weapon")} '{info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString()}' ", info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "");
if (configData.DeathLog.EvPD.Put && configData.LogMain.Death.Put) Puts(turretMessage);
if (configData.DeathLog.EvPD.Log && configData.LogMain.Death.Log) Log(turretMessage);
return;
}
if (info.Initiator is BradleyAPC || info?.WeaponPrefab?.ShortPrefabName == "maincannonshell") {
var apcMessage = Lang("Log Entity Death1", CleanName(victimPlayer), "Bradley APC", "", info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "");
if (configData.DeathLog.EvPD.Put && configData.LogMain.Death.Put) Puts(apcMessage);
if (configData.DeathLog.EvPD.Log && configData.LogMain.Death.Log) Log(apcMessage);
return;
}
if (info.Initiator is PatrolHelicopter || info?.WeaponPrefab?.ShortPrefabName == "rocket_heli") {
var heliMessage = Lang("Log Entity Death1", CleanName(victimPlayer), "Patrol Helicopter", "", info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "");
if (configData.DeathLog.EvPD.Put && configData.LogMain.Death.Put) Puts(heliMessage);
if (configData.DeathLog.EvPD.Log && configData.LogMain.Death.Log) Log(heliMessage);
return;
}
if (info.Initiator is ModularCar) {
ModularCar vehicle = info.Initiator as ModularCar;
BasePlayer driver = vehicle.GetDriver();
if (driver != null) {
var carmessage = Lang("Log Entity Death1", CleanName(victimPlayer), CleanName(driver), "Modular Car", "", victimPlayer.transform.position, driver.transform.position);
if (configData.DeathLog.PvPD.Log && configData.LogMain.Death.Log) Log(carmessage);
if (configData.DeathLog.PvPD.Put && configData.LogMain.Death.Put) Puts(carmessage);
return;
}
}
var othermessage = Lang("Log Entity Death1", CleanName(victimPlayer), info.Initiator?.ShortPrefabName ?? info?.WeaponPrefab?.ShortPrefabName ?? victimPlayer.lastAttacker?.ShortPrefabName?.ToString() ?? info.Weapon?.GetParentEntity()?.ShortPrefabName ?? victimPlayer.lastDamage.ToString() ?? "Unknown", "", info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : victimPlayer.lastAttacker.IsValid() ? victimPlayer.lastAttacker.transform.position.ToString() : "");
if (configData.DeathLog.EvPD.Log && configData.LogMain.Death.Log) Log(othermessage);
if (configData.DeathLog.EvPD.Put && configData.LogMain.Death.Put) Puts(othermessage);
if (configData.Debug) Log($"|Other-PlayerDeath| Damage: {victimPlayer.lastDamage.ToString() ?? "No Damage"} | Attacker: {info.Initiator?.ShortPrefabName} | Victim: {victimPlayer}");
}
private void OnPlayerWound(BasePlayer victimPlayer, HitInfo info) {
if (victimPlayer == null || info == null) return;
if (info.InitiatorPlayer != null) {
if (info.InitiatorPlayer.userID.IsSteamId() && info.InitiatorPlayer != null) {
var othermessage = Lang("Log Entity Wounded1", CleanName(victimPlayer), CleanName(info.InitiatorPlayer), $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? FireCheck(info) ?? info.Initiator?.ShortPrefabName ?? info.damageTypes?.GetMajorityDamageType().ToString() ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? "Unknown"}' ", GetDistance(victimPlayer, info), victimPlayer.transform.position, info.InitiatorPlayer.transform.position);
if (configData.LogMain.Wound.Log) Log(othermessage);
if (configData.LogMain.Wound.Put) Puts(othermessage);
if (configData.Debug) Log($"|Player-Player Wound| Damage: {victimPlayer.lastDamage.ToString() ?? "No Damage"} | Attacker: {info.InitiatorPlayer} | Victim: {victimPlayer}");
return;
}
}
if (CheckDamage(victimPlayer) != null && victimPlayer.UserIDString.IsSteamId()) {
if (configData.LogMain.Wound.Log) Log(Lang("Log Entity Wounded1", victimPlayer, CheckDamage(victimPlayer), "", "", victimPlayer.transform.position, ""));
if (configData.LogMain.Wound.Put) Puts(Lang("Log Entity Wounded1", victimPlayer, CheckDamage(victimPlayer), "", "", victimPlayer.transform.position, ""));
return;
}
if (info.Initiator is BaseAnimalNPC) {
var animalmessage = Lang("Log Entity Wounded1", CleanName(victimPlayer), $"{info.Initiator?.ShortPrefabName ?? victimPlayer.lastAttacker?.ShortPrefabName ?? "Unknown"}[NPC]", "", GetDistance(victimPlayer, info), victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "");
if (configData.HurtLog.AvP.Log && configData.LogMain.Damage.Log) Log(animalmessage);
if (configData.HurtLog.AvP.Put && configData.LogMain.Damage.Put) Puts(animalmessage);
return;
}
if (info.Initiator is ScientistNPC || info.Initiator is Zombie || info.Initiator is ScarecrowNPC || info.Initiator is NPCPlayer) {
var scientistmessage = Lang("Log Entity Wounded1", CleanName(victimPlayer), $"{info.InitiatorPlayer?.displayName ?? info.Initiator?.name ?? victimPlayer.lastAttacker?.name ?? victimPlayer.lastAttacker?.ShortPrefabName ?? "Unknown"}[NPC]", $"{Lang("Log Weapon")} '{info.Weapon?.GetItem()?.info.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.ToString() ?? info.WeaponPrefab?.ShortPrefabName ?? info.InitiatorPlayer?.GetHeldEntity()?.GetItem()?.info?.displayName?.english ?? victimPlayer.lastDamage.ToString()}' ", GetDistance(victimPlayer, info), victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "");
if (configData.HurtLog.NvP.Log && configData.LogMain.Damage.Log) Log(scientistmessage);
if (configData.HurtLog.NvP.Put && configData.LogMain.Damage.Put) Puts(scientistmessage);
return;
}
if (info.Initiator is AutoTurret) {
var Turret = info.Initiator as AutoTurret;
var turretMessage = Lang("Log Entity Wounded1", CleanName(victimPlayer), "Auto Turret", $"{Lang("Log Weapon")} '{info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? Turret.AttachedWeapon?.GetItem()?.info?.displayName?.english ?? info.WeaponPrefab?.name}' ", info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "");
if (configData.HurtLog.EvP.Put && configData.LogMain.Damage.Put) Puts(turretMessage);
if (configData.HurtLog.EvP.Log && configData.LogMain.Damage.Log) Log(turretMessage);
return;
}
var othermessageent = Lang("Log Entity Wounded1", CleanName(victimPlayer), info?.Initiator?.GetItem()?.info?.displayName?.english ?? info?.WeaponPrefab?.GetItem()?.info?.displayName?.english ?? info.Initiator?.ShortPrefabName ?? info?.WeaponPrefab?.ShortPrefabName ?? info?.InitiatorPlayer?.ToString() ?? victimPlayer.lastAttacker?.ShortPrefabName?.ToString() ?? info.Weapon?.GetParentEntity()?.ShortPrefabName ?? FireCheck(info) ?? victimPlayer.lastAttacker?.ToString() ?? victimPlayer.lastDamage.ToString() ?? "Unknown", "", info.Initiator.IsValid() ? GetDistance(victimPlayer, info) : "", victimPlayer.transform.position, info.Initiator.IsValid() ? info.Initiator.transform.position.ToString() : "");
if (configData.LogMain.Wound.Log) Log(othermessageent);
if (configData.LogMain.Wound.Put) Puts(othermessageent);
if (configData.Debug) Log($"|Other-Player Wound| Damage: {victimPlayer.lastDamage.ToString() ?? "No Damage"} | Attacker: {info.Initiator?.ShortPrefabName} | Victim: {victimPlayer}");
}
#endregion Combat
#region Respawn
private void OnPlayerRespawned(BasePlayer player) {
if (player == null) return;
if (configData.LogMain.Respawns.Log) Log(Lang("Log Player Respawning1", player.displayName ?? player.name, player.UserIDString, $"{Lang("Log At")} {player.transform?.position.ToString() ?? ""}"));
if (configData.LogMain.Respawns.Put) Puts(Lang("Log Player Respawning1", player.displayName ?? player.name, player.UserIDString, $"{Lang("Log At")} {player.transform?.position.ToString() ?? ""}"));
}
#endregion Respawn
#endregion Hooks
#region Helpers
private string CleanName(BasePlayer entity) => $"{entity.displayName}{CheckSleeping(entity)}({entity.UserIDString})";
private string CheckDamage(BasePlayer entity) {
var damage = entity.lastDamage.ToString();
if (damage == null) return null;
// ... [Code preview truncated due to length. Full source in attached file] ...