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); } }
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(); } }