/// <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); } }
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)); } }