Пример #1
0
        static public void F_BAG_INFO(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (!cclient.IsPlaying())
            {
                return;
            }

            byte SlotCount = packet.GetUint8();
            byte Price     = packet.GetUint8();

            Player Plr = cclient.Plr;

            if (!Plr.ItmInterface.HasMaxBag())
            {
                if (Plr.HaveMoney(Plr.ItmInterface.GetBagPrice()))
                {
                    if (Plr.RemoveMoney(Plr.ItmInterface.GetBagPrice()))
                    {
                        ++Plr.ItmInterface.BagBuy;
                        Plr.ItmInterface.SendMaxInventory(Plr);
                    }
                }
            }
        }
Пример #2
0
        public static Dictionary <string, object> readProfile(ref PacketIn packet)
        {
            Dictionary <string, object> computerProfile = new Dictionary <string, object>();
            int count = packet.GetUint8();

            for (int i = 0; i < count; i++)
            {
                string key = packet.GetString();

                switch (packet.GetUint8())
                {
                case 0:     // string
                {
                    computerProfile[key] = packet.GetString();
                }
                break;

                case 1:     // list
                {
                    computerProfile[key] = readProfile(ref packet);
                }
                break;
                }
            }


            return(computerProfile);
        }
Пример #3
0
 public int HandlePacket(BaseClient client, PacketIn packet)
 {
     LobbyClient cclient = client as LobbyClient;
     byte[] clientModulus = new byte[64];
     for (int i = 0; i < 64; ++i) clientModulus[i] = packet.GetUint8();
     cclient.clientModulus = new FrameWork.NetWork.Crypto.BigInteger(1, clientModulus);
     UInt16 unk = packet.GetUint16();
     byte[] Proof = new byte[20];
     for (int i = 0; i < 20; ++i) Proof[i] = packet.GetUint8();
     cclient.Proof = Proof;
     if (IsBanned(cclient))
     {
         ANS_LOGIN_FAILED.Send(cclient, (int)ResponseCodes.RC_LOGIN_ACCOUNT_BLOCKED);
         cclient.Disconnect();
     }
     else
     {
         if (IsValid(cclient))
         {
             ANS_LOGIN_SUCCES.Send(cclient);
             cclient.ECrypt = new TCP.Encryption(cclient.SessionId);
             ANS_CHARACTER_INFO.Send(cclient);
         }
         else
         {
             ANS_LOGIN_FAILED.Send(cclient, (int)ResponseCodes.RC_LOGIN_INVALID_ACCOUNT);
             cclient.Disconnect();
         }
     }
     return 0;
 }
Пример #4
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);
            }
        }
Пример #5
0
        static public void F_PLAYER_ENTER_FULL(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            UInt16 SID;
            byte   unk1, serverID, characterSlot;

            SID      = packet.GetUint16();
            unk1     = packet.GetUint8();
            serverID = packet.GetUint8();
            string CharName = packet.GetString(24);

            packet.Skip(2);
            string Language = packet.GetString(2);

            packet.Skip(4);
            characterSlot = packet.GetUint8();

            Log.Success("F_PLAYER_ENTER_FULL", "Entrer en jeu de : " + CharName + ",Slot=" + characterSlot);

            if (Program.Rm.RealmId != serverID)
            {
                cclient.Disconnect();
            }
            else
            {
                PacketOut Out = new PacketOut((byte)Opcodes.S_PID_ASSIGN);
                Out.WriteUInt16R((ushort)cclient.Id);
                cclient.SendTCP(Out);
            }
        }
Пример #6
0
        public static void F_OBJECTIVE_UPDATE(BaseClient client, PacketIn packet)
        {
            GameClient cclient = (GameClient)client;

            uint pQuestID = packet.GetUint32();
            byte op       = packet.GetUint8();

            switch (op)
            {
            case 8:     // switch opt out state
                byte        optOutType = packet.GetUint8();
                PublicQuest pQuest     = cclient.Plr.QtsInterface.PublicQuest;

                if (pQuest == null || pQuest.Info.Entry != pQuestID)
                {
                    return;
                }

                pQuest.ProcessOptOut(cclient.Plr, optOutType);
                break;

            default:
                Log.Error("F_OBJECTIVE_UPDATE", $"Received unknown op {op} from client");
                break;
            }
        }
