Пример #1
0
        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~登录~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
        /// <summary>
        /// 登陆测试
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnLoginPageClick(object sender, EventArgs e)
        {
            if (m_tabLogin_Start.Text == "停止")
            {
                m_tabLogin_Start.Enabled = false;
                ClientNetManager.Instance.CloseAll();
                m_tabLogin_Start.Text    = "开始";
                m_tabLogin_Start.Enabled = true;
                EnableTabPage(true, m_tabLogin);
                EnableLoginTabPage(true);

                EventController.TriggerEvent(ClientEventID.SWITCH_PRESSURE, ePressureType.Login, false);
            }
            else
            {
                sPressureLoginInfo info = new sPressureLoginInfo();
                info.ip            = this.m_tabLogin_IP.Text;
                info.port          = ushort.Parse(this.m_tabLogin_Port.Text);
                info.client_count  = ushort.Parse(this.m_tabLogin_ClientCount.Text);
                info.dis_conn_time = float.Parse(this.m_tabLogin_DisconTime.Text);
                ServerConfig.net_info.login_server_ip    = info.ip;
                ServerConfig.net_info.login_server_port  = info.port;
                ServerConfig.net_info.login_client_count = info.client_count;

                m_tabLogin_Start.Enabled = false;
                EnableTabPage(false, m_tabLogin);
                EnableLoginTabPage(false);
                m_pressure_type       = ePressureType.Login;
                m_tabLogin_Start.Text = "停止";

                EventController.TriggerEvent(ClientEventID.SWITCH_PRESSURE, ePressureType.Login, true, info);
                ClientNetManager.Instance.StartConnect(info.ip, info.port, info.client_count, 8);
                m_tabLogin_Start.Enabled = true;
            }
        }
Пример #2
0
        private void OnPingNet(PacketBase packet)
        {
            eServerType server_type = eServerType.NONE;
            uint        packet_id   = 0; //发送包id
            long        tick        = 0; //发送时间,记录延迟
            long        offset_time = 0;
            uint        flags       = 0;

            if (packet is gs2c.PingNet)
            {
                gs2c.PingNet msg = packet as gs2c.PingNet;
                server_type = eServerType.GATE;
                packet_id   = msg.packet_id;
                tick        = msg.tick;
                offset_time = Time.time - tick;
                flags       = msg.flags;
                Log.Debug("收到gs包:" + msg.packet_id + " 时间:" + Time.time + " 延迟:" + (Time.time - msg.tick));
            }
            else if (packet is ss2c.PingNet)
            {
                ss2c.PingNet msg = packet as ss2c.PingNet;
                packet_id   = msg.packet_id;
                tick        = msg.tick;
                offset_time = Time.time - tick;
                flags       = msg.flags;
                if (Utils.HasFlag(msg.flags, (uint)eServerType.GLOBAL))
                {
                    server_type = eServerType.GLOBAL;
                }
                else
                {
                    server_type = eServerType.SERVER;
                }
                Log.Debug("收到ss包:" + msg.packet_id + " 时间:" + Time.time + " 延迟:" + (Time.time - msg.tick));
            }
            else if (packet is fs2c.PingNet)
            {
                fs2c.PingNet msg = packet as fs2c.PingNet;
                server_type = eServerType.FIGHT;
                packet_id   = msg.packet_id;
                tick        = msg.tick;
                offset_time = Time.time - tick;
                flags       = msg.flags;
                Log.Debug("收到fs包:" + msg.packet_id + " 时间:" + Time.time + " 延迟:" + (Time.time - msg.tick));
            }
            else if (packet is ws2c.PingNet)
            {
                ws2c.PingNet msg = packet as ws2c.PingNet;
                server_type = eServerType.WORLD;
                packet_id   = msg.packet_id;
                tick        = msg.tick;
                offset_time = Time.time - tick;
                flags       = msg.flags;
                Log.Debug("收到ws包:" + msg.packet_id + " 时间:" + Time.time + " 延迟:" + (Time.time - msg.tick));
            }
            if (server_type != eServerType.NONE)
            {
                EventController.TriggerEvent(ClientEventID.SERVER_PING, server_type, packet_id, tick, offset_time, flags);
            }
        }
