Exemple #1
0
        public void Run()
        {
            foreach (int i in _damagedPeds)
            {
                Ped ped = _damagedPeds.Components1[i].ThisPed;
                if (!ped.Exists())
                {
                    continue;
                }

                EcsEntity pedEntity = _damagedPeds.Entities[i];
                if (!ped.IsWearingHelmet)
                {
#if DEBUG
                    _logger.MakeLog($"{pedEntity.GetEntityName()} doesn't have helmet");
#endif
                    continue;
                }

                EcsEntity bodyPartEntity = _damagedPeds.Components2[i].DamagedBodyPartEntity;
                var       bodyArmor      = _ecsWorld.GetComponent <BodyPartArmorComponent>(bodyPartEntity);
                if (bodyArmor == null || !bodyArmor.ProtectedByHelmet)
                {
#if DEBUG
                    string partName = bodyPartEntity.GetEntityName();
                    _logger.MakeLog($"Helmet of {pedEntity.GetEntityName()} doesn't protect {partName}");
#endif
                    continue;
                }

                EcsEntity weaponEntity = _damagedPeds.Components3[i].WeaponEntity;
                var       weaponStats  = _ecsWorld.GetComponent <ArmorWeaponStatsComponent>(weaponEntity);
                if (weaponStats == null)
                {
#if DEBUG
                    _logger.MakeLog($"Weapon {weaponEntity.GetEntityName()} doesn't have {nameof(ArmorWeaponStatsComponent)}");
#endif
                    continue;
                }

                float chance           = weaponStats.ChanceToPenetrateHelmet;
                bool  helmetPenetrated = _random.IsTrueWithProbability(chance);
                if (!helmetPenetrated)
                {
#if DEBUG
                    _logger.MakeLog($"Helmet of {pedEntity.GetEntityName()} was not penetrated, " +
                                    $"when chance was {chance:0.00}");
#endif
                    _ecsWorld.RemoveComponent <DamagedByWeaponComponent>(pedEntity);
                    _ecsWorld.RemoveComponent <DamagedBodyPartComponent>(pedEntity);
                    continue;
                }

#if DEBUG
                _logger.MakeLog($"Helmet of {pedEntity.GetEntityName()} was penetrated, when chance was {chance:0.00}");
#endif
            }
        }
Exemple #2
0
        public void Run()
        {
            if (_playerConfig.EntitiesCount <= 0)
            {
                throw new Exception("Player system was not init!");
            }

            var config = _playerConfig.Components1[0];

            foreach (int i in _playerPeds)
            {
                Ped ped    = _playerPeds.Components1[i].ThisPed;
                int entity = _playerPeds.Entities[i];
                if (Game.LocalPlayer.Character.Equals(ped))
                {
                    continue;
                }

                _ecsWorld.RemoveComponent <PlayerMarkComponent>(entity);
#if DEBUG
                _logger.MakeLog($"PlayerMark removed from ped {ped.Name(entity)}, 'cause different characters");
#endif
            }

            foreach (int i in _newPeds)
            {
                Ped ped    = _newPeds.Components1[i].ThisPed;
                int entity = _newPeds.Entities[i];
                if (!ped.IsLocalPlayer)
                {
                    continue;
                }

                if (config.PlayerEnabled)
                {
                    _ecsWorld.AddComponent <PlayerMarkComponent>(entity);
                    NativeFunction.Natives.SET_PLAYER_HEALTH_RECHARGE_MULTIPLIER(Game.LocalPlayer, 0f);
#if DEBUG
                    _logger.MakeLog($"Ped {ped.Name(entity)} was marked as player");
#endif
                }
                else
                {
                    _ecsWorld.RemoveComponent <NewPedMarkComponent>(entity);
#if DEBUG
                    _logger.MakeLog($"NewPedMark removed from ped {ped.Name(entity)}, 'cause player is disabled");
#endif
                }
            }

            _ecsWorld.ProcessDelayedUpdates();
            if (config.PlayerEnabled && _playerPeds.EntitiesCount <= 0)
            {
                _ecsWorld.CreateEntityWith <ForceCreateGswPedEvent>().TargetPed = Game.LocalPlayer.Character;
            }
        }
Exemple #3
0
        public void Run()
        {
#if DEBUG
            GunshotWound2.LastSystem = nameof(HitCleanSystem);
#endif

            for (int i = 0; i < _requestsToClean.EntitiesCount; i++)
            {
                int pedEntity = _requestsToClean.Components1[i].Entity;
                var ped       = _ecsWorld.GetComponent <WoundedPedComponent>(pedEntity).ThisPed;

                if (ped != null)
                {
                    Function.Call(Hash.CLEAR_PED_LAST_WEAPON_DAMAGE, ped);
                    Function.Call(Hash.CLEAR_PED_LAST_DAMAGE_BONE, ped);
                }

                _ecsWorld.RemoveEntity(_requestsToClean.Entities[i]);
            }

            for (int i = 0; i < _peds.EntitiesCount; i++)
            {
                _ecsWorld.RemoveComponent <HaveDamageMarkComponent>(_peds.Entities[i]);
            }
        }
        public void Run()
        {
            foreach (int i in _pedsToRemove)
            {
                PedBleedingInfoComponent info = _pedsToRemove.Components1[i];
                EcsEntity pedEntity           = _pedsToRemove.Entities[i];
                foreach (EcsEntity entity in info.BleedingEntities)
                {
                    _ecsWorld.RemoveEntity(entity);
                }

                _ecsWorld.RemoveComponent <PedBleedingInfoComponent>(pedEntity);
            }

            _ecsWorld.ProcessDelayedUpdates();

            foreach (int i in _healedEntities)
            {
                PedBleedingInfoComponent info = _healedEntities.Components1[i];
                foreach (EcsEntity bleedingEntity in info.BleedingEntities)
                {
                    if (!_ecsWorld.IsEntityExists(bleedingEntity))
                    {
                        continue;
                    }

                    _ecsWorld.RemoveEntity(bleedingEntity);
                }
            }
        }
