Files
RAGECOOP-V/RageCoop.Client/Sync/Entities/Ped/SyncedPed.cs

736 lines
26 KiB
C#
Raw Normal View History

2022-07-20 17:50:01 +08:00
using GTA;
2022-05-22 15:55:26 +08:00
using GTA.Math;
2022-07-20 17:50:01 +08:00
using GTA.Native;
2022-05-22 15:55:26 +08:00
using LemonUI.Elements;
2022-07-20 17:50:01 +08:00
using RageCoop.Core;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
2022-05-22 15:55:26 +08:00
namespace RageCoop.Client
{
/// <summary>
/// ?
/// </summary>
2022-08-14 19:06:51 +08:00
public partial class SyncedPed : SyncedEntity
2022-05-22 15:55:26 +08:00
{
/// <summary>
/// Create a local entity (outgoing sync)
/// </summary>
/// <param name="p"></param>
internal SyncedPed(Ped p)
2022-05-22 15:55:26 +08:00
{
2022-09-06 21:46:35 +08:00
ID = EntityPool.RequestNewID();
p.CanWrithe = false;
p.IsOnlyDamagedByPlayer = false;
MainPed = p;
OwnerID = Main.LocalPlayerID;
2022-05-22 15:55:26 +08:00
2023-07-26 15:12:58 -03:00
Function.Call(Hash.SET_PED_IS_IGNORED_BY_AUTO_OPEN_DOORS, false);
2022-06-02 15:51:58 +08:00
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_DisableHurt, true);
2022-07-09 19:32:11 +08:00
// MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_DisableMelee, true);
2022-06-02 15:51:58 +08:00
2022-05-22 15:55:26 +08:00
}
/// <summary>
/// Create an empty character with ID
/// </summary>
internal SyncedPed(int id)
2022-05-22 15:55:26 +08:00
{
2022-09-06 21:46:35 +08:00
ID = id;
LastSynced = Main.Ticked;
2022-05-22 15:55:26 +08:00
}
internal override void Update()
2022-05-22 15:55:26 +08:00
{
2022-09-06 21:46:35 +08:00
if (Owner == null) { OwnerID = OwnerID; return; }
if (IsPlayer)
2022-05-22 15:55:26 +08:00
{
RenderNameTag();
}
2022-07-03 15:28:28 +08:00
// Check if all data avalible
if (!IsReady) { return; }
// Skip update if no new sync message has arrived.
2022-08-11 14:48:19 +02:00
if (!NeedUpdate) { return; }
2022-07-03 15:28:28 +08:00
if (MainPed == null || !MainPed.Exists())
2022-07-03 15:28:28 +08:00
{
if (!CreateCharacter())
{
return;
}
2022-07-03 15:28:28 +08:00
}
2022-05-22 15:55:26 +08:00
// Need to update state
2022-09-06 21:46:35 +08:00
if (LastFullSynced >= LastUpdated)
2022-05-22 15:55:26 +08:00
{
2022-09-06 21:46:35 +08:00
if (MainPed != null && (Model != MainPed.Model.Hash))
2022-05-22 15:55:26 +08:00
{
if (!CreateCharacter())
{
return;
}
2022-05-22 15:55:26 +08:00
}
2022-09-06 21:46:35 +08:00
if (((byte)BlipColor == 255) && (PedBlip != null))
2022-05-22 15:55:26 +08:00
{
PedBlip.Delete();
2022-09-06 21:46:35 +08:00
PedBlip = null;
2022-05-22 15:55:26 +08:00
}
2022-09-06 21:46:35 +08:00
else if (((byte)BlipColor != 255) && PedBlip == null)
2022-07-09 19:32:11 +08:00
{
2022-09-06 21:46:35 +08:00
PedBlip = MainPed.AddBlip();
2022-09-06 21:46:35 +08:00
PedBlip.Color = BlipColor;
PedBlip.Sprite = BlipSprite;
PedBlip.Scale = BlipScale;
}
2022-09-06 21:46:35 +08:00
if (PedBlip != null)
{
2022-09-06 21:46:35 +08:00
if (PedBlip.Color != BlipColor)
{
2022-09-06 21:46:35 +08:00
PedBlip.Color = BlipColor;
}
2022-09-06 21:46:35 +08:00
if (PedBlip.Sprite != BlipSprite)
{
2022-09-06 21:46:35 +08:00
PedBlip.Sprite = BlipSprite;
2022-07-09 19:32:11 +08:00
}
2022-08-20 11:32:35 +08:00
if (IsPlayer)
2022-08-20 11:08:51 +08:00
{
PedBlip.Name = Owner.Username;
}
2022-07-09 19:32:11 +08:00
}
if (!Clothes.SequenceEqual(_lastClothes))
{
SetClothes();
}
2022-08-22 19:13:52 +08:00
CheckCurrentWeapon();
2022-05-22 15:55:26 +08:00
}
if (MainPed.IsDead)
{
2022-09-06 21:46:35 +08:00
if (Health > 0)
2022-05-22 15:55:26 +08:00
{
if (IsPlayer)
{
MainPed.Resurrect();
}
else
{
SyncEvents.TriggerPedKilled(this);
}
}
}
2022-09-06 21:46:35 +08:00
else if (IsPlayer && (MainPed.Health != Health))
2022-05-22 15:55:26 +08:00
{
MainPed.Health = Health;
if (Health <= 0 && !MainPed.IsDead)
{
MainPed.IsInvincible = false;
MainPed.Kill();
return;
2022-05-22 15:55:26 +08:00
}
}
2022-09-06 21:46:35 +08:00
if (Speed >= 4)
2022-05-22 15:55:26 +08:00
{
DisplayInVehicle();
}
else
{
2022-09-06 21:46:35 +08:00
if (MainPed.IsInVehicle()) { MainPed.Task.LeaveVehicle(LeaveVehicleFlags.WarpOut); return; }
2022-05-22 15:55:26 +08:00
DisplayOnFoot();
}
2022-08-11 14:48:19 +02:00
2022-08-14 23:35:36 +02:00
if (IsSpeaking)
{
if (Main.Ticked - LastSpeakingTime < 10)
{
DisplaySpeaking(true);
}
else
{
DisplaySpeaking(false);
IsSpeaking = false;
LastSpeakingTime = 0;
}
}
2022-09-06 21:46:35 +08:00
LastUpdated = Main.Ticked;
2022-05-22 15:55:26 +08:00
}
private void RenderNameTag()
{
2022-09-06 21:46:35 +08:00
if (!Owner.DisplayNameTag || (MainPed == null) || !MainPed.IsVisible || !MainPed.IsInRange(Main.PlayerPosition, 40f))
2022-05-22 15:55:26 +08:00
{
return;
}
2022-07-14 10:33:24 +08:00
Vector3 targetPos = MainPed.Bones[Bone.IKHead].Position;
2022-07-20 17:50:01 +08:00
Point toDraw = default;
2022-07-14 10:33:24 +08:00
if (Util.WorldToScreen(targetPos, ref toDraw))
2022-05-22 15:55:26 +08:00
{
2022-09-06 21:46:35 +08:00
toDraw.Y -= 100;
new ScaledText(toDraw, Owner.Username, 0.4f, GTA.UI.Font.ChaletLondon)
2022-07-14 10:33:24 +08:00
{
Outline = true,
2022-08-10 20:42:47 +08:00
Alignment = GTA.UI.Alignment.Center,
2022-09-06 21:46:35 +08:00
Color = Owner.HasDirectConnection ? Color.FromArgb(179, 229, 252) : Color.White,
2022-07-14 10:33:24 +08:00
}.Draw();
}
2022-05-22 15:55:26 +08:00
}
private bool CreateCharacter()
2022-05-22 15:55:26 +08:00
{
if (MainPed != null)
{
if (MainPed.Exists())
{
2022-08-08 17:03:41 +08:00
// Main.Logger.Debug($"Removing ped {ID}. Reason:CreateCharacter");
2022-05-22 15:55:26 +08:00
MainPed.Kill();
MainPed.MarkAsNoLongerNeeded();
MainPed.Delete();
}
2022-07-20 17:50:01 +08:00
2022-05-22 15:55:26 +08:00
MainPed = null;
}
if (PedBlip != null && PedBlip.Exists())
{
PedBlip.Delete();
PedBlip = null;
}
if (!Model.IsLoaded)
2022-05-22 15:55:26 +08:00
{
Model.Request();
return false;
2022-05-22 15:55:26 +08:00
}
if ((MainPed = Util.CreatePed(Model, Position)) == null)
2022-05-22 15:55:26 +08:00
{
return false;
2022-05-22 15:55:26 +08:00
}
Model.MarkAsNoLongerNeeded();
2022-05-22 15:55:26 +08:00
MainPed.BlockPermanentEvents = true;
2022-09-06 21:46:35 +08:00
MainPed.CanWrithe = false;
2022-05-22 15:55:26 +08:00
MainPed.CanBeDraggedOutOfVehicle = true;
MainPed.IsOnlyDamagedByPlayer = false;
2022-09-06 21:46:35 +08:00
MainPed.RelationshipGroup = Main.SyncedPedsGroup;
MainPed.IsFireProof = false;
MainPed.IsExplosionProof = false;
2022-06-02 15:51:58 +08:00
2022-07-09 19:32:11 +08:00
Function.Call(Hash.SET_PED_DROPS_WEAPONS_WHEN_DEAD, MainPed.Handle, false);
Function.Call(Hash.SET_PED_CAN_BE_TARGETTED, MainPed.Handle, true);
Function.Call(Hash.SET_PED_CAN_BE_TARGETTED_BY_PLAYER, MainPed.Handle, Game.Player, true);
Function.Call(Hash.SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE, MainPed.Handle, false);
Function.Call(Hash.SET_CAN_ATTACK_FRIENDLY, MainPed.Handle, true, true);
2023-07-26 15:12:58 -03:00
Function.Call(Hash.SET_PED_IS_IGNORED_BY_AUTO_OPEN_DOORS, false);
2022-07-09 19:32:11 +08:00
Function.Call(Hash.SET_PED_CAN_EVASIVE_DIVE, MainPed.Handle, false);
2022-07-20 17:50:01 +08:00
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_DrownsInWater, false);
2022-06-02 15:51:58 +08:00
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_DisableHurt, true);
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_DisableExplosionReactions, true);
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_AvoidTearGas, false);
2022-08-14 19:06:51 +08:00
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_IgnoreBeingOnFire, true);
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_DisableEvasiveDives, true);
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_DisablePanicInVehicle, true);
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_BlockNonTemporaryEvents, true);
2022-06-02 15:51:58 +08:00
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_DisableShockingEvents, true);
MainPed.SetConfigFlag((int)PedConfigFlags.CPED_CONFIG_FLAG_DisableHurt, true);
2022-05-22 15:55:26 +08:00
SetClothes();
2022-09-06 21:46:35 +08:00
if (IsPlayer) { MainPed.IsInvincible = true; }
if (IsInvincible) { MainPed.IsInvincible = true; }
2022-05-22 15:55:26 +08:00
lock (EntityPool.PedsLock)
{
// Add to EntityPool so this Character can be accessed by handle.
EntityPool.Add(this);
}
return true;
2022-05-22 15:55:26 +08:00
}
private void SetClothes()
{
2022-06-19 11:12:20 +08:00
for (byte i = 0; i < 12; i++)
2022-05-22 15:55:26 +08:00
{
2022-09-06 21:46:35 +08:00
Function.Call(Hash.SET_PED_COMPONENT_VARIATION, MainPed.Handle, i, (int)Clothes[i], (int)Clothes[i + 12], (int)Clothes[i + 24]);
2022-05-22 15:55:26 +08:00
}
_lastClothes = Clothes;
}
2022-05-22 15:55:26 +08:00
private void DisplayOnFoot()
{
2022-08-14 19:06:51 +08:00
2022-05-22 15:55:26 +08:00
if (IsInParachuteFreeFall)
{
MainPed.PositionNoOffset = Vector3.Lerp(MainPed.ReadPosition(), Position + Velocity, 0.5f);
2022-05-22 15:55:26 +08:00
MainPed.Quaternion = Rotation.ToQuaternion();
if (!Function.Call<bool>(Hash.IS_ENTITY_PLAYING_ANIM, MainPed.Handle, "skydive@base", "free_idle", 3))
{
Function.Call(Hash.TASK_PLAY_ANIM, MainPed.Handle, LoadAnim("skydive@base"), "free_idle", 8f, 10f, -1, 0, -8f, 1, 1, 1);
}
return;
}
if (IsParachuteOpen)
{
if (ParachuteProp == null)
{
Model model = 1740193300;
model.Request(1000);
2022-05-22 15:55:26 +08:00
if (model != null)
{
ParachuteProp = World.CreateProp(model, MainPed.ReadPosition(), MainPed.ReadRotation(), false, false);
2022-05-22 15:55:26 +08:00
model.MarkAsNoLongerNeeded();
ParachuteProp.IsPositionFrozen = true;
ParachuteProp.IsCollisionEnabled = false;
ParachuteProp.AttachTo(MainPed.Bones[Bone.SkelSpine2], new Vector3(3.6f, 0f, 0f), new Vector3(0f, 90f, 0f));
}
MainPed.Task.ClearAllImmediately();
MainPed.Task.ClearSecondary();
}
MainPed.PositionNoOffset = Vector3.Lerp(MainPed.ReadPosition(), Position + Velocity, 0.5f);
2022-05-22 15:55:26 +08:00
MainPed.Quaternion = Rotation.ToQuaternion();
if (!Function.Call<bool>(Hash.IS_ENTITY_PLAYING_ANIM, MainPed.Handle, "skydive@parachute@first_person", "chute_idle_right", 3))
{
Function.Call(Hash.TASK_PLAY_ANIM, MainPed, LoadAnim("skydive@parachute@first_person"), "chute_idle_right", 8f, 10f, -1, 0, -8f, 1, 1, 1);
}
return;
}
if (ParachuteProp != null)
{
if (ParachuteProp.Exists())
{
ParachuteProp.Delete();
}
ParachuteProp = null;
}
if (IsOnLadder)
{
if (Velocity.Z < 0)
{
string anim = Velocity.Z < -2f ? "slide_climb_down" : "climb_down";
if (_currentAnimation[1] != anim)
{
MainPed.Task.ClearAllImmediately();
_currentAnimation[1] = anim;
}
if (!Function.Call<bool>(Hash.IS_ENTITY_PLAYING_ANIM, MainPed.Handle, "laddersbase", anim, 3))
{
MainPed.Task.PlayAnimation("laddersbase", anim, 8f, -1, AnimationFlags.Loop);
}
}
else
{
if (Math.Abs(Velocity.Z) < 0.5)
{
if (_currentAnimation[1] != "base_left_hand_up")
{
MainPed.Task.ClearAllImmediately();
_currentAnimation[1] = "base_left_hand_up";
}
if (!Function.Call<bool>(Hash.IS_ENTITY_PLAYING_ANIM, MainPed.Handle, "laddersbase", "base_left_hand_up", 3))
{
MainPed.Task.PlayAnimation("laddersbase", "base_left_hand_up", 8f, -1, AnimationFlags.Loop);
}
}
else
{
if (_currentAnimation[1] != "climb_up")
{
MainPed.Task.ClearAllImmediately();
_currentAnimation[1] = "climb_up";
}
if (!Function.Call<bool>(Hash.IS_ENTITY_PLAYING_ANIM, MainPed.Handle, "laddersbase", "climb_up", 3))
{
MainPed.Task.PlayAnimation("laddersbase", "climb_up", 8f, -1, AnimationFlags.Loop);
}
}
}
SmoothTransition();
return;
}
2022-08-14 19:06:51 +08:00
else if (MainPed.IsTaskActive(TaskType.CTaskGoToAndClimbLadder))
2022-05-22 15:55:26 +08:00
{
MainPed.Task.ClearAllImmediately();
_currentAnimation[1] = "";
}
if (IsVaulting)
{
if (!MainPed.IsVaulting)
{
MainPed.Task.Climb();
}
2022-05-23 19:19:56 +08:00
SmoothTransition();
2022-05-22 15:55:26 +08:00
return;
}
if (!IsVaulting && MainPed.IsVaulting)
{
MainPed.Task.ClearAllImmediately();
}
if (IsOnFire && !MainPed.IsOnFire)
{
2022-07-17 20:12:25 +08:00
Function.Call(Hash.START_ENTITY_FIRE, MainPed);
2022-05-22 15:55:26 +08:00
}
else if (!IsOnFire && MainPed.IsOnFire)
{
2022-07-17 20:12:25 +08:00
Function.Call(Hash.STOP_ENTITY_FIRE, MainPed);
2022-05-22 15:55:26 +08:00
}
if (IsJumping)
{
if (!_lastIsJumping)
{
_lastIsJumping = true;
MainPed.Task.Jump();
}
SmoothTransition();
return;
}
_lastIsJumping = false;
2022-09-06 21:46:35 +08:00
if (IsRagdoll || Health == 0)
2022-05-22 15:55:26 +08:00
{
if (!MainPed.IsRagdoll)
{
MainPed.Ragdoll();
}
SmoothTransition();
if (!_lastRagdoll)
{
_lastRagdoll = true;
2022-09-06 21:46:35 +08:00
_lastRagdollTime = Main.Ticked;
2022-05-22 15:55:26 +08:00
}
return;
}
2022-09-05 13:02:09 +02:00
if (MainPed.IsRagdoll)
2022-05-22 15:55:26 +08:00
{
2022-09-05 13:02:09 +02:00
if (Speed == 0)
2022-05-22 15:55:26 +08:00
{
2022-09-05 13:02:09 +02:00
MainPed.CancelRagdoll();
}
else
{
MainPed.Task.ClearAllImmediately();
2022-05-22 15:55:26 +08:00
}
2022-08-11 14:48:19 +02:00
_lastRagdoll = false;
2022-09-05 13:02:09 +02:00
return;
2022-08-11 14:48:19 +02:00
}
2022-05-22 15:55:26 +08:00
if (IsReloading)
{
if (!MainPed.IsTaskActive(TaskType.CTaskReloadGun))
{
MainPed.Task.ReloadWeapon();
}
/*
2022-05-22 15:55:26 +08:00
if (!_isPlayingAnimation)
{
string[] reloadingAnim = MainPed.GetReloadingAnimation();
if (reloadingAnim != null)
{
_isPlayingAnimation = true;
_currentAnimation = reloadingAnim;
MainPed.Task.PlayAnimation(_currentAnimation[0], _currentAnimation[1], 8f, -1, AnimationFlags.AllowRotation | AnimationFlags.UpperBodyOnly);
}
}
*/
2022-05-23 19:19:56 +08:00
SmoothTransition();
2022-05-22 15:55:26 +08:00
}
else if (IsInCover)
{
if (!_lastInCover)
{
Function.Call(Hash.TASK_STAY_IN_COVER, MainPed.Handle);
}
2022-09-06 21:46:35 +08:00
_lastInCover = true;
2022-05-22 15:55:26 +08:00
if (IsAiming)
{
DisplayAiming();
2022-09-06 21:46:35 +08:00
_lastInCover = false;
2022-05-22 15:55:26 +08:00
}
else if (MainPed.IsInCover)
{
SmoothTransition();
}
}
else if (_lastInCover)
{
MainPed.Task.ClearAllImmediately();
2022-09-06 21:46:35 +08:00
_lastInCover = false;
2022-05-22 15:55:26 +08:00
}
else if (IsAiming)
{
DisplayAiming();
}
else if (MainPed.IsShooting)
{
MainPed.Task.ClearAllImmediately();
}
else
{
WalkTo();
}
}
private void CheckCurrentWeapon()
{
2022-09-06 21:46:35 +08:00
if (MainPed.Weapons.Current.Hash != (WeaponHash)CurrentWeaponHash || !WeaponComponents.Compare(_lastWeaponComponents) || (Speed <= 3 && _weaponObj?.IsVisible != true))
2022-05-22 15:55:26 +08:00
{
2022-08-24 22:38:50 +08:00
new WeaponAsset(CurrentWeaponHash).Request();
2022-09-06 21:46:35 +08:00
MainPed.Weapons.RemoveAll();
_weaponObj = Entity.FromHandle(Function.Call<int>(Hash.CREATE_WEAPON_OBJECT, CurrentWeaponHash, -1, Position.X, Position.Y, Position.Z, true, 0, 0));
if (_weaponObj == null) { return; }
2022-05-22 15:55:26 +08:00
if (CurrentWeaponHash != (uint)WeaponHash.Unarmed)
{
if (WeaponComponents != null && WeaponComponents.Count != 0)
2022-05-22 15:55:26 +08:00
{
foreach (KeyValuePair<uint, bool> comp in WeaponComponents)
{
if (comp.Value)
{
Function.Call(Hash.GIVE_WEAPON_COMPONENT_TO_WEAPON_OBJECT, _weaponObj, comp.Key);
2022-05-22 15:55:26 +08:00
}
}
}
Function.Call(Hash.GIVE_WEAPON_OBJECT_TO_PED, _weaponObj, MainPed.Handle);
2022-05-22 15:55:26 +08:00
}
_lastWeaponComponents = WeaponComponents;
}
2022-09-06 21:46:35 +08:00
if (Function.Call<int>(Hash.GET_PED_WEAPON_TINT_INDEX, MainPed, CurrentWeaponHash) != WeaponTint)
2022-06-19 11:47:39 +08:00
{
Function.Call<int>(Hash.SET_PED_WEAPON_TINT_INDEX, MainPed, CurrentWeaponHash, WeaponTint);
}
2022-05-22 15:55:26 +08:00
}
private void DisplayAiming()
{
2022-09-06 21:46:35 +08:00
if (Velocity == default)
2022-05-22 15:55:26 +08:00
{
2022-07-20 17:50:01 +08:00
MainPed.Task.AimAt(AimCoords, 1000);
2022-05-22 15:55:26 +08:00
}
else
{
Function.Call(Hash.TASK_GO_TO_COORD_WHILE_AIMING_AT_COORD, MainPed.Handle,
2022-09-06 21:46:35 +08:00
Position.X + Velocity.X, Position.Y + Velocity.Y, Position.Z + Velocity.Z,
2022-05-22 15:55:26 +08:00
AimCoords.X, AimCoords.Y, AimCoords.Z, 3f, false, 0x3F000000, 0x40800000, false, 512, false, 0);
}
SmoothTransition();
}
private void WalkTo()
{
MainPed.Task.ClearAll();
2022-07-17 14:23:19 +08:00
Function.Call(Hash.SET_PED_STEALTH_MOVEMENT, MainPed, IsInStealthMode, 0);
2022-09-06 21:46:35 +08:00
Vector3 predictPosition = Predict(Position) + Velocity;
float range = predictPosition.DistanceToSquared(MainPed.ReadPosition());
2022-05-22 15:55:26 +08:00
switch (Speed)
{
case 1:
if (!MainPed.IsWalking || range > 0.25f)
{
float nrange = range * 2;
if (nrange > 1.0f)
{
nrange = 1.0f;
}
MainPed.Task.GoStraightTo(predictPosition);
Function.Call(Hash.SET_PED_DESIRED_MOVE_BLEND_RATIO, MainPed.Handle, nrange);
}
LastMoving = true;
break;
case 2:
if (!MainPed.IsRunning || range > 0.50f)
{
MainPed.Task.RunTo(predictPosition, true);
Function.Call(Hash.SET_PED_DESIRED_MOVE_BLEND_RATIO, MainPed.Handle, 1.0f);
}
LastMoving = true;
break;
case 3:
if (!MainPed.IsSprinting || range > 0.75f)
{
Function.Call(Hash.TASK_GO_STRAIGHT_TO_COORD, MainPed.Handle, predictPosition.X, predictPosition.Y, predictPosition.Z, 3.0f, -1, 0.0f, 0.0f);
Function.Call(Hash.SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER, MainPed.Handle, 1.49f);
Function.Call(Hash.SET_PED_DESIRED_MOVE_BLEND_RATIO, MainPed.Handle, 1.0f);
}
LastMoving = true;
break;
default:
if (LastMoving)
{
MainPed.Task.StandStill(2000);
LastMoving = false;
}
break;
}
SmoothTransition();
}
private void SmoothTransition()
{
var localRagdoll = MainPed.IsRagdoll;
2022-08-22 21:59:01 +08:00
var predicted = Predict(Position);
var dist = predicted.DistanceTo(MainPed.ReadPosition());
if (IsOff(dist))
2022-05-22 15:55:26 +08:00
{
2022-09-06 21:46:35 +08:00
MainPed.PositionNoOffset = predicted;
2022-05-22 15:55:26 +08:00
return;
}
2022-08-14 17:08:43 +08:00
if (!(localRagdoll || MainPed.IsDead))
2022-05-22 15:55:26 +08:00
{
2022-08-15 20:04:08 +08:00
if (!IsAiming && !MainPed.IsGettingUp)
2022-08-14 17:08:43 +08:00
{
2022-09-06 21:46:35 +08:00
var cur = MainPed.Heading;
var diff = Heading - cur;
2022-08-22 21:59:01 +08:00
if (diff > 180) { diff -= 360; }
else if (diff < -180) { diff += 360; }
2022-09-06 21:46:35 +08:00
MainPed.Heading = cur + diff / 2;
2022-08-14 17:08:43 +08:00
}
2022-08-22 21:59:01 +08:00
MainPed.Velocity = Velocity + 5 * dist * (predicted - MainPed.ReadPosition());
2022-05-22 15:55:26 +08:00
}
2022-09-06 21:46:35 +08:00
else if (Main.Ticked - _lastRagdollTime < 10)
2022-05-22 15:55:26 +08:00
{
return;
}
2022-07-17 18:44:16 +08:00
else if (IsRagdoll)
{
var helper = new GTA.NaturalMotion.ApplyImpulseHelper(MainPed);
var head = MainPed.Bones[Bone.SkelHead];
var rightFoot = MainPed.Bones[Bone.SkelRightFoot];
var leftFoot = MainPed.Bones[Bone.SkelLeftFoot];
2022-08-23 10:55:54 +08:00
Vector3 amount;
2022-07-17 18:44:16 +08:00
// 20:head, 3:left foot, 6:right foot, 17:right hand,
2022-09-06 21:46:35 +08:00
amount = 20 * (Predict(HeadPosition) - head.Position);
2022-08-23 10:55:54 +08:00
if (amount.Length() > 50) { amount = amount.Normalized * 50; }
2022-07-17 18:44:16 +08:00
helper.EqualizeAmount = 1;
2022-09-06 21:46:35 +08:00
helper.PartIndex = 20;
2022-08-23 10:55:54 +08:00
helper.Impulse = amount;
2022-07-17 18:44:16 +08:00
helper.Start();
helper.Stop();
2022-08-23 10:55:54 +08:00
amount = 20 * (Predict(RightFootPosition) - rightFoot.Position);
if (amount.Length() > 50) { amount = amount.Normalized * 50; }
2022-07-17 18:44:16 +08:00
helper.EqualizeAmount = 1;
2022-09-06 21:46:35 +08:00
helper.PartIndex = 6;
2022-08-23 10:55:54 +08:00
helper.Impulse = amount;
2022-07-17 18:44:16 +08:00
helper.Start();
helper.Stop();
2022-08-23 10:55:54 +08:00
amount = 20 * (Predict(LeftFootPosition) - leftFoot.Position);
if (amount.Length() > 50) { amount = amount.Normalized * 50; }
2022-07-17 18:44:16 +08:00
helper.EqualizeAmount = 1;
2022-09-06 21:46:35 +08:00
helper.PartIndex = 3;
2022-08-23 10:55:54 +08:00
helper.Impulse = amount;
2022-07-17 18:44:16 +08:00
helper.Start();
helper.Stop();
}
else
{
2022-08-23 10:55:54 +08:00
// localRagdoll
2022-09-06 21:46:35 +08:00
var force = Velocity - MainPed.Velocity + 5 * dist * (predicted - MainPed.ReadPosition());
if (force.Length() > 20) { force = force.Normalized * 20; }
2022-08-23 10:55:54 +08:00
MainPed.ApplyForce(force);
2022-07-17 18:44:16 +08:00
}
2022-05-22 15:55:26 +08:00
}
2022-07-17 14:23:19 +08:00
private void DisplayInVehicle()
{
2022-09-06 21:46:35 +08:00
if (CurrentVehicle?.MainVehicle == null) { return; }
switch (Speed)
2022-08-08 17:29:15 +08:00
{
case 4:
2022-09-06 21:46:35 +08:00
if (MainPed.CurrentVehicle != CurrentVehicle.MainVehicle || MainPed.SeatIndex != Seat || (!MainPed.IsSittingInVehicle() && !MainPed.IsBeingJacked))
{
MainPed.SetIntoVehicle(CurrentVehicle.MainVehicle, Seat);
}
if (MainPed.IsOnTurretSeat())
{
// Function.Call(Hash.SET_VEHICLE_TURRET_SPEED_THIS_FRAME, MainPed.CurrentVehicle, 100);
Function.Call(Hash.TASK_VEHICLE_AIM_AT_COORD, MainPed.Handle, AimCoords.X, AimCoords.Y, AimCoords.Z);
}
2022-09-06 21:46:35 +08:00
if (MainPed.VehicleWeapon == VehicleWeaponHash.Invalid)
{
// World.DrawMarker(MarkerType.DebugSphere,AimCoords,default,default,new Vector3(0.2f,0.2f,0.2f),Color.AliceBlue);
if (IsAiming)
{
2022-08-15 19:39:36 +08:00
Function.Call(Hash.SET_DRIVEBY_TASK_TARGET, MainPed, 0, 0, AimCoords.X, AimCoords.Y, AimCoords.Z);
if (!_lastDriveBy)
{
2022-09-06 21:46:35 +08:00
_lastDriveBy = true;
2022-08-15 19:39:36 +08:00
Function.Call(Hash.TASK_DRIVE_BY, MainPed, 0, 0, AimCoords.X, AimCoords.Y, AimCoords.Z, 1, 100, 1, FiringPattern.SingleShot);
}
}
else if (_lastDriveBy || MainPed.IsTaskActive(TaskType.CTaskAimGunVehicleDriveBy))
{
MainPed.Task.ClearAll();
2022-09-06 21:46:35 +08:00
_lastDriveBy = false;
}
2022-08-15 19:39:36 +08:00
}
2022-09-06 21:46:35 +08:00
else if (MainPed.VehicleWeapon != (VehicleWeaponHash)CurrentWeaponHash)
{
2022-09-06 21:46:35 +08:00
MainPed.VehicleWeapon = (VehicleWeaponHash)CurrentWeaponHash;
}
break;
case 5:
2022-09-06 21:46:35 +08:00
if (MainPed.VehicleTryingToEnter != CurrentVehicle.MainVehicle || MainPed.GetSeatTryingToEnter() != Seat)
{
2023-07-26 15:12:58 -03:00
MainPed.Task.EnterVehicle(CurrentVehicle.MainVehicle, Seat, -1, 5, EnterVehicleFlags.JackAnyone);
}
break;
case 6:
if (!MainPed.IsTaskActive(TaskType.CTaskExitVehicle))
{
2022-09-06 21:46:35 +08:00
MainPed.Task.LeaveVehicle(CurrentVehicle.Velocity.Length() > 5f ? LeaveVehicleFlags.BailOut : LeaveVehicleFlags.None);
}
break;
2022-08-08 17:29:15 +08:00
}
2022-06-20 10:27:45 +08:00
/*
Function.Call(Hash.SET_PED_STEALTH_MOVEMENT, P,true, 0);
return Function.Call<bool>(Hash.GET_PED_STEALTH_MOVEMENT, P);
*/
}
2022-05-22 15:55:26 +08:00
}
}