예제 #1
0
        //Ped Packet
        internal void ResendPacket(PedData fullPacket, Client exception, bool pure)
        {
            byte[] full;
            var    basic = new byte[0];

            if (pure)
            {
                full = PacketOptimization.WritePureSync(fullPacket);
                if (fullPacket.NetHandle != null)
                {
                    basic = PacketOptimization.WriteBasicSync(fullPacket.NetHandle.Value, fullPacket.Position);
                }
            }
            else
            {
                full = PacketOptimization.WriteLightSync(fullPacket);
            }

            var msg = Server.CreateMessage();

            if (pure)
            {
                //if (client.Position.DistanceToSquared(fullPacket.Position) > 10000) // 1km
                //{
                //    var lastUpdateReceived = client.LastPacketReceived.Get(exception.handle.Value);

                //    if (lastUpdateReceived != 0 && Program.GetTicks() - lastUpdateReceived <= 1000) continue;
                //    msg.Write((byte)PacketType.BasicSync);
                //    msg.Write(basic.Length);
                //    msg.Write(basic);
                //    Server.SendMessage(msg, client.NetConnection, NetDeliveryMethod.UnreliableSequenced, (int)ConnectionChannel.BasicSync);

                //    client.LastPacketReceived.Set(exception.handle.Value, Program.GetTicks());
                //}
                //else
                //{
                msg.Write((byte)PacketType.PedPureSync);
                msg.Write(full.Length);
                msg.Write(full);
                //}
            }
            else
            {
                msg.Write((byte)PacketType.PedLightSync);
                msg.Write(full.Length);
                msg.Write(full);
            }

            List <NetConnection> connectionsNear = new List <NetConnection>();

            foreach (var client in exception.Streamer.GetNearClients())
            {
                if (client.Fake)
                {
                    continue;
                }
                if (client.NetConnection.Status == NetConnectionStatus.Disconnected)
                {
                    continue;
                }
                if (!client.ConnectionConfirmed)
                {
                    continue;
                }
                if (client == exception)
                {
                    continue;
                }

                if (pure)
                {
                    if (client.Position == null)
                    {
                        continue;
                    }

                    connectionsNear.Add(client.NetConnection);
                }
                else
                {
                    connectionsNear.Add(client.NetConnection);
                }
            }

            if (pure)
            {
                Server.SendMessage(msg, connectionsNear, NetDeliveryMethod.UnreliableSequenced, (int)ConnectionChannel.PureSync);
            }
            else
            {
                Server.SendMessage(msg, connectionsNear, NetDeliveryMethod.ReliableSequenced, (int)ConnectionChannel.LightSync);
            }


            if (pure)
            {
                var msgBasic = Server.CreateMessage();

                msgBasic.Write((byte)PacketType.BasicSync);
                msgBasic.Write(basic.Length);
                msgBasic.Write(basic);

                long ticks = Program.GetTicks();

                List <NetConnection> connectionsFar = new List <NetConnection>();

                foreach (var client in exception.Streamer.GetFarClients())
                {
                    if (client.Fake)
                    {
                        continue;
                    }
                    if (client.NetConnection.Status == NetConnectionStatus.Disconnected)
                    {
                        continue;
                    }
                    if (!client.ConnectionConfirmed)
                    {
                        continue;
                    }
                    if (client == exception)
                    {
                        continue;
                    }

                    var lastUpdateReceived = client.LastPacketReceived.Get(exception.handle.Value);

                    if (lastUpdateReceived != 0 && ticks - lastUpdateReceived <= 1000)
                    {
                        continue;
                    }

                    connectionsFar.Add(client.NetConnection);
                    client.LastPacketReceived.Set(exception.handle.Value, ticks);
                }

                Server.SendMessage(msgBasic, connectionsFar, NetDeliveryMethod.UnreliableSequenced, (int)ConnectionChannel.BasicSync);
            }
        }
