Пример #1
0
        private void Server_OnConnectionRemoved(object sender, PacketEvents e)
        {
            if (!Usernames.ContainsKey(e.Sender.ClientId.ToString()))
            {
                return;
            }

            var notification = new ChatPacket
            {
                Username  = "******",
                Message   = "A user has left the chat",
                UserColor = Colors.Purple.ToString()
            };

            var userPacket = new UserConnectionPacket
            {
                UserGuid  = e.Sender.ClientId.ToString(),
                Username  = Usernames[e.Sender.ClientId.ToString()],
                IsJoining = false
            };

            if (Usernames.Keys.Contains(userPacket.UserGuid))
            {
                Usernames.Remove(userPacket.UserGuid);
            }

            userPacket.Users = Usernames.Values.ToArray();

            if (_server.Connections.Count != 0)
            {
                Task.Run(() => _server.SendObjectToClients(userPacket)).Wait();
                Task.Run(() => _server.SendObjectToClients(notification)).Wait();
            }
            WriteOutput("Client Disconnected: " + e.Sender.Socket.RemoteEndPoint.ToString());
        }
Пример #2
0
        private void ReceiveData(BinaryReader reader, int start)
        {
            var packetType = _readBuffer[start];

            //Debug.WriteLine($"RX: {packetType}");
            reader.BaseStream.Position = start + 1;
            switch ((PacketType)packetType)
            {
            case PacketType.Disconnect:
                // Disconnected, report
                var disconnectPacket = (Disconnect)PacketHelper.Deserialize(reader, packetType);
                Debug.WriteLine($"Disconnected: {disconnectPacket.Reason}");
                Dispose();
                break;

            case PacketType.InitializeClient:
                var initializeClient = (InitializeClient)PacketHelper.Deserialize(reader, packetType);
                SendData(4, -1, -1, null, initializeClient.PlayerIndex);
                SendData(68, -1, -1, null, initializeClient.PlayerIndex);
                SendData(16, -1, -1, null, initializeClient.PlayerIndex);
                SendData(42, -1, -1, null, initializeClient.PlayerIndex);
                SendData(50, -1, -1, null, initializeClient.PlayerIndex);
                for (var i = 0; i < 180; ++i)
                {
                    SendData(5, number: initializeClient.PlayerIndex, number2: i);
                }

                SendData((int)PacketType.RequestWorldInfo);
                break;

            case PacketType.WorldInfo:
                SendData(8, number: Terraria.MyPlayer, number2: 0, number3: 0);
                break;

            case PacketType.UpdatePlayer:
                reader.ReadToEnd();
                break;

            case PacketType.CompleteConnectionRequest:
                Debug.WriteLine("Connected to host");
                SendData(12, number: Terraria.MyPlayer);
                break;

            case PacketType.LoadNetModule:     // Chat
                var loadNetModulePacket = (LoadNetModule)PacketHelper.Deserialize(reader, packetType);
                PacketEvents.InvokePacketReceived(new PacketEventArgs(loadNetModulePacket));
                break;

            default:
                reader.ReadToEnd();
                break;
            }
        }
