rodecomp/Source/Client/Session.h
ragnarok-clanker 0f7eaea5e0 Decompile fn_20327 (CRagEffect::PartyEffectVisible)
Batch #16527 by eAthena: 0 byte-identical, 1 confirmed by peer review.

- fn_20327 CRagEffect::PartyEffectVisible: logic confirmed by peer review

Peer-reviewed-by: Yommy, alisonrag, br4yan
Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
2026-11-10 22:42:45 +00:00

1424 lines
62 KiB
C++

#ifndef RAGNAROK_SOURCE_CLIENT_SESSION_H
#define RAGNAROK_SOURCE_CLIENT_SESSION_H
#include "Render/Renderer.h"
#include "Contents/InstantVar.h"
#include "Contents/Hotkeys/EmotionHotkeys.h"
#include "Contents/Items/ItemInfo.h"
#include "Contents/Messenger/MessengerMember.h"
#include "Contents/Party/PartyBookingMgr.h"
#include "Contents/Skills/AutomaticSkills.h"
#include "Contents/Skills/PlayerSkillBundle.h"
#include "Contents/Store/MCStoreInfoBackup.h"
#include "Contents/UserData/NormalItemSlots.h"
#include "Resource/XmlNode.h"
#include "UI/Cooldowns/CooldownState.h"
#include "UI/Shortcuts/ShortcutCooldowns.h"
#include <windows.h>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <ctime>
#include <list>
#include <map>
#include <new>
#include <set>
#include <string>
#include <utility>
#include <vector>
class UIWindowMgr;
class CActRes;
class CFile;
class CGameActor;
class CRenderObject;
class LuaScript;
struct ActionFrame;
struct vector3d;
struct EquipSlots {
/* 0000 */ int values[3];
};
struct SessionRecord6144 {
/* 0000 */ std::uint16_t completionFlags = 0;
/* 0004 */ std::uint32_t objectives[10] = {};
/* 002C */ int completedAt = 0;
/* 0030 */ std::uint8_t rewarded = 0;
/* 0031 */ std::uint8_t padding_0031;
/* 0032 */ std::int16_t year;
/* 0034 */ std::int16_t month;
/* 0036 */ std::int16_t day;
};
#pragma pack(push, 1)
struct AchievementRecordPacket {
/* 0000 */ int id;
/* 0004 */ unsigned char completed;
/* 0005 */ std::uint32_t objectives[10];
/* 002D */ __time32_t completedAt;
/* 0031 */ unsigned char rewarded;
};
#pragma pack(pop)
struct MapPosRect {
/* 0000 */ int left;
/* 0004 */ int top;
/* 0008 */ int right;
/* 000C */ int bottom;
};
struct MapPosEntry {
/* 0000 */ MapPosRect rect;
/* 0010 */ int valid;
};
struct SessionRecord6178Entry {
// INLINED
SessionRecord6178Entry(const std::string& text, bool completed) : text(text), completed(completed) {
}
/* 0000 */ std::string text;
/* 0018 */ bool completed;
};
struct SessionRecord6178 {
/* 0000 */ unsigned char padding_0000 = 0;
/* 0001 */ unsigned char completed = 0;
/* 0004 */ int id = -1;
/* 0008 */ std::string title;
/* 0020 */ std::vector<SessionRecord6178Entry> objectives;
};
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 {
SessionRecord0734() : active(0) {
}
/* 0000 */ std::uint32_t active;
/* 0004 */ int id;
/* 0008 */ std::uint32_t cell;
};
struct SessionShop {
/* 0000 */ unsigned char flag;
/* 0004 */ std::vector<std::map<int, std::pair<int, int>>> items;
};
struct SessionParameterNameLess {
bool operator()(const std::pair<std::string, std::vector<std::string>>& left, const std::pair<std::string, std::vector<std::string>>& right) const {
return std::strcmp(left.first.c_str(), right.first.c_str()) < 0;
}
};
struct SessionEntry5BD4 {
SessionEntry5BD4() : item() {}
SessionEntry5BD4(const SessionEntry5BD4& other) {
std::memcpy(this->storeIdentity, other.storeIdentity, sizeof(this->storeIdentity));
std::memcpy(this->storeName, other.storeName, sizeof(this->storeName));
this->price = other.price;
this->quantity = other.quantity;
new (&this->item) ITEM_INFO(other.item);
}
~SessionEntry5BD4() {
this->item.displayName.~basic_string();
this->item.itemId.~basic_string();
}
/* 0000 */ unsigned char storeIdentity[8];
/* 0008 */ char storeName[80];
/* 0058 */ int price;
/* 005C */ std::uint16_t quantity;
union {
/* 0060 */ ITEM_INFO item;
};
};
static_assert(sizeof(SessionEntry5BD4) == 0x158);
struct SubChatWndInfo {
/* 0000 */ std::string name;
/* 0018 */ bool options[25];
/* 0034 */ int x;
/* 0038 */ int y;
/* 003C */ int width;
/* 0040 */ int height;
};
struct SessionEntry00A4 {
/* 0000 */ std::string name;
/* 0018 */ unsigned char skillIdPositionAndMaxLevel[0x0C];
/* 0024 */ std::vector<int> values;
};
struct SessionTraits {
SessionTraits();
/* 0000 */ std::map<int, int> stats;
/* 0008 */ int bonus[6];
/* 0020 */ std::int64_t points[6];
};
static_assert(sizeof(SessionTraits) == 0x50);
class CSession {
public:
void IconPath(char* output, const char* id, int identified);
const char* ItemDragResource(const char* id, int identified);
/* 0000 */ std::uint32_t mapPropertyId;
/* 0004 */ std::list<CSkillInfo> m_additionalSkills;
/* 000C */ CPlayerSkillBundle m_skillBundle;
/* 0084 */ std::list<CSkillInfo> m_homunSkills;
/* 008C */ std::list<CSkillInfo> m_mercSkills;
/* 0094 */ std::list<ShortcutCooldownIcon> m_mainCooldownIcons;
/* 009C */ std::list<ShortcutCooldownIcon> m_alternateCooldownIcons;
/* 00A4 */ std::map<std::string, SessionEntry00A4> m_skillTreePositions;
/* 00AC */ std::map<std::string, std::string> m_jobInheritance;
/* 00B4 */ int m_simplifiedSkillList;
/* 00B8 */ int m_showSkillDescription;
/* 00BC */ unsigned char m_hotkeyPage;
/* 00BD */ unsigned char padding_00BD[3];
/* 00C0 */ std::string m_hotkeyDescriptions[36];
/* 0420 */ std::uint32_t hotkeySkillLevels[36];
/* 04B0 */ NormalItemSlot m_shortcutSlots[36];
/* 05AC */ NormalItemSlot m_secondaryShortcutSlots[36];
/* 06A8 */ int alternateShortcutRow;
/* 06AC */ NormalItemSlot m_normalItemSlots[9];
/* 06EB */ NormalItemSlot quickSlot;
/* 06F2 */ NormalItemSlot alternateQuickSlot;
/* 06F9 */ unsigned char padding_06F9[0x03];
/* 06FC */ int mainShortcutRow;
/* 0700 */ std::map<int, int> skillFollowEffects;
/* 0708 */ std::map<int, int> skillEffectIds;
/* 0710 */ std::vector<int> extendedSkillLevels;
/* 071C */ std::vector<int> m_homunSkillLevels;
/* 0728 */ std::vector<int> m_mercSkillLevels;
/* 0734 */ std::list<SessionRecord0734> miniPartyRecords;
/* 073C */ std::map<int, SubChatWndInfo> m_noSubChatWnds;
/* 0744 */ std::map<int, SubChatWndInfo> m_subChatWnds;
/* 074C */ bool m_canDragWnd;
/* 074D */ unsigned char padding_074D[0x03];
/* 0750 */ std::uint32_t m_prohibitionTarget;
/* 0754 */ std::vector<ProhibitionLogEntry> m_prohibitionLog;
/* 0760 */ std::string m_accountName;
/* 0778 */ std::vector<std::pair<int, int>> keyValues;
/* 0784 */ std::map<std::int64_t, std::int64_t> summonHp;
/* 078C */ std::map<std::int64_t, std::int64_t> summonMaxHp;
/* 0794 */ std::uint32_t m_serverTimeOffset;
/* 0798 */ int m_serverTimeAdjustCount;
/* 079C */ unsigned char timeAttackMode[0x04];
/* 07A0 */ std::uint32_t m_averagePing;
union {
/* 07A4 */ unsigned char timeAttackState[0x10];
struct {
/* 07A4 */ std::uint32_t m_timeAttackCountdown;
/* 07A8 */ std::uint32_t m_timeAttackStart;
/* 07AC */ int m_timeAttackVisible;
/* 07B0 */ unsigned char padding_07B0[4];
};
};
/* 07B4 */ unsigned char m_playerNameKey[0x40];
/* 07F4 */ unsigned char characterSelectionData[0x6A0];
/* 0E94 */ int characterCount;
/* 0E98 */ int cachedSex;
/* 0E9C */ int m_sex;
/* 0EA0 */ unsigned char characterLoginData[0x38];
/* 0ED8 */ int m_head;
/* 0EDC */ unsigned char weaponAppearance[0x10];
/* 0EEC */ int m_bodyStyle;
/* 0EF0 */ int m_headPalette;
/* 0EF4 */ unsigned char accessoryAppearance[0x0C];
/* 0F00 */ int m_robe;
/* 0F04 */ bool m_newRobeDrawOnTop;
/* 0F05 */ unsigned char padding_0F05[0x03];
/* 0F08 */ int m_bodyCostume;
/* 0F0C */ unsigned char statusLevelEffects[0x08];
/* 0F14 */ std::uint32_t m_jobFlags;
/* 0F18 */ int m_playerX;
/* 0F1C */ int m_playerY;
/* 0F20 */ int m_playerDir;
/* 0F24 */ unsigned char playerTeam[0x04];
/* 0F28 */ int m_score1;
/* 0F2C */ int m_score2;
/* 0F30 */ unsigned char chatFont[0x04];
/* 0F34 */ int cartCount;
/* 0F38 */ int cartMaxCount;
/* 0F3C */ int cartWeight;
/* 0F40 */ int cartMaxWeight;
union {
/* 0F44 */ unsigned char storeSlotCounts[8];
struct {
/* 0F44 */ int m_vendingSlotCount;
/* 0F48 */ int m_buyingStoreSlotCount;
};
};
/* 0F4C */ int storeItemLimit;
/* 0F50 */ int selectedCharacterSlot;
/* 0F54 */ unsigned char guildTargetCharacter[0x04];
/* 0F58 */ int m_autoOpenWhisperWindow;
/* 0F5C */ int m_whisperOpenSound;
/* 0F60 */ int m_autoOpenFriendWhisperWindow;
/* 0F64 */ unsigned char whisperOptions[0x08];
/* 0F6C */ const char* const* m_humanMaleHeadNames;
/* 0F70 */ unsigned char m_humanMaleHeadNamesEndAndCapacity[0x08];
/* 0F78 */ const char* const* m_humanFemaleHeadNames;
/* 0F7C */ unsigned char m_humanFemaleHeadNamesEndAndCapacity[0x08];
/* 0F84 */ const char* const* m_imfNames;
/* 0F88 */ unsigned char additionalSpriteNames[0x14];
/* 0F9C */ const char* const* m_shieldJobNames;
/* 0FA0 */ unsigned char m_shieldJobNamesEndAndCapacity[0x08];
/* 0FA8 */ std::vector<const char*> m_jobNameTable;
/* 0FB4 */ std::map<unsigned, const char*> m_jobNameTableWoman;
/* 0FBC */ std::map<unsigned, const char*> m_jobNameTableMan;
/* 0FC4 */ std::map<unsigned, const char*> padding_0FC4;
/* 0FCC */ std::vector<const char*> m_sexLabels;
/* 0FD8 */ std::vector<const char*> m_jobKeyNames;
/* 0FE4 */ std::list<std::uint32_t> m_pingSamples;
/* 0FEC */ std::vector<const char*> m_palJobNames;
/* 0FF8 */ EmotionHotkeys m_emotionHotkeys;
/* 1010 */ std::uint32_t petGid;
/* 1014 */ unsigned char petNameModified[4];
/* 1018 */ char petName[0x20];
/* 1038 */ int petAccessory;
/* 103C */ int petJob;
/* 1040 */ int petLevel;
/* 1044 */ int petHunger;
/* 1048 */ unsigned char petMaxHunger[4];
/* 104C */ int m_petFriendly;
/* 1050 */ int petEggIndex;
/* 1054 */ int petPreviousHunger;
/* 1058 */ int m_petActionTable[5][5][7];
/* 1314 */ std::string m_petTalkStrings[25];
/* 156C */ XmlDocument m_petTalkTable;
/* 159C */ XmlDocument m_monsterSkillInfo;
/* 15CC */ XmlDocument m_monsterTalkTable;
/* 15FC */ unsigned char monsterTalkState[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 playerExperienceState[0x24];
/* 1650 */ int m_level;
/* 1654 */ unsigned char statusPoints[0x04];
/* 1658 */ int m_jobLevel;
/* 165C */ int m_skillPoint;
/* 1660 */ int m_guildSkillPoint;
/* 1664 */ unsigned char companionSkillPoints[8];
/* 166C */ int strengthBonus;
/* 1670 */ int agilityBonus;
/* 1674 */ int vitalityBonus;
/* 1678 */ int intelligenceBonus;
/* 167C */ int dexterityBonus;
/* 1680 */ int luckBonus;
/* 1684 */ int m_standardStats[6];
/* 169C */ unsigned char combatStats[0x50];
/* 16EC */ std::uint32_t equippedArrowIndex;
/* 16F0 */ int m_zeny;
/* 16F4 */ unsigned char healthPoints[0x8];
/* 16FC */ int m_maxWeight;
/* 1700 */ int m_weight;
/* 1704 */ unsigned char optionFlags[0x4];
/* 1708 */ int monsterInfoEnabled;
/* 170C */ unsigned char clientTimeOffset[0x4];
/* 1710 */ std::list<ITEM_INFO> m_inventoryItems;
/* 1718 */ std::list<ITEM_INFO> shopItems;
/* 1720 */ std::list<ITEM_INFO> purchaseItems;
/* 1728 */ std::list<ITEM_INFO> sellItems;
/* 1730 */ std::list<ITEM_INFO> storageItems;
/* 1738 */ std::list<ITEM_INFO> cartItems;
/* 1740 */ std::list<ITEM_INFO> merchantShopItems;
/* 1748 */ std::list<ITEM_INFO> merchantMirrorItems;
/* 1750 */ std::list<ITEM_INFO> merchantMyShopItems;
/* 1758 */ std::list<ITEM_INFO> merchantPurchaseItems;
/* 1760 */ std::list<ITEM_INFO> merchantHopeToSellItems;
/* 1768 */ std::list<ITEM_INFO> merchantPurchaseSavedItems;
/* 1770 */ std::list<ITEM_INFO> filteredInventoryItems;
/* 1778 */ std::vector<int> inventoryFilterIds;
/* 1784 */ std::list<ITEM_INFO> inventoryCategories[11];
/* 17DC */ std::list<MessengerMember> m_partyMembers;
/* 17E4 */ std::list<MessengerMember> m_friends;
/* 17EC */ unsigned char padding_17EC[0x04];
/* 17F0 */ ITEM_INFO equippedItems[10];
/* 21A0 */ ITEM_INFO alternateEquippedItems[10];
/* 2B50 */ ITEM_INFO costumeItems[10];
/* 3500 */ ITEM_INFO alternateCostumeItems[10];
/* 3EB0 */ ITEM_INFO m_exchangeItems[10];
/* 4860 */ ITEM_INFO m_itemSlots[10];
/* 5210 */ int exchangeMoney;
/* 5214 */ int otherExchangeMoney;
/* 5218 */ std::vector<std::pair<const char*, int>> m_commandIds;
/* 5224 */ std::vector<std::pair<const char*, const char*>> m_bgmFileNames;
/* 5230 */ std::vector<std::pair<std::string, std::vector<std::string>>> m_fogParameters;
/* 523C */ std::vector<std::pair<std::string, std::vector<std::string>>> m_mapViewParameters;
/* 5248 */ std::vector<char*> m_indoorRswNames;
/* 5254 */ std::map<int, float> m_npcLocationRadius;
/* 525C */ unsigned char weaponSoundTables[0x24];
/* 5280 */ std::list<int> padding_5280;
/* 5288 */ unsigned char padding_5288[0x0C];
/* 5294 */ const char* const* m_bodyJobNames;
/* 5298 */ unsigned char m_bodyJobNamesEndAndCapacity[0x08];
/* 52A0 */ const char* const* m_sexNames;
/* 52A4 */ unsigned char m_sexNamesEndAndCapacity[0x08];
/* 52AC */ const char* const* m_weaponNamesBegin;
/* 52B0 */ const char* const* m_weaponNamesEnd;
/* 52B4 */ unsigned char m_weaponNamesCapacityEnd[0x04];
/* 52B8 */ std::vector<const char*> m_accessoryNames;
/* 52C4 */ std::vector<const char*> m_robeNames;
/* 52D0 */ std::vector<std::string> m_navigationForbiddenMaps;
/* 52DC */ std::vector<std::pair<const char*, int>> m_commandOptions;
/* 52E8 */ unsigned char commandTables[0x28];
/* 5310 */ std::map<std::string, MapPosEntry> m_mapPositions;
/* 5318 */ std::map<std::string, MapPosEntry>* m_mapPosLists;
/* 531C */ std::map<int, MapPosEntry> m_mapPosBounds;
/* 5324 */ int mapPositionsScaled;
/* 5328 */ int m_mapPosListCount;
/* 532C */ int randomStatIndexA;
/* 5330 */ int randomStatIndexB;
/* 5334 */ int randomStatIndexC;
/* 5338 */ int randomStatIndexD;
/* 533C */ int randomStatIndexE;
/* 5340 */ int randomStatValues[12];
/* 5370 */ unsigned char replayStatValuesA[0x30];
/* 53A0 */ unsigned char replayStatValuesB[0x30];
/* 53D0 */ unsigned char replayStatValuesC[0x30];
/* 5400 */ unsigned char minimapTokenStorage[0x40];
/* 5440 */ std::list<ShortcutCooldownRecord> m_requestTimers;
/* 5448 */ int showTimer;
/* 544C */ unsigned char mapTransitionFlag[0x04];
/* 5450 */ int guildLeader;
/* 5454 */ unsigned char interactionFlags[0x0C];
/* 5460 */ int partyBlocked;
/* 5464 */ int partyLeader;
/* 5468 */ int adoptionSkillAvailable;
/* 546C */ unsigned char showEffects[0x04];
/* 5470 */ int lowMemory;
/* 5474 */ int performanceWarningEnabled;
/* 5478 */ unsigned char loginOptions[8];
/* 5480 */ int quitBlocked;
/* 5484 */ int battleChat;
/* 5488 */ int quitAllowed;
/* 548C */ int sessionFlag;
/* 5490 */ unsigned char itemSendState[0x10];
/* 54A0 */ int partyExpShare;
/* 54A4 */ int partyItemCollect;
/* 54A8 */ int partyItemDistribute;
/* 54AC */ std::string partyRequestName;
/* 54C4 */ std::string partyName;
/* 54DC */ std::string accountAddress;
/* 54F4 */ std::string registrationUrl;
/* 550C */ std::string storeTitle;
/* 5524 */ std::string accountPort;
/* 553C */ std::string m_serverName;
union {
/* 5554 */ unsigned char whisperRecordStorage[4];
/* 5554 */ int m_whisperRecord;
};
/* 5558 */ int currentSex;
/* 555C */ unsigned char playerStatusFlags[0xC];
/* 5568 */ int hp;
/* 556C */ int maxHp;
/* 5570 */ unsigned char spAndHomunculusStats[0x4C];
/* 55BC */ int m_homunJob;
/* 55C0 */ unsigned char homunLevel[0x04];
/* 55C4 */ int m_homunHp;
/* 55C8 */ unsigned char homunMaxHp[0x04];
/* 55CC */ int m_homunSp;
/* 55D0 */ int homunMaxSp;
/* 55D4 */ int homunFriendly;
/* 55D8 */ int homunAccessory;
/* 55DC */ unsigned char padding_55DC[4];
/* 55E0 */ std::int64_t m_homunExp;
/* 55E8 */ std::int64_t m_homunMaxExp;
/* 55F0 */ int homunHunger;
/* 55F4 */ int homunMaxHunger;
/* 55F8 */ int homunNameModified;
/* 55FC */ int homunEnemyGid;
/* 5600 */ int homunEnemyX;
/* 5604 */ int homunEnemyY;
/* 5608 */ int moveHomunEnemy;
/* 560C */ int selectHomunEnemy;
/* 5610 */ int attackHomunEnemy;
/* 5614 */ int homunAlive;
/* 5618 */ int m_traceAi;
/* 561C */ int m_homunActionState;
/* 5620 */ unsigned char companionTargetState[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 mercenaryAttackRange[4];
/* 5694 */ __time32_t m_mercenaryExpiration;
/* 5698 */ int mercenaryEnemyGid;
/* 569C */ int mercenaryEnemyX;
/* 56A0 */ int mercenaryEnemyY;
/* 56A4 */ int moveMercenaryEnemy;
/* 56A8 */ int selectMercenaryEnemy;
/* 56AC */ int attackMercenaryEnemy;
/* 56B0 */ int mercenaryAlive;
/* 56B4 */ int m_mercenaryActionState;
/* 56B8 */ unsigned char autoReplyState[0x1C];
/* 56D4 */ int m_storePasswordMode;
/* 56D8 */ bool m_passwordInputAlternate;
/* 56D9 */ unsigned char padding_56D9[0x7];
/* 56E0 */ int m_passwordWndMode;
/* 56E4 */ std::uint32_t m_loginAccountId;
/* 56E8 */ std::int32_t m_passwordWndAccountId;
/* 56EC */ bool m_launchAccountEnabled;
/* 56ED */ char m_loginErrorText[500];
/* 58E1 */ unsigned char padding_58E1[0x19];
/* 58FA */ char clientVersion[0x18];
/* 5912 */ unsigned char characterRenameEnabled;
/* 5913 */ unsigned char characterRenameData[0x25];
/* 5938 */ int replaySessionFlag;
/* 593C */ int memorialWindowOpen;
/* 5940 */ int memorialWindowX;
/* 5944 */ int memorialWindowY;
/* 5948 */ int memorialDungeonState;
/* 594C */ int memorialReplayValue;
/* 5950 */ std::string memorialDungeonName;
/* 5968 */ int memorialQueuePosition;
/* 596C */ int memorialCreationTime;
/* 5970 */ int memorialExpirationTime;
/* 5974 */ unsigned char equipmentViewState[0x48];
/* 59BC */ int characterSlotState;
/* 59C0 */ int m_normalSlotCount;
/* 59C4 */ int m_premiumSlotCount;
/* 59C8 */ int m_billingSlotCount;
/* 59CC */ int m_producibleSlotCount;
/* 59D0 */ int blockedCharacterCount;
/* 59D4 */ int m_validSlotCount;
/* 59D8 */ LuaScript* m_hotkeyScript;
union {
/* 59DC */ unsigned char mouseAndChannelOptions[0x19C];
struct {
/* 59DC */ unsigned char padding_59DC[0x194];
/* 5B70 */ bool m_lockMouse;
/* 5B71 */ unsigned char padding_5B71[3];
/* 5B74 */ int m_channelCopId;
};
};
/* 5B78 */ PartyBookingMgr m_partyBooking;
/* 5BBC */ int m_partyBookingLevelLimit;
/* 5BC0 */ int elementalGid;
/* 5BC4 */ int elementalHp;
/* 5BC8 */ int elementalSp;
/* 5BCC */ int elementalMaxHp;
/* 5BD0 */ int elementalMaxSp;
/* 5BD4 */ std::vector<SessionEntry5BD4> storeSearchResults;
/* 5BE0 */ int storeSearchCount;
/* 5BE4 */ int storeSearchPageFlags;
/* 5BE8 */ int storeSearchX;
/* 5BEC */ int storeSearchY;
/* 5BF0 */ std::uint32_t storeSearchOwnerAid;
/* 5BF4 */ int m_pairValues[3];
union {
/* 5C00 */ unsigned char itemDropOptions[0x1C];
struct {
/* 5C00 */ bool m_lockItemDrop;
/* 5C01 */ bool m_skipPriceWarning;
/* 5C02 */ unsigned char itemDropState[0x12];
/* 5C14 */ bool m_muteSellSound;
/* 5C15 */ unsigned char sellSoundState[7];
};
};
/* 5C1C */ int replayPacketMode;
/* 5C20 */ long long m_bankBalance;
/* 5C28 */ std::map<int, int> actorEffectStates;
/* 5C30 */ unsigned char itemSelectionState[0x38];
/* 5C68 */ ITEM_INFO selectionItems[5];
/* 6140 */ std::uint16_t achievementResult;
/* 6144 */ std::map<int, SessionRecord6144> achievements;
/* 614C */ int achievementScore;
/* 6150 */ std::int16_t achievementLevel;
/* 6154 */ int achievementCompleted;
/* 6158 */ int achievementTotal;
/* 615C */ int jobTitle;
/* 6160 */ std::vector<int> jobTitles;
/* 616C */ std::vector<int> achievementIds;
/* 6178 */ std::vector<SessionRecord6178> trackedAchievements;
/* 6184 */ int playerAppearanceState;
/* 6188 */ int m_lastIntervalTime;
/* 618C */ const char* const* m_doramMaleHeadNames;
/* 6190 */ unsigned char m_doramMaleHeadNamesEndAndCapacity[0x08];
/* 6198 */ const char* const* m_doramFemaleHeadNames;
/* 619C */ unsigned char m_doramFemaleHeadNamesEndAndCapacity[0x08];
/* 61A4 */ int automaticSkillHotkey;
union {
/* 61A8 */ unsigned char hotkeyAndSortOptions[0x10];
struct {
/* 61A8 */ int m_currentHotkey;
/* 61AC */ int m_localMapMove;
/* 61B0 */ bool m_guildMemberListSort;
/* 61B1 */ unsigned char showCameraInfo;
/* 61B2 */ bool m_blockPrivateTab;
/* 61B3 */ bool m_itemDefaultSort;
/* 61B4 */ bool m_itemAscendingOrder;
/* 61B5 */ bool m_itemDescendingOrder;
/* 61B6 */ unsigned char padding_61B6[2];
};
};
/* 61B8 */ ITEM_INFO swapCostumeItems[10];
/* 6B68 */ ITEM_INFO swapEquippedItems[10];
/* 7518 */ ITEM_INFO padding_7518[10];
/* 7EC8 */ std::uint32_t swapArrowIndex;
/* 7ECC */ unsigned char swapEquipmentFlag[0x04];
/* 7ED0 */ int minimumNameLength;
/* 7ED4 */ std::uint32_t nameValidationTick;
/* 7ED8 */ int m_swapEquipmentMode = 0;
/* 7EDC */ bool m_showMenuIcon;
/* 7EDD */ unsigned char padding_7EDD[3];
/* 7EE0 */ std::map<int, RobeAlpha> m_robeAlpha;
/* 7EE8 */ unsigned char maxBaseLevel[4];
/* 7EEC */ int m_maxLevel;
/* 7EF0 */ unsigned char jobLevelLimits[0x7C];
/* 7F6C */ int m_maxLevelEffect4th;
/* 7F70 */ int m_maxLevelEffect4thSub;
/* 7F74 */ unsigned char raceCreationOptions[8];
/* 7F7C */ bool m_homunculusAutoFeed;
union {
/* 7F7D */ unsigned char homunculusFeedOptions[0x0F];
struct {
/* 7F7D */ unsigned char padding_7F7D[0x0B];
/* 7F88 */ bool m_loginModeFlag;
};
};
/* 7F8C */ int m_priorityClass;
/* 7F90 */ int m_showRankingSchedule;
/* 7F94 */ std::set<std::uint32_t> pendingActorNames;
/* 7F9C */ int m_pingLiveSchedule;
/* 7FA0 */ std::uint32_t m_lastReceiveTick;
/* 7FA4 */ std::uint32_t m_lastSendTick;
/* 7FA8 */ CInstantVar m_options;
/* 7FB4 */ AutomaticSkills m_automaticSkills;
/* 7FBC */ int extraInventorySlots;
/* 7FC0 */ SessionTraits m_traits;
/* 8010 */ CMCStoreInfoBackup m_storeInfoBackup;
/* 8074 */ int madogearType;
/* 8078 */ const char* const* m_jobSpriteNames;
/* 807C */ unsigned char webServiceLoginData[0x20];
/* 809C */ std::vector<std::string> characterNames;
/* 80A8 */ std::vector<std::string> skyMapNames;
/* 80B4 */ std::map<std::string, int> m_nameToId;
/* 80BC */ std::map<int, SessionShop> m_shops;
/* 80C4 */ int m_damageSkinIndex;
/* 80C8 */ int damageSkinCount;
/* 80CC */ int m_damageSkinMode;
/* 80D0 */ int m_damageMillionUnit;
/* 80D4 */ std::string m_damageResourceName;
/* 80EC */ std::string damageSpriteName;
/* 8104 */ std::string damageSkinAuxiliaryName;
/* 811C */ std::vector<ITEM_INFO> m_cardItems;
/* 8128 */ unsigned char feedOptions[0x08];
/* 8130 */ int restrictedCharacterSlots;
/* 8134 */ int playerSkillMode;
/* 8138 */ std::int64_t m_startTimeTicks;
/* 8140 */ std::int64_t m_loginTimeTicks;
/* 8148 */ int sessionIndex;
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);
std::int32_t MemberColor(int index);
SessionShop* FindShop(const int& shopId);
int FindShopId(std::string name);
CSkillInfo* FindGroupedSkill(std::uint32_t id);
void AddFriend(MessengerMember& member);
void AddPartyMember(MessengerMember& member);
void ClearFriends();
int FriendCount() const;
int PartyCount() const;
int OnlinePartyCount() const;
MessengerMember FriendAt(int index) const;
MessengerMember PartyAt(int index) const;
MessengerMember PartyByAccount(std::uint32_t accountId) const;
MessengerMember PartyByCharacter(std::uint32_t characterId) const;
MessengerMember PartyByName(const char* name) const;
void SetPartyDead(std::uint32_t accountId, int dead);
void SetPartyJobLevel(std::uint32_t accountId, std::uint16_t job, std::uint16_t level);
void SetPartyLeader(std::uint32_t accountId, int leader);
int RotateShortcut(int index, int bank) const;
void AssignShortcut(unsigned char type, std::uint32_t id, int level, int slot, int bank);
void AssignItemShortcut(std::uint32_t id, int slot);
void ClearAdditionalShortcutSkills();
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 SetPlayerSkillMode(int value);
void SetElementalGid(int value);
void UnflagInventoryItem(int id);
void UnflagMerchantShopItem(int id);
void UnflagCartItem(int id);
std::uint32_t SyncServerTime(std::uint32_t serverTime);
__declspec(noinline) int DefaultRenderBackend();
int RenderSystemResetPolicy();
void LoadOptionInfo();
void SaveOptionInfo();
void LoadNavigationScripts();
bool IsNavigationAllowed() const;
void LoadRobeAlpha();
void LoadDamageSkinSettings();
bool LoadExceptionMinimapNameTable();
bool LoadMapNameTable();
bool LoadMapPosTable();
bool ScaleMapPositions();
bool LoadFogParameters();
void SetCostumeItem(unsigned int index, const ITEM_INFO& item);
void SetEquippedItem(unsigned int index, const ITEM_INFO& item);
void ClearHomunStatus();
std::pair<int, int>* InsertPair(int key, int value);
int SetPairValue(int value, int slot);
void ClearPairValues(unsigned char clearThird, unsigned char clearSecond, unsigned char clearFirst);
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;
int GetMaxBaseLevel(int job) const;
int GetMaxJobLevel(int job) const;
bool IsCostumeJob(int job) const;
int GetSiegeMode() const;
int IsPlayerJobId(int job) const;
int GetBattleFieldMode() 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 HasTrackedAchievements() const;
bool HasTrackedAchievement(int id) const;
int IsBerserkActive() const;
int IsTrickDeadActive() const;
int HasActiveSkillEffect(int id) const;
void PlaySkillEffect(int skillId, int level, CGameActor* source, CGameActor* target);
bool PlaySkillTargetEffect(int skillId, int level, CGameActor* source, CGameActor* target);
bool PlaySkillGroundEffect(int skillId, vector3d position);
int IsState291To303(int state) const;
int IsType0Or4(int type) const;
int IsMonsterActor(CGameActor* actor) const;
int IsLocalPlayerAid(std::uint32_t aid) const;
bool IsHomunAid(std::uint32_t aid) const;
bool IsMercenaryAid(std::uint32_t aid) const;
__declspec(noinline) int IsHomunculusSkill(unsigned id) const;
__declspec(noinline) int IsMercenarySkill(unsigned id) const;
int IsCompanionAid(std::uint32_t aid) const;
bool IsPetAid(std::uint32_t aid) 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<NormalItemSlot*>(reinterpret_cast<unsigned char*>(this) + offsetof(CSession, quickSlot))[index];
}
void ResetCostumeItems();
void ResetMercenaryStats();
const char* GetPetAccActName(int id);
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);
int AddAchievementJobTitle(int id);
bool ToggleTrackedAchievement(int id);
void RefreshTrackedAchievement(int id);
const char* GetPetTalkName(int job);
__declspec(noinline) const char* GetPetTalkActionName(int action);
void GetPetTalkText(int job, int hungerState, int action, char* text);
__declspec(noinline) 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 AddAchievementId(int id);
EquipSlots GetEquipSlots(int location);
bool EquipInventoryItem(const ITEM_INFO& item, const char* name);
bool UnequipItem(int location, std::uint32_t identity);
bool OnItemEquipped(ITEM_INFO& item);
bool EquipCostumeItem(const ITEM_INFO& item, const char* name);
bool UnequipCostumeItem(int location);
bool EquipAlternateCostumeItem(const ITEM_INFO& item);
void AddStackedItem(ITEM_INFO item);
void ReturnStackedItem(int index, int count);
void AddItemToFreeSlot(ITEM_INFO item);
bool IsListedId(int id, int variant) const;
void ClearItemQuantities();
void ResetAlternateCostumeItems();
void RestoreSelectionItems();
void ClearQuickSlots();
void ClearShortcutSlots();
void ClearSecondaryShortcutSlots();
void ClearHotkeySkillLevels();
void EraseSummonHp(std::int64_t key);
std::int64_t FindSummonHp(std::int64_t key) const;
std::int64_t FindSummonMaxHp(std::int64_t key) const;
SessionRecord6144 FindAchievementRecord(int key) const;
void UpdateAchievementRecord(const AchievementRecordPacket& packet);
void FindLatestCompletedAchievements(int* second, int* first);
int GetBeginEffectId(int skillId) const;
int IsPartyMember(std::uint32_t aid, bool onlineOnly);
bool IsPvpMap();
ITEM_INFO GetCostumeItemAt(int index) const;
ITEM_INFO GetAlternateCostumeItemAt(int index) const;
ITEM_INFO GetSelectionItemAt(int index) const;
ITEM_INFO GetEquippedItemAt(int index) const;
ITEM_INFO GetSwapEquippedItem(int index) const;
ITEM_INFO GetSwapCostumeItem(int index) const;
ITEM_INFO FindItemByIdentity(std::uint32_t identity, int location);
unsigned char IsAllyActor(std::uint32_t aid, int job);
const char* GetDamageSkinAuxiliaryName() const;
const char* GetDamageSpriteName() const;
ITEM_INFO FindMerchantPurchaseSavedItem(std::uint32_t id) const;
ITEM_INFO GetItem1768At(int index) const;
int GetItem1768Quantity(std::uint32_t id) const;
ITEM_INFO FindMerchantShopItem(std::uint32_t id) const;
ITEM_INFO GetItem1740At(int index) const;
int GetItem1740Quantity(std::uint32_t id) const;
ITEM_INFO FindMerchantMyShopItem(std::uint32_t id) const;
ITEM_INFO GetItem1750At(int index) const;
int GetItem1750Quantity(std::uint32_t id) const;
ITEM_INFO FindMerchantPurchaseItem(std::uint32_t id) const;
ITEM_INFO FindItem1758ByItemId(int itemId) const;
ITEM_INFO GetItem1758At(int index) const;
ITEM_INFO FindMerchantHopeToSellItem(std::uint32_t id) const;
ITEM_INFO GetItem1760At(int index) const;
int GetItem1760Quantity(std::uint32_t id) const;
ITEM_INFO FindFilteredInventoryItem(std::uint32_t id) const;
ITEM_INFO FindItem1760ByItemId(const char* itemId) const;
int GetItem1760QuantityByItemId(const char* itemId) const;
SessionRecord0734 FindMiniPartyRecord(int id) const;
const char* GatName2RswName(const char* gatName);
const char* GetBgmFileName(const char* rswName);
const char* GetMapDisplayName(const char* mapName);
const char* GetPlayerMapDisplayName();
std::uint32_t GetPartyMemberAid(const char* name);
bool HasInventorySearchItem(int itemId) const;
int 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 IsGuildMemberCharacter(int characterId, char* name) const;
bool IsGuildMemberName(const char* name) const;
bool IsIndoorMapName(const char* name) const;
bool IsKnownName(std::string name) const;
long long GetItem1760Total() const;
ITEM_INFO GetItem1748At(int index) const;
bool HasShopItemIdentity(std::uint32_t id) const;
bool HasExchangeItem(std::uint32_t id) const;
int CountSelectionItems() const;
int CountDistinctCostumeItems() const;
int CountDistinctEquippedItems() 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 FindActorSkillAnimationValue(int key) const;
CSkillInfo AdditionalSkillAt(int index) const;
CSkillInfo HomunSkillAt(int index) const;
CSkillInfo MercSkillAt(int index) const;
int CountProhibitionLog(std::uint32_t aid);
void DeleteProhibitionLog(std::uint32_t aid, std::uint32_t minutes);
void AddProhibitionLog(std::uint32_t aid, std::uint32_t minutes);
void LoadProhibitionLog();
void ResetPetEggAndJob();
int ProcessEmotionShortcut(const char* text);
int IsAdminSubMode(int subMode);
void GetMonsterSkillInfo(const char* monster, int skill, int* action, int* loopType);
const char* DecodePlayerName() const;
bool HasSkillEffect(std::uint32_t id) const;
CSkillInfo LookupHomunSkill(std::uint32_t id) const;
CSkillInfo LookupMercSkill(std::uint32_t id) const;
CSkillInfo LookupAdditionalSkill(std::uint32_t id) const;
CSkillInfo LookupSkill(std::uint32_t id);
void NotifySkillWindows();
void RemoveSkill(std::uint32_t id);
bool UpdateSkill(const CSkillInfo& value, unsigned char notify, unsigned char updateType);
bool UpdateAdditionalSkill(const CSkillInfo& value, int unused);
int InheritedJob(int job);
void WriteOptionFloat(CFile& file, const char* key, float value);
void WriteOptionInteger(CFile& file, const char* key, int value);
void WriteOptionString(CFile& file, const char* key, const char* value);
void WriteOptionGuid(CFile& file, const char* key, const GUID& value);
void InitializeSkillTree();
void NotifyHomunSkillWindows();
void NotifyMercSkillWindows();
int GetPetActionNumber(int hungerLevel, int friendlyLevel, int action);
void InitPetActionTable();
void InitSkillEffectIds();
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 IsRestrictedCharacterSlot(int value) const;
bool ResetCharacterSlotState();
__declspec(noinline) 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;
__declspec(noinline) int HomunSkillLevel(int skillId) const;
__declspec(noinline) int UseLevel(int id) const;
int SkillLevel(int id) const;
CRenderObject* FindGameActor(std::uint32_t aid) const;
int GetPetTargetAid() const;
const char* GetJobName(unsigned job, int sex);
void InitJobNameTable();
int GetCurrentSex();
void LoadXmlTables();
void LoadExternalSettings();
void ReloadLanguageTables();
bool AddInventoryItem(const ITEM_INFO& item, unsigned char refresh);
void AddShopItem(const RawItemBasic& item, int quantity, std::uint16_t padding_006C);
void AddShopItem(const RawItemBasic& item, int mode);
bool AddMerchantPurchaseSavedItem(const ITEM_INFO& item, unsigned char alternate, unsigned char refresh);
bool AddMerchantShopItem(const ITEM_INFO& item);
bool AddMerchantMyShopItem(const ITEM_INFO& item, int type, unsigned char refresh);
void AddMerchantPurchaseItem(const ITEM_INFO& item);
void AddMerchantHopeToSellItem(const ITEM_INFO& item);
void AddMerchantMirrorItem(const ITEM_INFO& item);
bool Equip(const ITEM_INFO& item);
void AppendShopItem(const ITEM_INFO& item);
void MergeItem1718ByName(const ITEM_INFO& item);
void MergeItem1720ByName(const ITEM_INFO& item);
void MergePurchaseItem(const ITEM_INFO& item);
void AddStorageItem(const ITEM_INFO& item);
void MergeShopItem(const ITEM_INFO& item);
bool AddCartItem(const ITEM_INFO& item, unsigned char refresh);
void RemoveItem1758ByItemId(ITEM_INFO& item);
__declspec(noinline) void RemoveInventoryItem(std::uint32_t id, int quantity);
bool AddExchangeItem(ITEM_INFO item);
bool RemoveMerchantPurchaseSavedItem(const ITEM_INFO& item, unsigned char alternate);
bool RemoveMerchantShopItem(const ITEM_INFO& item);
bool RemoveMerchantMyShopItem(const ITEM_INFO& item, int type, unsigned char refresh);
void RemoveMerchantPurchaseItem(ITEM_INFO& item);
void RemoveMerchantHopeToSellItem(const ITEM_INFO& item);
void RemoveItem1718ByItemId(const ITEM_INFO& item);
void RemoveShopItem(const ITEM_INFO& item);
void RemoveItem1720ByName(const ITEM_INFO& item);
void RemovePurchaseItem(const ITEM_INFO& item);
void RemoveStorageItem(const ITEM_INFO& item);
void ReduceShopItemQuantity(const ITEM_INFO& item);
bool RemoveCartItem(const ITEM_INFO& item);
void ClearInventory();
void ClearItems1760And1748();
void ClearMerchantPurchaseSavedItems();
void ClearMerchantShopItems();
void ClearMerchantMyShopItems();
void SetMerchantMyShopItems(int count, const short* ids);
void ClearMerchantPurchaseItems();
void ClearMerchantHopeToSellItems();
void ClearMerchantMirrorItems();
void ClearInventoryCategoryItems(int index);
void ClearItemSlotQuantities();
void ResetEquipped();
void ClearPurchaseItems();
void ClearCartItems();
void CopyItems1740To1750();
void CopyItems1760To1770();
std::pair<bool, ITEM_INFO> FindMerchantMyShopItem(const ITEM_INFO& item, unsigned char wholeItem);
void ClearMiniPartyRecords();
void ResetStatBonuses();
void ResetHotkeyDescriptions();
int IsDifferentName(const char* name, const char* other);
int IsGuildMemberNameDifferent(const char* name);
int IsFriendNameDifferent(const char* name);
bool EquipSwapEquipmentItem(const ITEM_INFO& item);
void ClearAllInventoryCategories();
void UpdateRandomStats();
void ResetEquipment();
void ResetSlots();
void InitClientData();
void LoadSessionTables();
int GetList0Size() const;
int GetList1Size() const;
int GetList2Size() const;
int GetList4Size() const;
int GetList5Size() const;
int GetList6Size() const;
int GetList7Size() const;
int GetList8Size() const;
int GetList9Size() const;
int GetList10Size() const;
int GetList11Size() const;
int GetInventoryCategorySize(int index) const;
void KeepEquipment();
void ClearTradeItems();
void RemoveEquipment();
float GetOptionFloat(const char* key, float fallback);
// INLINED
bool& ItemSlotActive() {
return reinterpret_cast<bool&>(this->feedOptions[5]);
}
int GetOptionInteger(const char* key, int fallback);
std::string GetOptionString(const char* key, const char* fallback);
GUID GetOptionGuid(const char* key, const GUID& fallback);
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();
std::uint32_t ReadReplayCharacter(const std::vector<unsigned char>& data);
std::uint32_t ReadReplayStats(const std::vector<unsigned char>& data);
std::uint32_t ReadReplayCompanions(const std::vector<unsigned char>& data);
std::uint32_t ReadReplayQuests(const std::vector<unsigned char>& data);
std::uint32_t ReadReplayMessenger(const std::vector<unsigned char>& data);
std::uint32_t ReadReplayItems(const std::vector<unsigned char>& data);
std::uint32_t ReadReplayShops(const std::vector<unsigned char>& data);
std::uint32_t ReadReplayExtra(const std::vector<unsigned char>& data);
std::uint32_t ReadReplayShortcuts(const std::vector<unsigned char>& data);
std::uint32_t ReadReplayReserved(const std::vector<unsigned char>& data);
std::uint32_t ReadReplayEntryQueue(const std::vector<unsigned char>& data);
std::vector<unsigned char> BuildShortcutReplayRecords();
std::vector<unsigned char> BuildCharacterReplayRecords();
std::vector<unsigned char> BuildReservedReplayRecords(); std::vector<unsigned char> BuildShopReplayRecords(); std::vector<unsigned char> BuildExtraReplayRecords(); std::vector<unsigned char> BuildStatsReplayRecords();
std::vector<unsigned char> BuildItemReplayRecords();
std::vector<unsigned char> BuildCompanionReplayRecords();
std::vector<unsigned char> BuildMessengerReplayRecords();
std::vector<unsigned char> BuildSkillListReplayPacket(short id);
void SetHomunculusAutoFeed(bool enabled);
void SetPetAutoFeed(bool enabled);
void SendClientOption(unsigned char value);
void SendHomunculusAutoFeedOption(unsigned char enabled);
void SendPetAutoFeedOption(unsigned char 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 IsHirelingJob(unsigned id) const;
int IsCompanionJob(unsigned id) const;
bool IsMonsterClass(int job);
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);
void ClearStoreSearchResults();
int GetRidingJob(int job);
void InitNpcLocationRadius();
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;
__declspec(noinline) void NormalizeHead(int* head, int job);
int GetDisplayJob();
const char* GetHitWaveName(int job);
const char* GetWeaponHitWaveName(int weapon);
void InitJobHitWaveNames();
void InitWeaponHitWaveNames();
const std::vector<std::string>* GetMapViewParameters(const char* rswName, int* found);
void LoadLuaDataFiles();
bool LoadMapViewParameters();
void InitCommandTables();
void InitJobKeyNames();
void InitResourceNameTables();
void InitJobSpriteNames();
const char* GetEFSTImgFileName(int efstId, int type);
bool IsTreeGroupTwo(int job) const;
bool IsTreeGroupThree(int job) const;
bool IsThirdJobOrHigher(int job);
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 GetShieldActName(int job, int sex, int shield, int costumeJob);
std::string GetShieldSprName(int job, int sex, int shield, int costumeJob);
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);
std::string GetBodyPalName(int job, int sex, int palette, int costumeJob, int costume, int unused);
std::string GetBodySprName(int job, int sex, int costumeJob, int costume);
std::string GetRaceBodyResourceName(int type, int raceJob, int job, int sex, int costumeJob);
int GetItemDescription40(int id);
std::uint32_t GetHotkeySkillLevel(int index);
void GetSkillActionInfo(int skillId, int& effectId, int& motion, int variant, int level);
void GetSkillActionInfo2(int skillId, int& effectId, int& motion);
bool IsNumberWithCommas(char* text);
bool AreInventoryCategoriesEmpty() const;
bool HasItem1740Number(int value) const;
bool IsRobeDrawOnTop(int action, int frame, bool riding);
int GetPlayerSkillMode() const;
int FindSkillEffectId(int key) const;
int FindSkillFollowEffect(int key) const;
const char* GetEnemyHitWaveName(int element);
ITEM_INFO* GetEquippedItem(const ITEM_INFO* item);
ITEM_INFO FindCostumeItem(std::uint32_t id, int* index) const;
ITEM_INFO FindEquippedItem(std::uint32_t id, int* index) const;
ITEM_INFO GetExchangeItem(int index) const;
int HasSwapEquipmentItem(std::uint32_t id) const;
const std::vector<std::string>* GetFogParameters(const char* rswName, int* found);
std::string GetPlayerHeadSprName();
std::string GetImfName(int job);
std::uint16_t FindInventoryIndexByItemId(int itemId);
std::vector<int> FindInventoryIndicesByItemId(int itemId, unsigned char identifiedOnly);
std::vector<unsigned char> BuildStatusReplayPacket();
__declspec(noinline) ITEM_INFO GetInventoryItemAt(int index) const;
std::uint32_t GetItemNameColor(const ITEM_INFO& item) const;
ITEM_INFO* FindInventoryItemByItemId(int itemId, bool identifiedOnly);
int GetInventoryItemCount(int itemId) const;
ITEM_INFO GetItem1784At(int list, int index) const;
void AddInventoryCategoryItem(const ITEM_INFO& item, int list);
int GetCommandId(const char* name) const;
int GetTalkType(const char* text, int* talkType, std::string* parts);
int GetItem1728Count() const;
ITEM_INFO GetItemSlot(int index) const;
ITEM_INFO GetAlternateEquippedItemAt(int index) const;
int GetItem1718QuantityByItemId(const ITEM_INFO& item) const;
int GetItem1718QuantityOf(const ITEM_INFO& item) const;
std::uint16_t GetShopItemPriceFactorByItemId(const ITEM_INFO& item) const;
std::uint16_t GetShopItemPriceFactor(const ITEM_INFO& item) const;
std::uint16_t SumPurchasePriceFactorByItemId() const;
std::uint16_t SumPurchasePriceFactor() 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;
void ResetInventoryItems();
unsigned char GetShopType(int id);
bool HasControlCharacter(std::string text);
const char* GetMonsterW3dName(int job) const;
ITEM_INFO FindStorageItem(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 FindCartItem(std::uint32_t id) const;
ITEM_INFO GetItem1738At(int index) const;
int GetItem1738Quantity(std::uint32_t id) const;
void AddPendingActorName(std::uint32_t id);
void SetShowRankingSchedule(bool show, const void* data);
void SetTraitStat(int type, int value);
int GetTraitStat(int type);
void EndSkillOption();
void ClearNormalItemSlots();
void ResetSwapEquippedItems();
void ResetSwapCostumeItems();
void FlagInventoryItem(std::uint32_t id);
void FlagMerchantShopItem(std::uint32_t id);
void FlagCartItem(std::uint32_t id);
void CollectFilteredMerchantMyShopItems();
void RefreshMerchantMyShopItems();
bool IsPartyRecommendTarget(std::uint32_t aid);
int GetBodyStyle(int job, int style, int renderJob);
int GetSessionIndex() const;
void RefreshMessengerGroupWindow();
void RefreshItem1740Window();
void RefreshItem1750Window(int type);
void RefreshItem1768Window(unsigned char alternate, int argument);
void UpdateMonsterInfoEnabled(int enabled);
void RefreshItem1738Window();
void RefreshHpSpWindows();
CSession();
void Init();
void ResetCharacterState();
void ClearItemContainers();
void RefreshHomunculusInfo();
void RefreshMercenaryInfo();
bool IsBlankString(const char* text) const;
void InvalidateWindowFrames();
void RefreshSkillTree();
void SetJob(int job);
void EraseMiniPartyRecord(int id);
void IgnoreText(std::string text);
void SaveMiniPartyInfo();
void LoadMiniPartyInfo();
void ClearPartyMembers();
void SetItem1768Quantity(int index, int quantity);
void SetReplayPacketMode(int value);
void UpdateFriendName(std::uint32_t characterId, const char* name);
void UnequipSwapEquippedItem(const ITEM_INFO& item);
void UnequipSwapCostumeItem(const ITEM_INFO& item);
bool EquipSwapCostumeItem(const ITEM_INFO& item);
void SetSwapArrowIndex(std::uint32_t value);
void ResolvePendingActorName(std::uint32_t id, const char* name);
void HiFriends(char* text);
void sub_DE4FF0();
std::pair<int, int> GetShopEntry(unsigned int index, int key);
bool HasCharacterName(std::string name);
void SetEquippedArrowIndex(std::uint32_t value);
bool IsRequestReady(int requestId);
void ClearAchievements();
void SetNavigationPlayerMap(const char* name);
int SetFriendOffline(std::uint32_t accountId, std::uint32_t characterId, unsigned char offline);
void SetHomunSkillLevel(int skillId, int level);
void UpdateInventoryItem(const ITEM_INFO& item, unsigned char refresh);
void SetMercSkillLevel(int skillId, int level);
void SetMerchantPurchaseSavedPrice(int index, std::uint32_t value);
void AddMiniPartyRecord(int id, std::uint32_t value);
void SetExchangeMoney(int value);
void SetOtherExchangeMoney(int value);
void SetPlayerPosition(int x, int y, int direction);
void SetRecord0734Value(int id, std::uint32_t value);
void LoadSkillDelayList(int skillId, std::vector<std::map<int, int>>& delays, int& skillFlag);
int SetServiceFlags(int first, int second);
};
extern CSession g_session;
extern std::vector<int> g_adminAccountIds;
extern std::vector<int> g_monsterJobs;
bool IsAdminAccount(int aid);
bool IsMonsterJob(int job);
int MonsterJobColor(int job);
void SetMemberFlags(std::uint32_t* flags);
void ClearMemberFlags(std::uint32_t* flags);
std::vector<unsigned char> SerializeMessengerMembers(const std::list<MessengerMember>& members);
#if defined(_WIN32) && !defined(_WIN64)
static_assert(sizeof(SessionRecord6144) == 0x38);
static_assert(sizeof(SessionRecord6178) == 0x2C);
static_assert(sizeof(ProhibitionLogEntry) == 0x54);
static_assert(sizeof(SubChatWndInfo) == 0x44);
static_assert(sizeof(SessionEntry00A4) == 0x30);
static_assert(offsetof(SubChatWndInfo, x) == 0x34);
static_assert(offsetof(CSession, m_timeAttackCountdown) == 0x7A4);
static_assert(offsetof(CSession, m_timeAttackStart) == 0x7A8);
static_assert(offsetof(CSession, m_timeAttackVisible) == 0x7AC);
static_assert(offsetof(CSession, m_whisperRecord) == 0x5554);
static_assert(offsetof(CSession, m_noSubChatWnds) == 0x73C);
static_assert(offsetof(CSession, m_subChatWnds) == 0x744);
static_assert(offsetof(CSession, m_prohibitionLog) == 0x754);
static_assert(offsetof(CSession, m_mapPositions) == 0x5310);
static_assert(offsetof(CSession, m_mapPosListCount) == 0x5328);
static_assert(offsetof(SessionRecord6144, completedAt) == 0x2C);
static_assert(offsetof(SessionRecord6144, rewarded) == 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_vendingSlotCount) == 0xF44);
static_assert(offsetof(CSession, m_buyingStoreSlotCount) == 0xF48);
static_assert(offsetof(CSession, storeItemLimit) == 0xF4C);
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_showSkillDescription) == 0xB8);
static_assert(offsetof(CSession, m_autoOpenFriendWhisperWindow) == 0xF60);
static_assert(offsetof(CSession, m_channelCopId) == 0x5B74);
static_assert(offsetof(CSession, m_muteSellSound) == 0x5C14);
static_assert(offsetof(CSession, m_itemDescendingOrder) == 0x61B5);
static_assert(offsetof(CSession, m_showMenuIcon) == 0x7EDC);
static_assert(offsetof(CSession, m_priorityClass) == 0x7F8C);
static_assert(offsetof(CSession, m_launchAccountEnabled) == 0x56EC);
static_assert(offsetof(CSession, m_loginModeFlag) == 0x7F88);
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, cartItems) == 0x1738);
static_assert(offsetof(CSession, merchantShopItems) == 0x1740);
static_assert(offsetof(CSession, filteredInventoryItems) == 0x1770);
static_assert(offsetof(CSession, m_itemSlots) == 0x4860);
static_assert(offsetof(CSession, m_shops) == 0x80BC);
static_assert(offsetof(CSession, playerSkillMode) == 0x8134);
static_assert(offsetof(CSession, m_playerDir) == 0xF20);
static_assert(offsetof(CSession, monsterInfoEnabled) == 0x1708);
static_assert(offsetof(CSession, exchangeMoney) == 0x5210);
static_assert(offsetof(CSession, otherExchangeMoney) == 0x5214);
static_assert(offsetof(CSession, characterCount) == 0xE94);
static_assert(offsetof(CSession, petJob) == 0x103C);
static_assert(offsetof(CSession, guildLeader) == 0x5450);
static_assert(offsetof(CSession, partyName) == 0x54C4);
static_assert(offsetof(CSession, memorialDungeonName) == 0x5950);
static_assert(offsetof(CSession, memorialExpirationTime) == 0x5970);
static_assert(offsetof(CSession, characterSlotState) == 0x59BC);
static_assert(offsetof(CSession, m_hotkeyScript) == 0x59D8);
static_assert(offsetof(CSession, m_lastIntervalTime) == 0x6188);
static_assert(offsetof(CSession, restrictedCharacterSlots) == 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, hotkeySkillLevels) == 0x420);
static_assert(offsetof(CSession, m_shortcutSlots) == 0x4B0);
static_assert(offsetof(CSession, m_mainCooldownIcons) == 0x94);
static_assert(offsetof(CSession, m_alternateCooldownIcons) == 0x9C);
static_assert(offsetof(CSession, m_secondaryShortcutSlots) == 0x5AC);
static_assert(offsetof(CSession, quickSlot) == 0x6EB);
static_assert(offsetof(CSession, alternateQuickSlot) == 0x6F2);
static_assert(offsetof(CSession, m_homunSkillLevels) == 0x71C);
static_assert(offsetof(CSession, m_mercSkillLevels) == 0x728);
static_assert(offsetof(CSession, keyValues) == 0x778);
static_assert(offsetof(CSession, summonHp) == 0x784);
static_assert(offsetof(CSession, summonMaxHp) == 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, cachedSex) == 0xE98);
static_assert(offsetof(CSession, m_sex) == 0xE9C);
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, equippedArrowIndex) == 0x16EC);
static_assert(offsetof(CSession, storageItems) == 0x1730);
static_assert(offsetof(CSession, miniPartyRecords) == 0x734);
static_assert(offsetof(CSession, inventoryCategories) == 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, purchaseItems) == 0x1720);
static_assert(offsetof(CSession, sellItems) == 0x1728);
static_assert(offsetof(CSession, alternateEquippedItems) == 0x21A0);
static_assert(offsetof(CSession, m_commandIds) == 0x5218);
static_assert(offsetof(CSession, equippedItems) == 0x17F0);
static_assert(offsetof(CSession, costumeItems) == 0x2B50);
static_assert(offsetof(CSession, alternateCostumeItems) == 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, m_commandOptions) == 0x52DC);
static_assert(offsetof(CSession, currentSex) == 0x5558);
static_assert(offsetof(CSession, m_hotkeyScript) == 0x59D8);
static_assert(offsetof(CSession, selectionItems) == 0x5C68);
static_assert(offsetof(CSession, achievementResult) == 0x6140);
static_assert(offsetof(CSession, achievements) == 0x6144);
static_assert(offsetof(CSession, jobTitles) == 0x6160);
static_assert(offsetof(CSession, achievementIds) == 0x616C);
static_assert(offsetof(CSession, m_swapEquipmentMode) == 0x7ED8);
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, skillFollowEffects) == 0x700);
static_assert(offsetof(CSession, skillEffectIds) == 0x708);
static_assert(offsetof(CSession, m_newRobeDrawOnTop) == 0xF04);
static_assert(offsetof(CSession, m_imfNames) == 0xF84);
static_assert(offsetof(CSession, m_fogParameters) == 0x5230);
static_assert(offsetof(CSession, m_normalItemSlots) == 0x6AC);
static_assert(offsetof(CSession, adoptionSkillAvailable) == 0x5468);
static_assert(offsetof(CSession, m_partyBooking) == 0x5B78);
static_assert(offsetof(CSession, automaticSkillHotkey) == 0x61A4);
static_assert(offsetof(CSession, swapEquippedItems) == 0x6B68);
static_assert(offsetof(CSession, m_showRankingSchedule) == 0x7F90);
static_assert(offsetof(CSession, pendingActorNames) == 0x7F94);
static_assert(offsetof(CSession, sessionIndex) == 0x8148);
static_assert(offsetof(CSession, m_passwordWndMode) == 0x56E0);
static_assert(offsetof(CSession, m_loginAccountId) == 0x56E4);
static_assert(offsetof(CSession, m_passwordWndAccountId) == 0x56E8);
static_assert(offsetof(CSession, m_partyBookingLevelLimit) == 0x5BBC);
#endif
// INLINED
inline __declspec(noinline) void CSession::sub_DE4FF0() {
const float scaleX = static_cast<float>(g_renderer->viewport.width) / 1280.0f;
const float scaleY = static_cast<float>(g_renderer->viewport.height - 17) / 1024.0f;
for (int i = 0; i < this->m_mapPosListCount; ++i) {
for (std::pair<const std::string, MapPosEntry>& entry : this->m_mapPosLists[i]) {
entry.second.rect.left = static_cast<int>(static_cast<float>(entry.second.rect.left) * scaleX + 0.5);
entry.second.rect.top = static_cast<int>(static_cast<float>(entry.second.rect.top) * scaleY + 0.5) + 17;
entry.second.rect.right = static_cast<int>(static_cast<float>(entry.second.rect.right) * scaleX + 0.5);
entry.second.rect.bottom = static_cast<int>(static_cast<float>(entry.second.rect.bottom) * scaleY + 0.5) + 17;
}
}
for (std::pair<const int, MapPosEntry>& entry : this->m_mapPosBounds) {
entry.second.rect.left = static_cast<int>(static_cast<float>(entry.second.rect.left) * scaleX + 0.5);
entry.second.rect.top = static_cast<int>(static_cast<float>(entry.second.rect.top) * scaleY + 0.5) + 17;
entry.second.rect.right = static_cast<int>(static_cast<float>(entry.second.rect.right) * scaleX + 0.5);
entry.second.rect.bottom = static_cast<int>(static_cast<float>(entry.second.rect.bottom) * scaleY + 0.5) + 17;
}
}
#endif