Exemple #5
0
        private void RemovePeds()
        {
            for (var pedIndex = 0; pedIndex < _npcs.EntitiesCount; pedIndex++)
            {
                var woundedPed = _npcs.Components1[pedIndex];
                if (woundedPed.IsPlayer)
                {
                    return;
                }

                var ped = woundedPed.ThisPed;
                if (ped.IsAlive && !OutRemoveRange(ped))
                {
                    continue;
                }

                _world.Data.GswPeds.Remove(ped);
                woundedPed.ThisPed = null;
                _ecsWorld.RemoveComponent <PainComponent>(_npcs.Entities[pedIndex], true);
                _ecsWorld.RemoveEntity(_npcs.Entities[pedIndex]);

#if DEBUG
                ped.AttachedBlip.Delete();
#endif
            }
        }
        protected override void ProcessWound(Ped ped, EcsEntity pedEntity, EcsEntity woundEntity)
        {
            var permanent = EcsWorld.GetComponent <PermanentRagdollComponent>(pedEntity);
            var enable    = EcsWorld.GetComponent <EnableRagdollComponent>(woundEntity);

            if (permanent == null && enable != null)
            {
                if (enable.Permanent)
                {
                    var create = EcsWorld.EnsureComponent <CreatePermanentRagdollComponent>(pedEntity, out _);
                    create.DisableOnlyOnHeal = enable.DisableOnlyOnHeal;
                    create.Type = enable.Type;
                }
                else
                {
                    int length = enable.LengthInMs;
                    NativeFunction
                    .Natives
                    .SET_PED_TO_RAGDOLL(ped, length, length, enable.Type, 0, 0, 0);
#if DEBUG
                    Logger.MakeLog($"{pedEntity.GetEntityName()} got ragdoll for {length} ms");
#endif
                }
            }

            var disable = EcsWorld.GetComponent <DisablePermanentRagdollComponent>(woundEntity);
            if (permanent != null && !permanent.DisableOnlyOnHeal && disable != null)
            {
                NativeFunction.Natives.SET_PED_TO_RAGDOLL(ped, 1, 1, 1, 0, 0, 0);
                EcsWorld.RemoveComponent <PermanentRagdollComponent>(pedEntity);
#if DEBUG
                Logger.MakeLog($"{pedEntity.GetEntityName()} was restored from permanent ragdoll");
#endif
            }
        }
Exemple #7
0
    public void OnPointerUp(PointerEventData eventData)
    {
        captured = false;
        ToggleCapture(captured);
        DuplicatePlayer();

        for (int i = 0; i < frameSelectionFilter.EntitiesCount; i++)
        {
            var entity = frameSelectionFilter.Entities[i];
            world.RemoveComponent <FrameSelection>(entity);
            var replay = world.AddComponent <Replay>(entity);
            replay.startFrame   = frameSelectionFilter.Components1[i].frame;
            releasedFrame       = Time.frameCount - replay.startFrame;
            replay.currentFrame = releasedFrame;
        }
    }
Exemple #8
0
        public void Run()
        {
            foreach (int i in _damagedPeds)
            {
                DamagedByWeaponComponent damagedComponent = _damagedPeds.Components1[i];
                EcsEntity weaponEntity = damagedComponent.WeaponEntity;
                EcsEntity pedEntity    = _damagedPeds.Entities[i];

                var woundRandomizer = _ecsWorld.GetComponent <WoundRandomizerComponent>(weaponEntity);
                if (woundRandomizer == null || woundRandomizer.WoundRandomizer.Count <= 0)
                {
                    _logger.MakeLog($"!!!WARNING!!! Weapon {weaponEntity.GetEntityName()} " +
                                    $"doesn't have {nameof(WoundRandomizerComponent)}");
                    _ecsWorld.RemoveComponent <DamagedByWeaponComponent>(pedEntity);
                    continue;
                }

                EcsEntity woundEntity = woundRandomizer.WoundRandomizer.NextWithReplacement();
                damagedComponent.MainWoundEntity = woundEntity;

                var wounded = _ecsWorld.EnsureComponent <WoundedComponent>(pedEntity, out _);
                wounded.WoundEntities.Add(woundEntity);

#if DEBUG
                _logger.MakeLog($"{pedEntity.GetEntityName()} have got wound {woundEntity.GetEntityName()}");
#endif
            }
        }
Exemple #9
0
        public void Run()
        {
            if (_notifications.IsEmpty() || _gameService.GameIsPaused)
            {
                return;
            }

            float delta = GswExtensions.GetDeltaTime();
            NotificationSettingsComponent settings = _settings.Components1[0];

            if (settings.CombineToOne)
            {
                string finalMessage = "";
                foreach (int i in _notifications)
                {
                    NotificationComponent notification = _notifications.Components1[i];
                    notification.Delay -= delta;
                    if (notification.Delay <= 0)
                    {
                        finalMessage += notification.Message + "~n~";
                        _ecsWorld.RemoveComponent <NotificationComponent>(_notifications.Entities[i]);
                    }
                }

                if (!string.IsNullOrEmpty(finalMessage))
                {
                    Game.DisplayNotification(finalMessage);
                }
            }
            else
            {
                foreach (int i in _notifications)
                {
                    NotificationComponent notification = _notifications.Components1[i];
                    notification.Delay -= delta;
                    if (notification.Delay <= 0)
                    {
                        if (!string.IsNullOrEmpty(notification.Message))
                        {
                            Game.DisplayNotification(notification.Message);
                        }
                        _ecsWorld.RemoveComponent <NotificationComponent>(_notifications.Entities[i]);
                    }
                }
            }
        }
 sealed protected override void RunReactive()
 {
     foreach (var i in _reactiveFilter)
     {
         _world.RemoveComponent <EcsUpdateReactiveFlag <Inc1> > (_reactiveFilter.Entities[i]);
     }
     RunUpdateReactive();
 }