Пример #3
0
        /// <summary>
        /// 上线
        /// </summary>
        public void OnEnter()
        {
            EventController.TriggerEvent(EventID.PLAYER_ENTER_GAME, m_char_idx);

            m_is_online        = true;
            m_last_access_time = Time.second_time;
        }
Пример #4
0
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~事件~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 private void OnAcceptConnect(long conn_idx)
 {
     m_sockets.Add(conn_idx);
     c2gs.EncryptInfo msg = PacketPools.Get(c2gs.msg.ENCRYPT) as c2gs.EncryptInfo;
     msg.version = 1;
     this.Send(conn_idx, msg);
     EventController.TriggerEvent(ClientEventID.NET_CONNECTED_OPEN, conn_idx);
 }
Пример #5
0
        public override void OnEnter()
        {
            base.OnEnter();

            m_player_bag.Setup();

            EventController.TriggerEvent(EventID.PLAYER_ENTER_GAME, m_obj_idx);
        }
Пример #6
0
 private void OnConnectClose(long conn_idx)
 {
     if (m_cur_conn_idx == conn_idx)
     {
         m_cur_conn_idx = 0;
     }
     EventController.TriggerEvent(ClientEventID.NET_CONNECTED_CLOSE, conn_idx);
 }
 private void OnConnectClose(long conn_idx)
 {
     lock (m_sync_lock)
     {
         m_sockets.Remove(conn_idx);
     }
     EventController.TriggerEvent(ClientEventID.NET_CONNECTED_CLOSE, conn_idx);
 }
Пример #8
0
        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~事件~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
        private void OnAcceptConnect(long conn_idx)
        {
            m_cur_conn_idx = conn_idx;

            c2gs.EncryptInfo msg = PacketPools.Get(c2gs.msg.ENCRYPT) as c2gs.EncryptInfo;
            msg.version = GlobalID.GetVersion();
            this.Send(msg);
            EventController.TriggerEvent(ClientEventID.NET_CONNECTED_OPEN, m_cur_conn_idx);
        }
Пример #9
0
 private static bool CheckLogin()
 {
     if (!ClientNetManager.Instance.is_connected)
     {
         EventController.TriggerEvent(ClientEventID.SHOW_STATUS, eFormStatusType.Log, "请先登录");
         return(false);
     }
     return(true);
 }
Пример #10
0
        public override void OnLeave()
        {
            EventController.TriggerEvent(EventID.PLAYER_LEAVE_GAME, m_obj_idx);

            m_unit_attr.SetAttribInteger(eUnitModType.UMT_time_last_logout, Time.second_time, true, false, false, false, false);
            this.Save();

            base.OnLeave();
        }
        private void OnConnAppLeave(ConnAppProc app_server)
        {
            Log.Info("断开与服务器的连接 type:" + app_server.srv_info.srv_type.ToString() + " sid:" + app_server.srv_info.srv_uid);

            if (app_server.srv_info.srv_type == eServerType.WORLD)
            {
                m_world_conn_idx = 0;
                EventController.TriggerEvent(EventID.NET_DISCONNECT_WORLD_SRV);
            }
        }
 private void OnConnAppEnter(ConnAppProc app_server)
 {
     Log.Info("连接上服务器 type:" + app_server.srv_info.srv_type.ToString() + " sid:" + app_server.srv_info.srv_uid);
     switch (app_server.srv_info.srv_type)
     {
     case eServerType.WORLD:
         EventController.TriggerEvent(EventID.NET_CONNECTED_WORLD_SRV);    //成功连接到世界服
         break;
     }
 }