Пример #7
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);
        }
Пример #8
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);
        }
Пример #9
0
        static public 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
                Plr.CbtInterface.TurnPvp();
                break;

            case 16:     // Buy more bag space
                byte Price = packet.GetUint8();
                if (!Plr.ItmInterface.HasMaxBag())
                {
                    if (Plr.HaveMoney(Plr.ItmInterface.GetBagPrice()))
                    {
                        if (Plr.RemoveMoney(Plr.ItmInterface.GetBagPrice()))
                        {
                            ++Plr.ItmInterface.BagBuy;
                            Plr.ItmInterface.SendMaxInventory(Plr);
                        }
                    }
                }
                break;
            }
        }
Пример #10
0
        public static void F_PLAYER_INFO(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
            {
                return;
            }

            packet.GetUint16();
            ushort Oid        = packet.GetUint16();
            byte   LOS        = packet.GetUint8();          // line of sight updates   96 if in los 32 if targeting someone out of los  0 if channiling a spell and target runs out of los
            byte   TargetType = packet.GetUint8();

            //cclient.Plr.DebugMessage("F_PLAYER_INFO: SetTarget: "+Oid);
            if (TargetType == (byte)TargetTypes.TARGETTYPES_TARGET_SELF)
            {
                TargetType = (byte)TargetTypes.TARGETTYPES_TARGET_ALLY;
            }

            cclient.Plr.CbtInterface.SetTarget(Oid, (TargetTypes)TargetType);

            if (LOS == 0)
            {
                cclient.Plr.AbtInterface.Cancel(true, (ushort)AbilityResult.ABILITYRESULT_NOTVISIBLECLIENT);
            }
        }
Пример #11
0
        static public void HandlePacket(BaseClient client, PacketIn packet)
        {
            LobbyClient cclient = client as LobbyClient;

            byte[] PublicKey = new byte[64];
            for (int i = 0; i < 64; ++i)
            {
                PublicKey[i] = packet.GetUint8();
            }
            Reverse(PublicKey, 64);
            cclient.A = PublicKey;

            UInt16 unk = packet.GetUint16();

            byte[] Proof = new byte[20];
            for (int i = 0; i < 20; ++i)
            {
                Proof[i] = packet.GetUint8();
            }
            Reverse(Proof, 20);
            cclient.Proof = Proof;

            if (IsValid(cclient))
            {
                ANS_LOGIN_SUCCES.Send(cclient);
            }
            else
            {
                cclient.Disconnect();
            }
        }
Пример #12
0
        public static void F_FIRE_SIEGE_WEAPON(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
            {
                return;
            }

            ushort siegeOid     = packet.GetUint16();
            ushort targetID     = packet.GetUint16();
            var    targetX      = packet.GetUint16();
            var    targetY      = packet.GetUint16();
            var    targetZ      = packet.GetUint16();
            var    targetZoneID = packet.GetUint16();
            var    power        = packet.GetUint8(); // ram power
            var    unk2         = packet.GetUint8();

            var siege = (Creature)cclient.Plr.Region.GetObject(siegeOid);

            if (siege != null)
            {
                if (siege.Spawn.Proto.CreatureSubType == (byte)GameData.CreatureSubTypes.SIEGE_RAM)
                {
                    siege.SiegeInterface.RamSwing(cclient.Plr, targetID, power);
                }
                else
                {
                    siege.SiegeInterface.Fire(cclient.Plr, targetID, targetX, targetY, targetZ, targetZoneID, power);
                }
            }
        }