Exemple #11
0
        public void Run()
        {
#if DEBUG
            GunshotWound2.LastSystem = nameof(PlayerSystem);
#endif
            if (!_config.Data.PlayerConfig.WoundedPlayerEnabled)
            {
                return;
            }

            for (var i = 0; i < _players.EntitiesCount; i++)
            {
                var woundedPed   = _players.Components1[i];
                var playerEntity = _players.Entities[i];

                if (!woundedPed.ThisPed.Position.Equals(Game.Player.Character.Position))
                {
                    SwitchGswPed(Game.Player.Character, woundedPed, playerEntity);
                }

                var pedHealth = woundedPed.PedHealth;
                if (pedHealth > _config.Data.PlayerConfig.MaximalHealth)
                {
                    _ecsWorld.CreateEntityWith <InstantHealEvent>().Entity = playerEntity;
                }
                else if (pedHealth < _config.Data.PlayerConfig.MinimalHealth && !woundedPed.IsDead)
                {
                    woundedPed.Health             = pedHealth;
                    woundedPed.IsDead             = true;
                    Game.Player.WantedLevel       = 0;
                    Game.Player.IgnoredByEveryone = false;
                    Function.Call(Hash.ANIMPOSTFX_STOP_ALL);

                    var ragdollEvent = _ecsWorld.CreateEntityWith <SetPedToRagdollEvent>();
                    ragdollEvent.RagdollState = RagdollStates.PERMANENT;
                    ragdollEvent.Entity       = playerEntity;

                    _ecsWorld.RemoveComponent <PainComponent>(_players.Entities[i], true);
                    _ecsWorld.CreateEntityWith <ShowHealthStateEvent>().Entity = playerEntity;
                }
            }
        }
        protected override void ResetEffect(Ped ped, EcsEntity pedEntity)
        {
            var permanent = EcsWorld.GetComponent <PermanentFacialAnimationComponent>(pedEntity);

            if (permanent == null)
            {
                return;
            }

            EcsWorld.RemoveComponent <PermanentFacialAnimationComponent>(pedEntity);
        }
Exemple #13
0
        protected override void ResetEffect(Ped ped, EcsEntity pedEntity)
        {
            bool isPlayer = EcsWorld.GetComponent <PlayerMarkComponent>(pedEntity) != null;

            if (!isPlayer)
            {
                return;
            }

            NativeFunction.Natives.xB4EDDC19532BFB85();
            EcsWorld.RemoveComponent <MainScreenEffectComponent>(pedEntity, true);
        }
Exemple #14
0
        protected override void ResetEffect(Ped ped, EcsEntity pedEntity)
        {
            bool isPlayer = EcsWorld.GetComponent <PlayerMarkComponent>(pedEntity) != null;

            if (!isPlayer)
            {
                return;
            }

            NativeFunction.Natives.STOP_GAMEPLAY_CAM_SHAKING(true);
            EcsWorld.RemoveComponent <PermanentCameraShakeComponent>(pedEntity, true);
        }
Exemple #15
0
    void IEcsRunSystem.Run()
    {
        foreach (var resEntity in _resFilter.Entities)
        {
            var res = _world.GetComponent <ResComponent>(resEntity, _resId);
            if (res.type == ResType.none)
            {
                _world.RemoveComponent <ResViewComponent>(resEntity, _viewId);
                _world.RemoveComponent <ResMoveComponent>(resEntity, _moveId);
            }
        }

        foreach (var moveEntity in _moveFilter.Entities)
        {
            var move = _world.GetComponent <ResMoveComponent>(moveEntity, _moveId);
            if (move.curcycle > move.cyclemove)
            {
                _world.RemoveComponent <ResMoveComponent>(moveEntity, _moveId);
            }
        }
    }
        public void Run()
        {
            foreach (int i in _pedsToRemove)
            {
                BleedingInfoComponent info = _pedsToRemove.Components1[i];
                int pedEntity = _pedsToRemove.Entities[i];

                foreach (int entity in info.BleedingEntities)
                {
                    _ecsWorld.RemoveEntity(entity);
                }

                _ecsWorld.RemoveComponent <BleedingInfoComponent>(pedEntity);
            }
        }
Exemple #17
0
        protected override void ProcessReceivedComponent(ReceivedNetworkComponentEvent received)
        {
            TComponent oldComponent;
            long       networkEntity    = received.NetworkEntityUid;
            bool       localEntityExist = NetworkConfig.Data.NetworkEntitiesToLocal.ContainsKey(networkEntity);
            int        localEntity;
            bool       componentWasRemoved = received.ComponentFlags.HasFlag(EcsNetComponentFlags.WAS_REMOVED);

            if (componentWasRemoved && !localEntityExist)
            {
#if DEBUG
                throw new Exception(string.Format("Attempt to remove {0} for non exist local entity", typeof(TComponent).Name));
#endif
                return;
            }

            if (localEntityExist)
            {
                localEntity = NetworkConfig.Data.NetworkEntitiesToLocal[received.NetworkEntityUid];
                bool isNew;
                oldComponent = EcsWorld.EnsureComponent <TComponent>(localEntity, out isNew);
            }
            else
            {
                localEntity = EcsWorld.CreateEntityWith(out oldComponent);
                EcsWorld.CreateEntityWith <NewEntityReceivedEvent>().LocalEntity = localEntity;
                AddNetworkToLocalEntity(received.NetworkEntityUid, localEntity);
            }

            if (componentWasRemoved)
            {
                EcsWorld.RemoveComponent <TComponent>(localEntity);
                if (EcsWorld.IsEntityExists(localEntity))
                {
                    return;
                }

                RemoveNetworkToLocalEntity(networkEntity, localEntity);
            }
            else
            {
                var newComponent =
                    NetworkConfig.Data.Serializator.GetComponentFromBytes <TComponent>(received.ComponentBytes);
                NewToOldConverter(newComponent, oldComponent);
            }
        }
