TPeerCnt _UnLinkCore() { if (_Key == null) { return(TPeerCnt.MaxValue); } if (_Socket != null) { _Socket.Close(); _Socket = null; } _RecvHeader = null; _StreamSndTail = 0; _RecvPacketSeq = 0; _SendPacketSeq = 0; _StreamRcv.Clear(); _StreamSnd.Clear(); _LongIP = 0; _Sending = false; _Connected = false; _ConnectTime = 0; _ConnectTimeOut = 0; _Connecting = false; var PeerNum = _Key.PeerNum; _Key = null; return(PeerNum); }
void _RecvA(CKey Key_, CStream Stream_) { var Header = new SHeader(); Stream_.Pop(Header); if (_Clients[(Int32)Key_.PeerNum].IsCheck()) { switch (Header.Proto) { case EProto.AcCheck: _RecvAcCheck(Key_, Stream_); return; case EProto.AcCheckFail: _RecvAcCheckFail(Key_, Stream_); return; default: _CheckFailAndClose(Key_.PeerNum, EGameRet.InvalidPacket); return; } } else { switch (Header.Proto) { case EProto.AcLogin: _RecvAcLogin(Key_, Stream_); return; case EProto.AcLoginFail: _RecvAcLoginFail(Key_, Stream_); return; default: _LoginFailAndCloseA(Key_.PeerNum, EGameRet.InvalidPacket); return; } } }
public TdfReader() { Bitmap = new SBitmap(); Version = new SVersion(); Header = new SHeader { Date = new SDate() }; }
void _RecvM(CKey Key_, CStream Stream_) { var Header = new SHeader(); Stream_.Pop(Header); switch (Header.Proto) { case EProto.McLogin: _RecvMcLogin(Key_, Stream_); return; case EProto.McLoginFail: _RecvMcLoginFail(Key_, Stream_); return; default: _NetM.Close(Key_); return; } }
void _RecvS(CKey Key_, CStream Stream_) { var Header = new SHeader(); Stream_.Pop(Header); switch (Header.Proto) { case EProto.ScLogin: _RecvScLogin(Key_, Stream_); return; case EProto.ScLoginFail: _RecvScLoginFail(Key_, Stream_); return; case EProto.ScUserProto: _RecvFunc(Key_, Stream_); return; default: _NetS.Close(Key_); return; } }
public TdfFile() { Bitmap = new SBitmap(); Version = new SVersion(); Header = new SHeader { Date = new SDate() }; Header.Date.Day = (char)DateTime.Now.Day; Header.Date.Month = (char)DateTime.Now.Month; Header.Date.Year = (ushort)DateTime.Now.Year; Bitmap.BfType = 19778; Bitmap.BfSize = 21054; Bitmap.BfOffBits = 54; Version.Major = 1; Version.Minor = 4; }
void _RecvS(CKey Key_, CStream Stream_) { var Header = new SHeader(); Stream_.Pop(Header); try { switch (Header.Proto) { case EProto.ScPatchData: _RecvScPatchData(Key_, Stream_); return; default: throw new Exception(); } } catch { _NetB.Close(Key_.PeerNum); } }
void _RecvS(CKey Key_, CStream Stream_) { var Header = new SHeader(); Stream_.Pop(Header); if (!_Servers[(Int32)Key_.PeerNum].Logon) { switch (Header.Proto) { case EProto.ScNewParent: _RecvScNewParent(Key_, Stream_); return; case EProto.ScAllocated: _RecvScAllocated(Key_, Stream_); return; default: _NetS.Close(Key_.PeerNum); return; } } else { switch (Header.Proto) { case EProto.ScUserProto: _RecvFuncS(Key_, Stream_); return; default: _NetS.Close(Key_.PeerNum); return; } } }
public SHeader(SHeader Obj_) { Proto = Obj_.Proto; }
public void Set(SHeader Obj_) { Proto = Obj_.Proto; }
void _Recved() // 수신 처리 { if (_RecvEvent.SocketError != SocketError.Success) { _UnLink(ENetState.Normal); return; } if (_RecvEvent.BytesTransferred == 0) { _UnLink(ENetState.Normal); return; } _HBRcvPeriod.NextLoose(); if (!_StreamRcv.Push(_aRecvBuf.SubArray(0, _RecvEvent.BytesTransferred))) { _UnLink(ENetState.Normal); return; } while (true) { // For Header ///////////////////// if (_RecvHeader == null) { if (_StreamRcv.Size < c_HeaderSize) { break; } try { _RecvHeader = new SHeader(); } catch { _UnLink(ENetState.Normal); return; } if (!_StreamRcv.Pop(_RecvHeader)) { _UnLink(ENetState.Normal); return; } } // For Body ///////////////////// if (_StreamRcv.Size < _RecvHeader.Size) { break; } if (_RecvHeader.Size > 0) { if (_RecvHeader.PacketSeq <= _RecvPacketSeq && (_RecvPacketSeq - _RecvHeader.PacketSeq) < (TPacketSeq.MaxValue << 1)) { _UnLink(ENetState.Normal); return; } _RecvPacketSeq = _RecvHeader.PacketSeq; var Body = _StreamRcv.GetStream(_RecvHeader.Size); _Crypto.Decode(Body, (0x1f3a49b72c8d5ef6 ^ (UInt64)_RecvHeader.Size ^ _RecvHeader.CheckSum ^ _RecvHeader.PacketSeq)); for (int i = 0; i < Body.Count(); ++i) { _StreamRcv.SetAt(_StreamRcv.Head + i, Body[i]); } if (_RecvHeader.CheckSum != CBase.GetCheckSum(Body)) { _UnLink(ENetState.Normal); return; } var OldSize = _StreamRcv.Size; var OldHead = _StreamRcv.Head; var OldTail = _StreamRcv.Tail; _StreamRcv.Tail = _StreamRcv.Head + _RecvHeader.Size; // For Notifying Received Size to RecvFunc _RecvFunc(_Key.PeerNum, _StreamRcv); if (_Key == null) { return; } // 외부에서 모두 Pop하지 않았거나 Stream에 대해서 Clear 하지 않아도 상관 없으므로 에러 체크하지 않음. //if (_StreamRcv.Size != OldSize - _RecvHeader.Size) // throw new Exception("Did Not Receive Whole Protocol"); if (OldSize > _RecvHeader.Size) { _StreamRcv.Head = OldHead + _RecvHeader.Size; _StreamRcv.Tail = OldTail; } else { _StreamRcv.Clear(); } } _RecvHeader = null; } if (_Socket == null) { return; } if (!_Recv()) { _UnLink(ENetState.Normal); return; } }
public void Set(SHeader Obj_) { Size = Obj_.Size; CheckSum = Obj_.CheckSum; SendPacketSeq = Obj_.SendPacketSeq; }
public SHeader(SHeader Obj_) { Size = Obj_.Size; CheckSum = Obj_.CheckSum; PacketSeq = Obj_.PacketSeq; }
// Controlador de pacotes public static void Controller(Client client, byte[] data) { lock (Lock) { SHeader header = PConvert.ToStruct <SHeader>(data); Log.Rcv(client, header); if (header.PacketId == 0x03A0) { if (header.Size != 12 || data.Length != 12) { client.Close(); } return; } switch (client.Status) { case ClientStatus.Login: { switch (header.PacketId) { case 0x20D: P_20D.Controller(client, PConvert.ToStruct <P_20D>(data)); break; // Login default: client.Close(); break; } break; } case ClientStatus.Numeric: { switch (header.PacketId) { case 0xFDE: P_FDE.Controller(client, PConvert.ToStruct <P_FDE>(data)); break; // Senha numérica default: client.Close(); break; } break; } case ClientStatus.Characters: { switch (header.PacketId) { case 0x020F: P_20F.Controller(client, PConvert.ToStruct <P_20F>(data)); break; // Criar personagem case 0x0211: P_211.Controller(client, PConvert.ToStruct <P_211>(data)); break; // Apagar personagem case 0x0213: P_213.Controller(client, PConvert.ToStruct <P_213>(data)); break; // Entrar no mundo case 0xFDE: P_FDE.Controller(client, PConvert.ToStruct <P_FDE>(data)); break; // Alterar senha numérica default: client.Close(); break; } break; } case ClientStatus.Game: { switch (header.PacketId) { case 0x0291: P_291.Controller(client, PConvert.ToStruct <P_291>(data)); break; // Depois que entra no mundo case 0x0333: P_333.Controller(client, PConvert.ToStruct <P_333>(data)); break; // Chat aberto case 0x0366: break; // Andar porém quando para de pressionar o mouse case 0x036C: P_36C.Controller(client, PConvert.ToStruct <P_36C>(data)); break; // Andar case 0x03AE: break; // 5 segundos case 0x0215: P_215.Controller(client, PConvert.ToStruct <P_215>(data)); break; // volta para tela de personagem case 0x0290: P_290.Controller(client); break; // teletransporte case 0x027B: P_27B.controller(client, PConvert.ToStruct <P_27B>(data)); break; // Abre o NPC de venda/skill case 0x0379: P_379.controller(client, PConvert.ToStruct <P_379>(data)); break; // Compra de item do NPC case 0x037A: P_37A.controller(client, PConvert.ToStruct <P_37A>(data)); break; // Vende o item para o NPC case 0x0376: P_376.controller(client, PConvert.ToStruct <P_376>(data)); break; // Move o Item case 0x0387: P_387.Controller(client, PConvert.ToStruct <P_387>(data)); break; // Envia o dinheiro para o inventario case 0x0388: P_388.Controller(client, PConvert.ToStruct <P_388>(data)); break; // Envia o dinheiro para o bau case 0x0367: case 0x039D: P_39D.controller(client, PConvert.ToStruct <P_39D>(data)); break; // Ataque ao Mobs/Players (nao esta pronto) //case 0x02CB: P_2CB.controller(client, PConvert.ToStruct<P_2CB>(data)); break; // UNKNOW //case 0x036B: // unknow case 0x0277: P_277.controller(client, PConvert.ToStruct <P_277>(data)); break; // Adiciona os pontos de status e skill case 0x0378: P_378.controller(client, PConvert.ToStruct <P_378>(data)); break; // Adiciona a skill na barra de skill case 0x0373: P_373.controller(client, PConvert.ToStruct <P_373>(data)); break; // Trata o uso de item (nao esta pronto) case 0x02E4: P_2E4.controller(client, PConvert.ToStruct <P_2E4>(data)); break; // Deleta o Item case 0x0334: P_334.controller(client, PConvert.ToStruct <P_334>(data)); break; // Comando do chat case 0x0369: P_369.controller(client, PConvert.ToStruct <P_369>(data)); break; // Respaw Mob (nao esta pronto) case 0x037F: P_37F.controller(client, PConvert.ToStruct <P_37F>(data)); break; // Envia uma requicao de grupo case 0x03AB: P_3AB.controller(client, PConvert.ToStruct <P_3AB>(data)); break; // Aceita a requisicao de grupo case 0x037E: P_37E.controller(client, PConvert.ToStruct <P_37E>(data)); break; // Remove um membro do grupo case 0x028B: P_28B.controller(client, PConvert.ToStruct <P_28B>(data)); break; // Trata os npc de quest, buff e etc default: client.Send(P_101.New($"UNK:0x { header.PacketId.ToString("X").PadLeft(4, '0')}")); break; } break; } } } }
public void RecvedEnd() { StreamRcv.LoadState(); StreamRcv.Pop(_RecvHeader.Size); _RecvHeader = null; }
public ERecvState RecvedBegin() { // For Header ///////////////////// if (_RecvHeader == null) { if (StreamRcv.Size < _HeaderSize) { return(ERecvState.NoData); } _RecvHeader = new SHeader(); _RecvHeader.Push(StreamRcv); } // For Body ///////////////////// if (StreamRcv.Size < _RecvHeader.Size) { return(ERecvState.NoData); } if (_RecvHeader.SendPacketSeq != (_RecvPacketSeq + 1)) { throw new Exception("PacketSeq Error " + _RecvHeader.SendPacketSeq.ToString() + ", " + (_RecvPacketSeq + 1).ToString()); } _RecvPacketSeq = _RecvHeader.SendPacketSeq; _Crypto.Decode(StreamRcv.Data, StreamRcv.Head, _RecvHeader.Size, (0x1f3a49b72c8d5ef6 ^ (UInt64)_RecvHeader.Size ^ _RecvHeader.CheckSum ^ _RecvHeader.SendPacketSeq)); if (_RecvHeader.CheckSum != core.CBase.GetCheckSum(StreamRcv.Data, StreamRcv.Head, _RecvHeader.Size)) { throw new Exception("CheckSum Error"); } var OldStreamSize = StreamRcv.Size; var Header2 = new SHeader2(); Header2.Push(StreamRcv); _RecvHeader.Size -= (OldStreamSize - StreamRcv.Size); StreamRcv.SaveState(); switch (Header2.PacketType) { case EPacketType.Ping: if (!_SendPong()) { throw new Exception("_SendPong Fail"); } return(ERecvState.PingPong); case EPacketType.Pong: if (Header2.RecvPacketSeq == _PingPacketSeq) { _Latency = DateTime.Now - _PingTime.Value; _PingTime = null; } return(ERecvState.PingPong); case EPacketType.User: break; default: throw new Exception("Invalid Packet Type"); } return(ERecvState.UserData); }
// Controlador de pacotes public static void Controller(Client client, byte [] data) { lock ( Lock ) { SHeader header = PConvert.ToStruct <SHeader> (data); Log.Rcv(client, header); if (header.PacketId == 0x03A0) { if (header.Size != 12 || data.Length != 12) { client.Close( ); } return; } switch (client.Status) { case ClientStatus.Login: { switch (header.PacketId) { case 0x20D: P_20D.Controller(client, PConvert.ToStruct <P_20D> (data)); break; // Login default: client.Close( ); break; } break; } case ClientStatus.Numeric: { switch (header.PacketId) { case 0xFDE: P_FDE.Controller(client, PConvert.ToStruct <P_FDE> (data)); break; // Senha numérica default: client.Close( ); break; } break; } case ClientStatus.Characters: { switch (header.PacketId) { case 0x020F: P_20F.Controller(client, PConvert.ToStruct <P_20F> (data)); break; // Criar personagem case 0x0211: P_211.Controller(client, PConvert.ToStruct <P_211> (data)); break; // Apagar personagem case 0x0213: P_213.Controller(client, PConvert.ToStruct <P_213> (data)); break; // Entrar no mundo case 0xFDE: P_FDE.Controller(client, PConvert.ToStruct <P_FDE> (data)); break; // Alterar senha numérica default: client.Close( ); break; } break; } case ClientStatus.Game: { switch (header.PacketId) { case 0x0291: break; // Depois que entra no mundo case 0x0333: P_333.Controller(client, PConvert.ToStruct <P_333> (data)); break; // Chat aberto case 0x0366: // Andar porém quando para de pressionar o mouse case 0x036C: P_36C.Controller(client, PConvert.ToStruct <P_36C> (data), header.PacketId == 0x036C); break; // Andar case 0x03AE: break; // 5 segundos default: client.Send(P_101.New($"UNK: 0x{header.PacketId.ToString ( "X" ).PadLeft ( 4 , '0' )}")); break; } break; } } } }