예제 #1
0
        private IEnumerable <object> RagdollCoroutine()
        {
            var peds = CachedPeds.Where(
                x => x.IsSafeExist() &&
                x.IsInRangeOf(PlayerPed.Position, 100)).ToArray();

            var vecs = CachedVehicles.Where(
                x => x.IsSafeExist() && x.IsInRangeOf(PlayerPed.Position, 100)).ToArray();

            foreach (var ped in peds)
            {
                // if (!ped.IsSafeExist()) continue;
                ped.IsInvincible = true;
                //ped.SetToRagdoll(100);
                //ped.ApplyForce(new Vector3(0, 0, 2));
                yield return(null);
            }

            foreach (var vec in vecs)
            {
                // if (!ped.IsSafeExist()) continue;
                vec.IsCollisionProof = true;
                //ped.SetToRagdoll(100);
                //ped.ApplyForce(new Vector3(0, 0, 2));
                yield return(null);
            }
        }
예제 #2
0
        private void Shock(Ped damagedPed)
        {
            var playerPos = PlayerPed.Position;

            GTA.World.AddExplosion(playerPos + Vector3.WorldUp * 10, GTA.ExplosionType.Grenade, 0.01f, 0.2f);
            #region Ped
            foreach (var p in CachedPeds.Where(
                         x => x.IsSafeExist() &&
                         x.IsInRangeOf(damagedPed.Position, 10) &&
                         x.IsAlive &&
                         !x.IsCutsceneOnlyPed()))
            {
                p.SetToRagdoll();
                p.ApplyForce(Vector3.WorldUp * 5f);
            }

            #endregion

            #region Vehicle

            foreach (var v in CachedVehicles.Where(
                         x => x.IsSafeExist() &&
                         x.IsInRangeOf(damagedPed.Position, 10) &&
                         x.IsAlive))
            {
                v.ApplyForce(Vector3.WorldUp * 5f, Vector3.RandomXYZ());
            }

            #endregion
        }
예제 #3
0
        private void RunAway()
        {
            affectPeds.RemoveWhere(x => !x.IsSafeExist());
            if (!PlayerPed.IsSafeExist())
            {
                return;
            }

            var playerVehicle = PlayerPed.CurrentVehicle;

            //プレイヤ周辺の車
            var drivers = CachedVehicles.Where(x => x.IsSafeExist() &&
                                               (!playerVehicle.IsSafeExist() || !x.IsSameEntity(playerVehicle)) &&
                                               !x.IsRequiredForMission() &&
                                               (x.Position - PlayerPed.Position).Length() <= PlayerAroundDistance)
                          .Select(x => x.GetPedOnSeat(VehicleSeat.Driver))
                          .Where(x => x.IsSafeExist() && !affectPeds.Contains(x));

            foreach (var driver in drivers)
            {
                try
                {
                    driver.DrivingSpeed    = 100.0f;
                    driver.MaxDrivingSpeed = 100.0f;
                    driver.DrivingStyle    = DrivingStyle.AvoidTrafficExtremely;
                    driver.Task.VehicleChase(PlayerPed);
                    affectPeds.Add(driver);
                }
                catch (Exception e)
                {
                    LogWrite(e.ToString());
                }
            }
        }
