예제 #1
0
        protected override void OnConnected()
        {
            Logger.Get <ISCClient>().LogInformation("Connection to LoginISC has been established.");

            var gsConfig = ContextBase.GetInstance <GameContext>().GameConfig.GameServerConfig;

            using (var packet = new NetPacket())
            {
                packet.Write((short)OpCode.REGISTER_GS);
                packet.Write(gsConfig.VirtualGameServerId);
                packet.Write(gsConfig.GameServerId);
                packet.Write(gsConfig.GroupId);
                packet.Write(gsConfig.DisplayNo);
                packet.Write(gsConfig.Name);
                packet.Write(gsConfig.ApiUrl);
                packet.Write(gsConfig.ProxyGameServerIp);
                packet.Write(gsConfig.ProxyGameServerPort);
                packet.Write(gsConfig.IsMaintenance);
                packet.Write(gsConfig.PkEnabled);
                packet.Write(gsConfig.TimeZone);
                packet.Write(gsConfig.StateCode);
                packet.Write(gsConfig.IsRecommend);
                Send(packet);
            }
        }
예제 #2
0
파일: Program.cs 프로젝트: Yothri/Flarine
        static void Main(string[] args)
        {
            using (var gameCtx = ContextBase.GetInstance <GameContext>())
                using (var gameWPDListener = new WPDGameListener())
                    using (var ISC = new ISCServer())
                        using (var gameServer = new PhotonGameServer())
                            using (DatabaseService.GetContext())
                                using (var loginServerClient = new ISCClient())
                                {
                                    gameCtx.AddService(gameServer);
                                    gameCtx.AddService(loginServerClient);

                                    gameWPDListener.StartListening();
                                    ISC.Start();
                                    gameServer.Start();
                                    gameCtx.SetStatus("Connecting to ISC...");
                                    loginServerClient.Connect();
                                    gameCtx.SetStatus("Listening");

                                    while (true)
                                    {
                                        string inp = Console.ReadLine();
                                        if (inp.Equals("exit"))
                                        {
                                            break;
                                        }
                                    }

                                    loginServerClient.Disconnect();
                                    gameServer.Stop();
                                    ISC.Stop();
                                    gameWPDListener.StopListening();
                                }
        }
예제 #3
0
 public override WPDResponse Handle()
 {
     return(new GameAssetBundlesResponse
     {
         GameAssetBundles = ContextBase.GetInstance <LoginContext>().GameAssetBundles.ToArray()
     });
 }
예제 #4
0
        static void Main(string[] args)
        {
            using (var loginCtx = ContextBase.GetInstance <LoginContext>())
                using (var loginWPDListener = new WPDLoginListener())
                    using (var ISC = new ISCServer())
                        using (DatabaseService.GetContext())
                        {
                            loginCtx.AddService(ISC);

                            loginWPDListener.StartListening();
                            ISC.Start();
                            loginCtx.SetStatus("Listening");

                            while (true)
                            {
                                string inp = Console.ReadLine();
                                if (inp.Equals("exit"))
                                {
                                    break;
                                }
                            }

                            ISC.Stop();
                            loginWPDListener.StopListening();
                        }
        }
예제 #5
0
 public override WPDResponse Handle()
 {
     return(new StageFarmVersionResponse
     {
         StageFarmVersion = ContextBase.GetInstance <GateContext>().GateConfig.StageFarmVersion
     });
 }
예제 #6
0
 public override WPDResponse Handle()
 {
     return(new ImageResourcesResponse
     {
         ImageResources = ContextBase.GetInstance <LoginContext>().ImageResources.ToArray()
     });
 }
예제 #7
0
 public override WPDResponse Handle()
 {
     return(new GameServersResponse
     {
         GameServerGroups = ContextBase.GetInstance <LoginContext>().LoginConfig.GameServerGroups,
         GameServers = ContextBase.GetInstance <LoginContext>().GameServers.Select(gs => gs.Value).ToArray()
     });
 }
예제 #8
0
파일: ISCServer.cs 프로젝트: Yothri/Flarine
 public ISCServer()
 {
     Configuration.Host       = ContextBase.GetInstance <GameContext>().GameConfig.ISCServerHost;
     Configuration.Port       = ContextBase.GetInstance <GameContext>().GameConfig.ISCServerPort;
     Configuration.Blocking   = false;
     Configuration.BufferSize = 8192;
     Configuration.Backlog    = 5;
     Configuration.MaximumNumberOfConnections = 5;
 }