Пример #13
0
        /// <summary>
        /// 上线
        /// </summary>
        public void OnEnter()
        {
            m_last_active_time     = Time.timeSinceStartup;
            m_is_send_check_online = false;

            //告诉客户端当前服务器时间
            ws2c.ServerTime rep_msg = PacketPools.Get(ws2c.msg.SERVER_TIME) as ws2c.ServerTime;
            rep_msg.server_time = GameTimeManager.Instance.server_time;
            ServerNetManager.Instance.SendProxy(m_client_uid, rep_msg);

            EventController.TriggerEvent(EventID.PLAYER_ENTER_GAME, m_char_idx);
        }
 private void OnConnAppLeave(ConnAppProc app_server)
 {
     Log.Info("断开与服务器的连接 type:" + app_server.srv_info.srv_type.ToString() + " sid:" + app_server.srv_info.srv_uid);
     app_server.srv_info.srv_status = eConnAppStatus.CLOSED;
     switch (app_server.srv_info.srv_type)
     {
     case eServerType.WORLD:
         m_world_conn_idx = 0;
         EventController.TriggerEvent(EventID.NET_DISCONNECT_WORLD_SRV);
         break;
     }
 }
        private void OnConnAppEnter(ConnAppProc app_server)
        {
            Log.Info("连接上服务器 type:" + app_server.srv_info.srv_type.ToString() + " sid:" + app_server.srv_info.srv_uid);
            if (app_server.srv_info.srv_type == eServerType.WORLD)
            {
                EventController.TriggerEvent(EventID.NET_CONNECTED_WORLD_SRV);//成功连接到世界服

                //启动DB
                DBManager.Instance.Start(ServerConfig.net_info.db_list);
                InitNextCharIdx();
            }
        }
Пример #16
0
        /// <summary>
        /// 下线
        /// </summary>
        public void OnLeave()
        {
            if (m_is_online)
            {
                //保存数据
                this.Save();

                EventController.TriggerEvent(EventID.PLAYER_LEAVE_GAME, m_char_idx);

                m_is_online        = false;
                m_last_access_time = Time.second_time;
            }
        }
Пример #17
0
 /// <summary>
 /// 创建角色
 /// </summary>
 private void OnCreateCharacter(PacketBase packet)
 {
     gs2c.CreateCharacter msg = packet as gs2c.CreateCharacter;
     if (msg.result != eCreateCharResult.E_SUCCESS)
     {
         EventController.TriggerEvent(ClientEventID.SHOW_MESSAGE, "创建角色错误:" + msg.result, "错误");
     }
     else
     {
         EventController.TriggerEvent(ClientEventID.SHOW_MESSAGE, "创建成功:" + msg.char_idx, "信息");
         ServerMsgSend.SendCharacterList();
     }
 }
Пример #18
0
        /// <summary>
        /// 登陆
        /// </summary>
        private void OnClientLogin(PacketBase packet)
        {
            gs2c.ClientLogin msg = packet as gs2c.ClientLogin;
            if (msg.login_result == eLoginResult.E_SUCCESS)
            {
                EventController.TriggerEvent(ClientEventID.SHOW_STATUS, eFormStatusType.Account, "登录账号:" + ServerConfig.net_info.user_name);
                EventController.TriggerEvent(ClientEventID.SHOW_STATUS, eFormStatusType.Log, "登录成功");

                ServerMsgSend.SendCharacterList();
            }
            else
            {
                EventController.TriggerEvent(ClientEventID.SHOW_MESSAGE, "登录错误:" + msg.login_result, "错误");
                EventController.TriggerEvent(ClientEventID.SHOW_STATUS, eFormStatusType.Log, "登录失败");
            }
        }
        /// <summary>
        /// 整点触发
        /// </summary>
        private void OnHourTimer(int timer_id, string param)
        {
            int h = DateTime.Now.Hour;//获取当前时间的小时部分

            if (h == m_cur_hour)
            {//有可能还差一点
                this.InitHourTimer();
                return;
            }
            else
            {//到时间了
                EventController.TriggerEvent(EventID.INTEGRAL_HOUR_TIMER, h);
                this.InitHourTimer();
                Log.Info("当前时间:" + DateTime.Now.Hour + " " + DateTime.Now.Minute + " " + DateTime.Now.Second);
            }
        }