예제 #2
0
        internal static void MainLoop()
        {
            bool lastPedData       = false;
            int  lastLightSyncSent = 0;

            while (true)
            {
                if (!Main.IsOnServer())
                {
                    Thread.Sleep(100);
                    continue;
                }

                object lastPacket;
                lock (SyncCollector.Lock)
                {
                    lastPacket = SyncCollector.LastSyncPacket;
                    SyncCollector.LastSyncPacket = null;
                }

                if (lastPacket == null)
                {
                    continue;
                }
                try
                {
                    if (lastPacket is PedData)
                    {
                        var bin = PacketOptimization.WritePureSync((PedData)lastPacket);

                        var msg = Main.Client.CreateMessage();
                        msg.Write((byte)PacketType.PedPureSync);
                        msg.Write(bin.Length);
                        msg.Write(bin);

                        try
                        {
                            Main.Client.SendMessage(msg, NetDeliveryMethod.UnreliableSequenced,
                                                    (int)ConnectionChannel.PureSync);
                        }
                        catch (Exception ex)
                        {
                            Util.Util.SafeNotify("FAILED TO SEND DATA: " + ex.Message);
                            LogManager.LogException(ex, "SENDPLAYERDATA");
                        }

                        if (!lastPedData || Environment.TickCount - lastLightSyncSent > LIGHT_SYNC_RATE)
                        {
                            lastLightSyncSent = Environment.TickCount;

                            LogManager.DebugLog("SENDING LIGHT VEHICLE SYNC");

                            var lightBin = PacketOptimization.WriteLightSync((PedData)lastPacket);

                            var lightMsg = Main.Client.CreateMessage();
                            lightMsg.Write((byte)PacketType.PedLightSync);
                            lightMsg.Write(lightBin.Length);
                            lightMsg.Write(lightBin);
                            try
                            {
                                Main.Client.SendMessage(lightMsg, NetDeliveryMethod.ReliableSequenced,
                                                        (int)ConnectionChannel.LightSync);
                            }
                            catch (Exception ex)
                            {
                                Util.Util.SafeNotify("FAILED TO SEND LIGHT DATA: " + ex.Message);
                                LogManager.LogException(ex, "SENDPLAYERDATA");
                            }

                            Main._bytesSent += lightBin.Length;
                            Main._messagesSent++;
                        }

                        lastPedData = true;

                        lock (Main._averagePacketSize)
                        {
                            Main._averagePacketSize.Add(bin.Length);
                            if (Main._averagePacketSize.Count > 10)
                            {
                                Main._averagePacketSize.RemoveAt(0);
                            }
                        }

                        Main._bytesSent += bin.Length;
                        Main._messagesSent++;
                    }
                    else
                    {
                        var bin = PacketOptimization.WritePureSync((VehicleData)lastPacket);

                        var msg = Main.Client.CreateMessage();
                        msg.Write((byte)PacketType.VehiclePureSync);
                        msg.Write(bin.Length);
                        msg.Write(bin);
                        try
                        {
                            Main.Client.SendMessage(msg, NetDeliveryMethod.UnreliableSequenced,
                                                    (int)ConnectionChannel.PureSync);
                        }
                        catch (Exception ex)
                        {
                            Util.Util.SafeNotify("FAILED TO SEND DATA: " + ex.Message);
                            LogManager.LogException(ex, "SENDPLAYERDATA");
                        }

                        if (lastPedData || Environment.TickCount - lastLightSyncSent > LIGHT_SYNC_RATE)
                        {
                            lastLightSyncSent = Environment.TickCount;

                            LogManager.DebugLog("SENDING LIGHT VEHICLE SYNC");

                            var lightBin = PacketOptimization.WriteLightSync((VehicleData)lastPacket);

                            var lightMsg = Main.Client.CreateMessage();
                            lightMsg.Write((byte)PacketType.VehicleLightSync);
                            lightMsg.Write(lightBin.Length);
                            lightMsg.Write(lightBin);
                            try
                            {
                                Main.Client.SendMessage(lightMsg, NetDeliveryMethod.ReliableSequenced,
                                                        (int)ConnectionChannel.LightSync);
                            }
                            catch (Exception ex)
                            {
                                Util.Util.SafeNotify("FAILED TO SEND LIGHT DATA: " + ex.Message);
                                LogManager.LogException(ex, "SENDPLAYERDATA");
                            }

                            Main._bytesSent += lightBin.Length;
                            Main._messagesSent++;
                        }

                        lastPedData = false;

                        lock (Main._averagePacketSize)
                        {
                            Main._averagePacketSize.Add(bin.Length);
                            if (Main._averagePacketSize.Count > 10)
                            {
                                Main._averagePacketSize.RemoveAt(0);
                            }
                        }

                        Main._bytesSent += bin.Length;
                        Main._messagesSent++;
                    }
                }
                catch (Exception ex)
                {
                    LogManager.LogException(ex, "SYNCSENDER");
                }

                LogManager.DebugLog("END SYNC SEND");

                Thread.Sleep(PURE_SYNC_RATE);
            }
        }