Some stuff

This commit is contained in:
sausage
2022-05-23 19:19:56 +08:00
parent 118725e949
commit 7854a47569
8 changed files with 101 additions and 97 deletions

View File

@ -37,6 +37,7 @@ namespace RageCoop.Client
DiagnosticMenu.Opening+=(sender, e) =>
{
DiagnosticMenu.Clear();
DiagnosticMenu.Add(new NativeItem("EntityPool", EntityPool.DumpDebug()));
foreach (var pair in Debug.TimeStamps)
{
DiagnosticMenu.Add(new NativeItem(pair.Key.ToString(), pair.Value.ToString(), pair.Value.ToString()));

View File

@ -133,6 +133,7 @@
<None Include="packages.config" />
<Compile Include="Sync\Entities\SyncedProjectile.cs" />
<Compile Include="Sync\EntityPool.cs" />
<Compile Include="Sync\EventArgs\ProjectileShotEventArgs.cs" />
<Compile Include="Sync\SyncEvents.cs" />
<Compile Include="Sync\Entities\SyncedEntity.cs" />
<Compile Include="Sync\Entities\SyncedVehicle.cs" />

View File

@ -89,7 +89,7 @@ namespace RageCoop.Client
public override void Update()
{
if (IsPlayer &&PedBlip!=null)
if (IsPlayer && PedBlip!=null)
{
if (Username=="N/A")
@ -427,7 +427,7 @@ namespace RageCoop.Client
MainPed.Task.Climb();
}
UpdateOnFootPosition(true, true, false);
SmoothTransition();
return;
}
@ -514,7 +514,7 @@ namespace RageCoop.Client
MainPed.Task.PlayAnimation(_currentAnimation[0], _currentAnimation[1], 8f, -1, AnimationFlags.AllowRotation | AnimationFlags.UpperBodyOnly);
}
}
UpdateOnFootPosition();
SmoothTransition();
}
else if (_currentAnimation[1] == "reload_aim")
{
@ -671,56 +671,6 @@ namespace RageCoop.Client
SmoothTransition();
}
private void UpdateOnFootPosition(bool updatePosition = true, bool updateRotation = true, bool updateVelocity = true)
{
/*
ulong time = Util.GetTickCount64();
if (StuckDetection)
{
if (time - LastStuckTime >= 500)
{
StuckDetection = false;
if (Character.Position.DistanceTo(Position) > 5f)
{
Character.PositionNoOffset = Position;
Character.Rotation = Rotation;
}
}
}
else if (time - LastStuckTime >= 500)
{
if (Character.Position.DistanceTo(Position) > 5f)
{
StuckDetection = true;
LastStuckTime = time;
}
}
*/
if (updatePosition)
{
MainPed.PositionNoOffset = Position;
/*
float lerpValue = (int)((Latency * 1000 / 2) + (Networking.Latency * 1000 / 2)) * 2 / 50000f;
Vector2 biDimensionalPos = Vector2.Lerp(new Vector2(Character.Position.X, Character.Position.Y), new Vector2(Position.X + (Velocity.X / 5), Position.Y + (Velocity.Y / 5)), lerpValue);
float zPos = Util.Lerp(Character.Position.Z, Position.Z, 0.1f);
Character.PositionNoOffset = new Vector3(biDimensionalPos.X, biDimensionalPos.Y, zPos);
*/
}
if (updateRotation)
{
// You can find the ToQuaternion() for Rotation inside the VectorExtensions
MainPed.Quaternion = Rotation.ToQuaternion();
}
if (updateVelocity)
{
MainPed.Velocity = Velocity;
}
}
private void SmoothTransition()
{
var localRagdoll = MainPed.IsRagdoll;

View File

@ -5,14 +5,17 @@ using System.Text;
using System.Threading.Tasks;
using GTA;
namespace RageCoop.Client.Sync.Entities
namespace RageCoop.Client
{
internal class SyncedProjectile:SyncedEntity
{
public bool Exploded { get; set; } = false;
public Projectile MainProjectile { get; set; }
public int ShooterID { get; set; }
public WeaponHash Hash { get; set; }
private WeaponAsset Asset;
private WeaponAsset Asset { get; set; }
private bool _creatingProjectile{ get;set; }=false;
private ulong _projectileShotTime { get;set; }
public override void Update()
{
// Check if all data avalible
@ -20,10 +23,18 @@ namespace RageCoop.Client.Sync.Entities
// Skip update if no new sync message has arrived.
if (!NeedUpdate)
{ return; }
if (_creatingProjectile) { return; }
if (MainProjectile == null || !MainProjectile.Exists())
{
CreateProjectile();
return;
}
MainProjectile.Position=Position+Velocity*Networking.Latency;
MainProjectile.Velocity=Velocity;
MainProjectile.Rotation=Rotation;
if (Exploded)
{
if (Exploded)
@ -35,23 +46,35 @@ namespace RageCoop.Client.Sync.Entities
}
}
}
else
{
if (MainProjectile != null && MainProjectile.Exists())
{
MainProjectile.Position=Position+Velocity*Networking.Latency;
MainProjectile.Velocity=Velocity;
}
else
{
CreateProjectile();
}
}
}
private void CreateProjectile()
{
throw new NotImplementedException();
Asset=new WeaponAsset(Hash);
if (!Asset.IsLoaded) { Asset.Request(); }
World.ShootBullet(Position,Position+Velocity,EntityPool.GetPedByID(ShooterID)?.MainPed,Asset,0,Velocity.Length());
_projectileShotTime=Main.Ticked;
_creatingProjectile=true;
EventHandler<ProjectileShotEventArgs> checker = null;
checker= (sender, e) =>
{
if (Main.Ticked<=_projectileShotTime+1)
{
if (e.Projectile.WeaponHash==Hash)
{
MainProjectile=e.Projectile;
_creatingProjectile=false;
SyncEvents.OnProjectileShot-=checker;
}
}
else
{
_creatingProjectile=false;
SyncEvents.OnProjectileShot-=checker;
}
};
SyncEvents.OnProjectileShot+=checker;
}
}
}