Пример #3
0
        public void Tick()
        {
            CurrentTick++;
            GameEvents.Tick(CurrentTick);

            if (AnnounceSelf && DateTime.Now.Subtract(_lastAnnounceDateTime).TotalMinutes >= 5)
            {
                AnnounceToMaster();
            }
            //throw new Exception("test");
            NetIncomingMessage msg;

            while ((msg = Server.ReadMessage()) != null)
            {
                Client client = null;
                lock (Clients)
                {
                    foreach (var c in Clients)
                    {
                        if (c?.NetConnection == null || c.NetConnection.RemoteUniqueIdentifier == 0 ||
                            msg.SenderConnection == null ||
                            c.NetConnection.RemoteUniqueIdentifier != msg.SenderConnection.RemoteUniqueIdentifier)
                        {
                            continue;
                        }
                        client = c;
                        break;
                    }
                }
                if (client == null)
                {
                    logger.LogDebug("Client not found for remote ID " + msg.SenderConnection?.RemoteUniqueIdentifier + ", creating client. Current number of clients: " + Clients.Count());
                    client = new Client(msg.SenderConnection);
                }

                // Plugin event: OnIncomingPacket
                var pluginPacketHandlerResult = PacketEvents.IncomingPacket(client, msg);
                msg = pluginPacketHandlerResult.Data;
                if (!pluginPacketHandlerResult.ContinueServerProc)
                {
                    Server.Recycle(msg);
                    return;
                }

                //logger.LogInformation("Packet received - type: " + ((NetIncomingMessageType)msg.MessageType).ToString());
                switch (msg.MessageType)
                {
                case NetIncomingMessageType.UnconnectedData:
                    var ucType = msg.ReadString();
                    // ReSharper disable once ConvertIfStatementToSwitchStatement
                    if (ucType == "ping")
                    {
                        if (!PacketEvents.Ping(client, msg).ContinueServerProc)
                        {
                            Server.Recycle(msg);
                            return;
                        }
                        logger.LogInformation("Ping received from " + msg.SenderEndPoint.Address.ToString());
                        var reply = Server.CreateMessage("pong");
                        Server.SendMessage(reply, client.NetConnection, NetDeliveryMethod.ReliableOrdered);
                    }
                    else if (ucType == "query")
                    {
                        if (!PacketEvents.Query(client, msg).ContinueServerProc)
                        {
                            Server.Recycle(msg);
                            return;
                        }
                        var playersOnline = 0;
                        lock (Clients) playersOnline = Clients.Count;
                        logger.LogInformation("Query received from " + msg.SenderEndPoint.Address.ToString());
                        var reply = Server.CreateMessage($"{Name}%{PasswordProtected}%{playersOnline}%{MaxPlayers}%{GamemodeName}");
                        Server.SendMessage(reply, client.NetConnection, NetDeliveryMethod.ReliableOrdered);
                    }
                    break;

                case NetIncomingMessageType.VerboseDebugMessage:
                case NetIncomingMessageType.DebugMessage:
                    logger.LogDebug("Network (Verbose)DebugMessage: " + msg.ReadString());
                    break;

                case NetIncomingMessageType.WarningMessage:
                    logger.LogWarning("Network WarningMessage: " + msg.ReadString());
                    break;

                case NetIncomingMessageType.ErrorMessage:
                    logger.LogError("Network ErrorMessage: " + msg.ReadString());
                    break;

                case NetIncomingMessageType.ConnectionLatencyUpdated:
                    client.Latency = msg.ReadFloat();
                    break;

                case NetIncomingMessageType.ConnectionApproval:
                    var connectionApprovalPacketResult = PacketEvents.IncomingConnectionApproval(client, msg);
                    msg = connectionApprovalPacketResult.Data;
                    if (!connectionApprovalPacketResult.ContinueServerProc)
                    {
                        Server.Recycle(msg);
                        return;
                    }
                    HandleClientConnectionApproval(client, msg);
                    break;

                case NetIncomingMessageType.StatusChanged:
                    pluginPacketHandlerResult = PacketEvents.IncomingStatusChange(client, msg);
                    msg = pluginPacketHandlerResult.Data;
                    if (!pluginPacketHandlerResult.ContinueServerProc)
                    {
                        Server.Recycle(msg);
                        return;
                    }
                    HandleClientStatusChange(client, msg);
                    break;

                case NetIncomingMessageType.DiscoveryRequest:
                    pluginPacketHandlerResult = PacketEvents.IncomingDiscoveryRequest(client, msg);
                    msg = pluginPacketHandlerResult.Data;
                    if (!pluginPacketHandlerResult.ContinueServerProc)
                    {
                        Server.Recycle(msg);
                        return;
                    }
                    HandleClientDiscoveryRequest(client, msg);
                    break;

                case NetIncomingMessageType.Data:
                    pluginPacketHandlerResult = PacketEvents.IncomingData(client, msg);
                    msg = pluginPacketHandlerResult.Data;
                    if (!pluginPacketHandlerResult.ContinueServerProc)
                    {
                        Server.Recycle(msg);
                        return;
                    }
                    HandleClientIncomingData(client, msg);
                    break;

                default:
                    // We shouldn't get packets reaching this, so throw warnings when it happens.
                    logger.LogWarning("Unknown packet received: " +
                                      msg.MessageType.ToString());
                    break;
                }
                Server.Recycle(msg);
            }
        }
