using GTA; using GTA.Math; using GTA.Native; using Lidgren.Network; using RageCoop.Core; using System; using System.Collections.Generic; namespace RageCoop.Client { internal static partial class Networking { public static int SyncInterval = 30; public static List Targets = new List(); public static void SendSync(Packet p, ConnectionChannel channel = ConnectionChannel.Default, NetDeliveryMethod method = NetDeliveryMethod.UnreliableSequenced) { Peer.SendTo(p, Targets, channel, method); } public static void SendPed(SyncedPed c, bool full) { if (c.LastSentStopWatch.ElapsedMilliseconds(Hash.GET_PED_WEAPON_TINT_INDEX, p, p.Weapons.Current.Hash); Blip b; if (c.IsPlayer) { packet.BlipColor=Scripting.API.Config.BlipColor; packet.BlipSprite=Scripting.API.Config.BlipSprite; packet.BlipScale=Scripting.API.Config.BlipScale; } else if ((b = p.AttachedBlip) !=null) { packet.BlipColor=b.Color; packet.BlipSprite=b.Sprite; if (packet.BlipSprite==BlipSprite.PoliceOfficer || packet.BlipSprite==BlipSprite.PoliceOfficer2) { packet.BlipScale=0.5f; } } } SendSync(packet, ConnectionChannel.PedSync); } public static void SendVehicle(SyncedVehicle v, bool full) { if (v.LastSentStopWatch.ElapsedMilliseconds(Hash.GET_VEHICLE_COLOURS, veh, &primaryColor, &secondaryColor); } packet.Flags |= VehicleDataFlags.IsFullSync; packet.Colors = new byte[] { primaryColor, secondaryColor }; packet.DamageModel=veh.GetVehicleDamageModel(); packet.LandingGear = veh.IsAircraft ? (byte)veh.LandingGearState : (byte)0; packet.RoofState=(byte)veh.RoofState; packet.Mods = veh.Mods.GetVehicleMods(); packet.ModelHash=veh.Model.Hash; packet.EngineHealth=veh.EngineHealth; packet.Passengers=veh.GetPassengers(); packet.LockStatus=veh.LockStatus; packet.LicensePlate=Function.Call(Hash.GET_VEHICLE_NUMBER_PLATE_TEXT, veh); packet.Livery=Function.Call(Hash.GET_VEHICLE_LIVERY, veh); if (v.MainVehicle==Game.Player.LastVehicle) { packet.RadioStation=Util.GetPlayerRadioIndex(); } if (packet.EngineHealth>v.LastEngineHealth) { packet.Flags |= VehicleDataFlags.Repaired; } v.LastEngineHealth=packet.EngineHealth; } SendSync(packet, ConnectionChannel.VehicleSync); } public static void SendProjectile(SyncedProjectile sp) { var p = sp.MainProjectile; var packet = new Packets.ProjectileSync() { ID =sp.ID, ShooterID=sp.ShooterID, Rotation=p.Rotation, Position=p.Position, Velocity=p.Velocity, WeaponHash=(uint)p.WeaponHash, Exploded=p.IsDead }; if (p.IsDead) { EntityPool.RemoveProjectile(sp.ID, "Dead"); } SendSync(packet, ConnectionChannel.ProjectileSync); } #region SYNC EVENTS public static void SendBulletShot(Vector3 start, Vector3 end, uint weapon, int ownerID) { SendSync(new Packets.BulletShot() { StartPosition = start, EndPosition = end, OwnerID = ownerID, WeaponHash=weapon, }, ConnectionChannel.SyncEvents); } #endregion public static void SendChatMessage(string message) { Peer.SendTo(new Packets.ChatMessage(new Func((s) => Security.Encrypt(s.GetBytes()))) { Username = Main.Settings.Username, Message = message },ServerConnection, ConnectionChannel.Chat, NetDeliveryMethod.ReliableOrdered); Peer.FlushSendQueue(); } public static void SendVoiceMessage(byte[] buffer, int recorded) { SendSync(new Packets.Voice() { Buffer = buffer, Recorded = recorded }, ConnectionChannel.Voice, NetDeliveryMethod.ReliableOrdered); } } }