Пример #20
0
        /// <summary>
        /// 角色列表
        /// </summary>
        private void OnCharacterList(PacketBase packet)
        {
            ss2c.EnumCharacter msg = packet as ss2c.EnumCharacter;
            LoginDataMgr.Instance.AddCharacterList(msg.list);
            if (msg.list.Count == 0 || msg.list.Count > 1)
            {
                EventController.TriggerEvent(ClientEventID.OPEN_FORM, eFormType.CreateUser);
            }
            else
            {
                CharacterLogin char_info = msg.list[0];
                EventController.TriggerEvent(ClientEventID.SHOW_STATUS, eFormStatusType.User, "当前角色:" + char_info.char_name);

                ServerMsgSend.SendEnterGame(char_info.char_idx);
            }
        }
Пример #21
0
 private void OnConnAppEnter(ConnAppProc app_server)
 {
     if (m_srv_servers.ContainsKey(app_server.srv_info.srv_uid))
     {
         Log.Warning("已经存在服务器 sid:" + app_server.srv_info.srv_uid);
         return;
     }
     Log.Info("连接上服务器 type:" + app_server.srv_info.srv_type.ToString() + " sid:" + app_server.srv_info.srv_uid);
     m_srv_servers.Add(app_server.srv_info.srv_uid, app_server);
     switch (app_server.srv_info.srv_type)
     {
     case eServerType.WORLD:
         //之所以放在连接世界服后再连接全局服,是可以告诉全局服ss所在大区id
         Connect2GlobalServer(ServerConfig.net_info.gl_ip, ServerConfig.net_info.gl_port);
         EventController.TriggerEvent(EventID.NET_CONNECTED_WORLD_SRV);    //成功连接到世界服
         break;
     }
 }
Пример #22
0
        private void OnConnAppEnter(ConnAppProc app_server)
        {
            if (m_srv_servers.ContainsKey(app_server.srv_info.srv_uid))
            {
                Log.Warning("已经存在服务器 sid:" + app_server.srv_info.srv_uid);
                return;
            }
            Log.Info("连接上服务器 type:" + app_server.srv_info.srv_type.ToString() + " sid:" + app_server.srv_info.srv_uid);
            m_srv_servers.Add(app_server.srv_info.srv_uid, app_server);
            switch (app_server.srv_info.srv_type)
            {
            case eServerType.WORLD:
                EventController.TriggerEvent(EventID.NET_CONNECTED_WORLD_SRV);    //成功连接到世界服
                break;

            case eServerType.GATE:
                break;
            }
        }
Пример #23
0
        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~创建角色~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
        /// <summary>
        /// 登陆测试
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnLoginPageClick(object sender, EventArgs e)
        {
            this.SetCreateProgress(0, 1);
            if (m_tabLogin_Start.Text == "停止")
            {
                m_tabLogin_Start.Text    = "开始";
                m_tabLogin_Start.Enabled = true;
                EnableTabPage(true, m_tabUser);
                EnableLoginTabPage(true);

                EventController.TriggerEvent(ClientEventID.SWITCH_PRESSURE, ePressureType.CreateUser, false);
            }
            else
            {
                sCreateUserInfo info = new sCreateUserInfo();
                info.ip            = this.m_tabUser_IP.Text;
                info.port          = ushort.Parse(this.m_tabUser_Port.Text);
                info.db_name       = this.m_tabUser_DB.Text;
                info.start_id      = long.Parse(this.m_tabUser_StartId.Text);
                info.start_account = long.Parse(this.m_tabUser_StartAccount.Text);
                info.end_account   = long.Parse(this.m_tabUser_EndAccount.Text);
                if (info.start_id < 0)
                {
                    MessageBox.Show("请设置有效的角色起始id", "错误", MessageBoxButtons.OK);
                    return;
                }
                if (info.end_account <= info.start_account || info.start_account < 0)
                {
                    MessageBox.Show("请设置有效的账号范围", "错误", MessageBoxButtons.OK);
                    return;
                }

                m_tabLogin_Start.Enabled = false;
                EnableTabPage(false, m_tabUser);
                EnableLoginTabPage(false);
                m_pressure_type       = ePressureType.CreateUser;
                m_tabLogin_Start.Text = "停止";

                EventController.TriggerEvent(ClientEventID.SWITCH_PRESSURE, ePressureType.CreateUser, true, info);
                m_tabLogin_Start.Enabled = true;
            }
        }
