Batch #16351 by ragnarok-clanker: no function's compiled code changes; checked with 784 compiled unit(s), including every includer of Source/Archive/GPak.h, Source/Client/Browser/BrowserCommandTarget.h, Source/Client/Browser/BrowserDocumentUI.h, Source/Client/Browser/BrowserInPlace.h, Source/Client/Browser/WebBrowser.h, Source/Client/Input/Language.h, Source/Client/Input/LanguageTC.h, Source/Client/Input/Mouse.h, Source/Client/Mode/CGameMode.h, Source/Client/Mode/CLoginMode.h, Source/Client/Replay.h, Source/Client/Session.h, Source/Client/Stove/StovePCSDK.h, Source/Contents/AchievementMgr.h, Source/Contents/Actors/CharacterRender.h, Source/Contents/Actors/EffectActors.h, Source/Contents/Actors/GameActor.h, Source/Contents/Actors/GndRiser.h, Source/Contents/Actors/GrannyGameActor.h, Source/Contents/Actors/MousePointer.h, Source/Contents/Actors/Npc.h, Source/Contents/Actors/Pc.h, Source/Contents/Actors/RenderObjectState.h, Source/Contents/Actors/Skill.h, Source/Contents/AdventureGuideMgr.h, Source/Contents/CashEmotionMgr.h, Source/Contents/ClanInfo.h, Source/Contents/Configuration/GameSettingsMgr.h, Source/Contents/EffectResourceSwitcher.h, Source/Contents/Effects/AcidifiedThrow.h, Source/Contents/Effects/ArrowEffect.h, Source/Contents/Effects/AxeBoomerang.h, Source/Contents/Effects/BlastForge.h, Source/Contents/Effects/CharacterParticleBundle.h, Source/Contents/Effects/DummyEffectLauncher.h, Source/Contents/Effects/EZ2STREffectEx.h, Source/Contents/Effects/Effect.h, Source/Contents/Effects/EffectActor.h, Source/Contents/Effects/EffectEmitter.h, Source/Contents/Effects/EffectPrimitiveState.h, Source/Contents/Effects/EffectTypes.h, Source/Contents/Effects/ElectricEffect.h, Source/Contents/Effects/EmitterEffect.h, Source/Contents/Effects/FortuneKissEffect.h, Source/Contents/Effects/MagicFloorEffect.h, Source/Contents/Effects/MandraAttackEffect.h, Source/Contents/Effects/MonsterSkillEffects.h, Source/Contents/Effects/MsgEffect.h, Source/Contents/Effects/Particle.h, Source/Contents/Effects/RagEffectState.h, Source/Contents/Effects/RichManKim.h, Source/Contents/Effects/SpriteParticle.h, Source/Contents/Effects/StarEffect.h, Source/Contents/Effects/WhirlwindEffect.h, Source/Contents/EnchantMgr.h, Source/Contents/FlyingShipRouteInfo.h, Source/Contents/Ground/GroundSpatial.h, Source/Contents/GuildInfo.h, Source/Contents/Hotkeys/InterfaceHotkey.h, Source/Contents/Items/ItemInfo.h, Source/Contents/Items/RuneSystem.h, Source/Contents/MapSkyMgr.h, Source/Contents/Models/ModelActor.h, Source/Contents/Movies/BinkMovie.h, Source/Contents/NavigationManager.h, Source/Contents/Party/PartyBookingMgr.h, Source/Contents/PetEvolutionMgr.h, Source/Contents/RenewQuestMgr.h, Source/Contents/RodexMailStore.h, Source/Contents/Schedule/Schedule.h, Source/Contents/Schedule/ShutDownSchedule.h, Source/Contents/SignBoard/SignBoard.h, Source/Contents/Skills/PlayerSkillBundle.h, Source/Contents/Sound/SoundMgr.h, Source/Contents/SpriteLayerDrawing.h, Source/Contents/Store/MCStoreInfoBackupAsyncWork.h, Source/Contents/UserData/AccountLinkedUserDataLoadAsyncWork.h, Source/Contents/UserData/NormalItemSlots.h, Source/Contents/WorldView/WorldViewData.h, Source/Network/Connection/Connection.h, Source/Render/DX7/DeviceOwnerDX7.h, Source/Render/DX7/DirectDrawEnumeration.h, Source/Render/DX9/DeviceOwnerDX9.h, Source/Render/Primitives/LightmappedPrimitive.h, Source/Render/Primitives/RenderPrimitive.h, Source/Render/Renderer.h, Source/Render/RendererDX7.h, Source/Render/Text/EmbedFont.h, Source/Render/Text/TextContext.h, Source/Render/Textures/Texture.h, Source/Resource/BinkRuntime.h, Source/Resource/GifResource.h, Source/Resource/Models/AnimatedModelResource.h, Source/Resource/Models/GrannyModelResource.h, Source/Resource/Models/ModelMesh.h, Source/Resource/ResourceMgr.h, Source/Resource/World/GroundResource.h, Source/Resource/World/WorldResource.h, Source/Security/NProtectGameGuardMgr.h, Source/Security/ReassemblyPacketMgr.h, Source/UI/Buttons/UIBmpRadioBtn.h, Source/UI/Buttons/UIBmpTextButton2.h, Source/UI/Buttons/UIDescriptRace.h, Source/UI/Buttons/UIItemTagButton.h, Source/UI/Buttons/UITVTextButton.h, Source/UI/Buttons/UITextureButton.h, Source/UI/Chat/UINewChatWnd.h, Source/UI/Chat/UISubChatHisWnd.h, Source/UI/Dialogs/UILoadingWnd.h, Source/UI/Dialogs/UIMiniMapWnd.h, Source/UI/Dialogs/UIPasswordWnd.h, Source/UI/Dialogs/UIRestartWnd.h, Source/UI/Dialogs/UISayDialogWnd.h, Source/UI/Edit/UIEditCtrl.h, Source/UI/Enchant/EnchantUI.h, Source/UI/GameSettings/GameSettingsUI.h, Source/UI/Guild/UIGuildWnd.h, Source/UI/Item/UIItemStoreFindWnd.h, Source/UI/Item/UIItemStoreSubWnd.h, Source/UI/Item/UIItemStoreWnd.h, Source/UI/Items/UIEquipWnd.h, Source/UI/Items/UIExchangeWnd.h, Source/UI/Items/UIItemCollectionWnd.h, Source/UI/Items/UIItemRepairWnd.h, Source/UI/Items/UISwapEquipmentWnd.h, Source/UI/Lists/TableBox.h, Source/UI/Lists/UIListBox.h, Source/UI/Lists/UIListBoxEx.h, Source/UI/Lists/UIListBoxID.h, Source/UI/Lists/UIListBoxTemplate.h, Source/UI/Lists/UITabControl.h, Source/UI/Lists/UITreeView.h, Source/UI/Lists/UIVScrollBar.h, Source/UI/Navigation/UINavigationV4Wnd.h, Source/UI/Navigation/UIPrivateAirplaneWnd.h, Source/UI/Party/UIAdvenPartyBoardWnd.h, Source/UI/Party/UIRequestJoinPartyWnd.h, Source/UI/ProbabilityTable/UIProbabilityTable.h, Source/UI/Quest/UIRenewQuestWnd.h, Source/UI/Rodex/UIRodexComposeWnd.h, Source/UI/RuneSystem/UIRuneSystemWindows.h, Source/UI/RuneSystem/UIRuneSystemWnd.h, Source/UI/Shop/UIMerchantItemMyShopWnd.h, Source/UI/Shop/UIMerchantShopMakeWnd.h, Source/UI/Shop/UIMerchantShopTitle.h, Source/UI/StylingShop/UIStylingShopWnd.h, Source/UI/Text/CreateLineInfo.h, Source/UI/Text/TextMarkup.h, Source/UI/Text/UIString.h, Source/UI/Text/UITextViewer.h, Source/UI/Text/UITransBalloonText.h, Source/UI/UIChangeMaterialWnd.h, Source/UI/UIMacroDetectorWnd.h, Source/UI/UIMacroUserInfoWnd.h, Source/UI/Window/UIAccountLimitedToolWnd.h, Source/UI/Window/UIBalloonOpenBtn.h, Source/UI/Window/UIBasicInfoWnd.h, Source/UI/Window/UIBattleMsgOptionWnd.h, Source/UI/Window/UICollectionSystemWnd.h, Source/UI/Window/UIControl.h, Source/UI/Window/UIHotKeyWnd.h, Source/UI/Window/UIJobListWnd.h, Source/UI/Window/UILoginWnd.h, Source/UI/Window/UIMakeCharWnd.h, Source/UI/Window/UIMerInfoWnd.h, Source/UI/Window/UIMessageBox.h, Source/UI/Window/UIMonsterDisplayWnd.h, Source/UI/Window/UINewMakeCharWnd.h, Source/UI/Window/UINewSkillListWnd.h, Source/UI/Window/UINoticeWnd.h, Source/UI/Window/UIReplayRECControlWnd.h, Source/UI/Window/UIRoMapWnd.h, Source/UI/Window/UISecondCostumeWnd.h, Source/UI/Window/UISeekPartyListWnd.h, Source/UI/Window/UISeekPartyMBWnd.h, Source/UI/Window/UISeekPartyWnd.h, Source/UI/Window/UISerachStoreInfoWnd.h, Source/UI/Window/UIWindow.h, Source/UI/Window/UIWindowMgr.h, Source/UI/Window/WindowId.h, Source/Utility/Async/NAsyncWork.h, Source/Utility/Async/NRecycleObjectPoolMgr.h, Source/Utility/JsonCppLoader.h, Source/Utility/Lexicon/LexiconSerializer.h, Source/Utility/NFileLog.h, Source/Utility/Threading/NThread.h.
206 lines
6.2 KiB
C++
206 lines
6.2 KiB
C++
#include "Client/Mode/CGameMode.h"
|
|
#include "UI/Window/WindowId.h"
|
|
#include "Contents/Items/InventoryType.h"
|
|
#include "Client/Session.h"
|
|
#include "Contents/ClientState.h"
|
|
#include "Contents/Items/ItemInfo.h"
|
|
#include "Contents/Messenger/ClientMessenger.h"
|
|
#include "Contents/PetEvolutionMgr.h"
|
|
#include "UI/Item/UIItemStoreWnd.h"
|
|
#include "UI/Window/UIWindowMgr.h"
|
|
|
|
#include <cstdint>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <new>
|
|
|
|
namespace EquipmentProperties {
|
|
class CEquipmentPropertiesMgr {
|
|
public:
|
|
CEquipmentPropertiesMgr();
|
|
void AddExpansion(const int& kind, const int& itemId, bool notify);
|
|
|
|
unsigned char padding_0000[0x1FC];
|
|
};
|
|
}
|
|
|
|
|
|
|
|
namespace {
|
|
#pragma pack(push, 1)
|
|
struct EquipListOption {
|
|
/* 0000 */ std::int16_t id;
|
|
/* 0002 */ std::int16_t value;
|
|
/* 0004 */ unsigned char param;
|
|
};
|
|
|
|
struct EquipListRecord {
|
|
/* 0000 */ std::int16_t index;
|
|
/* 0002 */ int itemId;
|
|
/* 0006 */ unsigned char type;
|
|
/* 0007 */ std::uint32_t location;
|
|
/* 000B */ std::uint32_t wearState;
|
|
/* 000F */ unsigned char refine;
|
|
/* 0010 */ std::uint32_t cards[4];
|
|
/* 0020 */ std::uint32_t expireTime;
|
|
/* 0024 */ std::uint16_t bindOnEquip;
|
|
/* 0026 */ std::uint16_t sprite;
|
|
/* 0028 */ unsigned char optionCount;
|
|
/* 0029 */ EquipListOption options[5];
|
|
/* 0042 */ unsigned char flags;
|
|
};
|
|
|
|
struct InventoryStartHeader {
|
|
/* 0000 */ std::int16_t length;
|
|
/* 0002 */ unsigned char listType;
|
|
};
|
|
#pragma pack(pop)
|
|
|
|
static_assert(sizeof(EquipListRecord) == 0x43);
|
|
|
|
// INLINED
|
|
__forceinline int CountEquipListOptions(const EquipListOption* options) {
|
|
int count = 0;
|
|
for (int index = 0; index < 5; ++index) {
|
|
if (options[index].id != 0) {
|
|
++count;
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
|
|
// INLINED
|
|
__forceinline void FillEquipListItem(ITEM_INFO& item, const EquipListRecord& record, const EquipListOption* options) {
|
|
item.identity[0] = record.type;
|
|
item.identity[1] = record.index;
|
|
item.identity[2] = record.location;
|
|
item.identity[3] = record.wearState;
|
|
item.quantity = 1;
|
|
std::memcpy(item.cards, record.cards, sizeof(record.cards));
|
|
item.SetItemId(record.itemId);
|
|
item.identified = record.flags & 1;
|
|
item.damaged = (record.flags >> 1) & 1;
|
|
item.refiningLevel = record.refine;
|
|
item.expireTime = record.expireTime;
|
|
item.bindOnEquip = record.bindOnEquip;
|
|
item.sprite = record.sprite;
|
|
item.flags[0] = (record.flags >> 2) & 1;
|
|
item.optionCount = CountEquipListOptions(options);
|
|
item.grade = 0;
|
|
for (int index = 0; index < item.optionCount; ++index) {
|
|
reinterpret_cast<EquipListOption*>(item.options)[index] = options[index];
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// OFFSET: 0x00D42FB0
|
|
// FUNCTION: fn_21831
|
|
void CGameMode::ReceiveEquipListPart(unsigned char listType, int count, const unsigned char* data) {
|
|
const EquipListRecord* records = reinterpret_cast<const EquipListRecord*>(data);
|
|
switch (listType) {
|
|
case INVTYPE_STORAGE:
|
|
case INVTYPE_GUILD_STORAGE:
|
|
for (int i = 0; i < count; ++i) {
|
|
const EquipListRecord record = records[i];
|
|
if (record.location == 0x8000) {
|
|
continue;
|
|
}
|
|
|
|
EquipListOption options[5];
|
|
std::memcpy(options, record.options, sizeof(options));
|
|
ITEM_INFO item;
|
|
FillEquipListItem(item, record, options);
|
|
g_session.AddCartItem(item, 0);
|
|
}
|
|
break;
|
|
case INVTYPE_INVENTORY:
|
|
for (int i = 0; i < count; ++i) {
|
|
const EquipListRecord record = records[i];
|
|
EquipListOption options[5];
|
|
std::memcpy(options, record.options, sizeof(options));
|
|
ITEM_INFO item;
|
|
FillEquipListItem(item, record, options);
|
|
|
|
if (g_session.IsPetEgg(std::atoi(item.itemId.c_str())) && item.damaged) {
|
|
g_session.petEggIndex = item.identity[1];
|
|
}
|
|
|
|
if (item.identity[3] == 0) {
|
|
g_session.AddInventoryItem(item, 0);
|
|
g_session.UpdateInventoryItem(item, 0);
|
|
} else {
|
|
char equipped = 1;
|
|
if (g_session.IsCostumeLocation(item.identity[3])) {
|
|
g_session.EquipCostumeItem(item, &equipped);
|
|
} else {
|
|
g_session.EquipInventoryItem(item, &equipped);
|
|
}
|
|
}
|
|
|
|
if (g_session.IsPetEgg(std::atoi(item.itemId.c_str())) && item.damaged) {
|
|
const int petEgg = std::atoi(LookupClientItemByIdentity(g_session.m_inventoryItems, g_session.petEggIndex).itemId.c_str());
|
|
if (!g_petEvolutionMgr->IsAutoFeeding(petEgg) && g_petAutoFeed == true) {
|
|
g_session.SendPetAutoFeedOption(0);
|
|
}
|
|
|
|
if (g_equipmentPropertiesMgr == nullptr) {
|
|
g_equipmentPropertiesMgr = new (std::nothrow) EquipmentProperties::CEquipmentPropertiesMgr;
|
|
}
|
|
|
|
const int kind = 0;
|
|
const int itemId = std::atoi(item.itemId.c_str());
|
|
g_equipmentPropertiesMgr->AddExpansion(kind, itemId, false);
|
|
}
|
|
}
|
|
break;
|
|
case INVTYPE_CART:
|
|
for (int i = 0; i < count; ++i) {
|
|
const EquipListRecord record = records[i];
|
|
EquipListOption options[5];
|
|
std::memcpy(options, record.options, sizeof(options));
|
|
ITEM_INFO item;
|
|
FillEquipListItem(item, record, options);
|
|
g_session.AddMerchantShopItem(item);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x00D44600
|
|
// FUNCTION: fn_21835
|
|
void CGameMode::ReceiveInventoryStart(const unsigned char* packet) {
|
|
const InventoryStartHeader& header = *reinterpret_cast<const InventoryStartHeader*>(g_gameModePacketBuffer + 2);
|
|
const int length = header.length - 5;
|
|
const unsigned char listType = header.listType;
|
|
if (length > 24) {
|
|
return;
|
|
}
|
|
|
|
switch (listType) {
|
|
case INVTYPE_STORAGE:
|
|
case INVTYPE_GUILD_STORAGE: {
|
|
char title[24] = {};
|
|
memcpy_s(title, sizeof(title), packet + 5, length);
|
|
UIItemStoreWnd* window = static_cast<UIItemStoreWnd*>(g_windowMgr.EnsureWindow(WID_ITEMSTOREWND));
|
|
if (window) {
|
|
const std::size_t titleLength = std::strlen(title);
|
|
if (titleLength != 0) {
|
|
window->SetTitle(std::string(title, titleLength));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case INVTYPE_INVENTORY:
|
|
g_session.ClearInventory();
|
|
g_session.ResetEquipment();
|
|
g_session.ResetCostumeItems();
|
|
break;
|
|
case INVTYPE_CART:
|
|
g_session.ClearMerchantShopItems();
|
|
break;
|
|
}
|
|
}
|
|
|
|
// GLOBAL: gl_25206
|
|
unsigned char g_gameModePacketBuffer[0x10000];
|