예제 #9
0
        protected override void OnClientDisconnected(LoginISCConnection connection)
        {
            Logger.Get <ISCServer>().LogInformation($"{connection.Socket.RemoteEndPoint.ToString()} disconnected from ISCServer.");

            if (ContextBase.GetInstance <LoginContext>().GameServers.TryGetValue(connection, out GameServer gameServer))
            {
                Logger.Get <ISCServer>().LogInformation($"GameServer {gameServer.Name} with id {gameServer.GameServerId} deregistered.");
                ContextBase.GetInstance <LoginContext>().GameServers.Remove(connection);
            }
        }
예제 #10
0
        public override INetPacketStream Handle(NetUser connection, INetPacketStream stream)
        {
            var userId      = stream.Read <string>();
            var accessToken = stream.Read <string>();

            ContextBase.GetInstance <GameContext>().LoginSessions.Add(new LoginSession
            {
                User = new User
                {
                    UserId          = userId,
                    UserAccessToken = accessToken
                }
            });

            return(null);
        }
예제 #11
0
        public override WPDResponse Handle()
        {
            var supportedLanguages = new List <SupportedLanguage>();

            foreach (var clientText in ContextBase.GetInstance <LoginContext>().ClientTexts)
            {
                supportedLanguages.Add(new SupportedLanguage {
                    LanguageId = clientText.languageId, MaintenanceInfoUrl = string.Empty
                });
            }

            return(new SupportedLanguagesResponse
            {
                DefaultLanguageId = ContextBase.GetInstance <LoginContext>().LoginConfig.DefaultLanguageId,
                SupportedLanguages = supportedLanguages.ToArray()
            });
        }
예제 #12
0
        public override WPDResponse Handle()
        {
            var session = ContextBase.GetInstance <GameContext>().GameSessions
                          .Where(s => s.User.GameAccessToken == GameAccessToken).FirstOrDefault();

            if (session == null)
            {
                return new GameMetaDatasResponse {
                           Result = 1
                }
            }
            ;

            return(new GameMetaDatasResponse
            {
                GameDatas = ContextBase.GetInstance <GameContext>().CompressedGameDatas
            });
        }
예제 #13
0
파일: Program.cs 프로젝트: Yothri/Flarine
        static void Main(string[] args)
        {
            using (var loginCtx = ContextBase.GetInstance <GateContext>())
                using (var gateWPDListener = new WPDGateListener())
                {
                    gateWPDListener.StartListening();
                    loginCtx.SetStatus("Listening");

                    while (true)
                    {
                        string inp = Console.ReadLine();
                        if (inp.Equals("exit"))
                        {
                            break;
                        }
                    }

                    gateWPDListener.StopListening();
                }
        }
예제 #14
0
        public override WPDResponse Handle()
        {
            var clientText = ContextBase.GetInstance <LoginContext>().ClientTexts.FirstOrDefault(t => t.languageId == (int)LanguageId);

            if (clientText == null)
            {
                clientText = ContextBase.GetInstance <LoginContext>().ClientTexts.FirstOrDefault();
            }
            if (clientText == null)
            {
                return new ClientTextMetaDatasResponse()
                       {
                           Result = 1, ErrMsg = "Server has no languages loaded."
                       }
            }
            ;

            return(new ClientTextMetaDatasResponse
            {
                ClientTexts = WPDUtil.ZipToBase64(clientText.SerializeBase64String())
            });
        }
예제 #15
0
        protected override void OnClientDisconnected(PhotonGameConnection connection)
        {
            var session = ContextBase.GetInstance <GameContext>().GameSessions
                          .Where(s => s.Connection == connection)
                          .FirstOrDefault();

            using (var dbCtx = DatabaseService.GetContext())
            {
                var hero = dbCtx.Heros
                           .Where(h => h.Id == session.SelectedPlayCharacter)
                           .FirstOrDefault();

                var character = session.AccountHeros
                                .Where(h => h.AccountHeroId == session.SelectedPlayCharacter)
                                .FirstOrDefault();

                hero.X         = character.Position.X;
                hero.Y         = character.Position.Y;
                hero.Z         = character.Position.Z;
                hero.RotationY = character.RotationY;
                dbCtx.SaveChanges();
            }

            // disconnect user to other clients
            GameContext.GameSessions
            .Where(s => s.Connection != null && s.Connection != connection)
            .ToList()
            .ForEach(s => s.Connection.SendEvent(new SEBHeroExitEventBody
            {
                accountHeroId = session.SelectedPlayCharacter
            }, ServerEventName.kEvent_HeroExit));

            GameContext.GameSessions.Remove(session);


            Logger.Get <PhotonGameServer>().LogInformation($"{connection.Socket.RemoteEndPoint.ToString()} disconnected from GameServer.");
        }