Пример #24
0
        private void OnConnAppLeave(ConnAppProc app_server)
        {
            Log.Info("断开与服务器的连接 type:" + app_server.srv_info.srv_type.ToString() + " sid:" + app_server.srv_info.srv_uid);
            app_server.srv_info.srv_status = eConnAppStatus.CLOSED;
            switch (app_server.srv_info.srv_type)
            {
            case eServerType.WORLD:
                m_world_conn_idx = 0;
                EventController.TriggerEvent(EventID.NET_DISCONNECT_WORLD_SRV);
                break;

            case eServerType.GLOBAL:
                m_global_conn_idx = 0;
                break;

            case eServerType.FIGHT:    //如果战斗服退出,当前战斗服的玩家自动连接其他战斗服
                EventController.TriggerEvent(EventID.NET_DISCONNECT_FIGHT_SRV, app_server.srv_info.srv_uid);
                break;
            }
            m_srv_servers.Remove(app_server.srv_info.srv_uid);
        }
Пример #25
0
        /// <summary>
        /// 场景切换
        /// </summary>
        private void OnEnterScene(PacketBase packet)
        {
            ss2c.EnterScene msg = packet as ss2c.EnterScene;

            UnitManager.Instance.RemoveAll();
            //玩家信息
            PlayerInfoForClient char_info   = PlayerDataMgr.Instance.main_player_info;
            PlayerAOIInfo       player_info = CommonObjectPools.Spawn <PlayerAOIInfo>();

            player_info.char_name = char_info.char_name;
            player_info.char_type = char_info.char_type;
            player_info.pos_x     = msg.pos.x;
            player_info.pos_y     = msg.pos.y;
            player_info.flags     = char_info.flags;
            player_info.model_idx = char_info.model_idx;
            player_info.job       = char_info.job;
            player_info.level     = char_info.level;
            player_info.exp       = char_info.exp;
            player_info.energy    = char_info.energy;
            player_info.gold      = char_info.gold;
            player_info.coin      = char_info.coin;
            player_info.hp        = char_info.hp;
            player_info.hp_max    = char_info.hp_max;
            player_info.hurt      = char_info.hurt;
            player_info.range     = char_info.range;
            player_info.run_speed = char_info.run_speed;
            player_info.vip_grade = char_info.vip_grade;
            player_info.vip_flags = char_info.vip_flags;

            //创建玩家对象
            Player player = new Player();

            player.obj_idx = char_info.char_idx;
            player.Setup();
            player.LoadData(player_info);
            UnitManager.Instance.AddUnit(player);

            EventController.TriggerEvent(ClientEventID.SHOW_STATUS, eFormStatusType.Scene, "当前场景:" + msg.scene_type);
            EventController.TriggerEvent(ClientEventID.SHOW_STATUS, eFormStatusType.Log, "进入场景:" + msg.scene_type);
        }
Пример #26
0
        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~移动~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
        private void OnMovePageClick(object sender, EventArgs e)
        {
            if (m_tabMove_Start.Text == "停止")
            {
                m_tabMove_Start.Enabled = false;
                ClientNetManager.Instance.CloseAll();
                m_tabMove_Start.Text    = "开始";
                m_tabMove_Start.Enabled = true;
                EnableTabPage(true, m_tabMove);
                EnableMoveTabPage(true);

                EventController.TriggerEvent(ClientEventID.SWITCH_PRESSURE, ePressureType.Move, false);
            }
            else
            {
                sPressureMoveInfo info = new sPressureMoveInfo();
                info.ip            = this.m_tabMove_IP.Text;
                info.port          = ushort.Parse(this.m_tabMove_Port.Text);
                info.client_count  = ushort.Parse(this.m_tabMove_ClientCount.Text);
                info.move_time     = float.Parse(this.m_tabMove_MoveTime.Text);
                info.start_account = long.Parse(this.m_tabMove_StartAccount.Text);
                ServerConfig.net_info.move_server_ip     = info.ip;
                ServerConfig.net_info.move_server_port   = info.port;
                ServerConfig.net_info.move_client_count  = info.client_count;
                ServerConfig.net_info.move_start_account = info.start_account;

                m_tabMove_Start.Enabled = false;
                EnableTabPage(false, m_tabMove);
                EnableMoveTabPage(false);
                m_pressure_type      = ePressureType.Move;
                m_tabMove_Start.Text = "停止";

                EventController.TriggerEvent(ClientEventID.SWITCH_PRESSURE, ePressureType.Move, true, info);
                ClientNetManager.Instance.StartConnect(info.ip, info.port, info.client_count, 10);
                m_tabMove_Start.Enabled = true;
            }
        }