View File

@ -144,29 +144,6 @@ namespace RageCoop.Client
MainVehicle.Position=Position;
MainVehicle.Velocity=Velocity;
}
#region OBSOLETE
// Good enough for now, but we need to create a better sync
/*
float dist = Position.DistanceTo(MainVehicle.Position);
Vector3 f = 5*dist * (Position+Velocity*0.06f - (MainVehicle.Position+MainVehicle.Velocity*delay));
if (dist < 5f)
{
// Precised calibration
if (Velocity.Length()<0.05) { f*=10f; }
else if (dist<1)
{
// Avoid vibration
f+=(Velocity-MainVehicle.Velocity);
}
MainVehicle.ApplyForce(f);
}
else
{
MainVehicle.PositionNoOffset = Position;
}
*/
#endregion
Vector3 r = GetCalibrationRotation();
if (r.Length() < 20f)
{

View File

@ -66,7 +66,6 @@ namespace RageCoop.Client
if (player.MainPed!=p)
{
// Player model changed
player.MainPed = p;
// Remove it from Handle_Characters
@ -74,6 +73,7 @@ namespace RageCoop.Client
if (pairs.Any())
{
var pair=pairs.First();
// Re-add
Handle_Peds.Remove(pair.Key);
if (Handle_Peds.ContainsKey(p.Handle))
@ -192,6 +192,8 @@ namespace RageCoop.Client
}
}
public static bool Exists(int id)
{
return ID_Peds.ContainsKey(id) || ID_Vehicles.ContainsKey(id);
@ -355,5 +357,14 @@ namespace RageCoop.Client
Function.Call(Hash.SET_PED_POPULATION_BUDGET, b); // 0 - 3
Function.Call(Hash.SET_VEHICLE_POPULATION_BUDGET, b); // 0 - 3
}
public static string DumpDebug()
{
string s= "";
s+="\nID_Peds: "+ID_Peds.Count;
s+="\nHandle_Peds: "+Handle_Peds.Count;
s+="\nID_Vehicles: "+ID_Vehicles.Count;
s+="\nHandle_Vehicles: "+Handle_Vehicles.Count;
return s;
}
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GTA;
namespace RageCoop.Client
{
internal class ProjectileShotEventArgs:EventArgs
{
public bool IsMine { get; set; }
public Projectile Projectile { get; set; }
}
}

View File

@ -12,6 +12,17 @@ using System.Threading;
namespace RageCoop.Client {
internal static class SyncEvents
{
public static event EventHandler<ProjectileShotEventArgs> OnProjectileShot;
static SyncEvents() {
OnProjectileShot+=(s, e) =>
{
if (e.IsMine)
{
TriggerProjectileShot(e.Projectile);
}
};
}
#region TRIGGER
public static void TriggerPedKilled(SyncedPed victim)
{
@ -267,12 +278,28 @@ namespace RageCoop.Client {
_projectileShot=false;
foreach (Projectile p in projectiles)
{
var owner = p.Owner.GetSyncEntity();
if ((!lastProjectiles.Contains(p)) && (owner!=null) && owner.IsMine)
var owner = p.Owner?.GetSyncEntity();
if (!lastProjectiles.Contains(p))
{
TriggerProjectileShot(p);
_projectileShot=true;
if((owner!=null) && owner.IsMine)
{
_projectileShot=true;
OnProjectileShot?.Invoke(null, new ProjectileShotEventArgs()
{
Projectile=p,
IsMine=true
}) ;
}
else
{
OnProjectileShot?.Invoke(null, new ProjectileShotEventArgs()
{
Projectile=p,
IsMine=false
});
}
}
}
lastProjectiles=projectiles;