Exemple #18
0
        protected override void ResetEffect(Ped ped, EcsEntity pedEntity)
        {
            var disabled = EcsWorld.GetComponent <DisabledVehicleControlComponent>(pedEntity);

            if (disabled == null)
            {
                return;
            }

            EcsWorld.RemoveComponent <DisabledVehicleControlComponent>(pedEntity);
            bool isPlayer = EcsWorld.GetComponent <PlayerMarkComponent>(pedEntity) != null;

            if (!isPlayer)
            {
                ped.BlockPermanentEvents = false;
            }
        }
        protected override void PreExecuteActions()
        {
            foreach (int i in _needRagdollPeds)
            {
                Ped       ped       = _needRagdollPeds.Components1[i].ThisPed;
                EcsEntity pedEntity = _needRagdollPeds.Entities[i];
                if (!ped.Exists() || EcsWorld.GetComponent <PermanentRagdollComponent>(pedEntity) != null)
                {
                    EcsWorld.RemoveComponent <CreatePermanentRagdollComponent>(pedEntity);
                    continue;
                }

                if (ped.IsRagdoll)
                {
                    continue;
                }

                CreatePermanentRagdollComponent createRagdoll = _needRagdollPeds.Components2[i];
                NativeFunction.Natives.SET_PED_TO_RAGDOLL(ped, -1, -1, createRagdoll.Type, 0, 0, 0);

                var permanentRagdoll = EcsWorld.EnsureComponent <PermanentRagdollComponent>(pedEntity, out _);
                permanentRagdoll.DisableOnlyOnHeal = createRagdoll.DisableOnlyOnHeal;
                permanentRagdoll.Type = createRagdoll.Type;

                EcsWorld.RemoveComponent <CreatePermanentRagdollComponent>(pedEntity);
#if DEBUG
                Logger.MakeLog($"{pedEntity.GetEntityName()} have got permanent ragdoll");
#endif
            }

            foreach (int i in _permanentRagdollPeds)
            {
                Ped ped = _permanentRagdollPeds.Components1[i].ThisPed;
                if (!ped.Exists() || ped.IsRagdoll)
                {
                    continue;
                }

                PermanentRagdollComponent ragdoll = _permanentRagdollPeds.Components2[i];
                NativeFunction.Natives.SET_PED_TO_RAGDOLL(ped, -1, -1, ragdoll.Type, 0, 0, 0);
            }
        }
Exemple #20
0
        protected override void ProcessWound(Ped ped, EcsEntity pedEntity, EcsEntity woundEntity)
        {
            bool isPlayer = EcsWorld.GetComponent <PlayerMarkComponent>(pedEntity) != null;
            var  disabled = EcsWorld.GetComponent <DisabledVehicleControlComponent>(pedEntity);

            var disable = EcsWorld.GetComponent <DisableVehicleControlComponent>(woundEntity);

            if (disable != null && ped.CurrentVehicle.Exists())
            {
                if (disabled == null)
                {
                    EcsWorld
                    .AddComponent <DisabledVehicleControlComponent>(pedEntity)
                    .EnableOnlyOnHeal = disable.EnableOnlyOnHeal;

                    if (!isPlayer)
                    {
                        ped.Tasks.Clear();
                        ped.BlockPermanentEvents = true;
                        ped.Tasks.PerformDrivingManeuver(VehicleManeuver.Wait);
                    }
                }
                else
                {
                    disabled.EnableOnlyOnHeal |= disable.EnableOnlyOnHeal;
                }
            }

            var enable = EcsWorld.GetComponent <EnableVehicleControlComponent>(woundEntity);

            if (disabled == null || disabled.EnableOnlyOnHeal || enable == null)
            {
                return;
            }

            EcsWorld.RemoveComponent <DisabledVehicleControlComponent>(pedEntity);
            if (!isPlayer)
            {
                ped.BlockPermanentEvents = false;
            }
        }
Exemple #21
0
        protected override void ProcessWound(Ped ped, EcsEntity pedEntity, EcsEntity woundEntity)
        {
            bool isPlayer = EcsWorld.GetComponent <PlayerMarkComponent>(pedEntity) != null;

            if (!isPlayer)
            {
                return;
            }

            var mainEffect = EcsWorld.GetComponent <MainScreenEffectComponent>(pedEntity);
            var start      = EcsWorld.GetComponent <StartScreenEffectComponent>(woundEntity);

            if (start != null)
            {
                if (mainEffect != null && (!start.Main || mainEffect.Name.Equals(start.Name)))
                {
                    return;
                }

                NativeFunction.Natives.x2206BF9A37B7F724(start.Name, start.Duration, start.Loop);
                EcsWorld.EnsureComponent <MainScreenEffectComponent>(pedEntity, out _).Name = start.Name;
#if DEBUG
                Logger.MakeLog($"Start Effect {start.Name}, duration {start.Duration}, loop {start.Loop}");
#endif
            }

            var stop = EcsWorld.GetComponent <StopScreenEffectComponent>(woundEntity);
            if (stop != null)
            {
                NativeFunction.Natives.x068E835A1D0DC0E3(stop.Name);
                if (mainEffect != null && mainEffect.Name.Equals(stop.Name))
                {
                    EcsWorld.RemoveComponent <MainScreenEffectComponent>(pedEntity);
                }

#if DEBUG
                Logger.MakeLog($"Stop Effect {stop.Name}");
#endif
            }
        }