Пример #13
0
        public static void F_BUY_CAREER_PACKAGE(BaseClient client, PacketIn packet)
        {
            GameClient cclient = (GameClient)client;

            if (cclient.Plr == null)
            {
                return;
            }

            AbilityInterface abInterface = cclient.Plr.AbtInterface;

            byte value    = packet.GetUint8();
            byte resource = packet.GetUint8();
            byte unk1     = packet.GetUint8();
            byte tree     = packet.GetUint8();

            if (resource != 7) // renown training
            {
                cclient.Plr.RenInterface.PurchaseRenownAbility(resource, tree);
                return;
            }

            if (tree <= 3)
            {
                if (!abInterface.AddPointToTree(tree))
                {
                    return;
                }
            }

            else if (tree <= 24)
            {
                byte targetTree = 1;
                tree -= 3;

                while (tree > 7)
                {
                    tree -= 7;
                    targetTree++;
                }

                abInterface.ActivateSkillInTree(targetTree, tree);
            }

            else
            {
                return;
            }

            abInterface.SaveMastery();
            abInterface.ReloadMastery();
            abInterface.MasteryChanged = true;
        }
Пример #14
0
        public static void CL_REQUEST_MANIFEST(BaseClient client, PacketIn packet)
        {
            Client         cclient     = client as Client;
            List <Archive> archiveList = new List <Archive>();
            var            count       = packet.GetUint8();

            for (int i = 0; i < count; i++)
            {
                archiveList.Add((Archive)packet.GetUint8());
            }

            cclient.OnRequestManifest(archiveList);
        }
        public static void F_MAIL(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (!cclient.IsPlaying() || !cclient.Plr.IsInWorld())
            {
                return;
            }

            Player Plr = cclient.Plr;

            Plr.MlInterface.CheckMailExpired();

            byte Type = packet.GetUint8();

            switch (Type)
            {
            case 0:     // Mailbox closed
            {
                if (Plr.GldInterface.IsInGuild() && Plr.GldInterface.Guild.GuildVaultUser.Contains(Plr))
                {
                    Plr.GldInterface.Guild.GuildVaultClosed(Plr);
                }

                if (Plr.CurrentSiege != null && Plr.CurrentSiege.SiegeInterface.IsDeployed)
                {
                    Plr.CurrentSiege.SiegeInterface.RemovePlayer(Plr);
                }
            } break;

            case 1:     // Mail sent
            {
                Plr.MlInterface.SendPacketMail(packet);
            } break;

            case 2:     // Open mail
            case 3:     // Return mail
            case 4:     // Delete mail
            case 5:     // Mark as read/unread
            case 7:     // Take Item
            case 8:     // Take money
            {
                byte page = packet.GetUint8();
                uint guid = ByteOperations.ByteSwap.Swap(packet.GetUint32());

                Plr.MlInterface.MailInteract((MailInteractType)Type, guid, packet);
            }
            break;
            }
        }
        public static void F_TROPHY_SETLOCATION(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (!cclient.IsPlaying())
            {
                return;
            }

            packet.GetUint8();
            byte   Trophyslot = packet.GetUint8();
            ushort value      = packet.GetUint16();

            cclient.Plr.ItmInterface.AssignTrophy(Trophyslot, value);
        }
Пример #17
0
        static public void F_REQUEST_QUEST(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            Log.Success("HandlePacket", "Handle F_REQUEST_QUEST");

            UInt16 QuestID = packet.GetUint16();
            byte   State   = packet.GetUint8();

            switch (State)
            {
            case 0:     // Show Quest
            {
                Log.Info("F_REQUEST_QUEST", "Show Quest : " + QuestID);
                cclient.Plr.QtsInterface.SendQuest(QuestID);
            } break;

            case 1:     // Decline Quest
            {
                Log.Info("F_REQUEST_QUEST", "Decline Quest : " + QuestID);
                cclient.Plr.QtsInterface.DeclineQuest(QuestID);
            } break;

            case 2:     // Send To Group
            {
            } break;
            }
            ;
        }
