예제 #1
0
        public static void NotifyPlayerJoining(PlayerInfo src, Blaze.Packet p, PlayerInfo pi, NetworkStream ns)
        {
            uint             t      = Blaze.GetUnixTimeStamp();
            List <Blaze.Tdf> result = new List <Blaze.Tdf>();

            result.Add(Blaze.TdfInteger.Create("GID\0", pi.game.id));
            List <Blaze.Tdf> PDAT = new List <Blaze.Tdf>();

            PDAT.Add(Blaze.TdfInteger.Create("EXID", pi.userId));
            PDAT.Add(Blaze.TdfInteger.Create("GID\0", pi.game.id));
            PDAT.Add(Blaze.TdfInteger.Create("LOC\0", pi.loc));
            PDAT.Add(Blaze.TdfString.Create("NAME", pi.profile.name));
            PDAT.Add(Blaze.TdfInteger.Create("PID\0", pi.userId));
            PDAT.Add(BlazeHelper.CreateNETFieldUnion(pi, "PNET"));
            PDAT.Add(Blaze.TdfInteger.Create("SID\0", pi.slot));
            PDAT.Add(Blaze.TdfInteger.Create("STAT", pi.stat));
            PDAT.Add(Blaze.TdfInteger.Create("TIDX", 0xFFFF));
            PDAT.Add(Blaze.TdfInteger.Create("TIME", t));
            PDAT.Add(Blaze.TdfInteger.Create("UID\0", pi.userId));
            result.Add(Blaze.TdfStruct.Create("PDAT", PDAT));
            byte[] buff = Blaze.CreatePacket(0x4, 0x15, 0, 0x2000, 0, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [0004:0015] NotifyPlayerJoining");
        }
예제 #2
0
 public static void Exit()
 {
     Logger.Warn("[MAIN] Exit the Server...");
     stop = false;
     if (!BlazeServer._exit)
     {
         BlazeServer.Stop();
     }
     if (!MagmaServer._exit)
     {
         MagmaServer.Stop();
     }
     if (!QOSServer._exit)
     {
         QOSServer.Stop();
     }
     if (!RedirectorServer._exit)
     {
         RedirectorServer.Stop();
     }
     if (!Webserver._exit)
     {
         Webserver.Stop();
     }
 }
예제 #3
0
        public static void NotifyUserRemoved(PlayerInfo src, Blaze.Packet p, long pid, NetworkStream ns)
        {
            List <Blaze.Tdf> result = new List <Blaze.Tdf>();

            result.Add(Blaze.TdfInteger.Create("BUID", pid));
            byte[] buff = Blaze.CreatePacket(0x7802, 0x3, 0, 0x2000, 0, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [7802:0001] NotifyUserRemoved");
        }
예제 #4
0
        public static void UserSessionExtendedDataUpdateNotification(PlayerInfo src, Blaze.Packet p, PlayerInfo pi, NetworkStream ns)
        {
            List <Blaze.Tdf> Result = new List <Blaze.Tdf>();

            Result.Add(BlazeHelper.CreateUserDataStruct(pi));
            Result.Add(Blaze.TdfInteger.Create("USID", pi.userId));
            byte[] buff = Blaze.CreatePacket(0x7802, 1, 0, 0x2000, 0, Result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [7802:0001] UserSessionExtendedDataUpdateNotification");
        }
예제 #5
0
        public static void NotifyUserAdded(PlayerInfo src, Blaze.Packet p, PlayerInfo pi, NetworkStream ns)
        {
            List <Blaze.Tdf> result = new List <Blaze.Tdf>();

            result.Add(BlazeHelper.CreateUserDataStruct(pi));
            result.Add(BlazeHelper.CreateUserStruct(pi));
            byte[] buff = Blaze.CreatePacket(0x7802, 0x2, 0, 0x2000, 0, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [7802:0001] NotifyUserAdded");
        }
예제 #6
0
        public static void NotifyGameStateChange(PlayerInfo src, Blaze.Packet p, PlayerInfo pi, NetworkStream ns)
        {
            List <Blaze.Tdf> result = new List <Blaze.Tdf>();

            result.Add(Blaze.TdfInteger.Create("GID\0", pi.game.id));
            result.Add(Blaze.TdfInteger.Create("GSTA", pi.game.GSTA));
            byte[] buff = Blaze.CreatePacket(4, 0x64, 0, 0x2000, 0, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [0004:0064] NotifyGameStateChange");
        }
예제 #7
0
        public static void NotifyPlayerJoinCompleted(PlayerInfo src, Blaze.Packet p, PlayerInfo pi, NetworkStream ns)
        {
            List <Blaze.Tdf> result = new List <Blaze.Tdf>();

            result.Add(Blaze.TdfInteger.Create("GID\0", pi.game.id));
            result.Add(Blaze.TdfInteger.Create("PID\0", pi.userId));
            byte[] buff = Blaze.CreatePacket(0x4, 0x1E, 0, 0x2000, 0, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [0004:001E] NotifyPlayerJoinCompleted");
        }
예제 #8
0
        public static void StartServers()
        {
            bool useQOS       = Config.useQOS;
            bool useWebServer = Config.useWebServer;
            bool RediSSL      = Config.RediSSL;
            bool useShark     = Config.useShark;
            bool DEDISRV      = Config.DEDIServer;

            ProviderInfo.backendIP = Config.IPAddress;

            if (useQOS)
            {
                ProviderInfo.QOS_IP = ProviderInfo.backendIP;
            }
            else
            {
                ProviderInfo.QOS_IP = "gossjcprod-qos01.ea.com";
            }

            if (RediSSL)
            {
                RedirectorServer.useSSL = true;
            }
            else
            {
                RedirectorServer.useSSL = false;
            }

            if (!useShark)
            {
                RedirectorServer.targetPort = 30001;
            }

            RedirectorServer.Start();
            BlazeServer.Start();

            MagmaServer.basicMode = true;
            MagmaServer.Start();

            if (useQOS)
            {
                QOSServer.Start();
            }

            if (useWebServer)
            {
                Webserver.Start();
            }

            if (DEDISRV)
            {
                StartDEDServer();
            }
        }
예제 #9
0
        public static void NotifyUserStatus(PlayerInfo src, Blaze.Packet p, PlayerInfo pi, NetworkStream ns)
        {
            List <Blaze.Tdf> result = new List <Blaze.Tdf>();

            result.Add(Blaze.TdfInteger.Create("FLGS", 3));
            result.Add(Blaze.TdfInteger.Create("ID\0\0", pi.userId));
            byte[] buff = Blaze.CreatePacket(0x7802, 0x5, 0, 0x2000, 0, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [7802:0001] NotifyUserStatus");
        }
예제 #10
0
        public static void NotifyPlatformHostInitialized(PlayerInfo src, Blaze.Packet p, PlayerInfo pi, NetworkStream ns)
        {
            List <Blaze.Tdf> result = new List <Blaze.Tdf>();

            result.Add(Blaze.TdfInteger.Create("GID\0", pi.game.id));
            result.Add(Blaze.TdfInteger.Create("PHID", pi.userId));
            result.Add(Blaze.TdfInteger.Create("PHST", 0));
            byte[] buff = Blaze.CreatePacket(4, 0x47, 0, 0x2000, 0, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [0004:0047] NotifyPlatformHostInitialized");
        }
예제 #11
0
        public static void NotifyPlayerRemoved(PlayerInfo src, Blaze.Packet p, PlayerInfo pi, NetworkStream ns, long pid, long cntx, long reas)
        {
            List <Blaze.Tdf> result = new List <Blaze.Tdf>();

            result.Add(Blaze.TdfInteger.Create("CNTX", cntx));
            result.Add(Blaze.TdfInteger.Create("GID\0", pi.game.id));
            result.Add(Blaze.TdfInteger.Create("PID\0", pid));
            result.Add(Blaze.TdfInteger.Create("REAS", reas));
            byte[] buff = Blaze.CreatePacket(4, 0x28, 0, 0x2000, 0, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [0004:001E] NotifyPlayerRemoved");
        }
        public static void JoinGame(Blaze.Packet p, PlayerInfo pi, NetworkStream ns)
        {
            PlayerInfo srv = null;

            foreach (PlayerInfo info in BlazeServer.allClients)
            {
                if (info.isServer)
                {
                    srv = info;
                    break;
                }
            }
            if (srv == null)
            {
                Logger.Error("[CLNT] #" + pi.userId + " : cant find game to join!");
                return;
            }
            pi.game = srv.game;
            pi.slot = srv.game.getNextSlot();
            BlazeServer.Log("[CLNT] #" + pi.userId + " : assigned Slot Id " + pi.slot);
            if (pi.slot == 255)
            {
                Logger.Warn("[CLNT] #" + pi.userId + " : server full!");
                return;
            }
            srv.game.setNextSlot((int)pi.userId);
            srv.game.players[pi.slot] = pi;

            List <Blaze.Tdf> result = new List <Blaze.Tdf>();

            result.Add(Blaze.TdfInteger.Create("GID\0", srv.game.id));
            result.Add(Blaze.TdfInteger.Create("JGS\0", 0));
            byte[] buff = Blaze.CreatePacket(p.Component, p.Command, 0, 0x1000, p.ID, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();

            pi.stat = 2;

            AsyncUserSessions.NotifyUserAdded(pi, p, pi, ns);
            AsyncUserSessions.NotifyUserStatus(pi, p, pi, ns);
            AsyncGameManager.NotifyClientGameSetup(pi, p, pi, srv, ns);

            AsyncUserSessions.NotifyUserAdded(srv, p, pi, srv.ns);
            AsyncUserSessions.NotifyUserStatus(srv, p, pi, srv.ns);
            AsyncUserSessions.UserSessionExtendedDataUpdateNotification(srv, p, pi, srv.ns);
            AsyncGameManager.NotifyPlayerJoining(srv, p, pi, srv.ns);
        }
예제 #13
0
        public static void GetStatsAsyncNotification(Blaze.Packet p, PlayerInfo pi, NetworkStream ns)
        {
            List <Blaze.Tdf> input     = Blaze.ReadPacketContent(p);
            string           statSpace = ((Blaze.TdfString)input[2]).Value;
            long             vid       = ((Blaze.TdfInteger)input[7]).Value;
            long             eid       = ((List <long>)((Blaze.TdfList)input[1]).List)[0];
            List <Blaze.Tdf> Result    = new List <Blaze.Tdf>();

            Result.Add(Blaze.TdfString.Create("GRNM", statSpace));
            Result.Add(Blaze.TdfString.Create("KEY\0", "No_Scope_Defined"));
            Result.Add(Blaze.TdfInteger.Create("LAST", 1));
            List <Blaze.Tdf>       STS  = new List <Blaze.Tdf>();
            List <Blaze.TdfStruct> STAT = new List <Blaze.TdfStruct>();
            List <Blaze.Tdf>       e0   = new List <Blaze.Tdf>();

            e0.Add(Blaze.TdfInteger.Create("EID\0", eid));
            e0.Add(Blaze.TdfDoubleVal.Create("ETYP", new Blaze.DoubleVal(30722, 1)));
            e0.Add(Blaze.TdfInteger.Create("POFF", 0));
            List <string> values = new List <string>();

            if (statSpace == "crit")
            {
                values.AddRange(new string[] { pi.profile.level.ToString(),
                                               pi.profile.xp.ToString(),
                                               "10000" });
            }
            else
            {
                values.AddRange(new string[] { pi.profile.kit.ToString(),
                                               pi.profile.head.ToString(),
                                               pi.profile.face.ToString(),
                                               pi.profile.shirt.ToString() });
            }
            e0.Add(Blaze.TdfList.Create("STAT", 1, values.Count, values));
            STAT.Add(Blaze.TdfStruct.Create("0", e0));
            STS.Add(Blaze.TdfList.Create("STAT", 3, STAT.Count, STAT));
            Result.Add(Blaze.TdfStruct.Create("STS\0", STS));
            Result.Add(Blaze.TdfInteger.Create("VID\0", vid));
            byte[] buff = Blaze.CreatePacket(7, 0x32, 0, 0x2000, 0, Result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + pi.userId + " [0007:0032] GetStatsAsyncNotification");
        }
예제 #14
0
 public static void Refresh()
 {
     profiles = new List <Profile>();
     if (!Directory.Exists("backend"))
     {
         Directory.CreateDirectory("backend");
     }
     if (!Directory.Exists("backend\\profiles"))
     {
         Directory.CreateDirectory("backend\\profiles");
     }
     string[] files = Directory.GetFiles("backend\\profiles\\", "*.txt");
     foreach (string file in files)
     {
         Profile p = Profile.Load(file);
         if (p != null)
         {
             profiles.Add(p);
         }
     }
     BlazeServer.Log("[MAIN] Loaded " + profiles.Count + " player profiles");
 }
예제 #15
0
 public static void tBlazeMain(object obj)
 {
     try
     {
         Log("[MAIN] Blaze starting...");
         Profiles.Refresh();
         lBlaze = new TcpListener(IPAddress.Parse(ProviderInfo.backendIP), 30001);
         Log("[MAIN] Blaze bound to " + ProviderInfo.backendIP + ":30001");
         lBlaze.Start();
         Log("[MAIN] Blaze listening...");
         while (!GetExit())
         {
             while (!BlazeServer.GetExit())
             {
                 new Thread(new ParameterizedThreadStart(tBlazeClientHandler)).Start((object)lBlaze.AcceptTcpClient());
             }
         }
     }
     catch (Exception ex)
     {
         LogError("MAIN", ex);
     }
 }
예제 #16
0
        public static void NotifyServerGameSetup(PlayerInfo src, Blaze.Packet p, PlayerInfo pi, NetworkStream ns)
        {
            List <Blaze.Tdf> input = Blaze.ReadPacketContent(p);
            uint             t     = Blaze.GetUnixTimeStamp();

            pi.game.GNAM = ((Blaze.TdfString)input[2]).Value;
            pi.game.GSET = ((Blaze.TdfInteger)input[3]).Value;
            pi.game.VOIP = ((Blaze.TdfInteger)input[21]).Value;
            pi.game.VSTR = ((Blaze.TdfString)input[22]).Value;
            List <Blaze.Tdf> result = new List <Blaze.Tdf>();
            List <Blaze.Tdf> GAME   = new List <Blaze.Tdf>();

            GAME.Add(Blaze.TdfList.Create("ADMN", 0, 1, new List <long>(new long[] { pi.userId })));
            GAME.Add(Blaze.TdfList.Create("CAP\0", 0, 2, new List <long>(new long[] { 0x20, 0 })));
            GAME.Add(Blaze.TdfInteger.Create("GID\0", pi.game.id));
            GAME.Add(Blaze.TdfString.Create("GNAM", pi.game.GNAM));
            GAME.Add(Blaze.TdfInteger.Create("GPVH", 666));
            GAME.Add(Blaze.TdfInteger.Create("GSET", pi.game.GSET));
            GAME.Add(Blaze.TdfInteger.Create("GSID", 1));
            GAME.Add(Blaze.TdfInteger.Create("GSTA", pi.game.GSTA));
            GAME.Add(Blaze.TdfString.Create("GTYP", "AssaultStandard"));
            GAME.Add(BlazeHelper.CreateNETField(pi, "HNET"));
            GAME.Add(Blaze.TdfInteger.Create("HSES", 13666));
            GAME.Add(Blaze.TdfInteger.Create("IGNO", 0));
            GAME.Add(Blaze.TdfInteger.Create("MCAP", 0x20));
            GAME.Add(BlazeHelper.CreateNQOSField(pi, "NQOS"));
            GAME.Add(Blaze.TdfInteger.Create("NRES", 0));
            GAME.Add(Blaze.TdfInteger.Create("NTOP", 1));
            GAME.Add(Blaze.TdfString.Create("PGID", ""));
            List <Blaze.Tdf> PHST = new List <Blaze.Tdf>();

            PHST.Add(Blaze.TdfInteger.Create("HPID", pi.userId));
            GAME.Add(Blaze.TdfStruct.Create("PHST", PHST));
            GAME.Add(Blaze.TdfInteger.Create("PRES", 1));
            GAME.Add(Blaze.TdfString.Create("PSAS", "wv"));
            GAME.Add(Blaze.TdfInteger.Create("QCAP", 0x10));
            GAME.Add(Blaze.TdfInteger.Create("SEED", 0x2CF2048F));
            GAME.Add(Blaze.TdfInteger.Create("TCAP", 0x10));
            List <Blaze.Tdf> THST = new List <Blaze.Tdf>();

            THST.Add(Blaze.TdfInteger.Create("HPID", pi.userId));
            GAME.Add(Blaze.TdfStruct.Create("THST", THST));
            GAME.Add(Blaze.TdfList.Create("TIDS", 0, 2, new List <long>(new long[] { 1, 2 })));
            GAME.Add(Blaze.TdfString.Create("UUID", "f5193367-c991-4429-aee4-8d5f3adab938"));
            GAME.Add(Blaze.TdfInteger.Create("VOIP", pi.game.VOIP));
            GAME.Add(Blaze.TdfString.Create("VSTR", pi.game.VSTR));
            result.Add(Blaze.TdfStruct.Create("GAME", GAME));
            List <Blaze.TdfStruct> PROS = new List <Blaze.TdfStruct>();
            List <Blaze.Tdf>       ee0  = new List <Blaze.Tdf>();

            ee0.Add(Blaze.TdfInteger.Create("EXID", pi.userId));
            ee0.Add(Blaze.TdfInteger.Create("GID\0", pi.game.id));
            ee0.Add(Blaze.TdfInteger.Create("LOC\0", pi.loc));
            ee0.Add(Blaze.TdfString.Create("NAME", pi.profile.name));
            ee0.Add(Blaze.TdfInteger.Create("PID\0", pi.userId));
            ee0.Add(BlazeHelper.CreateNETFieldUnion(pi, "PNET"));
            ee0.Add(Blaze.TdfInteger.Create("SID\0", pi.slot));
            ee0.Add(Blaze.TdfInteger.Create("SLOT", 0));
            ee0.Add(Blaze.TdfInteger.Create("STAT", 2));
            ee0.Add(Blaze.TdfInteger.Create("TIDX", 0xFFFF));
            ee0.Add(Blaze.TdfInteger.Create("TIME", t));
            ee0.Add(Blaze.TdfInteger.Create("UID\0", pi.userId));
            PROS.Add(Blaze.TdfStruct.Create("0", ee0));
            result.Add(Blaze.TdfList.Create("PROS", 3, 1, PROS));
            List <Blaze.Tdf> VALU = new List <Blaze.Tdf>();

            VALU.Add(Blaze.TdfInteger.Create("DCTX", 0));
            result.Add(Blaze.TdfUnion.Create("REAS", 0, Blaze.TdfStruct.Create("VALU", VALU)));
            byte[] buff = Blaze.CreatePacket(p.Component, 0x14, 0, 0x2000, 0, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [0004:0014] NotifyServerGameSetup");
        }
예제 #17
0
        public static void NotifyClientGameSetup(PlayerInfo src, Blaze.Packet p, PlayerInfo pi, PlayerInfo srv, NetworkStream ns, long reas = 1)
        {
            List <Blaze.Tdf> result = new List <Blaze.Tdf>();
            List <Blaze.Tdf> GAME   = new List <Blaze.Tdf>();

            GAME.Add(Blaze.TdfList.Create("ADMN", 0, 1, new List <long>(new long[] { srv.userId })));
            if (srv.game.ATTR != null)
            {
                GAME.Add(srv.game.ATTR);
            }
            GAME.Add(Blaze.TdfList.Create("CAP\0", 0, 2, new List <long>(new long[] { 0x20, 0 })));
            GAME.Add(Blaze.TdfInteger.Create("GID\0", srv.game.id));
            GAME.Add(Blaze.TdfString.Create("GNAM", srv.game.GNAM));
            GAME.Add(Blaze.TdfInteger.Create("GPVH", 666));
            GAME.Add(Blaze.TdfInteger.Create("GSET", srv.game.GSET));
            GAME.Add(Blaze.TdfInteger.Create("GSID", 1));
            GAME.Add(Blaze.TdfInteger.Create("GSTA", srv.game.GSTA));
            GAME.Add(Blaze.TdfString.Create("GTYP", "AssaultStandard"));
            GAME.Add(BlazeHelper.CreateNETField(srv, "HNET"));
            GAME.Add(Blaze.TdfInteger.Create("HSES", 13666));
            GAME.Add(Blaze.TdfInteger.Create("IGNO", 0));
            GAME.Add(Blaze.TdfInteger.Create("MCAP", 0x20));
            GAME.Add(BlazeHelper.CreateNQOSField(srv, "NQOS"));
            GAME.Add(Blaze.TdfInteger.Create("NRES", 0));
            GAME.Add(Blaze.TdfInteger.Create("NTOP", 1));
            GAME.Add(Blaze.TdfString.Create("PGID", ""));
            List <Blaze.Tdf> PHST = new List <Blaze.Tdf>();

            PHST.Add(Blaze.TdfInteger.Create("HPID", srv.userId));
            PHST.Add(Blaze.TdfInteger.Create("HSLT", srv.slot));
            GAME.Add(Blaze.TdfStruct.Create("PHST", PHST));
            GAME.Add(Blaze.TdfInteger.Create("PRES", 1));
            GAME.Add(Blaze.TdfString.Create("PSAS", "wv"));
            GAME.Add(Blaze.TdfInteger.Create("QCAP", 0x10));
            GAME.Add(Blaze.TdfInteger.Create("SEED", 0x2CF2048F));
            GAME.Add(Blaze.TdfInteger.Create("TCAP", 0x10));
            List <Blaze.Tdf> THST = new List <Blaze.Tdf>();

            THST.Add(Blaze.TdfInteger.Create("HPID", srv.userId));
            THST.Add(Blaze.TdfInteger.Create("HSLT", srv.slot));
            GAME.Add(Blaze.TdfStruct.Create("THST", THST));
            List <long> playerIdList = new List <long>();

            for (int i = 0; i < 32; i++)
            {
                if (srv.game.slotUse[i] != -1)
                {
                    playerIdList.Add(srv.game.slotUse[i]);
                }
            }
            GAME.Add(Blaze.TdfList.Create("TIDS", 0, 2, playerIdList));
            GAME.Add(Blaze.TdfString.Create("UUID", "f5193367-c991-4429-aee4-8d5f3adab938"));
            GAME.Add(Blaze.TdfInteger.Create("VOIP", srv.game.VOIP));
            GAME.Add(Blaze.TdfString.Create("VSTR", srv.game.VSTR));
            result.Add(Blaze.TdfStruct.Create("GAME", GAME));
            List <Blaze.TdfStruct> PROS = new List <Blaze.TdfStruct>();

            for (int i = 0; i < 32; i++)
            {
                if (srv.game.players[i] != null)
                {
                    PROS.Add(BlazeHelper.MakePROSEntry(i, srv.game.players[i]));
                }
            }
            result.Add(Blaze.TdfList.Create("PROS", 3, PROS.Count, PROS));
            List <Blaze.Tdf> VALU = new List <Blaze.Tdf>();

            VALU.Add(Blaze.TdfInteger.Create("DCTX", reas));
            result.Add(Blaze.TdfUnion.Create("REAS", 0, Blaze.TdfStruct.Create("VALU", VALU)));
            byte[] buff = Blaze.CreatePacket(0x4, 0x14, 0, 0x2000, 0, result);
            ns.Write(buff, 0, buff.Length);
            ns.Flush();
            BlazeServer.Log("[CLNT] #" + src.userId + " [0004:0014] NotifyClientGameSetup");
        }