Beispiel #1
0
        /// <summary>
        /// LS의 연결 상태 변동에 따른 처리
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="status"></param>
        private void LS_ConnectionStatusChanged(EventDrivenTCPClient sender, EventDrivenTCPClient.ConnectionStatus status)
        {
            if (status == EventDrivenTCPClient.ConnectionStatus.Connected)
            {
                _Main.UpdateLSinfo("Connected");
                MSG_ZA2LS_CONNECT LS_Connect = new MSG_ZA2LS_CONNECT();
                LS_Connect.byServerID = Config.ZA.sID;
                LS_Connect.byAgentID  = Config.ZA.aID;
                LS_Connect.szZAIP     = Config.ZA.IP.ToString();
                LS_Connect.dwZAPort   = (uint)Config.ZA.Port;
                LS.Send(LS_Connect.Serialize());

                //LS가 종료되었다 재실행 되었을 경우를 대비하여 현재 접속 유저 정보를 LS에 알려준다.
                if (ZoneAgent._Players != null)
                {
                    foreach (var player in ZoneAgent._Players)
                    {
                        MSG_ZA2LS_LOGIN_USER_LIST LS_ConnectedPlayer = new MSG_ZA2LS_LOGIN_USER_LIST();
                        LS_ConnectedPlayer.MsgHeader.dwPCID = player.Key;
                        LS_ConnectedPlayer.szUserAccount    = player.Value.Account;
                        LS_ConnectedPlayer.szUserIP         = player.Value.IPadress;
                        LS.Send(LS_ConnectedPlayer.Serialize());
                    }
                }
                LS_Reporter.Change(0, 5000);
                Prepared_Checker.Change(0, 500);
            }
            else
            {
                _Main.UpdateLSinfo("Disconnected");
                LS_Reporter.Change(Timeout.Infinite, Timeout.Infinite);
                Prepared_Checker.Change(Timeout.Infinite, Timeout.Infinite);
                PreparedAcc.Clear();
            }
        }