Exemple #22
0
        protected override void ResetEffect(Ped ped, EcsEntity pedEntity)
        {
            var permanentRate = EcsWorld.GetComponent <PermanentMovementRateComponent>(pedEntity);

            if (permanentRate != null)
            {
                NativeFunction.Natives.SET_PED_MOVE_RATE_OVERRIDE(ped, 1.0f);
                EcsWorld.RemoveComponent <PermanentMovementRateComponent>(pedEntity);
#if DEBUG
                Logger.MakeLog($"Permanent move rate for {pedEntity.GetEntityName()} was reset");
#endif
            }

            var player = EcsWorld.GetComponent <PlayerMarkComponent>(pedEntity);
            if (player == null)
            {
                return;
            }

            NativeFunction.Natives.SET_PLAYER_SPRINT(Game.LocalPlayer, true);
            EcsWorld.RemoveComponent <PermanentDisabledSprintComponent>(pedEntity, true);
        }
        protected override void ProcessWound(Ped ped, EcsEntity pedEntity, EcsEntity woundEntity)
        {
            var enable = EcsWorld.GetComponent <EnableFacialAnimationComponent>(woundEntity);

            if (enable != null)
            {
                string animationName = _random.NextFromList(enable.Animations);
                string dict          = ped.IsMale
                    ? enable.MaleDict
                    : enable.FemaleDict;

                if (enable.Permanent)
                {
                    var permanent = EcsWorld.EnsureComponent <PermanentFacialAnimationComponent>(pedEntity, out _);
                    permanent.Name = animationName;
                    permanent.Dict = dict;
#if DEBUG
                    Logger.MakeLog($"{pedEntity.GetEntityName()} got permanent facial animation {animationName}");
#endif
                }
                else
                {
                    NativeFunction.Natives.PLAY_FACIAL_ANIM(ped, animationName, dict);
#if DEBUG
                    Logger.MakeLog($"{pedEntity.GetEntityName()} got short facial animation {animationName}");
#endif
                }
            }

            var disable = EcsWorld.GetComponent <DisableFacialAnimationComponent>(woundEntity);
            if (disable != null)
            {
                EcsWorld.RemoveComponent <PermanentFacialAnimationComponent>(pedEntity, true);
#if DEBUG
                Logger.MakeLog($"{pedEntity.GetEntityName()} clean facial animation");
#endif
            }
        }
        protected override void ResetEffect(Ped ped, EcsEntity pedEntity)
        {
            if (!ped.IsRagdoll)
            {
                return;
            }

            NativeFunction.Natives.SET_PED_TO_RAGDOLL(ped, 1, 1, 1, 0, 0, 0);
#if DEBUG
            Logger.MakeLog($"{pedEntity.GetEntityName()} was restored from ragdoll");
#endif

            var permanent = EcsWorld.GetComponent <PermanentRagdollComponent>(pedEntity);
            if (permanent == null)
            {
                return;
            }

            EcsWorld.RemoveComponent <PermanentRagdollComponent>(pedEntity);
#if DEBUG
            Logger.MakeLog($"{pedEntity.GetEntityName()} was restored from permanent ragdoll");
#endif
        }
