/// <summary> /// Handle game event CEventNetworkEntityDamage, /// Useful for indicating entity damage/died/destroyed. /// </summary> /// <param name="victim">victim</param> /// <param name="attacker">attacker</param> /// <param name="arg2">Unknown</param> /// <param name="isDamageFatal">Is damage fatal to entity. or victim died/destroyed.</param> /// <param name="weaponInfoHash">Probably related to common.rpf/data/ai => Item type = "CWeaponInfo"</param> /// <param name="arg5">Unknown</param> /// <param name="arg6">Unknown</param> /// <param name="arg7">Unknown, might be int</param> /// <param name="arg8">Unknown, might be int</param> /// <param name="isMeleeDamage">Is melee damage</param> /// <param name="damageTypeFlag">0 for peds, 116 for the body of a vehicle, 93 for a tire, 120 for a side window, 121 for a rear window, 122 for a windscreen, etc</param> private void HandleCEventNetworkEntityDamaged( Entity victim, Entity attacker, int arg2, bool isDamageFatal, uint weaponInfoHash, int arg5, int arg6, object arg7, object arg8, bool isMeleeDamage, int damageTypeFlag) { if (isDamageFatal && victim is Ped p1 && attacker is Ped p2) { if (p2 == Game.PlayerPed) { OnPlayerKillPed?.Invoke(p1, isMeleeDamage, weaponInfoHash, damageTypeFlag); } } if (isDamageFatal && victim == Game.PlayerPed) { OnPlayerDead?.Invoke(); } }
/// <summary> /// Handle game event CEventNetworkEntityDamage, /// Useful for indicating entity damage/died/destroyed. /// </summary> /// <param name="victim">victim</param> /// <param name="attacker">attacker</param> /// <param name="arg2">Unknown</param> /// <param name="isDamageFatal">Is damage fatal to entity. or victim died/destroyed.</param> /// <param name="weaponInfoHash">Probably related to common.rpf/data/ai => Item type = "CWeaponInfo"</param> /// <param name="arg5">Unknown</param> /// <param name="arg6">Unknown</param> /// <param name="arg7">Unknown, might be int</param> /// <param name="arg8">Unknown, might be int</param> /// <param name="isMeleeDamage">Is melee damage</param> /// <param name="damageTypeFlag">0 for peds, 116 for the body of a vehicle, 93 for a tire, 120 for a side window, 121 for a rear window, 122 for a windscreen, etc</param> private void HandleCEventNetworkEntityDamaged( Entity victim, Entity attacker, int arg2, bool isDamageFatal, uint weaponInfoHash, int arg5, int arg6, object arg7, object arg8, bool isMeleeDamage, int damageTypeFlag) { // 致命伤 if (isDamageFatal) { bool isAttackerPed = false; bool isAttackerPlayer = false; Ped pedAttacker = null; Player playerAttacker = null; // 攻击者是Ped if (attacker is Ped) { pedAttacker = (Ped)attacker; isAttackerPed = true; // 攻击者是Player if (pedAttacker.IsPlayer) { playerAttacker = new Player(API.NetworkGetPlayerIndexFromPed(pedAttacker.Handle)); isAttackerPlayer = true; } } bool isVictimPed = false; bool isVictimPlayer = false; bool isVictimThisPlayer = false; Ped pedVictim = null; Player playerVictim = null; // 受害者是Ped if (victim is Ped) { pedVictim = (Ped)victim; isVictimPed = true; // 受害者是Player if (pedVictim.IsPlayer) { playerVictim = new Player(API.NetworkGetPlayerIndexFromPed(pedVictim.Handle)); isVictimPlayer = true; if (playerVictim == Game.Player) { isVictimThisPlayer = true; } } } if (isAttackerPlayer && isVictimPlayer) { OnPlayerKillPlayer?.Invoke(playerAttacker, playerVictim, isMeleeDamage, weaponInfoHash, damageTypeFlag); } else if (isAttackerPlayer && isVictimPed) { OnPlayerKillPed?.Invoke(playerAttacker, pedVictim, isMeleeDamage, weaponInfoHash, damageTypeFlag); } else if (isAttackerPed && isVictimPlayer) { OnPedKillPlayer?.Invoke(pedAttacker, playerVictim, isMeleeDamage, weaponInfoHash, damageTypeFlag); } else if (isVictimPed && isAttackerPed) { OnPedKillPed?.Invoke(pedAttacker, pedVictim, isMeleeDamage, weaponInfoHash, damageTypeFlag); } else { OnEntityKillEntity?.Invoke(attacker, victim, isMeleeDamage, weaponInfoHash, damageTypeFlag); } if (isVictimThisPlayer) { OnDeath?.Invoke(attacker, isMeleeDamage, weaponInfoHash, damageTypeFlag); } } }