Beispiel #2
0
        private void ZS_DataReceived(EventDrivenTCPClient sender, object data)
        {
            try
            {
                byte[]        buffer = (byte[])Convert.ChangeType(data, typeof(byte[]));
                List <byte[]> packetList;
                Packet.SplitPackets(buffer, buffer.Length, out packetList);
                foreach (byte[] sPacket in packetList)
                {
                    byte[] packet = sPacket;
                    Config.mConvert.Crypter.Decrypt(ref packet, ClientVer.v562);
                    MSG_HEAD_WITH_PROTOCOL pHeader = new MSG_HEAD_WITH_PROTOCOL();
                    pHeader.Deserialize(ref packet);
                    if (ZoneAgent._Players.ContainsKey(pHeader.dwPCID))
                    {
                        Client client = ZoneAgent._Players[pHeader.dwPCID];

                        if (pHeader.byCtrl == 0x01 && pHeader.byCmd == 0xE1)
                        {
                            //Zone Change Packet
                            _Main.UpdateLogMsg(string.Format("{0} {1} user zone changed {2}->{3}", client.Account, client.Uid, client.ZoneStatus, packet[0x0A]));
                            client.ZoneStatus = packet[0x0A];
                            continue;
                        }
                        else if (pHeader.wProtocol == 0x1800)
                        {
                            MSG_S2C_SAY pSay = new MSG_S2C_SAY();
                            pSay.Deserialize(ref packet);
                            if (pSayType.Notice == (pSayType)pSay.bySayType && "NOTICE" == pSay.szSayPC && uint.MaxValue == pSay.dwSayPCID)
                            {
                                ZoneAgent.szNotice = pSay.szWords;
                            }
                        }
                        else if (pHeader.wProtocol == 0x1107)
                        {
                            //world login: save character name and town
                            MSG_S2C_WORLD_LOGIN wLogin = new MSG_S2C_WORLD_LOGIN();
                            wLogin.Deserialize(ref packet);
                            client.Character = wLogin.szPCName;
                            client.Town      = wLogin.byTown;
                        }
                        //encrypt후 클라이언트로 send
                        //Config.mConvert.Convert_S2C(ref packet, client.Ver);
#if DEBUG
                        PacketLogger.LogPacket(packet, "server_to_client", client.Character);
#endif
                        ZoneAgent.Write(ref client, packet);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Write(string.Format("ZS_DataReceived: {0}", ex));
            }
        }
Beispiel #3
0
        /// <summary>
        /// LS에서 들어오는 패킷 처리
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="data"></param>
        private void LS_DataReceived(EventDrivenTCPClient sender, object data)
        {
            try
            {
                byte[] packet = (byte[])Convert.ChangeType(data, typeof(byte[]));
                MSG_HEAD_WITH_PROTOCOL pHeader = new MSG_HEAD_WITH_PROTOCOL();
                pHeader.Deserialize(ref packet);
                switch (pHeader.byCtrl)
                {
                case 0x01:
                    switch (pHeader.byCmd)
                    {
                    case 0xE1:         //LS가 보내주는 접속할 새 클라이언트 정보 : Uid, 0A:userid(30)
                        if (!PreparedAcc.ContainsKey(pHeader.dwPCID))
                        {
                            MSG_LS2ZA_ACC_LOGIN accPrepare = new MSG_LS2ZA_ACC_LOGIN();
                            accPrepare.Deserialize(ref packet);
                            PreparedAcc.Add(pHeader.dwPCID, new LSuserInfo(accPrepare.szAccount));
                            //zonelog update
                            _Main.UpdateLogMsg(string.Format("<LC>UID={0} {1} Prepared", pHeader.dwPCID, accPrepare.szAccount));
                        }
                        break;

                    case 0xE3:         //duplicate login; request DC to ZA from loginserver
                        if (ZoneAgent._Players.ContainsKey(pHeader.dwPCID))
                        {
                            MSG_LS2ZA_REQ_LOGOUT reqLogout = new MSG_LS2ZA_REQ_LOGOUT();
                            reqLogout.Deserialize(ref packet);
                            //zonelog update
                            _Main.UpdateLogMsg(string.Format("<LC>UID={0} {1} Dropped, Duplicate login", reqLogout.MsgHeader.dwPCID, reqLogout.szAccount));
                            ZoneAgent.RemoveClient(pHeader.dwPCID, reqLogout.byReason);
                        }
                        break;

                    default:         //any other packet received
                        Logger.NewPacket("LS->ZA", packet, sender.IP.ToString(), ClientVer.undefined);
                        break;
                    }
                    break;

                default:
                    Logger.NewPacket("LS->ZA", packet, sender.IP.ToString(), ClientVer.undefined);
                    break;
                }
            }
            catch (Exception ex)
            {
                Logger.Write(string.Format("LS_DataReceived: {0}", ex));
            }
        }
Beispiel #4
0
 private void ZS_ConnectionStatusChanged(EventDrivenTCPClient sender, EventDrivenTCPClient.ConnectionStatus status)
 {
     if (status == EventDrivenTCPClient.ConnectionStatus.Connected)
     {
         MSG_ZA2ZS_CONNECT ZS_Connect = new MSG_ZA2ZS_CONNECT();
         ZS_Connect.byAgentID = Config.ZA.aID;
         ZS[sender.ID].Send(ZS_Connect.Serialize());
         Config.ZSList[sender.ID].Status = "Connected";
     }
     else
     {
         Config.ZSList[sender.ID].Status = "Disconnected";
     }
     _Main.UpdateConnectedZs();
 }
Beispiel #5
0
 internal LoginServer(FrmMain frm)
 {
     _Main            = frm;
     LS_Reporter      = new Timer(LS_Report_Tick, null, Timeout.Infinite, Timeout.Infinite);
     Prepared_Checker = new Timer(Prepared_Checker_Tick, null, Timeout.Infinite, Timeout.Infinite);
     LS = new EventDrivenTCPClient(Config.LS.IP, Config.LS.Port);
     LS.ConnectionStatusChanged += LS_ConnectionStatusChanged;
     LS.DataReceived            += LS_DataReceived;
     PreparedAcc = new Dictionary <uint, LSuserInfo>();
     try
     {
         LS.Connect();
     }
     catch { }
 }