/// <inheritdoc/> public void HandlePacket(Player player, Span <byte> packet) { // todo: determine password length by looking at the packet length var usernameBytes = packet.Slice(4, 10); var passwordBytes = packet.Slice(14, player.GameContext.Configuration.MaximumPasswordLength); this.decryptor.Decrypt(usernameBytes); this.decryptor.Decrypt(passwordBytes); var username = usernameBytes.ExtractString(0, 10, Encoding.UTF8); var password = passwordBytes.ExtractString(0, player.GameContext.Configuration.MaximumPasswordLength, Encoding.UTF8); int startTickCountIndex = 14 + player.GameContext.Configuration.MaximumPasswordLength; ////Player.StartTickCount = Utils.MakeDword(buffer[sti], buffer[sti + 1], buffer[sti + 2], buffer[sti + 3]); ////Player.StartTick = DateTime.Now; this.loginAction.Login(player, username, password); var versionStartIndex = startTickCountIndex + 4; var version = packet.Slice(versionStartIndex, 5).ToArray(); if (player is RemotePlayer remotePlayer) { // Set Version in RemotePlayer so that the right plugins will be selected var clientVersion = ClientVersionResolver.Resolve(version); remotePlayer.ClientVersion = clientVersion; } }
private void LoadGameClientDefinitions(IContext persistenceContext) { ClientVersionResolver.DefaultVersion = new ClientVersion(6, 3, ClientLanguage.English); foreach (var gameClientDefinition in persistenceContext.Get <GameClientDefinition>()) { ClientVersionResolver.Register( gameClientDefinition.Version, new ClientVersion(gameClientDefinition.Season, gameClientDefinition.Episode, gameClientDefinition.Language)); } }
/// <inheritdoc/> public void ShowLoginWindow() { using var writer = this.player.Connection.StartSafeWrite(GameServerEntered.HeaderType, GameServerEntered.Length); var message = new GameServerEntered(writer.Span) { PlayerId = ViewExtensions.ConstantPlayerId, }; ClientVersionResolver.Resolve(this.player.ClientVersion).CopyTo(message.Version); writer.Commit(); }
/// <inheritdoc/> public void ShowLoginWindow() { using (var writer = this.player.Connection.StartSafeWrite(0xC1, 0x0C)) { var message = writer.Span; message[2] = 0xF1; message[3] = 0x00; message[4] = 0x01; // Success message[5] = ViewExtensions.ConstantPlayerId.GetHighByte(); message[6] = ViewExtensions.ConstantPlayerId.GetLowByte(); ClientVersionResolver.Resolve(this.player.ClientVersion).CopyTo(message.Slice(7, 5)); writer.Commit(); } }
private void LoadGameClientDefinitions(IContext persistenceContext) { var versions = persistenceContext.Get <GameClientDefinition>().ToList(); foreach (var gameClientDefinition in versions) { ClientVersionResolver.Register( gameClientDefinition.Version, new ClientVersion(gameClientDefinition.Season, gameClientDefinition.Episode, gameClientDefinition.Language)); } if (versions.FirstOrDefault() is { } firstVersion) { ClientVersionResolver.DefaultVersion = ClientVersionResolver.Resolve(firstVersion.Version); } }
private void HandleLogin(Player player, Span <byte> userNameSpan, Span <byte> passwordSpan, uint tickCount, Span <byte> version) { this.decryptor.Decrypt(userNameSpan); this.decryptor.Decrypt(passwordSpan); var username = userNameSpan.ExtractString(0, 10, Encoding.UTF8); var password = passwordSpan.ExtractString(0, 20, Encoding.UTF8); if (player.Logger.IsEnabled(LogLevel.Debug)) { player.Logger.LogDebug($"User tries to log in. username:{username}, version:{version.AsString()}, tickCount:{tickCount} "); } this.loginAction.Login(player, username, password); if (player is RemotePlayer remotePlayer) { // Set Version in RemotePlayer so that the right plugins will be selected var clientVersion = ClientVersionResolver.Resolve(version); remotePlayer.ClientVersion = clientVersion; } }
/// <summary> /// Initializes a new instance of the <see cref="Program"/> class. /// Constructor for the main entry program. /// </summary> /// <param name="args">The command line args.</param> public Program(string[] args) { if (args.Contains("-demo")) { this.persistenceContextProvider = new InMemoryPersistenceContextProvider(); var initialization = new DataInitialization(this.persistenceContextProvider); initialization.CreateInitialData(); } else { this.persistenceContextProvider = this.PrepareRepositoryManager(args.Contains("-reinit")); } var ipResolver = args.Contains("-local") ? (IIpAddressResolver) new LocalIpResolver() : new PublicIpResolver(); Log.Info("Start initializing sub-components"); var signalRServerObserver = new SignalRGameServerStateObserver(); var persistenceContext = this.persistenceContextProvider.CreateNewConfigurationContext(); var loginServer = new LoginServer(); var chatServer = new ChatServerListener(55980, signalRServerObserver, ipResolver); this.servers.Add(chatServer); var guildServer = new GuildServer(this.gameServers, this.persistenceContextProvider); var friendServer = new FriendServer(this.gameServers, chatServer, this.persistenceContextProvider); var connectServers = new Dictionary <GameClientDefinition, IConnectServer>(); ClientVersionResolver.DefaultVersion = new ClientVersion(6, 3, ClientLanguage.English); foreach (var gameClientDefinition in persistenceContext.Get <GameClientDefinition>()) { ClientVersionResolver.Register(gameClientDefinition.Version, new ClientVersion(gameClientDefinition.Season, gameClientDefinition.Episode, gameClientDefinition.Language)); } foreach (var connectServerDefinition in persistenceContext.Get <ConnectServerDefinition>()) { var connectServer = ConnectServerFactory.CreateConnectServer(connectServerDefinition, signalRServerObserver); this.servers.Add(connectServer); connectServers[connectServerDefinition.Client] = connectServer; } Log.Info("Start initializing game servers"); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); foreach (var gameServerDefinition in persistenceContext.Get <DataModel.Configuration.GameServerDefinition>()) { using (ThreadContext.Stacks["gameserver"].Push(gameServerDefinition.ServerID.ToString())) { var gameServer = new GameServer(gameServerDefinition, guildServer, loginServer, this.persistenceContextProvider, friendServer, signalRServerObserver); foreach (var endpoint in gameServerDefinition.Endpoints) { gameServer.AddListener(new DefaultTcpGameServerListener(endpoint, gameServer.ServerInfo, gameServer.Context, connectServers[endpoint.Client], ipResolver)); } this.servers.Add(gameServer); this.gameServers.Add(gameServer.Id, gameServer); Log.InfoFormat("Game Server {0} - [{1}] initialized", gameServer.Id, gameServer.Description); } } stopwatch.Stop(); Log.Info($"All game servers initialized, elapsed time: {stopwatch.Elapsed}"); Log.Info("Start initializing admin panel"); this.adminPanel = new AdminPanel(1234, this.servers, this.persistenceContextProvider, Log4NetConfigFilePath); Log.Info("Admin panel initialized"); if (args.Contains("-autostart")) { chatServer.Start(); foreach (var gameServer in this.gameServers.Values) { gameServer.Start(); } foreach (var connectServer in connectServers.Values) { connectServer.Start(); } } }
/// <summary> /// Initializes a new instance of the <see cref="Program"/> class. /// Constructor for the main entry program. /// </summary> /// <param name="args">The command line args.</param> public Program(string[] args) { if (args.Contains("-demo")) { this.persistenceContextProvider = new InMemoryPersistenceContextProvider(); var initialization = new DataInitialization(this.persistenceContextProvider); initialization.CreateInitialData(); } else { this.persistenceContextProvider = this.PrepareRepositoryManager(args.Contains("-reinit"), args.Contains("-autoupdate")); } var ipResolver = IpAddressResolverFactory.DetermineIpResolver(args); Log.Info("Start initializing sub-components"); var signalRServerObserver = new SignalRGameServerStateObserver(); var serverConfigListener = new ServerConfigurationChangeListener(this.servers, signalRServerObserver); var persistenceContext = this.persistenceContextProvider.CreateNewConfigurationContext(); var loginServer = new LoginServer(); var chatServerDefinition = persistenceContext.Get <ChatServerDefinition>().First(); var chatServer = new ChatServer(chatServerDefinition.ConvertToSettings(), signalRServerObserver, ipResolver); this.servers.Add(chatServer); var guildServer = new GuildServer(this.gameServers, this.persistenceContextProvider); var friendServer = new FriendServer(this.gameServers, chatServer, this.persistenceContextProvider); var connectServers = new Dictionary <GameClientDefinition, IGameServerStateObserver>(); ClientVersionResolver.DefaultVersion = new ClientVersion(6, 3, ClientLanguage.English); foreach (var gameClientDefinition in persistenceContext.Get <GameClientDefinition>()) { ClientVersionResolver.Register(gameClientDefinition.Version, new ClientVersion(gameClientDefinition.Season, gameClientDefinition.Episode, gameClientDefinition.Language)); } foreach (var connectServerDefinition in persistenceContext.Get <ConnectServerDefinition>()) { var clientVersion = new ClientVersion(connectServerDefinition.Client.Season, connectServerDefinition.Client.Episode, connectServerDefinition.Client.Language); var connectServer = ConnectServerFactory.CreateConnectServer(connectServerDefinition, signalRServerObserver, clientVersion); this.servers.Add(connectServer); if (!connectServers.TryGetValue(connectServerDefinition.Client, out var observer)) { connectServers[connectServerDefinition.Client] = connectServer; } else { Log.WarnFormat($"Multiple connect servers for game client '{connectServerDefinition.Client.Description}' configured. Only one per client makes sense."); if (!(observer is MulticastConnectionServerStateObserver)) { var multicastObserver = new MulticastConnectionServerStateObserver(); multicastObserver.AddObserver(observer); multicastObserver.AddObserver(connectServer); connectServers[connectServerDefinition.Client] = multicastObserver; } } } Log.Info("Start initializing game servers"); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); foreach (var gameServerDefinition in persistenceContext.Get <DataModel.Configuration.GameServerDefinition>()) { using (ThreadContext.Stacks["gameserver"].Push(gameServerDefinition.ServerID.ToString())) { var gameServer = new GameServer(gameServerDefinition, guildServer, loginServer, this.persistenceContextProvider, friendServer, signalRServerObserver); foreach (var endpoint in gameServerDefinition.Endpoints) { gameServer.AddListener(new DefaultTcpGameServerListener(endpoint, gameServer.ServerInfo, gameServer.Context, connectServers[endpoint.Client], ipResolver)); } this.servers.Add(gameServer); this.gameServers.Add(gameServer.Id, gameServer); Log.InfoFormat("Game Server {0} - [{1}] initialized", gameServer.Id, gameServer.Description); } } stopwatch.Stop(); Log.Info($"All game servers initialized, elapsed time: {stopwatch.Elapsed}"); var adminPort = this.DetermineAdminPort(args); Log.Info($"Start initializing admin panel for port {adminPort}."); this.adminPanel = new AdminPanel(adminPort, this.servers, this.persistenceContextProvider, serverConfigListener, Log4NetConfigFilePath); Log.Info($"Admin panel initialized, port {adminPort}."); if (args.Contains("-autostart")) { chatServer.Start(); foreach (var gameServer in this.gameServers.Values) { gameServer.Start(); } foreach (var connectServer in this.servers.OfType <IConnectServer>()) { connectServer.Start(); } } }