Exemple #25
0
        public void Run()
        {
            for (var i = 0; i < _requestEvents.EntitiesCount; i++)
            {
                var pedEntity = _requestEvents.Components1[i].Entity;
                if (!_ecsWorld.IsEntityExists(pedEntity))
                {
                    continue;
                }

                var woundedPed = _ecsWorld.GetComponent <WoundedPedComponent>(pedEntity);
                if (woundedPed?.MostDangerBleedingEntity == null)
                {
                    continue;
                }
                if (woundedPed.InPermanentRagdoll)
                {
                    continue;
                }

                var progress = _ecsWorld.EnsureComponent <BandageInProgressComponent>(pedEntity, out var isNew);
                if (!isNew)
                {
                    SendMessage(_localeConfig.Data.AlreadyBandaging, pedEntity);
                    continue;
                }

                if (woundedPed.IsPlayer)
                {
                    if (Game.Player.Money < _config.Data.WoundConfig.BandageCost)
                    {
                        SendMessage(_localeConfig.Data.DontHaveMoneyForBandage, pedEntity);
                        continue;
                    }

                    Game.Player.Money -= _config.Data.WoundConfig.BandageCost;
                }

                var timeToBandage = _config.Data.WoundConfig.ApplyBandageTime;
                progress.EstimateTime = timeToBandage;
                SendMessage(string.Format(_localeConfig.Data.YouTryToBandage, timeToBandage.ToString("F1")), pedEntity);
            }

            _requestEvents.CleanFilter();

            var frameTimeInSec = Game.LastFrameTime;

            for (var i = 0; i < _pedsWithBandageInProgress.EntitiesCount; i++)
            {
                var woundedPed = _pedsWithBandageInProgress.Components1[i];
                var thisPed    = woundedPed.ThisPed;
                var progress   = _pedsWithBandageInProgress.Components2[i];
                var pedEntity  = _pedsWithBandageInProgress.Entities[i];

                if (woundedPed.InPermanentRagdoll || thisPed.IsWalking || thisPed.IsRunning ||
                    thisPed.IsSprinting || thisPed.IsShooting || thisPed.IsRagdoll ||
                    thisPed.IsJumping || thisPed.IsReloading || thisPed.IsSwimming)
                {
                    SendMessage($"~r~{_localeConfig.Data.BandageFailed}", pedEntity);
                    _ecsWorld.RemoveComponent <BandageInProgressComponent>(pedEntity);
                    continue;
                }

                progress.EstimateTime -= frameTimeInSec;

                if (progress.EstimateTime > 0)
                {
                    continue;
                }
                _ecsWorld.RemoveComponent <BandageInProgressComponent>(pedEntity);
                _ecsWorld.CreateEntityWith <SuccessfulBandageEvent>().Entity = pedEntity;
            }

            for (var i = 0; i < _successfulEvents.EntitiesCount; i++)
            {
                var pedEntity = _successfulEvents.Components1[i].Entity;
                if (!_ecsWorld.IsEntityExists(pedEntity))
                {
                    continue;
                }

                var woundedPed = _ecsWorld.GetComponent <WoundedPedComponent>(pedEntity);
                if (woundedPed?.MostDangerBleedingEntity == null)
                {
                    continue;
                }

                var bleedingEntity = woundedPed.MostDangerBleedingEntity.Value;
                if (!_ecsWorld.IsEntityExists(bleedingEntity))
                {
                    continue;
                }

                var bleeding = _ecsWorld.GetComponent <BleedingComponent>(woundedPed.MostDangerBleedingEntity.Value);
                if (bleeding == null)
                {
                    continue;
                }

                bleeding.BleedSeverity = bleeding.BleedSeverity / 2;
                UpdateMostDangerWound(woundedPed, pedEntity);
                SendMessage(string.Format("~g~" + _localeConfig.Data.BandageSuccess, bleeding.Name), pedEntity);
            }

            _successfulEvents.CleanFilter();
        }
        public void Run()
        {
            GhostConfigComponent ghostConfig = _ghostConfig.Components1[0];
            WorldComponent       world       = _world.Components1[0];

            if (_enableEvents.EntitiesCount > 0)
            {
                foreach (int i in _ghosts)
                {
                    GameObject ghost       = _ghosts.Components2[i].Transform.gameObject;
                    int        ghostEntity = _ghosts.Entities[i];

                    bool isNew;
                    _ecsWorld
                    .EnsureComponent <GhostInFearStateComponent>(ghostEntity, out isNew)
                    .EstimateTime = ghostConfig.FearStateInSec;

                    if (isNew)
                    {
                        ghost.GetComponent <MeshRenderer>().material.color = ghostConfig.FearState;
                    }
                }
            }

            foreach (int i in _fearStateGhosts)
            {
                GhostComponent            ghostComponent = _fearStateGhosts.Components1[i];
                GhostInFearStateComponent fearState      = _fearStateGhosts.Components2[i];
                GameObject ghost       = _fearStateGhosts.Components3[i].Transform.gameObject;
                int        ghostEntity = _fearStateGhosts.Entities[i];

                fearState.EstimateTime -= Time.deltaTime;
                if (fearState.EstimateTime <= 0)
                {
                    _ecsWorld.RemoveComponent <GhostInFearStateComponent>(ghostEntity);

                    var material = ghost.GetComponent <MeshRenderer>().material;
                    switch (ghostComponent.GhostType)
                    {
                    case GhostTypes.BLINKY:
                        material.color = ghostConfig.Blinky;
                        break;

                    case GhostTypes.PINKY:
                        material.color = ghostConfig.Pinky;
                        break;

                    case GhostTypes.INKY:
                        material.color = ghostConfig.Inky;
                        break;

                    case GhostTypes.CLYDE:
                        material.color = ghostConfig.Clyde;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    return;
                }

                Vector2Int currentPosition = _ecsWorld.GetComponent <PositionComponent>(ghostEntity).Position;
                foreach (int entity in world.WorldField[currentPosition.x][currentPosition.y])
                {
                    var player = _ecsWorld.GetComponent <PlayerComponent>(entity);
                    if (player == null)
                    {
                        continue;
                    }

                    player.Scores += ghostConfig.ScoresPerGhost;
                    _ecsWorld.CreateEntityWith <UpdateScoreTableEvent>();
                    _ecsWorld.AddComponent <DestroyedWorldObjectComponent>(ghostEntity);
                }
            }
        }
        public void Run()
        {
#if DEBUG
            GunshotWound2.LastSystem = nameof(PainRecoverySystem);
#endif
            float frameTimeInSeconds = Game.LastFrameTime;

            for (int i = 0; i < _pedsWithPain.EntitiesCount; i++)
            {
                WoundedPedComponent woundedPed = _pedsWithPain.Components1[i];
                PainComponent       pain       = _pedsWithPain.Components2[i];

                int pedEntity = _pedsWithPain.Entities[i];
                if (pain.CurrentPain <= 0f || woundedPed.IsDead)
                {
                    _ecsWorld.RemoveComponent <PainComponent>(pedEntity, true);
                    continue;
                }

                pain.CurrentPain -= woundedPed.PainRecoverSpeed * frameTimeInSeconds;
                var painPercent = pain.CurrentPain / woundedPed.MaximalPain;
                var backPercent = painPercent > 1
                    ? 0
                    : 1 - painPercent;

                if (painPercent > 3f)
                {
                    if (woundedPed.PainState == PainStates.DEADLY)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out DeadlyPainChangeStateEvent deadlyPainEvent);
                    deadlyPainEvent.Entity      = pedEntity;
                    deadlyPainEvent.ForceUpdate = false;
                }
                else if (painPercent > 1f)
                {
                    if (woundedPed.IsMale)
                    {
                        Function.Call(Hash.PLAY_FACIAL_ANIM, woundedPed.ThisPed, "dead_1", "facials@gen_male@base");
                    }
                    else
                    {
                        Function.Call(Hash.PLAY_FACIAL_ANIM, woundedPed.ThisPed, "dead_1", "facials@gen_female@base");
                    }
                    if (woundedPed.PainState == PainStates.UNBEARABLE)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out UnbearablePainChangeStateEvent unbearablePainEvent);
                    unbearablePainEvent.Entity      = pedEntity;
                    unbearablePainEvent.ForceUpdate = false;
                }
                else if (painPercent > 0.8f)
                {
                    if (woundedPed.IsMale)
                    {
                        Function.Call(Hash.PLAY_FACIAL_ANIM, woundedPed.ThisPed, "mood_injured_1", "facials@gen_male@base");
                    }
                    else
                    {
                        Function.Call(Hash.PLAY_FACIAL_ANIM, woundedPed.ThisPed, "mood_injured_1", "facials@gen_female@base");
                    }
                    if (woundedPed.PainState == PainStates.INTENSE)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out IntensePainChangeStateEvent intensePainEvent);
                    intensePainEvent.Entity      = pedEntity;
                    intensePainEvent.ForceUpdate = false;
                }
                else if (painPercent > 0.3f)
                {
                    if (woundedPed.PainState == PainStates.AVERAGE)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out AveragePainChangeStateEvent averagePainEvent);
                    averagePainEvent.Entity      = pedEntity;
                    averagePainEvent.ForceUpdate = false;
                }
                else if (painPercent > 0.01f)
                {
                    if (woundedPed.PainState == PainStates.MILD)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out MildPainChangeStateEvent mildPainEvent);
                    mildPainEvent.Entity      = pedEntity;
                    mildPainEvent.ForceUpdate = false;
                }
                else
                {
                    if (woundedPed.PainState == PainStates.NONE)
                    {
                        continue;
                    }

                    _ecsWorld.CreateEntityWith(out NoPainChangeStateEvent noPainEvent);
                    noPainEvent.Entity      = pedEntity;
                    noPainEvent.ForceUpdate = false;

                    if (!_config.Data.PlayerConfig.CameraIsShaking)
                    {
                        Function.Call(Hash._SET_CAM_EFFECT, 0);
                        Function.Call(Hash._STOP_ALL_SCREEN_EFFECTS);
                    }
                }

                if (woundedPed.Crits.HasFlag(CritTypes.LEGS_DAMAGED))
                {
                    continue;
                }

                var adjustable = 1f - _config.Data.WoundConfig.MoveRateOnFullPain;
                var moveRate   = 1f - adjustable * backPercent;
                Function.Call(Hash.SET_PED_MOVE_RATE_OVERRIDE, woundedPed.ThisPed, moveRate);
            }
        }