Пример #18
0
        static public void F_REQUEST_QUEST(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            UInt16 QuestID = packet.GetUint16();
            byte   State   = packet.GetUint8();

            switch (State)
            {
            case 0:     // Show Quest
            {
                cclient.Plr.QtsInterface.SendQuest(QuestID);
            } break;

            case 1:     // Decline Quest
            {
                cclient.Plr.QtsInterface.DeclineQuest(QuestID);
            } break;

            case 2:     // Send To Group
            {
            } break;
            }
            ;
        }
Пример #19
0
 public int HandlePacket(BaseClient client, PacketIn packet)
 {
     LobbyClient cclient = client as LobbyClient;
     byte slotId = packet.GetUint8();
     Character Info = cclient.Characters.Get(slotId);
     MySqlCommand cmd = new MySqlCommand("DELETE FROM `clientstatus` WHERE `name` = @name", Connection.Instance);
     try
     {
         cmd.Prepare();
         cmd.Parameters.AddWithValue("@name", Info.Name);
         cmd.ExecuteNonQuery();
     }
     catch (MySqlException) { }
     finally { cmd.Dispose(); }
     PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_CHARACTER_INFO);
     if (Info == null) Out.WriteUInt32Reverse((uint)ResponseCodes.RC_FAILED);
     else
     {
         Out.WriteUInt32Reverse((uint)ResponseCodes.RC_SUCCESS);
         Out.WriteByte(Info.Slot);
         Out.WriteByte(Info.Gender);
         Out.WriteUInt32Reverse(Info.Playtime);
         Out.WriteUInt32Reverse(Info.Rank);
         Out.WriteByte(Info.Threat);
         Out.WriteUInt32Reverse(Info.Money);
         Out.WriteParsedString("APB-EMU", 60);
         byte[] Custom = Info.getCustom();
         Out.Write(Custom, 0, Custom.Length);
     }
     cclient.Send(Out);
     return 0;
 }
Пример #20
0
        static public void F_INTERFACE_COMMAND(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null)
            {
                return;
            }

            byte CommandId = packet.GetUint8();

            switch (CommandId)
            {
            case 1:     // ????
            {
            } break;

            case 2:     // Resurrect Button
            {
                cclient.Plr.PreRespawnPlayer();
                Log.Success("Interface Command", "Respawn Player");
            } break;

            case 10:     // Talisman Fuse
            {
            } break;
            }
            ;
        }
Пример #21
0
        public int HandlePacket(BaseClient client, PacketIn packet)
        {
            LobbyClient    cclient = client as LobbyClient;
            byte           slotId  = packet.GetUint8();
            CharacterEntry Info    = Databases.CharacterTable.SingleOrDefault(c => c.AccountIndex == cclient.Account.Index && c.Slot == slotId);

            PacketOut Out = new PacketOut((uint)Opcodes.ANS_CHARACTER_INFO);

            if (Info.Index < 1)
            {
                Out.WriteUInt32Reverse((uint)ResponseCodes.RC_FAILED);
            }
            else
            {
                Out.WriteUInt32Reverse((uint)ResponseCodes.RC_SUCCESS);
                Out.WriteByte(Info.Slot);
                Out.WriteByte(Info.Gender);
                Out.WriteUInt32Reverse((uint)Info.Playtime);
                Out.WriteUInt32Reverse((uint)Info.Rank);
                Out.WriteByte(Info.Threat);
                Out.WriteUInt32Reverse((uint)Info.Money);
                Out.WriteParsedString(Info.Clan, 60);
                byte[] Custom = getCustom(Info);
                Out.Write(Custom, 0, Custom.Length);
            }
            cclient.Send(Out);
            return(0);
        }
Пример #22
0
        static public void F_DUMP_ARENAS_LARGE(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (!cclient.HasAccount())
            {
                cclient.Disconnect();
                return;
            }

            byte      CharacterSlot = packet.GetUint8();
            Character Char          = CharMgr.GetAccountChar(cclient._Account.AccountId).GetCharacterBySlot(CharacterSlot);

            if (Char == null)
            {
                Log.Error("F_DUMP_ARENAS_LARGE", "Can not find character on slot : " + CharacterSlot);
                cclient.Disconnect();
                return;
            }

            if (cclient.Plr == null)
            {
                cclient.Plr = Player.CreatePlayer(cclient, Char);
            }

            PacketOut Out = new PacketOut((byte)Opcodes.F_WORLD_ENTER);

            Out.WriteUInt16(0x0608); // TODO
            Out.Fill(0, 20);
            Out.WriteString("38699", 5);
            Out.WriteString("38700", 5);
            Out.WriteString("0.0.0.0", 20);
            cclient.SendTCP(Out);
        }
