public static void HandleConnectResponse(ClientPacket packet, Session session) { PacketInboundConnectResponse connectResponse = new PacketInboundConnectResponse(packet); DatabaseManager.Shard.GetCharacters(session.Id, false, result => { // If you want to create default characters for accounts that have none, here is where you would do it. SendConnectResponse(session, result); }); }
public static async void HandleConnectResponse(ClientPacket packet, Session session) { PacketInboundConnectResponse connectResponse = new PacketInboundConnectResponse(packet); var result = await DatabaseManager.Character.GetByAccount(session.Id); session.UpdateCachedCharacters(result); GameMessageCharacterList characterListMessage = new GameMessageCharacterList(result, session.Account); GameMessageServerName serverNameMessage = new GameMessageServerName(ConfigManager.Config.Server.WorldName); GameMessageDDDInterrogation dddInterrogation = new GameMessageDDDInterrogation(); session.Network.EnqueueSend(characterListMessage, serverNameMessage, dddInterrogation); session.State = SessionState.AuthConnected; }
public static void HandleConnectResponse(ClientPacket packet, Session session) { PacketInboundConnectResponse connectResponse = new PacketInboundConnectResponse(packet); DatabaseManager.Shard.GetCharacters(session.Id, false, result => { result = result.OrderByDescending(o => o.LastLoginTimestamp).ToList(); // The client highlights the first character in the list. We sort so the first character sent is the one we last logged in session.UpdateCharacters(result); GameMessageCharacterList characterListMessage = new GameMessageCharacterList(session.Characters, session); GameMessageServerName serverNameMessage = new GameMessageServerName(ConfigManager.Config.Server.WorldName, WorldManager.GetAll().Count, (int)ConfigManager.Config.Server.Network.MaximumAllowedSessions); GameMessageDDDInterrogation dddInterrogation = new GameMessageDDDInterrogation(); session.Network.EnqueueSend(characterListMessage, serverNameMessage); session.Network.EnqueueSend(dddInterrogation); session.State = SessionState.AuthConnected; }); }
public static void HandleConnectResponse(ClientPacket packet, Session session) { PacketInboundConnectResponse connectResponse = new PacketInboundConnectResponse(packet); DatabaseManager.Shard.GetCharacters(session.Id, ((List <CachedCharacter> result) => { result = result.OrderByDescending(o => o.LoginTimestamp).ToList(); session.UpdateCachedCharacters(result); GameMessageCharacterList characterListMessage = new GameMessageCharacterList(result, session.Account); GameMessageServerName serverNameMessage = new GameMessageServerName(ConfigManager.Config.Server.WorldName, WorldManager.GetAll().Count, (int)ConfigManager.Config.Server.Network.MaximumAllowedSessions); GameMessageDDDInterrogation dddInterrogation = new GameMessageDDDInterrogation(); session.Network.EnqueueSend(characterListMessage, serverNameMessage); session.Network.EnqueueSend(dddInterrogation); session.State = SessionState.AuthConnected; })); }
public static async void HandleConnectResponse(ClientPacket packet, Session session) { PacketInboundConnectResponse connectResponse = new PacketInboundConnectResponse(packet); var result = await DatabaseManager.Character.GetByAccount(session.Id); session.UpdateCachedCharacters(result); GameMessageCharacterList characterListMessage = new GameMessageCharacterList(result, session.Account); GameMessageServerName serverNameMessage = new GameMessageServerName(ConfigManager.Config.Server.WorldName); // looks like account settings/info, expansion information ect? (this is needed for world entry) GameMessageDDDInterrogation unknown75e5Message = new GameMessageDDDInterrogation(); GameMessageDDDEndDDD patchStatusMessage = new GameMessageDDDEndDDD(); session.Network.EnqueueSend(characterListMessage); session.Network.EnqueueSend(serverNameMessage); session.Network.EnqueueSend(unknown75e5Message); session.Network.EnqueueSend(patchStatusMessage); session.State = SessionState.AuthConnected; }
public static void ProcessPacket(ClientPacket packet, IPEndPoint endPoint, IPEndPoint listenerEndpoint) { if (listenerEndpoint.Port == ConfigManager.Config.Server.Network.Port + 1) { ServerPerformanceMonitor.RegisterEventStart(ServerPerformanceMonitor.MonitorType.ProcessPacket_1); if (packet.Header.Flags.HasFlag(PacketHeaderFlags.ConnectResponse)) { packetLog.Debug($"{packet}, {endPoint}"); PacketInboundConnectResponse connectResponse = new PacketInboundConnectResponse(packet); // This should be set on the second packet to the server from the client. // This completes the three-way handshake. sessionLock.EnterReadLock(); Session session = null; try { session = (from k in sessionMap where k != null && k.State == SessionState.AuthConnectResponse && k.Network.ConnectionData.ConnectionCookie == connectResponse.Check && k.EndPoint.Address.Equals(endPoint.Address) select k).FirstOrDefault(); } finally { sessionLock.ExitReadLock(); } if (session != null) { session.State = SessionState.AuthConnected; session.Network.sendResync = true; AuthenticationHandler.HandleConnectResponse(session); } } else if (packet.Header.Id == 0 && packet.Header.HasFlag(PacketHeaderFlags.CICMDCommand)) { // TODO: Not sure what to do with these packets yet } else { log.ErrorFormat("Packet from {0} rejected. Packet sent to listener 1 and is not a ConnectResponse or CICMDCommand", endPoint); } ServerPerformanceMonitor.RegisterEventEnd(ServerPerformanceMonitor.MonitorType.ProcessPacket_1); } else // ConfigManager.Config.Server.Network.Port + 0 { ServerPerformanceMonitor.RegisterEventStart(ServerPerformanceMonitor.MonitorType.ProcessPacket_0); if (packet.Header.HasFlag(PacketHeaderFlags.LoginRequest)) { packetLog.Debug($"{packet}, {endPoint}"); if (GetSessionCount() >= ConfigManager.Config.Server.Network.MaximumAllowedSessions) { log.InfoFormat("Login Request from {0} rejected. Server full.", endPoint); SendLoginRequestReject(endPoint, CharacterError.LogonServerFull); } else if (ServerManager.ShutdownInitiated && (ServerManager.ShutdownTime - DateTime.UtcNow).TotalMinutes < 2) { log.InfoFormat("Login Request from {0} rejected. Server shutting down in less than 2 minutes.", endPoint); SendLoginRequestReject(endPoint, CharacterError.ServerCrash1); } else { log.DebugFormat("Login Request from {0}", endPoint); var session = FindOrCreateSession(endPoint); if (session != null) { if (session.State == SessionState.AuthConnectResponse) { // connect request packet sent to the client was corrupted in transit and session entered an unspecified state. // ignore the request and remove the broken session and the client will start a new session. RemoveSession(session); log.Warn($"Bad handshake from {endPoint}, aborting session."); } session.ProcessPacket(packet); } else { log.InfoFormat("Login Request from {0} rejected. Failed to find or create session.", endPoint); SendLoginRequestReject(endPoint, CharacterError.LogonServerFull); } } } else if (sessionMap.Length > packet.Header.Id) { var session = sessionMap[packet.Header.Id]; if (session != null) { if (session.EndPoint.Equals(endPoint)) { session.ProcessPacket(packet); } else { log.WarnFormat("Session for Id {0} has IP {1} but packet has IP {2}", packet.Header.Id, session.EndPoint, endPoint); } } else { log.DebugFormat("Unsolicited Packet from {0} with Id {1}", endPoint, packet.Header.Id); } } else { log.DebugFormat("Unsolicited Packet from {0} with Id {1}", endPoint, packet.Header.Id); } ServerPerformanceMonitor.RegisterEventEnd(ServerPerformanceMonitor.MonitorType.ProcessPacket_0); } }
public static void ProcessPacket(ClientPacket packet, IPEndPoint endPoint, IPEndPoint listenerEndpoint) { if (listenerEndpoint.Port == ConfigManager.Config.Server.Network.Port + 1) { if (packet.Header.Flags.HasFlag(PacketHeaderFlags.ConnectResponse)) { PacketInboundConnectResponse connectResponse = new PacketInboundConnectResponse(packet); // This should be set on the second packet to the server from the client. // This completes the three-way handshake. sessionLock.EnterReadLock(); Session session = null; try { session = (from k in sessionMap where k != null && k.State == SessionState.AuthConnectResponse && k.Network.ConnectionData.ConnectionCookie == connectResponse.Check && k.EndPoint.Address.Equals(endPoint.Address) select k).FirstOrDefault(); } finally { sessionLock.ExitReadLock(); } if (session != null) { session.State = SessionState.AuthConnected; session.Network.sendResync = true; AuthenticationHandler.HandleConnectResponse(session); return; } else { return; } } else if (packet.Header.Id == 0 && packet.Header.HasFlag(PacketHeaderFlags.CICMDCommand)) { // TODO: Not sure what to do with these packets yet } else { log.ErrorFormat("Packet from {0} rejected. Packet sent to listener 1 and is not a ConnectResponse or CICMDCommand", endPoint); } } else if (packet.Header.HasFlag(PacketHeaderFlags.LoginRequest)) { if (!loggedInClients.Contains(endPoint) && loggedInClients.Count >= ConfigManager.Config.Server.Network.MaximumAllowedSessions) { log.InfoFormat("Login Request from {0} rejected. Server full.", endPoint); // TODO can we send a message back to the client indicating we're full? } else { log.DebugFormat("Login Request from {0}", endPoint); var session = FindOrCreateSession(endPoint); if (session != null) { session.ProcessPacket(packet); } } } else if (sessionMap.Length > packet.Header.Id && loggedInClients.Contains(endPoint)) { var session = sessionMap[packet.Header.Id]; if (session != null) { if (session.EndPoint.Equals(endPoint)) { session.ProcessPacket(packet); } else { log.WarnFormat("Session for Id {0} has IP {1} but packet has IP {2}", packet.Header.Id, session.EndPoint, endPoint); } } else { log.WarnFormat("Null Session for Id {0}", packet.Header.Id); } } }