예제 #4
0
 private void FulutonUpdate()
 {
     foreach (var entity in CachedPeds.Concat(CachedVehicles.Cast <Entity>()).Where(
                  x => x.IsSafeExist() &&
                  x.IsInRangeOf(PlayerPed.Position, 15.0f) &&
                  !fulutonedEntityList.Contains(x.Handle) &&
                  x.IsAlive
                  ))
     {
         if (entity.HasBeenDamagedByPed(PlayerPed) && (
                 entity.HasBeenDamagedBy(Weapon.UNARMED)
                 ))
         {
             fulutonedEntityList.Add(entity.Handle);
             StartCoroutine(FulutonCoroutine(entity));
             if (entity is Vehicle)
             {
                 soundPlayerVehicleSetup?.Play();
             }
             else
             {
                 //pedの時は遅延させてならす
                 Observable.Timer(TimeSpan.FromSeconds(0.3f))
                 .Subscribe(_ => soundPlayerPedSetup?.Play());
             }
         }
     }
 }
        private void RobberVehicle()
        {
            if (!PlayerPed.IsSafeExist())
            {
                return;
            }

            var playerVehicle = this.GetPlayerVehicle();

            //プレイヤの周辺の市民
            var targetPeds = CachedPeds.Where(x => x.IsSafeExist() &&
                                              x.IsAlive &&
                                              x.IsInRangeOf(PlayerPed.Position, PlayerAroundDistance) &&
                                              x != PlayerPed &&
                                              !x.IsRequiredForMission() &&
                                              !x.IsNotChaosPed());

            foreach (var targetPed in targetPeds)
            {
                try
                {
                    //確率で強盗する
                    if (Random.Next(0, 100) > probability)
                    {
                        continue;
                    }

                    //市民周辺の車が対象
                    var targetVehicle =
                        CachedVehicles
                        .FirstOrDefault(x => x.IsSafeExist() && x.IsInRangeOf(targetPed.Position, 40.0f) && x != targetPed.CurrentVehicle);

                    //30%の確率でプレイヤの車を盗むように変更
                    if (playerVehicle.IsSafeExist() && Random.Next(0, 100) < 30)
                    {
                        targetVehicle = playerVehicle;
                    }
                    if (!targetVehicle.IsSafeExist())
                    {
                        continue;
                    }
                    StartCoroutine(RobberVehicleCoroutine(targetPed, targetVehicle));
                }
                catch (Exception e)
                {
                    LogWrite(e.ToString());
                }
            }
        }
예제 #6
0
        private void VehicleBombAction()
        {
            //まだ発火していないプレイや以外のドライバのいるミッション対象外の車が対象
            var targetVehicles = CachedVehicles
                                 .Where(x =>
                                        x.IsSafeExist() && x.IsAlive && x.PetrolTankHealth >= 0 && !x.IsPersistent && !x.IsPlayerVehicle() &&
                                        x.GetPedOnSeat(GTA.VehicleSeat.Driver).IsSafeExist());

            foreach (var vehicle in targetVehicles)
            {
                if (Random.Next(0, 100) <= Probability)
                {
                    vehicle.PetrolTankHealth = -1;
                }
            }
        }
예제 #7
0
        //キャッシュ市民から一人選出
        private Entity GetRandomTarget()
        {
            var playerVehicle = PlayerPed.CurrentVehicle;

            //プレイヤの近くの市民
            var targetPeds = CachedPeds
                             .Where(x => x.IsSafeExist() && x.IsHuman && x.IsAlive && x.IsInRangeOf(PlayerPed.Position, 150) &&
                                    (!x.IsInVehicle() || x.CurrentVehicle != playerVehicle)).Concat(new Ped[] { PlayerPed });

            var targetVehicles = CachedVehicles
                                 .Where(x => x.IsSafeExist() && x.IsAlive && x.IsInRangeOf(PlayerPed.Position, 150) &&
                                        playerVehicle != x);

            var targets = targetPeds.Concat(targetVehicles.Cast <Entity>()).ToArray();

            //ターゲットが周りにいない場合は誰も攻撃しない
            return(targets.Length > 5 ? targets[Random.Next(targets.Length)] : null);
        }
        /// <summary>
        /// 掴む車両の選別
        /// </summary>
        private void GripAction()
        {
            var gripAvailableVeles = CachedVehicles
                                     .Where(x => x.IsSafeExist() && x.IsInRangeOf(PlayerPed.Position, 10.0f))
                                     .OrderBy(x => x.Position.DistanceTo(PlayerPed.Position))
                                     .FirstOrDefault();

            if (gripAvailableVeles == null || !gripAvailableVeles.IsTouching(PlayerPed))
            {
                return;
            }
            _isGriped = true;
            var playerRHandCoords = PlayerPed.GetBoneCoord(Bone.SKEL_R_Hand);

            var offsetPosition = Function.Call <Vector3>(Hash.GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS,
                                                         gripAvailableVeles,
                                                         playerRHandCoords.X,
                                                         playerRHandCoords.Y,
                                                         playerRHandCoords.Z);

            Grip(PlayerPed, gripAvailableVeles, offsetPosition);
        }
예제 #9
0
        /// <summary>
        /// ニトロ対象の選別
        /// </summary>
        private void CitizenNitroAction()
        {
            try
            {
                var playerVehicle = this.GetPlayerVehicle();

                var nitroAvailableVeles = CachedVehicles
                                          .Where(x => (!playerVehicle.IsSafeExist() || x != playerVehicle) && x.GetPedOnSeat(VehicleSeat.Driver).IsSafeExist() && !x.IsPersistent);

                foreach (var veh in nitroAvailableVeles)
                {
                    if (Random.Next(0, 100) <= Probability)
                    {
                        DelayCoroutine(veh);
                    }
                }
            }
            catch (Exception e)
            {
                //nice catch!
                LogWrite(e.ToString());
            }
        }
예제 #10
0
        protected override void Setup()
        {
            CreateInputKeywordAsObservable("snax")
            .Subscribe(_ => IsActive = !IsActive);

            IsActiveAsObservable
            .Where(x => x)
            .Subscribe(x =>
            {
                DrawText($"SpeedMax:{IsActive}[Type:{(currentSpeedType)}][Exclude:{excludeMissionVehicle}]");
                vehicleHashSet.Clear();
            });

            IsActiveAsObservable
            .Skip(1)
            .Where(x => !x)
            .Subscribe(x =>
            {
                DrawText($"SpeedMax:{IsActive}");
                vehicleHashSet.Clear();
            });

            //ミッション開始直後に一瞬動作を止めるフラグ
            var suspednFlag = false;

            OnThinnedTickAsObservable
            .Where(_ => IsActive && !suspednFlag)
            .Subscribe(_ =>
            {
                foreach (var v in CachedVehicles
                         .Where(x =>
                                x.IsSafeExist() &&
                                x.IsInRangeOf(PlayerPed.Position, 100.0f) &&
                                !vehicleHashSet.Contains(x.Handle) &&
                                !(excludeMissionVehicle && x.IsPersistent)
                                ))
                {
                    vehicleHashSet.Add(v.Handle);
                    if (currentSpeedType == SpeedType.Original)
                    {
                        StartCoroutine(OriginalSpeedMaxCoroutine(v));
                    }
                    else
                    {
                        StartCoroutine(VehicleSpeedMaxCorutine(v));
                    }
                }
            });
            var nextType = currentSpeedType;

            OnKeyDownAsObservable
            .Where(x => IsActive && x.KeyCode == Keys.F6)
            .Do(_ =>
            {
                nextType = GetNextSpeedType(nextType);
                DrawText($"SpeedMax:[Type:{nextType}]", 1.0f);
            })
            .Throttle(TimeSpan.FromSeconds(1))
            .Subscribe(_ =>
            {
                currentSpeedType = nextType;
                DrawText($"SpeedMax:[Type:{(currentSpeedType)}][OK]", 2.0f);
                StopAllCoroutine();
                vehicleHashSet.Clear();
            });

            OnKeyDownAsObservable
            .Where(x => IsActive && x.KeyCode == Keys.F5)
            .Subscribe(_ =>
            {
                excludeMissionVehicle = !excludeMissionVehicle;
                vehicleHashSet.Clear();
                StopAllCoroutine();
                DrawText($"SpeedMax:ExcludeMissionVehicles[{excludeMissionVehicle}]");
            });

            OnThinnedTickAsObservable
            .Where(_ => IsActive)
            .Select(_ => PlayerPed.IsAlive)
            .DistinctUntilChanged()
            .Where(x => x)
            .Subscribe(_ => vehicleHashSet.Clear());

            //ミッションが始まった時にしばらく動作を止める
            OnThinnedTickAsObservable
            .Where(_ => IsActive)
            .Select(_ => Game.MissionFlag)
            .DistinctUntilChanged()
            .Where(x => x)
            .Do(_ => suspednFlag = true)
            .Delay(TimeSpan.FromSeconds(3))
            .Subscribe(_ => suspednFlag = false);
        }