Пример #23
0
        static public void F_PLAYER_INFO(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
            {
                return;
            }

            packet.GetUint16();
            UInt16 Oid        = packet.GetUint16();
            byte   Unk        = packet.GetUint8();
            byte   TargetType = packet.GetUint8();

            cclient.Plr.CbtInterface.SetTarget(Oid, (GameData.TargetTypes)TargetType);
        }
Пример #24
0
        public static void F_DO_ABILITY_AT_POS(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null)
            {
                return;
            }

            ushort unk        = packet.GetUint16();
            ushort Oid        = packet.GetUint16();
            ushort CastPx     = packet.GetUint16();
            ushort CastPy     = packet.GetUint16();
            ushort CastZoneId = packet.GetUint16();

            ushort CastPz       = packet.GetUint16();
            ushort AbilityId    = packet.GetUint16();
            ushort Px           = packet.GetUint16();
            ushort Py           = packet.GetUint16();
            ushort Pz           = packet.GetUint16();
            ushort targetZoneId = packet.GetUint16();
            byte   abGroup      = packet.GetUint8();

            if (Px == 0 && Py == 0 && Pz == 0)
            {
                cclient.Plr.SendClientMessage("Target position out of range", ChatLogFilters.CHATLOGFILTERS_C_ABILITY_ERROR);
            }

            cclient.Plr.AbtInterface.StartCastAtPos(cclient.Plr, AbilityId, ZoneService.GetWorldPosition(cclient.Plr.Zone.Info, Px, Py, Pz), CastZoneId, abGroup);
        }
Пример #25
0
        static public void HandlePacket(BaseClient client, PacketIn packet)
        {
            LobbyClient cclient = (LobbyClient)client;

            byte sloid = packet.GetUint8();

            Program.CharMgr.SetEnter(cclient.Account.Id, sloid);

            WorldInfo Info = Program.CharMgr.GetWorldInfo(cclient.Account.WorldId);

            PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_WORLD_ENTER);

            if (Info == null)
            {
                Out.WriteUInt32R(1);
            }
            else
            {
                Out.WriteUInt32R(0);

                Out.WriteInt32R(Info.Ip);            // WorldServerIp
                Out.WriteUInt16R((UInt16)Info.Port); // Port
                Out.WriteInt64R(TCPManager.GetTimeStamp());
            }

            cclient.SendTCP(Out);
        }
Пример #26
0
 public int HandlePacket(BaseClient client, PacketIn packet)
 {
     LobbyClient cclient = (LobbyClient)client;
     Byte slotId = packet.GetUint8();
     Character character = cclient.Characters.Get(slotId);
     if (character == null) Log.Error(cclient.Account.Email, "Wrong slot specified!");
     World.World info = null;
     lock (Program.worldListener.Worlds)
     {
         Program.worldListener.Worlds.TryGetValue(character.WorldId, out info);
     }
     PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_WORLD_ENTER);
     if (info == null) Out.WriteUInt32Reverse(1);
     else
     {
         info.Send(new AccountEnter(cclient.Account.Id, character.Id, cclient.SessionId));
         Out.WriteUInt32Reverse((uint)ResponseCodes.RC_SUCCESS);
         Out.WriteByte(info.IP1);
         Out.WriteByte(info.IP2);
         Out.WriteByte(info.IP3);
         Out.WriteByte(info.IP4);
         Out.WriteUInt16Reverse((UInt16)info.Port);
         Out.WriteInt64Reverse(TCPManager.GetTimeStamp());
     }
     cclient.Send(Out);
     return 0;
 }
