Esempio n. 1
0
        public void Run()
        {
#if DEBUG
            GunshotWound2.LastSystem = nameof(BaseDamageSystem <T>);
#endif

            for (int damageIndex = 0; damageIndex < HitComponents.EntitiesCount; damageIndex++)
            {
                var damage    = HitComponents.Components1[damageIndex];
                var pedEntity = damage.Entity;

                BodyPartWasHitEvent bodyHitComponent = null;
                for (int bodyIndex = 0; bodyIndex < BodyHitComponents.EntitiesCount; bodyIndex++)
                {
                    var bodyDamage = BodyHitComponents.Components1[bodyIndex];
                    if (bodyDamage.Entity != pedEntity)
                    {
                        continue;
                    }

                    bodyHitComponent = bodyDamage;
                    EcsWorld.RemoveEntity(BodyHitComponents.Entities[bodyIndex]);
                    break;
                }

                EcsWorld.RemoveEntity(HitComponents.Entities[damageIndex]);
                ProcessWound(bodyHitComponent, pedEntity);
            }
        }
Esempio n. 2
0
        private void ProcessWound(BodyPartWasHitEvent bodyHit, int pedEntity)
        {
            if (bodyHit == null || bodyHit.DamagedPart == BodyParts.NOTHING)
            {
                SendMessage("BodyHit is null " + (bodyHit == null), pedEntity, NotifyLevels.DEBUG);
                DefaultAction?.Invoke(pedEntity);
                return;
            }

            var woundedPed = EcsWorld.GetComponent <WoundedPedComponent>(pedEntity);

            if (woundedPed == null)
            {
                return;
            }

            switch (bodyHit.DamagedPart)
            {
            case BodyParts.HEAD:
                if (woundedPed.ThisPed.IsWearingHelmet && Random.IsTrueWithProbability(HelmetSafeChance))
                {
                    SendMessage(Locale.Data.HelmetSavedYourHead, pedEntity, NotifyLevels.WARNING);
                    return;
                }
                HeadActions?.NextWithReplacement()(pedEntity);
                break;

            case BodyParts.NECK:
                NeckActions?.NextWithReplacement()(pedEntity);
                break;

            case BodyParts.UPPER_BODY:
                if (!CheckArmorPenetration(woundedPed, pedEntity))
                {
                    SendMessage(Locale.Data.ArmorSavedYourChest, pedEntity, NotifyLevels.WARNING);
                    CreatePain(pedEntity, ArmorDamage / 5f);
                    return;
                }
                UpperBodyActions?.NextWithReplacement()(pedEntity);
                break;

            case BodyParts.LOWER_BODY:
                if (!CheckArmorPenetration(woundedPed, pedEntity))
                {
                    SendMessage(Locale.Data.ArmorSavedYourLowerBody, pedEntity, NotifyLevels.WARNING);
                    CreatePain(pedEntity, ArmorDamage / 5f);
                    return;
                }
                LowerBodyActions?.NextWithReplacement()(pedEntity);
                break;

            case BodyParts.ARM:
                ArmActions?.NextWithReplacement()(pedEntity);
                break;

            case BodyParts.LEG:
                LegActions?.NextWithReplacement()(pedEntity);
                break;

            case BodyParts.NOTHING:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }