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); } }
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 }
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()); } } }
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()); } } }
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; } } }
//キャッシュ市民から一人選出 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); }
/// <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()); } }
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); }