2022-07-20 17:50:01 +08:00
|
|
|
|
using GTA;
|
2022-05-22 15:55:26 +08:00
|
|
|
|
using GTA.Math;
|
2022-09-06 21:46:35 +08:00
|
|
|
|
using Lidgren.Network;
|
2022-05-22 15:55:26 +08:00
|
|
|
|
using RageCoop.Core;
|
2022-07-20 17:50:01 +08:00
|
|
|
|
using System;
|
2022-05-22 15:55:26 +08:00
|
|
|
|
|
2022-07-20 17:50:01 +08:00
|
|
|
|
namespace RageCoop.Client
|
|
|
|
|
{
|
2022-05-22 15:55:26 +08:00
|
|
|
|
internal static class SyncEvents
|
|
|
|
|
{
|
2022-10-09 11:15:09 +08:00
|
|
|
|
|
2022-05-22 15:55:26 +08:00
|
|
|
|
#region TRIGGER
|
|
|
|
|
public static void TriggerPedKilled(SyncedPed victim)
|
|
|
|
|
{
|
2022-09-06 21:46:35 +08:00
|
|
|
|
Networking.SendSync(new Packets.PedKilled() { VictimID = victim.ID }, ConnectionChannel.SyncEvents);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-08-13 16:14:18 +08:00
|
|
|
|
public static void TriggerChangeOwner(int vehicleID, int newOwnerID)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-05-23 15:48:02 +08:00
|
|
|
|
|
2022-08-11 16:25:38 +08:00
|
|
|
|
Networking.SendSync(new Packets.OwnerChanged()
|
2022-05-23 15:48:02 +08:00
|
|
|
|
{
|
2022-09-06 21:46:35 +08:00
|
|
|
|
ID = vehicleID,
|
|
|
|
|
NewOwnerID = newOwnerID,
|
|
|
|
|
}, ConnectionChannel.SyncEvents, NetDeliveryMethod.ReliableOrdered);
|
2022-05-23 15:48:02 +08:00
|
|
|
|
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-07-20 17:50:01 +08:00
|
|
|
|
public static void TriggerBulletShot(uint hash, SyncedPed owner, Vector3 impactPosition)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-07-01 12:22:31 +08:00
|
|
|
|
// Main.Logger.Trace($"bullet shot:{(WeaponHash)hash}");
|
2022-05-25 10:09:59 +08:00
|
|
|
|
|
2022-05-22 15:55:26 +08:00
|
|
|
|
|
|
|
|
|
var start = owner.MainPed.GetMuzzlePosition();
|
2022-09-06 21:46:35 +08:00
|
|
|
|
if (owner.MainPed.IsOnTurretSeat()) { start = owner.MainPed.Bones[Bone.SkelHead].Position; }
|
|
|
|
|
if (start.DistanceTo(impactPosition) > 10)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
|
|
|
|
// Reduce latency
|
2022-09-06 21:46:35 +08:00
|
|
|
|
start = impactPosition - (impactPosition - start).Normalized * 10;
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
2022-08-14 13:04:39 +08:00
|
|
|
|
Networking.SendBullet(start, impactPosition, hash, owner.ID);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-27 14:33:33 +08:00
|
|
|
|
public static void TriggerVehBulletShot(uint hash, Vehicle veh, SyncedPed owner)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-08-14 13:04:39 +08:00
|
|
|
|
|
|
|
|
|
int i;
|
2022-05-27 14:33:33 +08:00
|
|
|
|
// ANNIHL
|
2022-09-06 21:46:35 +08:00
|
|
|
|
if (veh.Model.Hash == 837858166)
|
2022-05-27 14:33:33 +08:00
|
|
|
|
{
|
2022-08-14 13:04:39 +08:00
|
|
|
|
Networking.SendVehicleBullet(hash, owner, veh.Bones[35]);
|
|
|
|
|
Networking.SendVehicleBullet(hash, owner, veh.Bones[36]);
|
|
|
|
|
Networking.SendVehicleBullet(hash, owner, veh.Bones[37]);
|
|
|
|
|
Networking.SendVehicleBullet(hash, owner, veh.Bones[38]);
|
|
|
|
|
}
|
2022-09-06 21:46:35 +08:00
|
|
|
|
else if ((i = veh.GetMuzzleIndex()) != -1)
|
2022-08-14 13:04:39 +08:00
|
|
|
|
{
|
|
|
|
|
Networking.SendVehicleBullet(hash, owner, veh.Bones[i]);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Main.Logger.Warning($"Failed to get muzzle info for vehicle:{veh.DisplayName}");
|
2022-05-27 14:33:33 +08:00
|
|
|
|
}
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
2022-07-20 17:50:01 +08:00
|
|
|
|
public static void TriggerNozzleTransform(int vehID, bool hover)
|
2022-05-29 18:16:32 +08:00
|
|
|
|
{
|
2022-09-06 21:46:35 +08:00
|
|
|
|
Networking.SendSync(new Packets.NozzleTransform() { VehicleID = vehID, Hover = hover }, ConnectionChannel.SyncEvents);
|
2022-05-29 18:16:32 +08:00
|
|
|
|
}
|
2022-05-22 15:55:26 +08:00
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region HANDLE
|
|
|
|
|
|
2022-06-02 15:51:58 +08:00
|
|
|
|
public static ParticleEffectAsset CorePFXAsset = new ParticleEffectAsset("core");
|
2022-09-06 21:46:35 +08:00
|
|
|
|
private static WeaponAsset _weaponAsset = default;
|
|
|
|
|
private static uint _lastWeaponHash;
|
2022-05-29 18:16:32 +08:00
|
|
|
|
|
2022-05-26 17:11:37 +08:00
|
|
|
|
private static void HandlePedKilled(Packets.PedKilled p)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
|
|
|
|
EntityPool.GetPedByID(p.VictimID)?.MainPed?.Kill();
|
|
|
|
|
}
|
2022-05-26 17:11:37 +08:00
|
|
|
|
private static void HandleOwnerChanged(Packets.OwnerChanged p)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
|
|
|
|
var v = EntityPool.GetVehicleByID(p.ID);
|
2022-09-06 21:46:35 +08:00
|
|
|
|
if (v == null) { return; }
|
|
|
|
|
v.OwnerID = p.NewOwnerID;
|
|
|
|
|
v.LastSynced = Main.Ticked;
|
|
|
|
|
v.Position = v.MainVehicle.Position;
|
|
|
|
|
v.Quaternion = v.MainVehicle.Quaternion;
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
2022-05-29 18:16:32 +08:00
|
|
|
|
private static void HandleNozzleTransform(Packets.NozzleTransform p)
|
|
|
|
|
{
|
|
|
|
|
EntityPool.GetVehicleByID(p.VehicleID)?.MainVehicle?.SetNozzleAngel(p.Hover ? 1 : 0);
|
|
|
|
|
}
|
2022-05-26 17:11:37 +08:00
|
|
|
|
private static void HandleBulletShot(Vector3 start, Vector3 end, uint weaponHash, int ownerID)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-06-02 10:34:33 +08:00
|
|
|
|
switch (weaponHash)
|
|
|
|
|
{
|
|
|
|
|
// Minigun, not working for some reason
|
|
|
|
|
case (uint)WeaponHash.Minigun:
|
2022-09-06 21:46:35 +08:00
|
|
|
|
weaponHash = 1176362416;
|
2022-06-02 10:34:33 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// Valkyire, not working for some reason
|
|
|
|
|
case 2756787765:
|
2022-09-06 21:46:35 +08:00
|
|
|
|
weaponHash = 1176362416;
|
2022-07-02 13:12:59 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// Tampa3, not working for some reason
|
|
|
|
|
case 3670375085:
|
2022-09-06 21:46:35 +08:00
|
|
|
|
weaponHash = 1176362416;
|
2022-07-02 13:21:55 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// Ruiner2, not working for some reason
|
|
|
|
|
case 50118905:
|
2022-09-06 21:46:35 +08:00
|
|
|
|
weaponHash = 1176362416;
|
2022-06-02 10:34:33 +08:00
|
|
|
|
break;
|
|
|
|
|
|
2022-06-02 13:09:13 +08:00
|
|
|
|
// SAVAGE
|
|
|
|
|
case 1638077257:
|
2022-09-06 21:46:35 +08:00
|
|
|
|
weaponHash = (uint)VehicleWeaponHash.PlayerLazer;
|
2022-06-02 13:09:13 +08:00
|
|
|
|
break;
|
2022-07-20 17:50:01 +08:00
|
|
|
|
|
2022-06-02 10:34:33 +08:00
|
|
|
|
case (uint)VehicleWeaponHash.PlayerBuzzard:
|
2022-09-06 21:46:35 +08:00
|
|
|
|
weaponHash = 1176362416;
|
2022-07-20 17:50:01 +08:00
|
|
|
|
break;
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
2022-06-02 10:34:33 +08:00
|
|
|
|
|
2022-05-22 15:55:26 +08:00
|
|
|
|
var p = EntityPool.GetPedByID(ownerID)?.MainPed;
|
2022-09-06 21:46:35 +08:00
|
|
|
|
if (p == null) { p = Game.Player.Character; Main.Logger.Warning("Failed to find owner for bullet"); }
|
2022-06-02 10:34:33 +08:00
|
|
|
|
if (!CorePFXAsset.IsLoaded) { CorePFXAsset.Request(); }
|
2022-09-06 21:46:35 +08:00
|
|
|
|
if (_lastWeaponHash != weaponHash)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-05-31 10:11:06 +08:00
|
|
|
|
_weaponAsset.MarkAsNoLongerNeeded();
|
2022-09-06 21:46:35 +08:00
|
|
|
|
_weaponAsset = new WeaponAsset(weaponHash);
|
|
|
|
|
_lastWeaponHash = weaponHash;
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
if (!_weaponAsset.IsLoaded) { _weaponAsset.Request(); }
|
2022-06-17 11:08:49 +08:00
|
|
|
|
World.ShootBullet(start, end, p, _weaponAsset, (int)p.GetWeaponDamage(weaponHash));
|
2022-06-02 10:34:33 +08:00
|
|
|
|
Prop w;
|
2022-09-06 21:46:35 +08:00
|
|
|
|
if (((w = p.Weapons.CurrentWeaponObject) != null) && (p.VehicleWeapon == VehicleWeaponHash.Invalid))
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
|
|
|
|
if (p.Weapons.Current.Components.GetSuppressorComponent().Active)
|
|
|
|
|
{
|
|
|
|
|
World.CreateParticleEffectNonLooped(CorePFXAsset, "muz_pistol_silencer", p.GetMuzzlePosition(), w.Rotation, 1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2022-08-14 13:04:39 +08:00
|
|
|
|
World.CreateParticleEffectNonLooped(CorePFXAsset, WeaponUtil.GetFlashFX((WeaponHash)weaponHash), p.GetMuzzlePosition(), w.Rotation, 1);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-08-14 13:04:39 +08:00
|
|
|
|
}
|
|
|
|
|
public static void HandleVehicleBulletShot(Packets.VehicleBulletShot p)
|
|
|
|
|
{
|
2022-09-06 21:46:35 +08:00
|
|
|
|
HandleBulletShot(p.StartPosition, p.EndPosition, p.WeaponHash, p.OwnerID);
|
2022-08-14 13:04:39 +08:00
|
|
|
|
var v = EntityPool.GetPedByID(p.OwnerID)?.MainPed.CurrentVehicle;
|
2022-09-06 21:46:35 +08:00
|
|
|
|
if (v == null) { return; }
|
2022-08-14 13:04:39 +08:00
|
|
|
|
var b = v.Bones[p.Bone];
|
2022-09-06 21:46:35 +08:00
|
|
|
|
World.CreateParticleEffectNonLooped(CorePFXAsset,
|
2022-08-14 13:04:39 +08:00
|
|
|
|
WeaponUtil.GetFlashFX((WeaponHash)p.WeaponHash),
|
2022-09-06 21:46:35 +08:00
|
|
|
|
b.Position, b.ForwardVector.ToEulerRotation(v.Bones[35].UpVector), 1);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
2022-09-08 12:41:56 -07:00
|
|
|
|
public static void HandleEvent(PacketType type, NetIncomingMessage msg)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
|
|
|
|
switch (type)
|
|
|
|
|
{
|
2022-07-01 12:22:31 +08:00
|
|
|
|
case PacketType.BulletShot:
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
|
|
|
|
Packets.BulletShot p = new Packets.BulletShot();
|
2022-09-08 12:37:06 -07:00
|
|
|
|
p.Deserialize(msg);
|
2022-05-30 14:32:38 +08:00
|
|
|
|
HandleBulletShot(p.StartPosition, p.EndPosition, p.WeaponHash, p.OwnerID);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
2022-08-14 13:04:39 +08:00
|
|
|
|
case PacketType.VehicleBulletShot:
|
|
|
|
|
{
|
2022-09-08 12:37:06 -07:00
|
|
|
|
HandleVehicleBulletShot(msg.GetPacket<Packets.VehicleBulletShot>());
|
2022-08-14 13:04:39 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
2022-07-01 12:22:31 +08:00
|
|
|
|
case PacketType.OwnerChanged:
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-09-08 12:37:06 -07:00
|
|
|
|
HandleOwnerChanged(msg.GetPacket<Packets.OwnerChanged>());
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
break;
|
2022-07-01 12:22:31 +08:00
|
|
|
|
case PacketType.PedKilled:
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-09-08 12:37:06 -07:00
|
|
|
|
HandlePedKilled(msg.GetPacket<Packets.PedKilled>());
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
break;
|
2022-07-01 12:22:31 +08:00
|
|
|
|
case PacketType.NozzleTransform:
|
2022-05-29 18:16:32 +08:00
|
|
|
|
{
|
2022-09-08 12:37:06 -07:00
|
|
|
|
HandleNozzleTransform(msg.GetPacket<Packets.NozzleTransform>());
|
2022-05-29 18:16:32 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
2022-09-08 12:37:06 -07:00
|
|
|
|
Networking.Peer.Recycle(msg);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region CHECK EVENTS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void Check(SyncedPed c)
|
|
|
|
|
{
|
|
|
|
|
Ped subject = c.MainPed;
|
2022-05-31 09:55:54 +08:00
|
|
|
|
|
|
|
|
|
// Check bullets
|
2022-05-27 14:33:33 +08:00
|
|
|
|
if (subject.IsShooting)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-05-27 14:33:33 +08:00
|
|
|
|
if (!subject.IsUsingProjectileWeapon())
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-05-27 14:33:33 +08:00
|
|
|
|
int i = 0;
|
|
|
|
|
Func<bool> getBulletImpact = (() =>
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-05-27 14:33:33 +08:00
|
|
|
|
Vector3 endPos = subject.LastWeaponImpactPosition;
|
2022-09-06 21:46:35 +08:00
|
|
|
|
if (endPos == default)
|
2022-05-27 14:33:33 +08:00
|
|
|
|
{
|
2022-09-06 21:46:35 +08:00
|
|
|
|
if (++i <= 5) { return false; }
|
2022-08-11 14:29:18 +02:00
|
|
|
|
|
|
|
|
|
endPos = subject.GetAimCoord();
|
|
|
|
|
if (subject.IsInVehicle() && subject.VehicleWeapon != VehicleWeaponHash.Invalid)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
|
|
|
|
if (subject.IsOnTurretSeat())
|
|
|
|
|
{
|
2022-07-20 17:50:01 +08:00
|
|
|
|
TriggerBulletShot((uint)subject.VehicleWeapon, c, endPos);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2022-07-20 17:50:01 +08:00
|
|
|
|
TriggerVehBulletShot((uint)subject.VehicleWeapon, subject.CurrentVehicle, c);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2022-07-20 17:50:01 +08:00
|
|
|
|
TriggerBulletShot((uint)subject.Weapons.Current.Hash, c, endPos);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2022-05-27 14:33:33 +08:00
|
|
|
|
|
2022-08-11 14:29:18 +02:00
|
|
|
|
if (subject.IsInVehicle() && subject.VehicleWeapon != VehicleWeaponHash.Invalid)
|
|
|
|
|
{
|
|
|
|
|
if (subject.IsOnTurretSeat())
|
|
|
|
|
{
|
|
|
|
|
TriggerBulletShot((uint)subject.VehicleWeapon, c, endPos);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
TriggerVehBulletShot((uint)subject.VehicleWeapon, subject.CurrentVehicle, c);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
TriggerBulletShot((uint)subject.Weapons.Current.Hash, c, endPos);
|
|
|
|
|
}
|
2022-05-27 14:33:33 +08:00
|
|
|
|
|
2022-08-11 14:29:18 +02:00
|
|
|
|
return true;
|
2022-05-27 14:33:33 +08:00
|
|
|
|
});
|
2022-08-11 14:29:18 +02:00
|
|
|
|
|
2022-05-27 14:33:33 +08:00
|
|
|
|
if (!getBulletImpact())
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-10-10 16:45:58 +08:00
|
|
|
|
Scripting.API.QueueAction(getBulletImpact);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
2022-05-27 14:33:33 +08:00
|
|
|
|
}
|
2022-09-06 21:46:35 +08:00
|
|
|
|
else if (subject.VehicleWeapon == VehicleWeaponHash.Tank && subject.LastWeaponImpactPosition != default)
|
2022-05-22 15:55:26 +08:00
|
|
|
|
{
|
2022-07-20 17:50:01 +08:00
|
|
|
|
TriggerBulletShot((uint)VehicleWeaponHash.Tank, c, subject.LastWeaponImpactPosition);
|
2022-05-22 15:55:26 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-07-20 17:50:01 +08:00
|
|
|
|
|
2022-05-29 18:16:32 +08:00
|
|
|
|
public static void Check(SyncedVehicle v)
|
|
|
|
|
{
|
2022-09-06 21:46:35 +08:00
|
|
|
|
if (v.MainVehicle == null || !v.MainVehicle.HasNozzle())
|
2022-05-29 18:16:32 +08:00
|
|
|
|
{
|
2022-08-11 14:29:18 +02:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((v.LastNozzleAngle == 1) && (v.MainVehicle.GetNozzleAngel() != 1))
|
|
|
|
|
{
|
|
|
|
|
TriggerNozzleTransform(v.ID, false);
|
|
|
|
|
}
|
|
|
|
|
else if ((v.LastNozzleAngle == 0) && (v.MainVehicle.GetNozzleAngel() != 0))
|
|
|
|
|
{
|
|
|
|
|
TriggerNozzleTransform(v.ID, true);
|
2022-05-29 18:16:32 +08:00
|
|
|
|
}
|
2022-08-11 14:29:18 +02:00
|
|
|
|
v.LastNozzleAngle = v.MainVehicle.GetNozzleAngel();
|
2022-05-29 18:16:32 +08:00
|
|
|
|
}
|
2022-05-22 15:55:26 +08:00
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|