Пример #27
0
 public int HandlePacket(BaseClient client, PacketIn packet)
 {
     LobbyClient cclient = (LobbyClient)client;
     Byte slotId = packet.GetUint8();
     CharacterEntry character = Databases.CharacterTable.SingleOrDefault(c => c.AccountIndex == cclient.Account.Index && c.Slot == slotId);
     if (character.Index < 1) Log.Error(cclient.Account.Username, "Wrong slot specified!");
     World.World info = null;
     lock (Program.worldListener.Worlds)
     {
         Program.worldListener.Worlds.TryGetValue((uint)character.World, out info);
     }
     PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_WORLD_ENTER);
     if (info == null) Out.WriteUInt32Reverse(1);
     else
     {
         info.Send(new AccountEnter((uint)cclient.Account.Index, (uint)character.Index, cclient.SessionId));
         Out.WriteUInt32Reverse((uint)ResponseCodes.RC_SUCCESS);
         Out.WriteByte(info.IP1);
         Out.WriteByte(info.IP2);
         Out.WriteByte(info.IP3);
         Out.WriteByte(info.IP4);
         Out.WriteUInt16Reverse((UInt16)info.Port);
         Out.WriteInt64Reverse(TCPManager.GetTimeStamp());
     }
     cclient.Send(Out);
     return 0;
 }
Пример #28
0
        protected override void OnReceive(byte[] Packet)
        {
            lock (this)
            {
                PacketIn packet   = new PacketIn(Packet, 0, Packet.Length);
                long     byteLeft = packet.Length;

                while (byteLeft > 0)
                {
                    if (!m_expectData)
                    {
                        long StartPos = packet.Position;
                        m_expectSize = packet.DecodeMythicSize();
                        long EndPos = packet.Position;

                        long Diff = EndPos - StartPos;
                        byteLeft -= Diff;
                        if (m_expectSize <= 0)
                        {
                            return;
                        }

                        if (byteLeft <= 0)
                        {
                            return;
                        }

                        Opcode    = packet.GetUint8();
                        byteLeft -= 1;

                        m_expectData = true;
                    }
                    else
                    {
                        m_expectData = false;
                        if (byteLeft >= m_expectSize)
                        {
                            long Pos = packet.Position;

                            packet.Opcode = Opcode;
                            packet.Size   = (ulong)m_expectSize;

                            _srvr.HandlePacket(this, packet);

                            byteLeft       -= m_expectSize;
                            packet.Position = Pos;
                            packet.Skip(m_expectSize);
                        }
                        else
                        {
                            Log.Error("OnReceive", "Data count incorrect :" + byteLeft + " != " + m_expectSize);
                        }
                    }
                }

                packet.Dispose();
            }
        }
Пример #29
0
        public static void F_DUMP_ARENAS_LARGE(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (!cclient.HasAccount())
            {
                cclient.Disconnect("No Account in F_DUMP_ARENAS_LARGE");
                return;
            }

            if (Program.Rm.OnlinePlayers >= Program.Rm.MaxPlayers && cclient._Account.GmLevel == 1)
            {
                PacketOut Out = new PacketOut((byte)Opcodes.F_LOGINQUEUE);
                client.SendPacket(Out);
                return;
            }

            byte      CharacterSlot = packet.GetUint8();
            Character Char          = CharMgr.GetAccountChar(cclient._Account.AccountId).GetCharacterBySlot(CharacterSlot);

            if (Char == null)
            {
                Log.Error("F_DUMP_ARENAS_LARGE", "Can not find character on slot : " + CharacterSlot);
                cclient.Disconnect("Character not found in F_DUMP_ARENAS_LARGE");
                return;
            }

            {
                if (cclient.Plr == null)
                {
                    cclient.Plr = Player.CreatePlayer(cclient, Char);
                }

                if (cclient.Plr == null)
                {
                    cclient.Disconnect("NULL Player from CreatePlayer?");
                    return;
                }

                if (cclient.Plr.Client != cclient)
                {
                    cclient.Plr.Client?.Disconnect("Ghost client");
                    cclient.Plr.Destroy();
                    cclient.Disconnect("Player already exists");

                    return;
                }

                PacketOut Out = new PacketOut((byte)Opcodes.F_WORLD_ENTER, 64);
                Out.WriteUInt16(0x0608); // TODO
                Out.Fill(0, 20);
                Out.WriteString("38699", 5);
                Out.WriteString("38700", 5);
                Out.WriteString("0.0.0.0", 20);
                cclient.SendPacket(Out);
            }
        }