예제 #16
0
        public override INetPacketStream Handle(NetUser connection, INetPacketStream stream)
        {
            var ctx        = ContextBase.GetInstance <LoginContext>();
            var gameServer = new GameServer
            {
                VirtualGameServerId = stream.Read <int>(),
                GameServerId        = stream.Read <int>(),
                GroupId             = stream.Read <int>(),
                DisplayNo           = stream.Read <int>(),
                Name                = stream.Read <string>(),
                ApiUrl              = stream.Read <string>(),
                ProxyGameServerIp   = stream.Read <string>(),
                ProxyGameServerPort = stream.Read <int>(),
                IsMaintenance       = stream.Read <bool>(),
                PkEnabled           = stream.Read <bool>(),
                TimeZone            = stream.Read <string>(),
                StateCode           = stream.Read <int>(),
                IsRecommend         = stream.Read <bool>()
            };

            var packet = new NetPacket();

            packet.Write((short)OpCode.REGISTER_GS);
            if (ctx.GameServers.Values.Any(g => g.GameServerId == gameServer.GameServerId || g.VirtualGameServerId == gameServer.VirtualGameServerId))
            {
                packet.Write(false);
                Logger.Get <RegisterGameServerHandler>().LogWarning($"GameServer registration for {gameServer.Name} with id {gameServer.GameServerId} was rejected.");
            }
            else
            {
                ctx.GameServers.Add(connection, gameServer);
                packet.Write(true);
                Logger.Get <RegisterGameServerHandler>().LogInformation($"GameServer registration for {gameServer.Name} with id {gameServer.GameServerId} was granted.");
            }
            return(packet);
        }
예제 #17
0
        public override WPDResponse Handle()
        {
            var loginCtx = ContextBase.GetInstance <LoginContext>();

            var account = default(Account);

            using (var ctx = DatabaseService.GetContext())
            {
                account = ctx.Accounts
                          .FirstOrDefault(a => a.UserId == UserId && a.UserSecret == UserSecret);
            }

            if (account == null)
            {
                return new LoginResponse {
                           Result = 1
                }
            }
            ;

            var accessToken = new JObject();

            accessToken["userId"]       = account.UserId;
            accessToken["accessSecret"] = Utils.RandomString(20);
            accessToken["checkCode"]    = Utils.RandomString(32);
            accessToken["platform"]     = "android";

            var user = new User
            {
                UserType              = 1,
                UserId                = account.UserId,
                UserSecret            = account.UserSecret,
                UserAccessToken       = accessToken.ToString(),
                LastVirtualGameServer = 0
            };

            var previousSession = loginCtx.Sessions.FirstOrDefault(s => s.User.UserId == user.UserId && s.User.UserSecret == user.UserSecret);

            if (previousSession != null)
            {
                loginCtx.Sessions.Remove(previousSession);
            }

            loginCtx.Sessions.Add(new LoginSession
            {
                User = user
            });

            // Register user to game servers
            using (var packet = new NetPacket())
            {
                packet.Write((short)OpCode.REGISTER_USER);
                packet.Write(user.UserId);
                packet.Write(user.UserAccessToken);
                loginCtx.GetService <ISCServer>().SendTo(loginCtx.GameServers.Select(d => d.Key), packet);
            }

            return(new LoginResponse
            {
                UserType = user.UserType,
                AccessToken = user.UserAccessToken,
                LastVirtualGameServerId = user.LastVirtualGameServer
            });
        }
예제 #18
0
 public WPDGateListener() : base(ContextBase.GetInstance <GateContext>().GateConfig.WPDListenPrefix)
 {
 }
예제 #19
0
 public ISCClient()
 {
     Configuration.Host       = ContextBase.GetInstance <GameContext>().GameConfig.LoginISCHost;
     Configuration.Port       = ContextBase.GetInstance <GameContext>().GameConfig.LoginISCPort;
     Configuration.BufferSize = 8192;
 }
예제 #20
0
 public WPDLoginListener() : base(ContextBase.GetInstance <LoginContext>().LoginConfig.WPDListenPrefix)
 {
 }