Ejemplo n.º 1
0
        /// <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;
            }
        }
Ejemplo n.º 2
0
 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));
     }
 }
Ejemplo n.º 3
0
        /// <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();
        }
Ejemplo n.º 4
0
 /// <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();
     }
 }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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;
            }
        }
Ejemplo n.º 7
0
        /// <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();
                }
            }
        }
Ejemplo n.º 8
0
        /// <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();
                }
            }
        }