Пример #30
0
 public int HandlePacket(BaseClient client, PacketIn packet)
 {
     LobbyClient cclient = client as LobbyClient;
     cclient.Characters.Delete(packet.GetUint8());
     PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_CHARACTER_DELETE);
     Out.WriteUInt32Reverse((uint)ResponseCodes.RC_SUCCESS);
     cclient.Send(Out);
     return 0;
 }
        static public void HandlePacket(BaseClient client, PacketIn packet)
        {
            LobbyClient cclient = client as LobbyClient;

            Program.CharMgr.DeleteCharacter(cclient.Account.Id, packet.GetUint8());

            PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_CHARACTER_DELETE);

            Out.WriteUInt32R(0);
            cclient.SendTCP(Out);
        }
Пример #32
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;
 }
Пример #33
0
 public int HandlePacket(BaseClient client, PacketIn packet)
 {
     LobbyClient cclient = (LobbyClient)client;
     byte FileId = packet.GetUint8();
     PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_CONFIGFILE_LOAD);
     Out.WriteInt32Reverse((int)ResponseCodes.RC_SUCCESS);
     Out.WriteByte(FileId);
     byte[] Result = ZlibMgr.Compress(Program.FileMgr.GetFileByte((int)cclient.Account.Id, FileId, true, "", ""));
     cclient.Send(Out);
     return 0;
 }
Пример #34
0
        public static void F_DO_ABILITY(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null)
            {
                return;
            }

            byte LOS    = packet.GetUint8();
            bool Moving = Convert.ToBoolean(packet.GetUint8());

            ushort Heading   = packet.GetUint16();
            ushort X         = packet.GetUint16();
            ushort Y         = packet.GetUint16();
            ushort ZoneID    = packet.GetUint16();
            ushort Z         = packet.GetUint16();
            ushort AbilityID = packet.GetUint16();

            // prevent ability when banner is out

            if (cclient.Plr.WeaponStance == WeaponStance.Standard && !(AbilityID == 14508 || AbilityID == 14524 || AbilityID == 14527 || AbilityID == 14526))
            {
                return;
            }

            byte abGroup = packet.GetUint8();

            byte unk = packet.GetUint8();

            uint unk2 = packet.GetUint32();

            bool enemyVisible    = Convert.ToBoolean(LOS & 128);
            bool friendlyVisible = Convert.ToBoolean(LOS & 8);

            cclient.Plr.SetPosition(X, Y, Z, Heading, ZoneID);

            cclient.Plr.AbtInterface.StartCast(cclient.Plr, AbilityID, abGroup, 0, 0, enemyVisible, friendlyVisible, Moving);
        }
Пример #35
0
        public int HandlePacket(BaseClient client, PacketIn packet)
        {
            LobbyClient cclient = (LobbyClient)client;
            byte        FileId  = packet.GetUint8();

            PacketOut Out = new PacketOut((uint)Opcodes.ANS_CONFIGFILE_LOAD);

            Out.WriteInt32Reverse((int)ResponseCodes.RC_SUCCESS);
            Out.WriteByte(FileId);
            byte[] Result = ZlibMgr.Compress(Program.FileMgr.GetFileByte(cclient.Account.Index, FileId, true, "", ""));
            cclient.Send(Out);
            return(0);
        }