Exemple #28
0
        public void Run()
        {
            foreach (int i in _pedsWithArmor)
            {
                GswPedComponent   gswPed = _pedsWithArmor.Components1[i];
                PedArmorComponent armor  = _pedsWithArmor.Components2[i];

                Ped ped = gswPed.ThisPed;
                if (!ped.Exists())
                {
                    continue;
                }

                if (ped.Armor > armor.Armor)
                {
                    armor.Armor = ped.Armor;
                }
#if DEBUG
                if (armor.Armor <= 0)
                {
                    continue;
                }

                Vector3 position = ped.AbovePosition;
                float   maxArmor = ped.IsLocalPlayer
                    ? NativeFunction.Natives.GET_PLAYER_MAX_ARMOUR <int>(Game.LocalPlayer)
                    : 100;
                Debug.DrawWireBoxDebug(position, ped.Orientation, new Vector3(1.05f, 0.15f, 0.1f), Color.LightSkyBlue);
                Debug.DrawWireBoxDebug(position, ped.Orientation, new Vector3(armor.Armor / maxArmor, 0.1f, 0.1f), Color.MediumBlue);
#endif
            }

            foreach (int i in _damagedPedsWithArmor)
            {
                GswPedComponent   gswPed = _damagedPedsWithArmor.Components1[i];
                PedArmorComponent armor  = _damagedPedsWithArmor.Components4[i];
                Ped ped = gswPed.ThisPed;
                if (!ped.Exists())
                {
                    continue;
                }

                EcsEntity pedEntity = _damagedPedsWithArmor.Entities[i];
                if (armor.Armor <= 0)
                {
#if DEBUG
                    _logger.MakeLog($"{pedEntity.GetEntityName()} doesn't have armor");
#endif
                    ped.Armor = armor.Armor;
                    continue;
                }

                EcsEntity bodyPartEntity = _damagedPedsWithArmor.Components2[i].DamagedBodyPartEntity;
                var       bodyArmor      = _ecsWorld.GetComponent <BodyPartArmorComponent>(bodyPartEntity);
                if (bodyArmor == null || !bodyArmor.ProtectedByBodyArmor)
                {
#if DEBUG
                    var partName = bodyPartEntity.GetEntityName();
                    _logger.MakeLog($"{partName} of {pedEntity.GetEntityName()} is not protected by armor");
#endif
                    ped.Armor = armor.Armor;
                    continue;
                }

                EcsEntity weaponEntity = _damagedPedsWithArmor.Components3[i].WeaponEntity;
                var       weaponStats  = _ecsWorld.GetComponent <ArmorWeaponStatsComponent>(weaponEntity);
                if (weaponStats == null)
                {
#if DEBUG
                    _logger.MakeLog($"Weapon {weaponEntity.GetEntityName()} " +
                                    $"doesn't have {nameof(ArmorWeaponStatsComponent)}");
#endif
                    ped.Armor = armor.Armor;
                    continue;
                }

                armor.Armor -= weaponStats.ArmorDamage;
                var newPain = _ecsWorld.EnsureComponent <AdditionalPainComponent>(pedEntity, out bool _);
                newPain.AdditionalPain = weaponStats.ArmorDamage;
#if DEBUG
                _logger.MakeLog($"Added pain {newPain.AdditionalPain:0.00} " +
                                $"by armor hit for {pedEntity.GetEntityName()}");
#endif

                if (armor.Armor <= 0)
                {
#if DEBUG
                    _logger.MakeLog($"Armor of {pedEntity.GetEntityName()} was destroyed");
#endif
                    ped.Armor = armor.Armor;
                    continue;
                }

                float maxArmor = ped.IsLocalPlayer
                    ? NativeFunction.Natives.GET_PLAYER_MAX_ARMOUR <int>(Game.LocalPlayer)
                    : 100;

                float armorPercent = armor.Armor / maxArmor;
                if (!weaponStats.CanPenetrateArmor || weaponStats.MinArmorPercentForPenetration < armorPercent)
                {
#if DEBUG
                    _logger.MakeLog($"Armor of {pedEntity.GetEntityName()} was not penetrated");
#endif
                    _ecsWorld.RemoveComponent <DamagedByWeaponComponent>(pedEntity);
                    _ecsWorld.RemoveComponent <DamagedBodyPartComponent>(pedEntity);
                    ped.Armor = armor.Armor;
                    continue;
                }

                float chanceToPenetrate = 1 - armorPercent / weaponStats.MinArmorPercentForPenetration;
                bool  wasPenetrated     = _random.IsTrueWithProbability(chanceToPenetrate);
                if (!wasPenetrated)
                {
#if DEBUG
                    _logger.MakeLog($"Armor of {pedEntity.GetEntityName()} was not penetrated, " +
                                    $"when chance was {chanceToPenetrate:0.00}");
#endif
                    _ecsWorld.RemoveComponent <DamagedByWeaponComponent>(pedEntity);
                    _ecsWorld.RemoveComponent <DamagedBodyPartComponent>(pedEntity);
                    ped.Armor = armor.Armor;
                    continue;
                }

#if DEBUG
                _logger.MakeLog($"Armor of {pedEntity.GetEntityName()} was penetrated, " +
                                $"when chance was {chanceToPenetrate:0.00}");
#endif
                ped.Armor = armor.Armor;
            }
        }
        public void Run()
        {
#if DEBUG
            GunshotWound2.LastSystem = nameof(InstantHealSystem);
#endif

            for (var i = 0; i < _events.EntitiesCount; i++)
            {
                var pedEntity = _events.Components1[i].Entity;
                if (!_ecsWorld.IsEntityExists(pedEntity))
                {
                    continue;
                }

                var woundedPed = _ecsWorld.GetComponent <WoundedPedComponent>(pedEntity);
                if (woundedPed != null)
                {
                    if (woundedPed.IsPlayer)
                    {
                        _ecsWorld.CreateEntityWith <AddCameraShakeEvent>().Length = CameraShakeLength.CLEAR;
                        Function.Call(Hash.SET_PLAYER_SPRINT, Game.Player, true);
                        Function.Call(Hash._SET_CAM_EFFECT, 0);
                        Function.Call(Hash.ANIMPOSTFX_STOP_ALL);
                        woundedPed.Health             = _mainConfig.Data.PlayerConfig.MaximalHealth;
                        Game.Player.IgnoredByEveryone = false;
                    }
                    else
                    {
                        woundedPed.Health           = GunshotWound2.Random.Next(50, _mainConfig.Data.NpcConfig.MaxStartHealth);
                        woundedPed.ThisPed.Accuracy = woundedPed.DefaultAccuracy;
                    }

                    woundedPed.IsDead                   = false;
                    woundedPed.Crits                    = 0;
                    woundedPed.PedHealth                = woundedPed.Health;
                    woundedPed.Armor                    = woundedPed.ThisPed.Armor;
                    woundedPed.BleedingCount            = 0;
                    woundedPed.MostDangerBleedingEntity = null;

                    _ecsWorld.RemoveComponent <PainComponent>(pedEntity, true);

                    Function.Call(Hash.CLEAR_PED_BLOOD_DAMAGE, woundedPed.ThisPed);
                    Function.Call(Hash.SET_PED_MOVE_RATE_OVERRIDE, woundedPed.ThisPed, 1f);

                    _ecsWorld.CreateEntityWith(out NoPainChangeStateEvent noPainEvent);
                    noPainEvent.Entity      = pedEntity;
                    noPainEvent.ForceUpdate = true;
                }

                for (var bleedIndex = 0; bleedIndex < _bleedingComponents.EntitiesCount; bleedIndex++)
                {
                    if (_bleedingComponents.Components1[bleedIndex].Entity != pedEntity)
                    {
                        continue;
                    }

                    _ecsWorld.RemoveEntity(_bleedingComponents.Entities[bleedIndex]);
                }
            }

            _events.CleanFilter();
        }
