Exemplo n.º 1
0
 /// <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);
                }
            }
        }