示例#1
0
        /// <summary>
        /// 텔레포트 요청시 유효한 요청인지 확인 & 사용자 레벨에 따른 맵 이동 제한
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="client"></param>
        private void isPossibleTeleport(byte[] buffer, ref Client client)
        {
            MSG_C2S_REQ_TELEPORT reqTel = new MSG_C2S_REQ_TELEPORT();

            reqTel.Deserialize(ref buffer);
            if (reqTel.wTargetLine > Config.TeleportList.Count)
            {
                //bad request. if approval, ZS is crash.
                MSG_S2C_SAY pSay = new MSG_S2C_SAY();
                pSay.MsgHeader.dwPCID = client.Uid;
                pSay.szWords          = ByteTools.bSubString("Invalid request", 0x40);
                byte[] pSayByte = pSay.Serialize();
                //Config.mConvert.Convert_S2C(ref pSayByte, client.Ver);
                Write(ref client, pSayByte);
                Logger.WriteSDB(string.Format("[Try Crash]  {0}  {1}  {2}  {3}/{4}", client.Account, client.Character, client.IPadress, reqTel.wTargetLine, Config.TeleportList.Count));
                //client.TcpClient.Client.Disconnect(false);
            }
            else if (client.Level < Config.TeleportList[reqTel.wTargetLine].MapLv)
            {
                //account level is low
                MSG_S2C_SAY pSay = new MSG_S2C_SAY();
                pSay.MsgHeader.dwPCID = client.Uid;
                pSay.szWords          = ByteTools.bSubString(string.Format("{0}, You can not use this map at your level", client.Account), 0x40);
                byte[] pSayByte = pSay.Serialize();
                //Config.mConvert.Convert_S2C(ref pSayByte, client.Ver);
                Write(ref client, pSayByte);
            }
            else
            {
                Config.mConvert.Crypter.Encrypt(ref buffer, ClientVer.v562);
                ZoneServer.ZS[client.ZoneStatus].Send(buffer);
            }
        }
示例#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));
            }
        }