Пример #27
0
        /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~网络~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
        /// <summary>
        /// 网络压力
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnNetPageClick(object sender, EventArgs e)
        {
            if (m_tabNet_Start.Text == "停止")
            {
                m_tabNet_Start.Enabled = false;
                ClientNetManager.Instance.CloseAll();
                m_tabNet_Start.Text    = "开始";
                m_tabNet_Start.Enabled = true;
                EnableTabPage(true, m_tabNet);
                EnableNetTabPage(true);

                EventController.TriggerEvent(ClientEventID.SWITCH_PRESSURE, ePressureType.Net, false);
            }
            else
            {
                sPressureNetInfo info = new sPressureNetInfo();
                info.ip                                = this.m_tabNet_IP.Text;
                info.port                              = ushort.Parse(this.m_tabNet_Port.Text);
                info.client_count                      = ushort.Parse(this.m_tabNet_ClientCount.Text);
                info.send_count_per_second             = ushort.Parse(this.m_tabNet_SendCountPerSecond.Text);
                info.send_size_per_packet              = ushort.Parse(this.m_tabNet_SendSizePerSecond.Text);
                ServerConfig.net_info.net_server_ip    = info.ip;
                ServerConfig.net_info.net_server_port  = info.port;
                ServerConfig.net_info.net_client_count = info.client_count;

                m_tabNet_Start.Enabled = false;
                EnableTabPage(false, m_tabNet);
                EnableNetTabPage(false);
                m_pressure_type     = ePressureType.Net;
                m_tabNet_Start.Text = "停止";

                EventController.TriggerEvent(ClientEventID.SWITCH_PRESSURE, ePressureType.Net, true, info);
                ClientNetManager.Instance.StartConnect(info.ip, info.port, info.client_count, 5);
                m_tabNet_Start.Enabled = true;
            }
        }
        private void CreateOneUser(long account_idx, long char_idx)
        {
            if (!m_active || account_idx > m_pressure_info.end_account)
            {
                return;
            }

            CreateCharacterInfo create_info = new CreateCharacterInfo();

            create_info.spid      = 0;
            create_info.ws_id     = 0;
            create_info.ss_id     = 0;
            create_info.fs_id     = 0;
            create_info.char_idx  = char_idx;
            create_info.char_name = "test" + account_idx;
            create_info.char_type = (byte)(MathUtils.Rand_Sign() == 1 ? eSexType.BOY : eSexType.GIRL);

            SQLCharHandle.CreateCharacter(account_idx, create_info, (res) =>
            {
                if (create_info.char_idx != res)
                {
                    Log.Error("创建角色失败,账号:" + account_idx + ", error:" + res.ToString());
                }
                EventController.TriggerEvent(ClientEventID.CREATE_PROGRESS, (int)(account_idx - m_pressure_info.start_account), (int)(m_pressure_info.end_account - m_pressure_info.start_account));
                if (account_idx + 1 > m_pressure_info.end_account)
                {
                    EventController.TriggerEvent(ClientEventID.CREATE_COMPLETE);
                    this.Stop();
                }
                else
                {
                    this.CreateOneUser(account_idx + 1, char_idx + 1);
                }
            }
                                          );
        }
Пример #29
0
 /// <summary>
 /// 下线
 /// </summary>
 public void OnLeave()
 {
     EventController.TriggerEvent(EventID.PLAYER_LEAVE_GAME, m_char_idx);
 }
 private void OnMessageReveived(long conn_idx, ushort header, ByteArray data)
 {
     m_recv_msg_count++;
     m_recv_msg_size += data.Available + NetID.PacketHeadSize + 2;
     EventController.TriggerEvent(ClientEventID.RECV_DATA, conn_idx, header, data);
 }