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()); }
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; } }
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); } }
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) { } } } }
private void Server_OnConnectionAccepted(object sender, PacketEvents e) { WriteOutput("Client Connected: " + e.Sender.Socket.RemoteEndPoint.ToString()); }
private void Server_OnPacketReceived(object sender, PacketEvents e) { }
private void Server_OnPacketSent(object sender, PacketEvents e) { }