Exemple #30
0
        public void Run()
        {
            foreach (int i in _entities)
            {
                Ped ped = _entities.Components1[i].ThisPed;
                if (!ped.Exists())
                {
                    continue;
                }

                HealthComponent health = _entities.Components2[i];
                if (health.Health <= 0)
                {
                    continue;
                }

                BleedingInfoComponent info = _entities.Components3[i];
                int   pedEntity            = _entities.Entities[i];
                float bleedingDamage       = 0;

                for (int bleedingIndex = info.BleedingEntities.Count - 1; bleedingIndex >= 0; bleedingIndex--)
                {
                    int bleedingEntity = info.BleedingEntities[bleedingIndex];
                    if (!_ecsWorld.IsEntityExists(bleedingEntity))
                    {
                        info.BleedingEntities.RemoveAt(bleedingIndex);
                        continue;
                    }

                    var bleeding = _ecsWorld.GetComponent <BleedingComponent>(bleedingEntity);
                    if (bleeding == null)
                    {
                        info.BleedingEntities.RemoveAt(bleedingIndex);
                        continue;
                    }

                    float delta = GswExtensions.GetDeltaTime();
                    if (delta <= 0)
                    {
                        continue;
                    }

                    bleedingDamage    += bleeding.Severity * delta;
                    bleeding.Severity -= info.BleedingHealRate / HEAL_RATE_SLOWER * delta;
                    if (bleeding.Severity > 0)
                    {
                        continue;
                    }

#if DEBUG
                    _logger.MakeLog($"Bleeding {bleedingEntity} on Entity ({pedEntity}) was healed");
#endif
                    _ecsWorld.RemoveComponent <BleedingComponent>(bleedingEntity);
                    info.BleedingEntities.RemoveAt(bleedingIndex);
                }

                if (bleedingDamage <= 0)
                {
                    continue;
                }

                health.Health -= bleedingDamage;
                ped.SetHealth(health.Health);
            }
        }