public int HandlePacket(BaseClient client, PacketIn packet) { LobbyClient cclient = (LobbyClient)client; PacketOut Out = new PacketOut((uint)Opcodes.ANS_CHARACTER_CREATE); byte freeSlot = GetFreeSlot(cclient); if (freeSlot == 0) { Out.WriteInt32Reverse((int)ResponseCodes.RC_FAILED); } else { cclient.Pending.Slot = freeSlot; cclient.Pending.Faction = packet.GetUint8(); cclient.Pending.Gender = packet.GetUint8(); cclient.Pending.Version = (byte)packet.GetUint32Reversed(); packet.GetUint32Reversed(); packet.GetUint32Reversed(); byte[] Custom = new byte[packet.Length - packet.Position]; packet.Read(Custom, 0, Custom.Length); byte[] ActualCustom = new byte[Custom.Length + 4]; ActualCustom[0] = 0x36; ActualCustom[1] = 0x00; ActualCustom[2] = 0x00; ActualCustom[3] = 0x00; Buffer.BlockCopy(Custom, 0, ActualCustom, 4, Custom.Length); cclient.Pending.Appearance = BitConverter.ToString(ActualCustom); Databases.CharacterTable.Add(cclient.Pending); Out.WriteInt32Reverse((int)ResponseCodes.RC_SUCCESS); Out.WriteInt32Reverse(cclient.Pending.Slot); } cclient.Send(Out); return(0); }
static public void CL_START(BaseClient client, PacketIn packet) { Client cclient = client as Client; string Username = packet.GetString(); UInt32 Len = packet.GetUint32(); byte[] Password = packet.Read((int)Len); bool result = Program.AcctMgr.CheckAccount(Username, Password); Log.Debug("CL_START", "Launching of client : " + Username + " " + result); PacketOut Out = new PacketOut((byte)Opcodes.LCR_START); if (result == true) { Out.WriteByte(0); Out.WriteString(Program.AcctMgr.GenerateToken(Username)); } else { Out.WriteByte(1); } cclient.SendPacket(Out); }
static public void HandlePacket(BaseClient client, PacketIn packet) { LobbyClient cclient = client as LobbyClient; byte freeslot = Program.CharMgr.GetFreeSlot(cclient.Account.Id); if (freeslot == 0 || cclient.CreateChar == null) { ANS_CHARACTER_CREATE.Send(cclient); } else { cclient.CreateChar.SlotId = freeslot; cclient.CreateChar.Faction = packet.GetUint8(); cclient.CreateChar.Gender = packet.GetUint8(); cclient.CreateChar.Version = (int)packet.GetUint32R(); cclient.CreateChar.Seconds = (int)packet.GetUint32R(); byte[] Custom = new byte[packet.Length - packet.Position]; packet.Read(Custom, 0, Custom.Length); cclient.CreateChar.Custom = BitConverter.ToString(Custom); Program.CharMgr.CreateCharacter(cclient.CreateChar); ANS_CHARACTER_CREATE.Send(cclient); } }
public int HandlePacket(BaseClient client, PacketIn packet) { LobbyClient cclient = (LobbyClient)client; PacketOut Out = new PacketOut((uint)Opcodes.ANS_CHARACTER_CREATE); byte freeSlot = GetFreeSlot(cclient); if (freeSlot == 0) { Out.WriteInt32Reverse((int)ResponseCodes.RC_FAILED); } else { cclient.Pending.Slot = freeSlot; cclient.Pending.Faction = packet.GetUint8(); cclient.Pending.Gender = packet.GetUint8(); cclient.Pending.Version = (byte)packet.GetUint32Reversed(); packet.GetUint32Reversed(); byte[] Custom = new byte[packet.Length - packet.Position]; packet.Read(Custom, 0, Custom.Length); cclient.Pending.Appearance = BitConverter.ToString(Custom); Databases.CharacterTable.Add(cclient.Pending); Out.WriteInt32Reverse((int)ResponseCodes.RC_SUCCESS); Out.WriteInt32Reverse(cclient.Pending.Slot); } cclient.Send(Out); System.Threading.Thread.Sleep(500); cclient.Pending = default(CharacterEntry); System.Threading.Thread.Sleep(500); cclient.Disconnect(); return(0); }
public static void F_ENCRYPTKEY(BaseClient client, PacketIn packet) { GameClient cclient = (GameClient)client; sEncrypt result = BaseClient.ByteToType <sEncrypt>(packet); string version = result.major + "." + result.minor + "." + result.revision; Log.Debug("F_ENCRYPTKEY", "Version = " + version); // Should be a connection to the remote client. //Log.Debug("F_ENCRYPTKEY", "Client Ip = " + cclient.); if (result.cipher == 0) { PacketOut Out = new PacketOut((byte)Opcodes.F_RECEIVE_ENCRYPTKEY, 1); Out.WriteByte(1); cclient.SendPacket(Out); } else if (result.cipher == 1) { byte[] encryptKey = new byte[256]; packet.Read(encryptKey, 0, encryptKey.Length); cclient.AddCrypt("RC4Crypto", new CryptKey(encryptKey), new CryptKey(encryptKey)); } }
public SELECT_SERVER(PacketIn p, ref byte[] pAESKey) { result = p.ReadUInt16(); encrypted_data_size = p.ReadInt32(); encrypted_data = new byte[encrypted_data_size]; p.Read(encrypted_data, 0, encrypted_data_size); encrypted_data = XClientAuthEmulator.DecryptAES(pAESKey, encrypted_data); pending_time = p.ReadUInt32(); unknown = p.ReadUInt32(); unknown2 = p.ReadUInt32(); }
public static void CL_LOGIN(BaseClient client, PacketIn packet) { Client cclient = client as Client; var username = packet.GetString16(); var hashLen = packet.GetUint16(); var hash = new byte[hashLen]; packet.Read(hash, 0, hashLen); var installID = packet.GetString(); cclient.Login(username, hash, installID); }
public int HandlePacket(BaseClient client, PacketIn packet) { LobbyClient cclient = (LobbyClient)client; byte FileId = packet.GetUint8(); uint Version = packet.GetUint32Reversed(); byte[] File = new byte[packet.Length - packet.Position]; packet.Read(File, 0, File.Length); PacketOut Out = new PacketOut((uint)Opcodes.ANS_CONFIGFILE_SAVE); Out.WriteUInt32Reverse((uint)ResponseCodes.RC_SUCCESS); Out.WriteByte(FileId); Out.Write(File, 0, File.Length); cclient.Send(Out); return(0); }
public int HandlePacket(BaseClient client, PacketIn packet) { LobbyClient cclient = (LobbyClient)client; byte FileId = packet.GetUint8(); UInt32 Version = packet.GetUint32Reversed(); byte[] File = new byte[packet.Length - packet.Position]; packet.Read(File, 0, File.Length); File = ZlibMgr.Decompress(File); Log.Debug("ConfigSave", "Config saved! FileId = " + FileId + " | Version = " + Version + " | Size = " + File.Length); Program.FileMgr.SaveInfo((int)cclient.Account.Index, FileId, File); PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_CONFIGFILE_SAVE); Out.WriteUInt32Reverse((uint)ResponseCodes.RC_SUCCESS); Out.WriteByte(FileId); Out.Write(File, 0, File.Length); cclient.Send(Out); return 0; }
public int HandlePacket(BaseClient client, PacketIn packet) { LobbyClient cclient = client as LobbyClient; Byte freeSlot = GetFreeSlot(cclient); if (freeSlot == 0) ANS_CHARACTER_CREATE.Send(cclient); else { cclient.Pending.Slot = freeSlot; cclient.Pending.Faction = packet.GetUint8(); cclient.Pending.Gender = packet.GetUint8(); cclient.Pending.Version = (Byte)packet.GetUint32Reversed(); packet.GetUint32Reversed(); Byte[] Custom = new Byte[packet.Length - packet.Position]; packet.Read(Custom, 0, Custom.Length); cclient.Pending.Appearance = BitConverter.ToString(Custom); Databases.CharacterTable.Add(cclient.Pending); ANS_CHARACTER_CREATE.Send(cclient); } return 0; }
public static void CL_PATCHER_LOG(BaseClient client, PacketIn packet) { Client cclient = client as Client; var compressedSize = packet.GetInt32(); var uncompressedSize = packet.GetInt32(); byte[] compressedData = packet.Read(compressedSize); byte[] uncompressedData = new byte[uncompressedSize]; MemoryStream ms = new MemoryStream(compressedData); ms.Position += 2; //skip zlib header using (DeflateStream decompressionStream = new DeflateStream(ms, CompressionMode.Decompress, true)) decompressionStream.Read(uncompressedData, 0, uncompressedSize); string log = System.Text.ASCIIEncoding.ASCII.GetString(uncompressedData); cclient.OnPatcherLog(log); }
public int HandlePacket(BaseClient client, PacketIn packet) { LobbyClient cclient = (LobbyClient)client; byte FileId = packet.GetUint8(); uint Version = packet.GetUint32Reversed(); byte[] File = new byte[packet.Length - packet.Position]; packet.Read(File, 0, File.Length); File = ZlibMgr.Decompress(File); Log.Debug("ConfigSave", "Config saved! FileId = " + FileId + " | Version = " + Version + " | Size = " + File.Length); Program.FileMgr.SaveInfo(cclient.Account.Index, FileId, File); PacketOut Out = new PacketOut((uint)Opcodes.ANS_CONFIGFILE_SAVE); Out.WriteUInt32Reverse((uint)ResponseCodes.RC_SUCCESS); Out.WriteByte(FileId); Out.Write(File, 0, File.Length); cclient.Send(Out); return(0); }
static public void HandlePacket(BaseClient client, PacketIn packet) { LobbyClient cclient = (LobbyClient)client; byte FileId = packet.GetUint8(); UInt32 Version = packet.GetUint32R(); byte[] File = new byte[packet.Length - packet.Position]; packet.Read(File, 0, File.Length); File = ZlibMgr.Decompress(File); Log.Debug("ConfigSave", "Config saved : fileid=" + FileId + ", Version=" + Version + ",Size=" + File.Length); Program.FileMgr.SaveInfo(cclient.Account.Id, FileId, File); PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_CONFIGFILE_SAVE); Out.WriteUInt32R(0); Out.WriteByte(FileId); Out.Write(File, 0, File.Length); cclient.SendTCP(Out); }
static public void F_ENCRYPTKEY(BaseClient client, PacketIn packet) { GameClient cclient = client as GameClient; sEncrypt Result = BaseClient.ByteToType <sEncrypt>(packet); string Version = Result.major + "." + Result.minor + "." + Result.revision; Log.Debug("F_ENCRYPTKEY", "Version = " + Version); if (Result.cipher == 0) { PacketOut Out = new PacketOut((byte)Opcodes.F_RECEIVE_ENCRYPTKEY); Out.WriteByte(1); cclient.SendPacket(Out); } else if (Result.cipher == 1) { byte[] EncryptKey = new byte[256]; packet.Read(EncryptKey, 0, EncryptKey.Length); cclient.AddCrypt("RC4Crypto", new CryptKey(EncryptKey), new CryptKey(EncryptKey)); } }
public static void F_CLIENT_DATA(BaseClient client, PacketIn packet) { GameClient cclient = client as GameClient; Player plr = cclient.Plr; if (plr == null) { return; } ushort offset = packet.GetUint16(); ushort size = packet.GetUint16(); MemoryStream ms = new MemoryStream(plr.Info.ClientData.Data) { Position = offset }; ms.Write(packet.Read(size), 0, size); plr.Info.ClientData.Dirty = true; CharMgr.Database.SaveObject(plr.Info.ClientData); }
public PacketIn DeCrypt(PacketIn packet) { if (m_crypts.Count <= 0) { return(packet); } ulong opcode = packet.Opcode; ulong size = packet.Size; long StartPos = packet.Position; foreach (KeyValuePair <ICryptHandler, CryptKey[]> Entry in m_crypts) { try { byte[] Buf = new byte[size]; long Pos = packet.Position; packet.Read(Buf, 0, (int)Buf.Length); packet.Position = Pos; PacketIn Pack = Entry.Key.Decrypt(Entry.Value[1], Buf); packet.Write(Pack.ToArray(), 0, Pack.ToArray().Length); packet.Opcode = opcode; packet.Size = size; } catch (Exception e) { Log.Error("Decrypt Error : " + e.ToString()); continue; } } packet.Position = StartPos; return(packet); }
static public void F_ENCRYPTKEY(Connection conn, PacketIn packet) { sEncrypt Result = RC4Crypto.ByteToType <sEncrypt>(packet); string Version = Result.major + "." + Result.minor + "." + Result.revision; Log.Trace(Version + "cipher:" + Result.cipher); if (Result.cipher == 0) { PacketOut Out = new PacketOut((byte)Opcodes.F_RECEIVE_ENCRYPTKEY); Out.WriteByte(1); conn.SendTCP(Out); } else if (Result.cipher == 1) { byte[] EncryptKey = new byte[256]; packet.Read(EncryptKey, 0, EncryptKey.Length); conn.AddCrypt("RC4Crypto", new CryptKey(EncryptKey), new CryptKey(EncryptKey)); Log.Trace("KEY:" + BitConverter.ToString(EncryptKey)); } }
protected void OnReceive(byte[] bytes) { PacketIn _Packet = new PacketIn(bytes, 0, bytes.Length); packet = _Packet; lock (this) { long PacketLength = packet.Length; while (PacketLength > 0) { // Lecture du Header if (!ReadingData) { if (PacketLength < 2) { Log.Error("OnReceive", "invalid header " + PacketLength); break; } PacketSize = packet.GetUint16(); PacketLength -= 2; if (PacketLength < PacketSize + 10) { Log.Error("OnReceive", "Incomplete Packet Header " + PacketLength + "<" + PacketSize); break; } packet.Size = (ulong)PacketSize + 10; packet = DeCrypt(packet); SequenceID = packet.GetUint16(); SessionID = packet.GetUint16(); Unk1 = packet.GetUint16(); Unk2 = packet.GetUint8(); Opcode = packet.GetUint8(); PacketLength -= 8; if (PacketLength > PacketSize + 2) { Log.Debug("OnReceive::Packet contain multiple opcodes " + PacketLength + ">" + (PacketSize + 2)); } ReadingData = true; } else { ReadingData = false; if (PacketLength >= PacketSize + 2) { byte[] BPack = new byte[PacketSize + 2]; packet.Read(BPack, 0, (int)(PacketSize + 2)); PacketIn Packet = new PacketIn(BPack, 0, BPack.Length); Packet.Opcode = Opcode; Packet.Size = (ulong)PacketSize; // handler.HandlePacket(Packet); listener.HandlePacket(this, Packet); PacketLength -= PacketSize + 2; } else { Log.Error("OnReceive", "The size of the packet is less than the total received :" + PacketLength + "<" + (PacketSize + 2)); break; } } } } }
protected override void OnReceive(byte[] packetBuffer) { // Wrap the input stream in a PacketIn Log.Error("HandlePacket", $"Packet...{packetBuffer.Length}"); PacketIn inStream = new PacketIn(packetBuffer, 0, packetBuffer.Length, true, true); lock (this) { long bufferLength = inStream.Length; while (bufferLength > 0) { // Read the header if (!ReadingData) { if (bufferLength < 2) { Log.Debug("OnReceive", "Invalid header (buffer length " + bufferLength + ")"); return; } _packetSize = inStream.GetUint16(); bufferLength -= 2; if (bufferLength < _packetSize + 10) { return; } inStream.Size = (ulong)_packetSize + 10; Decrypt(inStream); SequenceID = inStream.GetUint16(); SessionID = inStream.GetUint16(); Unk1 = inStream.GetUint16(); Unk2 = inStream.GetUint8(); _opcode = inStream.GetUint8(); bufferLength -= 8; #if DEBUG if (bufferLength > _packetSize + 2) { Log.Debug("OnReceive", "Packet contains multiple opcodes " + bufferLength + ">" + (_packetSize + 2)); } #endif ReadingData = true; } else { ReadingData = false; if (bufferLength >= _packetSize + 2) { byte[] bPack = new byte[_packetSize + 2]; inStream.Read(bPack, 0, (int)(_packetSize + 2)); PacketIn packet = new PacketIn(bPack, 0, bPack.Length) { Opcode = _opcode, Size = (ulong)_packetSize }; if (PacketLog) { LogInPacket(packet); } PLogBuf.Enqueue(packet); if (Plr != null && Plr.IsInWorld()) { Plr.ReceivePacket(packet); } else { Server.HandlePacket(this, packet); } Log.Tcp("PacketSize", bPack, 0, bPack.Length); bufferLength -= _packetSize + 2; } else { Log.Error("OnReceive", "Packet size smaller than total received bytes: " + bufferLength + "<" + (_packetSize + 2)); break; } } } } }
static public void F_CREATE_CHARACTER(BaseClient client, PacketIn packet) { GameClient cclient = client as GameClient; CreateInfo Info; Info.slot = packet.GetUint8(); Info.race = packet.GetUint8(); Info.career = packet.GetUint8(); Info.sex = packet.GetUint8(); Info.model = packet.GetUint8(); Info.NameSize = packet.GetUint16(); packet.Skip(2); byte[] Traits = new byte[8]; packet.Read(Traits, 0, Traits.Length); packet.Skip(7); string Name = packet.GetString(Info.NameSize); if (!CharMgr.NameIsUsed(Name)) { CharacterInfo CharInfo = CharMgr.GetCharacterInfo(Info.career); if (CharInfo == null) { Log.Error("ON_CREATE", "Can not find career :" + Info.career); return; } Log.Success("OnCreate", "Creating new Character : " + Name); Character Char = new Character(); Char.AccountId = cclient._Account.AccountId; Char.bTraits = Traits; Char.Career = Info.career; Char.CareerLine = CharInfo.CareerLine; Char.ModelId = Info.model; Char.Name = Name; Char.Race = Info.race; Char.Realm = CharInfo.Realm; Char.RealmId = Program.Rm.RealmId; Char.Sex = Info.sex; if (!CharMgr.CreateChar(Char)) { Log.Error("CreateCharacter", "Hack : can not create more than 10 characters!"); return; } Character_items Citm = null; CharacterInfo_item[] Items = CharMgr.GetCharacterInfoItem(Char.CareerLine); for (int i = 0; i < Items.Length; ++i) { if (Items[i] == null) { continue; } Citm = new Character_items(); Citm.Counts = Items[i].Count; Citm.CharacterId = Char.CharacterId; Citm.Entry = Items[i].Entry; Citm.ModelId = Items[i].ModelId; Citm.SlotId = Items[i].SlotId; CharMgr.CreateItem(Citm); } Character_value CInfo = new Character_value(); CInfo.CharacterId = Char.CharacterId; CInfo.Level = 1; CInfo.Money = 0; CInfo.Online = false; CInfo.RallyPoint = CharInfo.RallyPt; CInfo.RegionId = CharInfo.Region; CInfo.Renown = 0; CInfo.RenownRank = 1; CInfo.RestXp = 0; CInfo.Skills = CharInfo.Skills; CInfo.Speed = 100; CInfo.WorldO = CharInfo.WorldO; CInfo.WorldX = CharInfo.WorldX; CInfo.WorldY = CharInfo.WorldY; CInfo.WorldZ = CharInfo.WorldZ; CInfo.Xp = 0; CInfo.ZoneId = CharInfo.ZoneId; CharMgr.Database.AddObject(CInfo); Char.Value = new Character_value[1] { CInfo }; } PacketOut Out = new PacketOut((byte)Opcodes.F_SEND_CHARACTER_RESPONSE); Out.WritePascalString(cclient._Account.Username); cclient.SendTCP(Out); }
public AES_KEY_IV(PacketIn packet) { nSize = packet.ReadInt32(); nKey = new byte[nSize]; packet.Read(nKey, 0, nSize); }
public static void F_CREATE_CHARACTER(BaseClient client, PacketIn packet) { GameClient cclient = (GameClient)client; CreateInfo Info; Info.slot = packet.GetUint8(); Info.race = packet.GetUint8(); Info.career = packet.GetUint8(); Info.sex = packet.GetUint8(); Info.model = packet.GetUint8(); Info.NameSize = packet.GetUint16(); packet.Skip(2); byte[] traits = new byte[8]; packet.Read(traits, 0, traits.Length); packet.Skip(7); string name = packet.GetString(Info.NameSize); ushort duplicate = 0; for (int i = 0; i < name.Length; i++) { if (i != 0) { if (name[i] == name[i - 1]) { duplicate++; } else { duplicate = 0; } if (duplicate > 3) { break; } } } if (name.Length > 2 && !CharMgr.NameIsUsed(name) && CharMgr.AllowName(name) && !CharMgr.NameIsDeleted(name) && duplicate < 3) { CharacterInfo CharInfo = CharMgr.GetCharacterInfo(Info.career); if (CharInfo == null) { Log.Error("ON_CREATE", "Can not find career :" + Info.career); } else { //Log.Success("OnCreate", "New Character : " + Name); Character Char = new Character { AccountId = cclient._Account.AccountId, bTraits = traits, Career = Info.career, CareerLine = CharInfo.CareerLine, ModelId = Info.model, Name = name, Race = Info.race, Realm = CharInfo.Realm, RealmId = Program.Rm.RealmId, Sex = Info.sex, FirstConnect = true }; if (!CharMgr.CreateChar(Char)) { Log.Error("CreateCharacter", "Hack : can not create more than 10 characters!"); } else { List <CharacterInfo_item> Items = CharMgr.GetCharacterInfoItem(Char.CareerLine); foreach (CharacterInfo_item Itm in Items) { if (Itm == null) { continue; } CharacterItem Citm = new CharacterItem { Counts = Itm.Count, CharacterId = Char.CharacterId, Entry = Itm.Entry, ModelId = Itm.ModelId, SlotId = Itm.SlotId, PrimaryDye = 0, SecondaryDye = 0 }; CharMgr.CreateItem(Citm); } Character_value CInfo = new Character_value { CharacterId = Char.CharacterId, Level = 1, Money = 2000, Online = false, RallyPoint = CharInfo.RallyPt, RegionId = CharInfo.Region, Renown = 0, RenownRank = 1, RestXp = 0, Skills = CharInfo.Skills, Speed = 100, PlayedTime = 0, WorldO = CharInfo.WorldO, WorldX = CharInfo.WorldX, WorldY = CharInfo.WorldY, WorldZ = CharInfo.WorldZ, Xp = 0, ZoneId = CharInfo.ZoneId }; CharMgr.Database.AddObject(CInfo); Program.AcctMgr.UpdateRealmCharacters(Program.Rm.RealmId, (uint)CharMgr.Database.GetObjectCount <Character>(" Realm=1"), (uint)CharMgr.Database.GetObjectCount <Character>(" Realm=2")); CharacterClientData clientData = new CharacterClientData { CharacterId = Char.CharacterId }; CharMgr.Database.AddObject(clientData); Char.Value = CInfo; Char.ClientData = clientData; PacketOut Out = new PacketOut((byte)Opcodes.F_SEND_CHARACTER_RESPONSE, 32); Out.WritePascalString(cclient._Account.Username); cclient.SendPacket(Out); } } } else { PacketOut Out = new PacketOut((byte)Opcodes.F_SEND_CHARACTER_ERROR, 64); Out.FillString(cclient._Account.Username, 24); Out.WriteStringBytes("You have entered a duplicate or invalid name. Please enter a new name."); cclient.SendPacket(Out); } }
static public void F_CREATE_CHARACTER(BaseClient client, PacketIn packet) { GameClient cclient = client as GameClient; CreateInfo Info; Info.slot = packet.GetUint8(); Info.race = packet.GetUint8(); Info.career = packet.GetUint8(); Info.sex = packet.GetUint8(); Info.model = packet.GetUint8(); Info.NameSize = packet.GetUint16(); packet.Skip(2); byte[] Traits = new byte[8]; packet.Read(Traits, 0, Traits.Length); packet.Skip(7); string Name = packet.GetString(Info.NameSize); if (Name.Length > 2 && !CharMgr.NameIsUsed(Name)) { CharacterInfo CharInfo = CharMgr.GetCharacterInfo(Info.career); if (CharInfo == null) { Log.Error("ON_CREATE", "Can not find career :" + Info.career); } else { Log.Success("OnCreate", "New Character : " + Name); Character Char = new Character(); Char.AccountId = cclient._Account.AccountId; Char.bTraits = Traits; Char.Career = Info.career; Char.CareerLine = CharInfo.CareerLine; Char.ModelId = Info.model; Char.Name = Name; Char.Race = Info.race; Char.Realm = CharInfo.Realm; Char.RealmId = Program.Rm.RealmId; Char.Sex = Info.sex; Char.FirstConnect = true; if (!CharMgr.CreateChar(Char)) { Log.Error("CreateCharacter", "Hack : can not create more than 10 characters!"); } else { Character_item Citm = null; List <CharacterInfo_item> Items = CharMgr.GetCharacterInfoItem(Char.CareerLine); foreach (CharacterInfo_item Itm in Items) { if (Itm == null) { continue; } Citm = new Character_item(); Citm.Counts = Itm.Count; Citm.CharacterId = Char.CharacterId; Citm.Entry = Itm.Entry; Citm.ModelId = Itm.ModelId; Citm.SlotId = Itm.SlotId; CharMgr.CreateItem(Citm); } Character_value CInfo = new Character_value(); CInfo.CharacterId = Char.CharacterId; CInfo.Level = 1; CInfo.Money = 0; CInfo.Online = false; CInfo.RallyPoint = CharInfo.RallyPt; CInfo.RegionId = CharInfo.Region; CInfo.Renown = 0; CInfo.RenownRank = 1; CInfo.RestXp = 0; CInfo.Skills = CharInfo.Skills; CInfo.Speed = 100; CInfo.WorldO = CharInfo.WorldO; CInfo.WorldX = CharInfo.WorldX; CInfo.WorldY = CharInfo.WorldY; CInfo.WorldZ = CharInfo.WorldZ; CInfo.Xp = 0; CInfo.ZoneId = CharInfo.ZoneId; CharMgr.Database.AddObject(CInfo); Program.AcctMgr.UpdateRealmCharacters(Program.Rm.RealmId, (uint)CharMgr.Database.GetObjectCount <Character>(" Realm=1"), (uint)CharMgr.Database.GetObjectCount <Character>(" Realm=2")); Char.Value = CInfo; PacketOut Out = new PacketOut((byte)Opcodes.F_SEND_CHARACTER_RESPONSE); Out.WritePascalString(cclient._Account.Username); cclient.SendPacket(Out); } } } else { PacketOut Out = new PacketOut((byte)Opcodes.F_SEND_CHARACTER_ERROR); Out.WritePascalString(cclient._Account.Username); cclient.SendPacket(Out); } }
public void Read(byte[] data, int size) { PacketIn pIn = new PacketIn(data, 0, size); //pIn.SetBuffer(buffer, size); //pIn.ReadByte(); //pIn.ReadByte(); //pIn.ReadByte(); //PID = pIn.GetInt16(); //data4 = pIn.ReadByte(); //MoveVelocity = pIn.GetIntClamped(-127, 325); //FallTime = pIn.GetIntClamped(-2000, 500); // 10 -1 92 List <string> lst = new List <string>(); for (int i = 0; i < 15; i++) { if (i > 10) { lst.Add(i.ToString() + " " + pIn.ReadByte().ToString().PadLeft(3)); } } Log.Error("", string.Join(", ", lst)); //pIn.Skip(7); byte test = (byte)pIn.ReadByte(); HasEnemyTarget = test & 64; //pIn.ReadByte(); //2 or 3 readbyte here seems to give some correct data and would correspond with the original readint(2) of freefall //pIn.ReadByte(); FreeFall = test & 0x1F; //3F pIn.ReadByte() & 48; //BitConverter.ToInt16(pIn.Read(2), 0); //Log.Error("freefall", Convert.ToString(test, 2)); //pIn.ReadByte(); //pIn.ReadByte(); //pIn.ReadByte(); Action = BitConverter.ToInt16(pIn.Read(2), 0); //pIn.ReadByte(); //pIn.ReadByte(); //pIn.ReadByte(); //pIn.ReadByte(); Strafe = BitConverter.ToInt16(pIn.Read(3), 0); //pIn.ReadByte(); if (HasEnemyTarget > 0 && data4 == 0) { data32 = pIn.ReadByte(); } if (data4 == 0) { Heartbeat = BitConverter.ToInt16(pIn.Read(3), 0); //pIn.ReadByte(); } HasPosition = pIn.ReadByte(); if (HasPosition > 0) { Heading = pIn.GetUint16(); // pIn.GetAngleRad(12); HasPositionChange = pIn.ReadByte(); Grounded = pIn.ReadByte(); if (HasPositionChange == 0) { X = pIn.GetInt16(); Y = pIn.GetInt16(); } } if (HasEnemyTarget > 0 && data4 == 0) { data60 = pIn.ReadByte(); } if (HasPosition > 0) { if (HasPositionChange == 0) { ZoneID = BitConverter.ToInt16(pIn.Read(9), 0); //pIn.GetInt16(); // (9) Z = pIn.GetInt16(); } else { data72 = pIn.GetUint16(); } } if (HasPosition > 0 && HasPositionChange > 0) { data76 = pIn.GetUint16(); data80 = pIn.GetUint16(); data84 = BitConverter.ToInt16(pIn.Read(9), 0); //pIn.GetInt16(); // (9) } if (HasEnemyTarget > 0) { if (data4 == 0) { TargetLos = pIn.ReadByte(); data89 = pIn.ReadByte(); data90 = pIn.ReadByte(); data91 = pIn.ReadByte(); data92 = pIn.ReadByte(); } } if ((data4 > 0) || (GroundType = BitConverter.ToInt16(pIn.Read(3), 0)) != 0) // (3) { data100 = pIn.ReadByte(); Floating2 = pIn.ReadByte(); data102 = pIn.ReadByte(); data103 = pIn.ReadByte(); } data104 = pIn.ReadByte(); if (data4 == 0) { data105 = pIn.ReadByte(); } data106 = pIn.ReadByte(); data107 = pIn.ReadByte(); }
public static void F_BAG_INFO(BaseClient client, PacketIn packet) { GameClient cclient = client as GameClient; if (!cclient.IsPlaying()) { return; } byte Type = packet.GetUint8(); Player Plr = cclient.Plr; switch (Type) { case 3: // Toggle Pvp ((CombatInterface_Player)Plr.CbtInterface).TogglePvPFlag(); break; case 16: // Buy more bag space { byte Price = packet.GetUint8(); if (!Plr.ItmInterface.HasMaxBag) { if (Plr.HasMoney(Plr.ItmInterface.GetBagPrice())) { if (Plr.RemoveMoney(Plr.ItmInterface.GetBagPrice())) { ++Plr.ItmInterface.BagBuy; Plr.ItmInterface.SendMaxInventory(Plr); } } } } break; case 17: // Buy more bank space { uint Price = packet.GetUint32R(); if (!Plr.ItmInterface.HasMaxBank) { if (Plr.HasMoney(Plr.ItmInterface.GetBankPrice())) { if (Plr.RemoveMoney(Plr.ItmInterface.GetBankPrice())) { ++Plr.ItmInterface.BankBuy; Plr.ItmInterface.SendMaxInventory(Plr); } } } } break; case 18: // Alternate Appereance { byte Slot = packet.GetUint8(); packet.Skip(2); ushort SlotItem = packet.GetUint16(); Plr.ItmInterface.HandleAltAppearance(Slot, SlotItem); } break; case 27: // Barber { packet.Skip(5); byte[] Traits = new byte[8]; packet.Read(Traits, 0, Traits.Length); Plr.Info.bTraits = Traits; CharMgr.Database.SaveObject(Plr.Info); } break; } }
protected override void OnReceive(byte[] bytes) { PacketIn _Packet = new PacketIn(bytes, 0, bytes.Length); packet = _Packet; lock (this) { long PacketLength = packet.Length; while (PacketLength > 0) { // Lecture du Header if (!ReadingData) { if (PacketLength < 2) { Log.Error("OnReceive", "Header invalide " + PacketLength); break; } PacketSize = packet.GetUint16(); PacketLength -= 2; if (PacketLength < PacketSize + 10) { break; } packet.Size = (ulong)PacketSize + 10; packet = DeCrypt(packet); SequenceID = packet.GetUint16(); SessionID = packet.GetUint16(); Unk1 = packet.GetUint16(); Unk2 = packet.GetUint8(); Opcode = packet.GetUint8(); PacketLength -= 8; if (PacketLength > PacketSize + 2) { Log.Debug("OnReceive", "Packet contain multiple opcodes " + PacketLength + ">" + (PacketSize + 2)); } ReadingData = true; } else { ReadingData = false; if (PacketLength >= PacketSize + 2) { byte[] BPack = new byte[PacketSize + 2]; packet.Read(BPack, 0, (int)(PacketSize + 2)); PacketIn Packet = new PacketIn(BPack, 0, BPack.Length); Packet.Opcode = Opcode; Packet.Size = (ulong)PacketSize; if (Plr != null && Plr.IsInWorld()) { Plr.ReceivePacket(Packet); } else { Server.HandlePacket(this, Packet); } Log.Tcp("PacketSize", BPack, 0, BPack.Length); PacketLength -= PacketSize + 2; } else { Log.Error("OnReceive", "La taille du packet est inférieur au total recu :" + PacketLength + "<" + (PacketSize + 2)); break; } } } } }