Пример #4
0
        private void SendData(int packetType, int remoteClient = -1, int ignoreClient = -1, string networkText = null,
                              int number  = 0, float number2 = 0.0f, float number3 = 0.0f, float number4 = 0.0f, int number5 = 0,
                              int number6 = 0, int number7   = 0)
        {
            if (!_tcpClient.Connected)
            {
                return;
            }

            lock (SyncLock)
            {
                //Debug.WriteLine($"TX: {packetType}");
                var buffer = new byte[131070];
                using (var memoryStream = new MemoryStream(buffer)
                {
                    Position = 0
                })
                    using (var writer = new BinaryWriter(memoryStream))
                    {
                        var oldSteamPosition = writer.BaseStream.Position;
                        writer.BaseStream.Position += 2L;

                        writer.Write((byte)packetType);

                        IPacket packet = null;
                        switch ((PacketType)packetType)
                        {
                        case PacketType.ConnectRequest:
                            PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new ConnectRequest()));
                            PacketHelper.WriteToWriter(writer, packet);
                            break;

                        case PacketType.PlayerInfo:
                            PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new PlayerInfo()));
                            PacketHelper.WriteToWriter(writer, packet);
                            break;

                        case PacketType.PlayerInventorySlot:
                            PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new PlayerInventorySlot()));
                            PacketHelper.WriteToWriter(writer, packet);
                            break;

                        case PacketType.RequestSpawn:
                            PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new RequestSpawn()));
                            PacketHelper.WriteToWriter(writer, packet);
                            break;

                        case PacketType.SpawnPlayer:
                            PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new SpawnPlayer {
                                PlayerIndex = (byte)number
                            }));
                            PacketHelper.WriteToWriter(writer, packet);
                            break;

                        case PacketType.UpdatePlayer:
                            PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new UpdatePlayer {
                                PlayerIndex = (byte)number
                            }));
                            PacketHelper.WriteToWriter(writer, packet);
                            break;

                        case PacketType.SendPlayerHealth:
                            PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new SendPlayerHealth
                            {
                                PlayerIndex = (byte)number, CurrentHealth = 100, HealthMax = 100
                            }));
                            PacketHelper.WriteToWriter(writer, packet);
                            break;

                        case PacketType.SendPlayerMana:
                            PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new SendPlayerMana {
                                PlayerIndex = (byte)number, CurrentMana = 100, ManaMax = 100
                            }));
                            PacketHelper.WriteToWriter(writer, packet);
                            break;

                        case PacketType.SendPlayerBuffs:
                            PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new SendPlayerBuffs {
                                PlayerIndex = (byte)number
                            }));
                            PacketHelper.WriteToWriter(writer, packet);
                            break;

                        case PacketType.SendClientUUID:
                            PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new SendClientUUID()));
                            PacketHelper.WriteToWriter(writer, packet);
                            break;
                        }

                        var newStreamPosition = writer.BaseStream.Position;
                        writer.BaseStream.Position = oldSteamPosition;
                        writer.Write((short)newStreamPosition);
                        writer.BaseStream.Position = newStreamPosition;

                        try
                        {
                            _networkStream.BeginWrite(buffer, 0, (int)memoryStream.Position,
                                                      ar => _networkStream.EndWrite(ar), null);
                        }
                        catch // The connection was most likely closed by the host (Disconnect packets)
                        {
                        }
                    }
            }
        }
Пример #5
0
 private void Server_OnConnectionAccepted(object sender, PacketEvents e)
 {
     WriteOutput("Client Connected: " + e.Sender.Socket.RemoteEndPoint.ToString());
 }
Пример #6
0
 private void Server_OnPacketReceived(object sender, PacketEvents e)
 {
 }
Пример #7
0
 private void Server_OnPacketSent(object sender, PacketEvents e)
 {
 }