Beispiel #1
0
        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);
        }
Beispiel #2
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);
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #5
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));
            }
        }
Beispiel #6
0
 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();
 }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
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;
 }
Beispiel #10
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;
 }
Beispiel #11
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);
        }
Beispiel #12
0
        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);
        }
Beispiel #14
0
        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));
            }
        }
Beispiel #15
0
        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);
        }
Beispiel #16
0
        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);
        }
Beispiel #17
0
        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));
            }
        }
Beispiel #18
0
        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;
                        }
                    }
                }
            }
        }
Beispiel #19
0
        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);
        }
Beispiel #21
0
 public AES_KEY_IV(PacketIn packet)
 {
     nSize = packet.ReadInt32();
     nKey  = new byte[nSize];
     packet.Read(nKey, 0, nSize);
 }
Beispiel #22
0
        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);
            }
        }
Beispiel #23
0
        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);
            }
        }
Beispiel #24
0
        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;
            }
        }
Beispiel #26
0
        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;
                        }
                    }
                }
            }
        }