Пример #36
0
        static public void F_INTERACT(BaseClient client, PacketIn packet)
        {
            GameClient cclient = client as GameClient;

            if (cclient.Plr == null || !cclient.Plr.IsInWorld())
            {
                return;
            }

            if (cclient.Plr.IsDead)
            {
                return;
            }

            InteractMenu Menu = new InteractMenu();

            Menu.Unk   = packet.GetUint16();
            Menu.Oid   = packet.GetUint16();
            Menu.Menu  = packet.GetUint16();
            Menu.Page  = packet.GetUint8();
            Menu.Num   = packet.GetUint8();
            Menu.Count = packet.GetUint16();

            Object Obj = cclient.Plr.Region.GetObject(Menu.Oid);

            if (Obj == null)
            {
                return;
            }

            if (Obj.GetDistanceTo(cclient.Plr) > 20)
            {
                //Log.Error("F_INTERACT", "Distance = " + Obj.GetDistanceTo(cclient.Plr));
                return;
            }

            Menu.Packet = packet;
            Obj.SendInteract(cclient.Plr, Menu);
        }
Пример #37
0
        public int HandlePacket(BaseClient client, PacketIn packet)
        {
            LobbyClient cclient = client as LobbyClient;

            byte[] clientModulus = new byte[64];
            for (int i = 0; i < 64; ++i)
            {
                clientModulus[i] = packet.GetUint8();
            }
            cclient.clientModulus = new FrameWork.NetWork.Crypto.BigInteger(1, clientModulus);
            ushort unk = packet.GetUint16();

            byte[] Proof = new byte[20];
            for (int i = 0; i < 20; ++i)
            {
                Proof[i] = packet.GetUint8();
            }
            cclient.Proof = Proof;
            if (IsBanned(cclient))
            {
                LOGIN_FAILED.Send(cclient, (int)ResponseCodes.RC_LOGIN_ACCOUNT_BLOCKED);
                cclient.Disconnect();
            }
            else
            {
                if (IsValid(cclient))
                {
                    LOGIN_SUCCES.Send(cclient);
                    cclient.ECrypt = new Encryption(cclient.SessionId);
                    CHARACTER_LIST.Send(cclient);
                }
                else
                {
                    LOGIN_FAILED.Send(cclient, (int)ResponseCodes.RC_LOGIN_INVALID_ACCOUNT);
                    cclient.Disconnect();
                }
            }
            return(0);
        }
Пример #38
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;
 }
Пример #39
0
 public int HandlePacket(BaseClient client, PacketIn packet)
 {
     LobbyClient cclient = client as LobbyClient;
     Byte slot = packet.GetUint8();
     foreach(CharacterEntry ch in cclient.Characters)
     {
         if(ch.Slot == slot)
         {
             cclient.Characters.Remove(ch);
             Databases.CharacterTable.Remove(ch);
             break;
         }
     }
     PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_CHARACTER_DELETE);
     Out.WriteUInt32Reverse((uint)ResponseCodes.RC_SUCCESS);
     cclient.Send(Out);
     return 0;
 }
Пример #40
0
 public int HandlePacket(BaseClient client, PacketIn packet)
 {
     LobbyClient cclient = client as LobbyClient;
     byte slotId = packet.GetUint8();
     CharacterEntry Info = Databases.CharacterTable.SingleOrDefault(c => c.AccountIndex == cclient.Account.Index && c.Slot == slotId);
     PacketOut Out = new PacketOut((UInt32)Opcodes.ANS_CHARACTER_INFO);
     if (Info.Index < 1) Out.WriteUInt32Reverse((uint)ResponseCodes.RC_FAILED);
     else
     {
         Out.WriteUInt32Reverse((uint)ResponseCodes.RC_SUCCESS);
         Out.WriteByte(Info.Slot);
         Out.WriteByte(Info.Gender);
         Out.WriteUInt32Reverse((uint)Info.Playtime);
         Out.WriteUInt32Reverse((uint)Info.Rank);
         Out.WriteByte(Info.Threat);
         Out.WriteUInt32Reverse((uint)Info.Money);
         Out.WriteParsedString(Info.Clan, 60);
         byte[] Custom = getCustom(Info);
         Out.Write(Custom, 0, Custom.Length);
     }
     cclient.Send(Out);
     return 0;
 }