#ifndef RAGNAROK_SOURCE_CLIENT_SESSION_H #define RAGNAROK_SOURCE_CLIENT_SESSION_H #include "Contents/InstantVar.h" #include "Contents/Items/ItemInfo.h" #include "Contents/Messenger/MessengerMember.h" #include "Contents/Skills/PlayerSkillBundle.h" #include "Contents/UserData/NormalItemSlots.h" #include "Resource/XmlNode.h" #include #include #include #include #include #include #include #include class CActRes; class CRenderObject; class LuaScript; struct JobNameInitialization; struct ActionFrame; struct WindowDialogs; struct SessionRecord6144 { /* 0000 */ std::uint16_t unknown_0000 = 0; /* 0004 */ std::uint32_t unknown_0004[10] = {}; /* 002C */ std::uint32_t unknown_002C = 0; /* 0030 */ std::uint8_t unknown_0030 = 0; /* 0031 */ std::uint8_t unknown_0031[7]; }; struct SessionRecord6178 { /* 0000 */ unsigned char unknown_0000[0x2C]; }; struct RobeAlpha { /* 0000 */ int from; /* 0004 */ int to; /* 0008 */ int period; }; struct ProhibitionLogEntry { /* 0000 */ std::uint32_t aid; /* 0004 */ std::uint32_t accountId; /* 0008 */ std::uint32_t minutes; /* 000C */ std::uint32_t date; /* 0010 */ std::uint32_t time; /* 0014 */ char name[32]; /* 0034 */ char ownerName[32]; }; struct SessionRecord0734 { /* 0000 */ std::uint32_t unknown_0000 = 0; /* 0004 */ int id; /* 0008 */ std::uint32_t unknown_0008; }; struct SessionShop { /* 0000 */ unsigned char unknown_0000; /* 0004 */ std::vector>> unknown_0004; }; class CSession { public: /* 0000 */ std::uint32_t unknown_0000; /* 0004 */ std::list m_additionalSkills; /* 000C */ CPlayerSkillBundle m_skillBundle; /* 0084 */ std::list m_homunSkills; /* 008C */ std::list m_mercSkills; /* 0094 */ unsigned char unknown_0094[0x28]; /* 00BC */ unsigned char m_hotkeyPage; /* 00BD */ unsigned char unknown_00BD[3]; /* 00C0 */ std::string m_hotkeyDescriptions[36]; /* 0420 */ std::uint32_t unknown_0420[36]; /* 04B0 */ NormalItemSlot m_shortcutSlots[36]; /* 05AC */ NormalItemSlot m_secondaryShortcutSlots[36]; /* 06A8 */ unsigned char unknown_06A8[0x43]; /* 06EB */ NormalItemSlot unknown_06EB; /* 06F2 */ NormalItemSlot unknown_06F2; /* 06F9 */ unsigned char unknown_06F9[0x07]; /* 0700 */ std::map unknown_0700; /* 0708 */ std::map unknown_0708; /* 0710 */ unsigned char unknown_0710[0x0C]; /* 071C */ std::vector m_homunSkillLevels; /* 0728 */ std::vector m_mercSkillLevels; /* 0734 */ std::list unknown_0734; /* 073C */ unsigned char unknown_073C[0x14]; /* 0750 */ std::uint32_t m_prohibitionTarget; /* 0754 */ std::vector m_prohibitionLog; /* 0760 */ std::string m_accountName; /* 0778 */ std::vector> unknown_0778; /* 0784 */ std::map unknown_0784; /* 078C */ std::map unknown_078C; /* 0794 */ std::uint32_t m_serverTimeOffset; /* 0798 */ int m_serverTimeAdjustCount; /* 079C */ unsigned char unknown_079C[0x04]; /* 07A0 */ std::uint32_t m_averagePing; /* 07A4 */ unsigned char unknown_07A4[0x10]; /* 07B4 */ unsigned char m_playerNameKey[0x40]; /* 07F4 */ unsigned char unknown_07F4[0x6A0]; /* 0E94 */ int unknown_0E94; /* 0E98 */ int unknown_0E98; /* 0E9C */ unsigned char unknown_0E9C[0x3C]; /* 0ED8 */ int m_head; /* 0EDC */ unsigned char unknown_0EDC[0x10]; /* 0EEC */ int m_bodyStyle; /* 0EF0 */ int m_headPalette; /* 0EF4 */ unsigned char unknown_0EF4[0x0C]; /* 0F00 */ int m_robe; /* 0F04 */ bool m_newRobeDrawOnTop; /* 0F05 */ unsigned char unknown_0F05[0x0F]; /* 0F14 */ std::uint32_t m_jobFlags; /* 0F18 */ int m_playerX; /* 0F1C */ int m_playerY; /* 0F20 */ unsigned char unknown_0F20[0x08]; /* 0F28 */ int m_score1; /* 0F2C */ int m_score2; /* 0F30 */ unsigned char unknown_0F30[0x04]; /* 0F34 */ int cartCount; /* 0F38 */ int cartMaxCount; /* 0F3C */ int cartWeight; /* 0F40 */ int cartMaxWeight; /* 0F44 */ unsigned char unknown_0F44[0x28]; /* 0F6C */ const char* const* m_humanMaleHeadNames; /* 0F70 */ unsigned char unknown_0F70[0x08]; /* 0F78 */ const char* const* m_humanFemaleHeadNames; /* 0F7C */ unsigned char unknown_0F7C[0x08]; /* 0F84 */ const char* const* m_imfNames; /* 0F88 */ unsigned char unknown_0F88[0x20]; /* 0FA8 */ std::vector m_jobNameTable; /* 0FB4 */ std::map m_jobNameTableWoman; /* 0FBC */ std::map m_jobNameTableMan; /* 0FC4 */ unsigned char unknown_0FC4[0x20]; /* 0FE4 */ std::list m_pingSamples; /* 0FEC */ unsigned char unknown_0FEC[0x24]; /* 1010 */ std::uint32_t unknown_1010; /* 1014 */ unsigned char unknown_1014[4]; /* 1018 */ char unknown_1018[0x24]; /* 103C */ int unknown_103C; /* 1040 */ unsigned char unknown_1040[0x18]; /* 1058 */ int m_petActionTable[5][5][7]; /* 1314 */ unsigned char unknown_1314[0x258]; /* 156C */ XmlDocument m_petTalkTable; /* 159C */ XmlDocument m_monsterSkillInfo; /* 15CC */ XmlDocument m_monsterTalkTable; /* 15FC */ unsigned char unknown_15FC[8]; /* 1604 */ std::uint32_t m_aid; /* 1608 */ std::uint32_t m_gid; /* 160C */ char m_navigationPlayerMap[0x1C]; /* 1628 */ int m_job; /* 162C */ unsigned char unknown_162C[0x24]; /* 1650 */ int m_level; /* 1654 */ unsigned char unknown_1654[0x98]; /* 16EC */ std::uint32_t unknown_16EC; /* 16F0 */ int m_zeny; /* 16F4 */ unsigned char unknown_16F4[0x8]; /* 16FC */ int m_maxWeight; /* 1700 */ int m_weight; /* 1704 */ unsigned char unknown_1704[0xC]; /* 1710 */ std::list m_inventoryItems; /* 1718 */ std::list unknown_1718; /* 1720 */ std::list unknown_1720; /* 1728 */ std::list unknown_1728; /* 1730 */ std::list unknown_1730; /* 1738 */ std::list unknown_1738; /* 1740 */ std::list unknown_1740; /* 1748 */ std::list unknown_1748; /* 1750 */ std::list unknown_1750; /* 1758 */ std::list unknown_1758; /* 1760 */ std::list unknown_1760; /* 1768 */ std::list unknown_1768; /* 1770 */ std::list unknown_1770; /* 1778 */ unsigned char unknown_1778[0x0C]; /* 1784 */ std::list unknown_1784[11]; /* 17DC */ std::list m_partyMembers; /* 17E4 */ std::list m_friends; /* 17EC */ unsigned char unknown_17EC[0x04]; /* 17F0 */ ITEM_INFO unknown_17F0[10]; /* 21A0 */ ITEM_INFO unknown_21A0[10]; /* 2B50 */ ITEM_INFO unknown_2B50[10]; /* 3500 */ ITEM_INFO unknown_3500[10]; /* 3EB0 */ ITEM_INFO m_exchangeItems[10]; /* 4860 */ ITEM_INFO m_itemSlots[10]; /* 5210 */ unsigned char unknown_5210[0x08]; /* 5218 */ std::vector> m_commandIds; /* 5224 */ std::vector> m_bgmFileNames; /* 5230 */ std::vector>> m_fogParameters; /* 523C */ unsigned char unknown_523C[0x18]; /* 5254 */ std::map m_npcLocationRadius; /* 525C */ unsigned char unknown_525C[0x38]; /* 5294 */ const char* const* m_bodyJobNames; /* 5298 */ unsigned char unknown_5298[0x08]; /* 52A0 */ const char* const* m_sexNames; /* 52A4 */ unsigned char unknown_52A4[0x08]; /* 52AC */ const char* const* m_weaponNamesBegin; /* 52B0 */ const char* const* m_weaponNamesEnd; /* 52B4 */ unsigned char unknown_52B4[0x04]; /* 52B8 */ std::vector m_accessoryNames; /* 52C4 */ std::vector m_robeNames; /* 52D0 */ std::vector m_navigationForbiddenMaps; /* 52DC */ unsigned char unknown_52DC[0x174]; /* 5450 */ int unknown_5450; /* 5454 */ unsigned char unknown_5454[0xE8]; /* 553C */ std::string m_serverName; /* 5554 */ unsigned char unknown_5554[4]; /* 5558 */ int unknown_5558; /* 555C */ unsigned char unknown_555C[0xC]; /* 5568 */ int unknown_5568; /* 556C */ int unknown_556C; /* 5570 */ unsigned char unknown_5570[0x4C]; /* 55BC */ int m_homunJob; /* 55C0 */ unsigned char unknown_55C0[0x58]; /* 5618 */ int m_traceAi; /* 561C */ int m_homunActionState; /* 5620 */ unsigned char unknown_5620[0xC]; /* 562C */ char m_mercenaryName[32]; /* 564C */ int m_mercenaryStats[8]; /* 566C */ int m_mercenaryHp; /* 5670 */ int m_mercenaryMaxHp; /* 5674 */ int m_mercenaryClass; /* 5678 */ int m_mercenaryLevel; /* 567C */ int m_mercenarySp; /* 5680 */ int m_mercenaryMaxSp; /* 5684 */ int m_mercenaryLoyalty; /* 5688 */ int m_mercenarySummons; /* 568C */ int m_mercenaryKills; /* 5690 */ unsigned char unknown_5690[4]; /* 5694 */ __time32_t m_mercenaryExpiration; /* 5698 */ unsigned char unknown_5698[0x1C]; /* 56B4 */ int m_mercenaryActionState; /* 56B8 */ unsigned char unknown_56B8[0x242]; /* 58FA */ char unknown_58FA[0x18]; /* 5912 */ unsigned char unknown_5912[0xAA]; /* 59BC */ int unknown_59BC; /* 59C0 */ int unknown_59C0; /* 59C4 */ int unknown_59C4; /* 59C8 */ int unknown_59C8; /* 59CC */ int unknown_59CC; /* 59D0 */ int unknown_59D0; /* 59D4 */ int unknown_59D4; /* 59D8 */ LuaScript* m_hotkeyScript; /* 59DC */ unsigned char unknown_59DC[0x218]; /* 5BF4 */ int m_pairValues[3]; /* 5C00 */ unsigned char unknown_5C00[0x20]; /* 5C20 */ long long m_bankBalance; /* 5C28 */ unsigned char unknown_5C28[0x40]; /* 5C68 */ ITEM_INFO unknown_5C68[5]; /* 6140 */ std::uint16_t unknown_6140; /* 6144 */ std::map unknown_6144; /* 614C */ unsigned char unknown_614C[0x20]; /* 616C */ std::vector unknown_616C; /* 6178 */ std::vector unknown_6178; /* 6184 */ unsigned char unknown_6184[0x04]; /* 6188 */ int m_lastIntervalTime; /* 618C */ const char* const* m_doramMaleHeadNames; /* 6190 */ unsigned char unknown_6190[0x08]; /* 6198 */ const char* const* m_doramFemaleHeadNames; /* 619C */ unsigned char unknown_619C[0x1C]; /* 61B8 */ ITEM_INFO unknown_61B8[10]; /* 6B68 */ ITEM_INFO unknown_6B68[10]; /* 7518 */ unsigned char unknown_7518[0x9C8]; /* 7EE0 */ std::map m_robeAlpha; /* 7EE8 */ unsigned char unknown_7EE8[4]; /* 7EEC */ int m_maxLevel; /* 7EF0 */ unsigned char unknown_7EF0[0x7C]; /* 7F6C */ int m_maxLevelEffect4th; /* 7F70 */ int m_maxLevelEffect4thSub; /* 7F74 */ unsigned char unknown_7F74[8]; /* 7F7C */ bool m_homunculusAutoFeed; /* 7F7D */ unsigned char unknown_7F7D[0x2B]; /* 7FA8 */ CInstantVar m_options; /* 7FB4 */ unsigned char unknown_7FB4[0x8]; /* 7FBC */ int unknown_7FBC; /* 7FC0 */ unsigned char unknown_7FC0[0xB4]; /* 8074 */ int unknown_8074; /* 8078 */ const char* const* m_jobSpriteNames; /* 807C */ unsigned char unknown_807C[0x38]; /* 80B4 */ std::map m_nameToId; /* 80BC */ std::map m_shops; /* 80C4 */ unsigned char unknown_80C4[4]; /* 80C8 */ int unknown_80C8; /* 80CC */ unsigned char unknown_80CC[0x20]; /* 80EC */ std::string unknown_80EC; /* 8104 */ std::string unknown_8104; /* 811C */ std::vector m_cardItems; /* 8128 */ unsigned char unknown_8128[0x08]; /* 8130 */ int unknown_8130; /* 8134 */ int unknown_8134; /* 8138 */ std::int64_t m_startTimeTicks; /* 8140 */ std::int64_t m_loginTimeTicks; /* 8148 */ int unknown_8148; void ItemBitmapPath(const char* name, char* output); int GetOption(int id) const; void SetOption(int id, int value, int extra); std::uint32_t GetServerTime(); std::uint32_t AddPingSample(std::uint32_t sample); std::uint32_t SetServerTime(std::uint32_t serverTime); void SetHotkeyDescription(const char* description, int index); void SetHotkeyDescription(const char* description, std::uint32_t skillLevel, int index); void SetHotkeySkillLevel(std::uint32_t skillLevel, int index); bool IsPetAccessory(int itemId); void AddItemSlot(ITEM_INFO item); SessionShop* GetShop(int shopId); void SetShopFlag(int shopId, char flag); void SetShopItem(int shopId, unsigned int index, int itemId, int first, int second); bool AddShopName(std::string name, int shopId); int SetUnknown8134(int value); void ClearUnknown1710(int id); void ClearUnknown1740(int id); void ClearUnknown1738(int id); std::uint32_t SyncServerTime(std::uint32_t serverTime); int DefaultRenderBackend(); void LoadNavigationScripts(); bool IsNavigationAllowed() const; void LoadRobeAlpha(); std::pair* InsertPair(int key, int value); int SetPairValue(int value, int slot); int GetPairValue() const; bool IsNpcJob(int job) const; bool HasJobShieldSprite(int job, int shield) const; bool IsJobWeaponTypeAllowed(int job, std::int64_t weaponType) const; int IsGuardianJob(int job) const; bool IsBabyJob(int job) const; int IsMercenaryJob(int job) const; int IsNewMercenaryJob(int job) const; bool IsSuperNovice2Job(int job) const; bool IsExpandedJob(int job) const; bool IsCostumeJob(int job) const; int GetSceneUnknown004C() const; int IsPlayerJobId(int job) const; int WorldUnknown0050() const; bool IsShadowItemType(int type) const; bool IsConsumableItemType(int type) const; bool IsCostumeLocation(int location) const; int GetMapProperty07() const; int GetMapProperty08() const; int GetMapProperty09() const; int GetMapProperty0F() const; int GetMapProperty10() const; int GetMapProperty11() const; int GetMapProperty12() const; int GetMapProperty13() const; bool HasUnknown6178Records() const; bool IsEquipItemType(int type) const; bool IsMiscItemType(int type) const; bool IsSuperNoviceJob(int job) const; bool IsSuperNoviceClass(int job) const; void ApplySaveDataOptions(); int SetHotkeyEntry(char enabled, int id, int value, int slot); int SetFlag(char value); void SetPlayerNameKey(const unsigned char* key); // INLINED NormalItemSlot& SkillHotkey(int index) { return reinterpret_cast(reinterpret_cast(this) + offsetof(CSession, unknown_06EB))[index]; } void ResetItems2B50(); int GetPetFood(int job); std::string GetMonsterActName(int job); std::string GetMonsterSprName(int job); void GetPetIllustName(int job, int, char* buffer); int GetPetJobByEggItem(int eggItemId); const char* GetPetString(int id); const char* GetPetTalkName(int job); const char* GetPetTalkActionName(int action); void GetPetTalkText(int job, int hungerState, int action, char* text); const char* GetMonsterTalkEventName(int event); void GetMonsterTalkText(int job, int event, int skill, char* text, std::uint32_t aid); void FormatMonsterSpeech(char* text, char* output, std::uint32_t aid, int feminine); bool UpdateHomunSkill(const CSkillInfo& value, unsigned char notify); bool UpdateMercSkill(const CSkillInfo& value, unsigned char notify); void AddUnknownId(int id); void AddStackedItem(ITEM_INFO item); void AddItemToFreeSlot(ITEM_INFO item); bool IsListedId(int id, int variant) const; void ClearItemQuantities(); void ResetItems3500(); void ClearSlots06EB(); void ClearShortcutSlots(); void ClearSecondaryShortcutSlots(); void ClearUnknown0420(); void EraseUnknownKey(std::int64_t key); std::int64_t FindUnknown0784(std::int64_t key) const; std::int64_t FindUnknown078C(std::int64_t key) const; SessionRecord6144 FindRecord6144(int key) const; int GetBeginEffectId(int skillId) const; bool IsPartyMember(std::uint32_t aid, bool onlineOnly); bool IsPvpMap(); ITEM_INFO GetItem2B50(int index) const; ITEM_INFO GetItem17F0(int index) const; unsigned char IsAllyActor(std::uint32_t aid, int job); const char* Text8104() const; const char* Text80EC() const; ITEM_INFO FindItem1768(std::uint32_t id) const; ITEM_INFO GetItem1768At(int index) const; int GetItem1768Quantity(std::uint32_t id) const; ITEM_INFO FindItem1740(std::uint32_t id) const; ITEM_INFO GetItem1740At(int index) const; int GetItem1740Quantity(std::uint32_t id) const; ITEM_INFO FindItem1750(std::uint32_t id) const; ITEM_INFO GetItem1750At(int index) const; int GetItem1750Quantity(std::uint32_t id) const; ITEM_INFO FindItem1758(std::uint32_t id) const; ITEM_INFO FindItem1758ByItemId(int itemId) const; ITEM_INFO GetItem1758At(int index) const; ITEM_INFO FindItem1760(std::uint32_t id) const; ITEM_INFO GetItem1760At(int index) const; int GetItem1760Quantity(std::uint32_t id) const; ITEM_INFO FindItem1770(std::uint32_t id) const; ITEM_INFO FindItem1760ByItemId(const char* itemId) const; int GetItem1760QuantityByItemId(const char* itemId) const; SessionRecord0734 FindRecord0734(int id) const; const char* GatName2RswName(const char* gatName); const char* GetBgmFileName(const char* rswName); bool HasItem17D4(int itemId) const; bool IsFriendName(const char* name) const; bool RemoveFriendByCharacterId(std::uint32_t characterId); void RemovePartyMemberByName(const char* name); bool IsGuildMemberAccount(std::uint32_t accountId) const; bool IsGuildMemberCharacter(std::uint32_t characterId) const; bool IsGuildMemberName(const char* name) const; long long GetItem1760Total() const; ITEM_INFO GetItem1748At(int index) const; bool HasItem1718(std::uint32_t id) const; bool HasExchangeItem(std::uint32_t id) const; int CountItems5C68() const; void SplitDate(__time32_t time, std::uint16_t& year, std::uint16_t& month, std::uint16_t& day) const; int GetDefaultOptionValue(const char* name, int fallback) const; int FindUnknown0778(int key) const; CSkillInfo AdditionalSkillAt(int index) const; CSkillInfo HomunSkillAt(int index) const; int CountProhibitionLog(std::uint32_t aid); void DeleteProhibitionLog(std::uint32_t aid, std::uint32_t minutes, WindowDialogs& dialogs); void AddProhibitionLog(std::uint32_t aid, std::uint32_t minutes); int ProcessEmotionShortcut(const char* text); int IsAdminSubMode(int subMode); void GetMonsterSkillInfo(const char* monster, int skill, int* action, int* loopType, WindowDialogs& dialogs); const char* DecodePlayerName() const; void NotifyHomunSkillWindows(); void NotifyMercSkillWindows(); int GetPetActionNumber(int hungerLevel, int friendlyLevel, int action); int GetPetFriendlyState(int friendly); void GetPetFriendlyStateString(int friendly, char* buffer); int GetPetHungryState(int hunger); void GetPetHungryStateString(int hunger, char* buffer); int GetPetEmotionNumber(int job, int action, int hungerLevel); void ClearItemSelection(); bool IsDoramJob(int job) const; bool IsEffectRenderEnabled() const; bool CheckInterval(long long interval); bool IsPlayerPerformerJob(int job) const; bool IsSpecialMonsterJob(int job) const; bool IsWithinUnknown59C0(int value) const; bool ResetUnknownState(); bool IsSecondJob(int job); void UpdateBodyStyle(int job, int style, int renderJob); std::string GetBodyJobName(int job); char* ConvertTooltipText(const char* source, char* output) const; void StoreEmblem(const void* data, std::size_t size, std::uint32_t guildId, int version); int MercSkillLevel(int skillId) const; int HomunSkillLevel(int skillId) const; CRenderObject* FindGameActor(std::uint32_t aid) const; const char* GetJobName(unsigned job, int sex); void InitJobNameTable(JobNameInitialization& context); int SyncUnknown0E98(); void LoadXmlTables(); std::string GetAccessoryName(int id); std::string GetWeaponName(int weapon); const char* GetWeaponClassName(int item); std::string GetWeaponActName(int job, int sex, int weapon, int weaponItem, int costume); std::string GetWeaponSprName(int job, int sex, int weapon, int weaponItem, int costume); std::string GetWeaponEffectActName(int job, int sex, int weapon, int weaponItem, int effect, int costume); std::string GetWeaponEffectSprName(int job, int sex, int weapon, int weaponItem, int effect, int costume); void CollectCardItems(); void SetHomunculusAutoFeed(bool enabled); void SetPetAutoFeed(bool enabled); int GetRobeAlpha(int robeId); bool IsTopLayerRobe(int robe); int IsExchangeItemListFull(); // INLINED int GetFilledExchangeItemList() { int count = 0; for (int i = 0; i < 10; ++i) { if (this->m_exchangeItems[i].quantity) { ++count; } } return count; } int IsSkillIdInRange6018(unsigned id) const; int IsSkillIdInRange6001(unsigned id) const; int IsPetEgg(int itemId) const; const ActionFrame* GetSyncedFrame(CActRes* baseAct, CActRes* act, unsigned action, int baseFrame, std::uint32_t startTime, int* frame); float GetNpcLocationRadius(int job, bool riding); int GetRidingJob(int job); int GetSpriteJob(int job, int costumeJob, bool spriteIndex); bool HasRequiredItems() const; bool IsSlotItemIdentity(std::uint32_t id) const; bool HasInventoryItem(std::uint32_t id) const; bool HasItemId(int itemId) const; bool HasItemCount(int itemId, int count) const; void NormalizeHead(int* head, int job); int GetDisplayJob(); bool IsTreeGroupThree(int job) const; std::string GetSexName(int sex); std::string GetHeadActName(int job, int sex, int* head); std::string GetPlayerHeadActName(); std::string GetHeadPalName(int head, int job, int sex, int palette); std::string GetPlayerHeadPalName(); std::string GetHeadSprName(int job, int sex, int* head); std::string GetAccessoryActName(int job, int sex, int head, int accessory); std::string GetAccessorySprName(int job, int sex, int head, int accessory); std::string GetRobeActName(int job, int sex, int robe, bool riding, int unused, int costumeJob); std::string GetRobeSprName(int job, int sex, int robe, bool riding, int unused, int costumeJob); std::string GetRobeName(unsigned int robe); int GetItemDescription40(int id); std::uint32_t GetUnknown0420(int index); void GetSkillActionInfo(int skillId, int& effectId, int& motion, int variant, int level); bool IsNumberWithCommas(char* text); bool IsRobeDrawOnTop(int action, int frame, bool riding); int GetUnknown8134() const; int FindUnknown0708(int key) const; int FindUnknown0700(int key) const; const char* GetEnemyHitWaveName(int element); ITEM_INFO* GetEquippedItem(const ITEM_INFO* item); ITEM_INFO FindItem2B50(std::uint32_t id, int* index) const; ITEM_INFO FindItem17F0(std::uint32_t id, int* index) const; ITEM_INFO GetExchangeItem(int index) const; int HasItem61B8(std::uint32_t id) const; const std::vector* GetFogParameters(const char* rswName, int* found); std::string GetPlayerHeadSprName(); std::string GetImfName(int job); std::uint16_t FindInventoryIndexByItemId(int itemId); std::vector FindInventoryIndicesByItemId(int itemId, unsigned char identifiedOnly); ITEM_INFO GetInventoryItemAt(int index) const; ITEM_INFO* FindInventoryItemByItemId(int itemId, bool identifiedOnly); int GetInventoryItemCount(int itemId) const; ITEM_INFO GetItem1784At(int list, int index) const; int GetCommandId(const char* name) const; int GetItem1728Count() const; ITEM_INFO GetItemSlot(int index) const; ITEM_INFO GetItem21A0(int index) const; int GetItem1718QuantityByItemId(const ITEM_INFO& item) const; int GetItem1718QuantityOf(const ITEM_INFO& item) const; std::uint16_t GetItem1718Unknown006CByItemId(const ITEM_INFO& item) const; std::uint16_t GetItem1718Unknown006COf(const ITEM_INFO& item) const; std::uint16_t SumItem1720Unknown006CByItemId() const; std::uint16_t SumItem1720Unknown006C() const; ITEM_INFO FindItem1720ByItemId(const char* itemId) const; ITEM_INFO GetItem1720At(int index) const; int GetItem1720QuantityByItemId(const char* itemId) const; int GetItem1720Quantity(std::uint32_t id) const; int GetItem1720Total() const; const char* GetMonsterRmaName(int job) const; ITEM_INFO FindItem1730(std::uint32_t id) const; ITEM_INFO GetItem1730At(int index) const; int GetItem1730Quantity(std::uint32_t id) const; ITEM_INFO GetItem1718At(int index) const; int GetItem1718Quantity(std::uint32_t id) const; const char* GetHotkeyDescription(int index) const; ITEM_INFO FindItem1738(std::uint32_t id) const; ITEM_INFO GetItem1738At(int index) const; int GetItem1738Quantity(std::uint32_t id) const; }; extern CSession g_session; extern std::vector g_adminAccountIds; extern std::vector g_monsterJobs; bool IsAdminAccount(int aid); bool IsMonsterJob(int job); int MonsterJobColor(int job); #if defined(_WIN32) && !defined(_WIN64) static_assert(sizeof(SessionRecord6144) == 0x38); static_assert(sizeof(SessionRecord6178) == 0x2C); static_assert(sizeof(ProhibitionLogEntry) == 0x54); static_assert(offsetof(CSession, m_prohibitionLog) == 0x754); static_assert(offsetof(SessionRecord6144, unknown_002C) == 0x2C); static_assert(offsetof(SessionRecord6144, unknown_0030) == 0x30); static_assert(offsetof(CSession, m_additionalSkills) == 0x4); static_assert(offsetof(CSession, m_maxLevelEffect4th) == 0x7F6C); static_assert(offsetof(CSession, m_homunculusAutoFeed) == 0x7F7C); static_assert(offsetof(CSession, m_options) == 0x7FA8); static_assert(offsetof(CSession, m_nameToId) == 0x80B4); static_assert(offsetof(CSession, m_level) == 0x1650); static_assert(offsetof(CSession, m_hotkeyPage) == 0xBC); static_assert(offsetof(CSession, m_pairValues) == 0x5BF4); static_assert(offsetof(CSession, m_zeny) == 0x16F0); static_assert(offsetof(CSession, m_weight) == 0x1700); static_assert(offsetof(CSession, m_bankBalance) == 0x5C20); static_assert(offsetof(CSession, m_mercenaryStats) == 0x564C); static_assert(offsetof(CSession, m_mercenaryExpiration) == 0x5694); static_assert(offsetof(CSession, m_homunJob) == 0x55BC); static_assert(offsetof(CSession, m_traceAi) == 0x5618); static_assert(offsetof(CSession, m_homunActionState) == 0x561C); static_assert(offsetof(CSession, m_mercenaryActionState) == 0x56B4); static_assert(offsetof(CSession, m_hotkeyDescriptions) == 0xC0); static_assert(offsetof(CSession, m_serverTimeOffset) == 0x794); static_assert(offsetof(CSession, m_serverTimeAdjustCount) == 0x798); static_assert(offsetof(CSession, m_averagePing) == 0x7A0); static_assert(offsetof(CSession, m_pingSamples) == 0xFE4); static_assert(offsetof(CSession, m_petTalkTable) == 0x156C); static_assert(offsetof(CSession, m_monsterTalkTable) == 0x15CC); static_assert(offsetof(CSession, m_navigationPlayerMap) == 0x160C); static_assert(offsetof(CSession, unknown_1738) == 0x1738); static_assert(offsetof(CSession, unknown_1740) == 0x1740); static_assert(offsetof(CSession, unknown_1770) == 0x1770); static_assert(offsetof(CSession, m_itemSlots) == 0x4860); static_assert(offsetof(CSession, m_shops) == 0x80BC); static_assert(offsetof(CSession, unknown_8134) == 0x8134); static_assert(offsetof(CSession, unknown_0E94) == 0xE94); static_assert(offsetof(CSession, unknown_103C) == 0x103C); static_assert(offsetof(CSession, unknown_5450) == 0x5450); static_assert(offsetof(CSession, unknown_59BC) == 0x59BC); static_assert(offsetof(CSession, m_hotkeyScript) == 0x59D8); static_assert(offsetof(CSession, m_lastIntervalTime) == 0x6188); static_assert(offsetof(CSession, unknown_8130) == 0x8130); static_assert(offsetof(CSession, m_skillBundle) == 0xC); static_assert(offsetof(CSession, m_homunSkills) == 0x84); static_assert(offsetof(CSession, m_mercSkills) == 0x8C); static_assert(offsetof(CSession, unknown_0420) == 0x420); static_assert(offsetof(CSession, m_shortcutSlots) == 0x4B0); static_assert(offsetof(CSession, m_secondaryShortcutSlots) == 0x5AC); static_assert(offsetof(CSession, unknown_06EB) == 0x6EB); static_assert(offsetof(CSession, unknown_06F2) == 0x6F2); static_assert(offsetof(CSession, m_homunSkillLevels) == 0x71C); static_assert(offsetof(CSession, m_mercSkillLevels) == 0x728); static_assert(offsetof(CSession, unknown_0778) == 0x778); static_assert(offsetof(CSession, unknown_0784) == 0x784); static_assert(offsetof(CSession, unknown_078C) == 0x78C); static_assert(offsetof(CSession, m_robe) == 0xF00); static_assert(offsetof(CSession, m_playerX) == 0xF18); static_assert(offsetof(CSession, m_playerY) == 0xF1C); static_assert(offsetof(CSession, m_score1) == 0xF28); static_assert(offsetof(CSession, m_score2) == 0xF2C); static_assert(offsetof(CSession, m_jobNameTable) == 0xFA8); static_assert(offsetof(CSession, m_jobNameTableWoman) == 0xFB4); static_assert(offsetof(CSession, m_jobNameTableMan) == 0xFBC); static_assert(offsetof(CSession, m_pingSamples) == 0xFE4); static_assert(offsetof(CSession, m_head) == 0xED8); static_assert(offsetof(CSession, m_headPalette) == 0xEF0); static_assert(offsetof(CSession, m_humanMaleHeadNames) == 0xF6C); static_assert(offsetof(CSession, m_humanFemaleHeadNames) == 0xF78); static_assert(offsetof(CSession, m_doramMaleHeadNames) == 0x618C); static_assert(offsetof(CSession, m_doramFemaleHeadNames) == 0x6198); static_assert(offsetof(CSession, unknown_0E98) == 0xE98); static_assert(offsetof(CSession, m_petActionTable) == 0x1058); static_assert(offsetof(CSession, m_job) == 0x1628); static_assert(offsetof(CSession, m_inventoryItems) == 0x1710); static_assert(offsetof(CSession, unknown_16EC) == 0x16EC); static_assert(offsetof(CSession, unknown_1730) == 0x1730); static_assert(offsetof(CSession, unknown_0734) == 0x734); static_assert(offsetof(CSession, unknown_1784) == 0x1784); static_assert(offsetof(CSession, m_partyMembers) == 0x17DC); static_assert(offsetof(CSession, m_friends) == 0x17E4); static_assert(offsetof(CSession, m_bgmFileNames) == 0x5224); static_assert(offsetof(CSession, unknown_1720) == 0x1720); static_assert(offsetof(CSession, unknown_1728) == 0x1728); static_assert(offsetof(CSession, unknown_21A0) == 0x21A0); static_assert(offsetof(CSession, m_commandIds) == 0x5218); static_assert(offsetof(CSession, unknown_17F0) == 0x17F0); static_assert(offsetof(CSession, unknown_2B50) == 0x2B50); static_assert(offsetof(CSession, unknown_3500) == 0x3500); static_assert(offsetof(CSession, m_accessoryNames) == 0x52B8); static_assert(offsetof(CSession, m_robeNames) == 0x52C4); static_assert(offsetof(CSession, m_navigationForbiddenMaps) == 0x52D0); static_assert(offsetof(CSession, unknown_5558) == 0x5558); static_assert(offsetof(CSession, m_hotkeyScript) == 0x59D8); static_assert(offsetof(CSession, unknown_5C68) == 0x5C68); static_assert(offsetof(CSession, unknown_6140) == 0x6140); static_assert(offsetof(CSession, unknown_6144) == 0x6144); static_assert(offsetof(CSession, unknown_616C) == 0x616C); static_assert(offsetof(CSession, m_robeAlpha) == 0x7EE0); static_assert(offsetof(CSession, m_maxLevel) == 0x7EEC); static_assert(offsetof(CSession, m_cardItems) == 0x811C); static_assert(offsetof(CSession, m_startTimeTicks) == 0x8138); static_assert(offsetof(CSession, m_loginTimeTicks) == 0x8140); static_assert(offsetof(CSession, unknown_0700) == 0x700); static_assert(offsetof(CSession, unknown_0708) == 0x708); static_assert(offsetof(CSession, m_newRobeDrawOnTop) == 0xF04); static_assert(offsetof(CSession, m_imfNames) == 0xF84); static_assert(offsetof(CSession, m_fogParameters) == 0x5230); #endif #endif