Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class ContainerMenu : public ContainerMenuBase
- {
- public:
- class ScaleformArgs
- {
- public:
- GFxValue * result; // 00
- GFxMovieView * movie; // 08
- GFxValue * thisObj; // 10
- GFxValue * unk18; // 18
- GFxValue * args; // 20
- UInt32 numArgs; // 28
- UInt32 pad2C; // 2C
- UInt32 optionID; // 30 pUserData
- };
- using FnInvoke = void(__thiscall ContainerMenu::*)(ScaleformArgs *);
- static FnInvoke Invoke_Original;
- bool hasHealth = false;
- bool CreateItemData(ContainerMenu::ScaleformArgs * args, std::string text, std::string value, GFxValue list) {
- if (!args) {
- return false;
- }
- auto * movieRoot = args->movie->movieRoot;
- GFxValue extraData;
- movieRoot->CreateObject(&extraData);
- RegisterString(&extraData, movieRoot, "text", text.c_str());//
- RegisterString(&extraData, movieRoot, "value", value.c_str());
- Register<SInt32>(&extraData, "difference", 0);
- list.PushBack(&extraData);
- return true;
- }
- void Invoke_Hook(ScaleformArgs * args)
- {
- if (args->optionID == 0 || args->optionID == 3) {
- (this->*Invoke_Original)(args);
- _MESSAGE("Update item cards");
- auto movie = args->movie;
- auto root = movie->movieRoot;
- GFxValue playerListArray, playerListArrayItem, playerListArrayItemCardInfoList;
- root->GetVariable(&playerListArray, "root1.FilterHolder_mc.Menu_mc.playerListArray");
- TBO_InstanceData* neededInst = nullptr;
- for (size_t i = 0; i < playerListArray.GetArraySize(); i++)
- {
- playerListArray.GetElement(i, &playerListArrayItem);
- if (!playerListArrayItem.HasMember("haveExtraData"))
- {
- playerListArrayItem.GetMember("ItemCardInfoList", &playerListArrayItemCardInfoList);
- BGSInventoryItem* ii = (*g_itemMenuDataMgr)->GetSelectedItem((this->playerItems[i].HandleID));
- if (ii)
- {
- TESForm* form = ii->form;
- BGSInventoryItem::Stack* currentStack = ii->stack;
- UInt16 stackid = this->playerItems[i].stackid;
- while (stackid != 0)
- {
- if (currentStack) {
- currentStack = currentStack->next;
- }
- stackid--;
- }
- if (form->formType == kFormType_WEAP)
- {
- ExtraDataList * extraDataList = currentStack->extraData;
- if (extraDataList->GetByType(ExtraDataType::kExtraData_Health)) {
- hasHealth = true;
- }
- BSExtraData * extraData = extraDataList->GetByType(ExtraDataType::kExtraData_InstanceData);
- if (extraData) {
- ExtraInstanceData * objectModData = DYNAMIC_CAST(extraData, BSExtraData, ExtraInstanceData);
- if (objectModData)
- neededInst = objectModData->instanceData;
- }
- else {
- }
- auto * pWeapon = (TESObjectWEAP::InstanceData*)Runtime_DynamicCast(neededInst, RTTI_TBO_InstanceData, RTTI_TESObjectWEAP__InstanceData);
- if (pWeapon && pWeapon->damageTypes != nullptr)
- {
- if (!hasHealth) {
- ExtraHealth* eh = ExtraHealth::Create(1);
- extraDataList->Add(ExtraDataType::kExtraData_Health, eh);
- }
- if (currentStack->flags & BGSInventoryItem::Stack::kFlagEquipped) {
- StoredHealthData = DYNAMIC_CAST(extraDataList->GetByType(ExtraDataType::kExtraData_Health), BSExtraData, ExtraHealth);
- }
- ExtraHealth* storedHealthDataLocal = DYNAMIC_CAST(extraDataList->GetByType(ExtraDataType::kExtraData_Health), BSExtraData, ExtraHealth);
- UInt32 value = storedHealthDataLocal->health * 100;
- std::string displayString = std::to_string(value);
- std::string finalStr = displayString + "%";
- if (storedHealthDataLocal) {
- CreateItemData(args, "CND", finalStr, playerListArrayItemCardInfoList);
- }
- }
- }
- }
- GFxValue haveExtraData;
- haveExtraData.SetBool(true);
- playerListArrayItem.SetMember("haveExtraData", &haveExtraData);
- }
- }
- GFxValue containerListArray, containerListArrayItem, containerListArrayItemCardInfoList;
- root->GetVariable(&containerListArray, "root1.FilterHolder_mc.Menu_mc.containerListArray");
- for (size_t i = 0; i < containerListArray.GetArraySize(); i++)
- {
- containerListArray.GetElement(i, &containerListArrayItem);
- if (!containerListArrayItem.HasMember("haveExtraData"))
- {
- containerListArrayItem.GetMember("ItemCardInfoList", &containerListArrayItemCardInfoList);
- BGSInventoryItem* ii = (*g_itemMenuDataMgr)->GetSelectedItem((this->contItems[i].HandleID));
- if (ii)
- {
- TESForm* form = ii->form;
- BGSInventoryItem::Stack* currentStack = ii->stack;
- UInt16 stackid = this->contItems[i].stackid;
- while (stackid != 0)
- {
- if (currentStack) {
- currentStack = currentStack->next;
- }
- stackid--;
- }
- if (form->formType == kFormType_WEAP)
- {
- ExtraDataList * extraDataList = currentStack->extraData;
- if (extraDataList->GetByType(ExtraDataType::kExtraData_Health)) {
- hasHealth = true;
- }
- BSExtraData * extraData = extraDataList->GetByType(ExtraDataType::kExtraData_InstanceData);
- if (extraData) {
- ExtraInstanceData * objectModData = DYNAMIC_CAST(extraData, BSExtraData, ExtraInstanceData);
- if (objectModData)
- neededInst = objectModData->instanceData;
- }
- else {
- }
- auto * pWeapon = (TESObjectWEAP::InstanceData*)Runtime_DynamicCast(neededInst, RTTI_TBO_InstanceData, RTTI_TESObjectWEAP__InstanceData);
- if (pWeapon && pWeapon->damageTypes != nullptr)
- {
- if (!hasHealth) {
- ExtraHealth* eh = ExtraHealth::Create(1);
- extraDataList->Add(ExtraDataType::kExtraData_Health, eh);
- }
- if (currentStack->flags & BGSInventoryItem::Stack::kFlagEquipped) {
- StoredHealthData = DYNAMIC_CAST(extraDataList->GetByType(ExtraDataType::kExtraData_Health), BSExtraData, ExtraHealth);
- }
- ExtraHealth* storedHealthDataLocal = DYNAMIC_CAST(extraDataList->GetByType(ExtraDataType::kExtraData_Health), BSExtraData, ExtraHealth);
- if (storedHealthDataLocal) {
- UInt32 value = storedHealthDataLocal->health * 100;
- std::string displayString = std::to_string(value);
- std::string finalStr = displayString + "%";
- if (storedHealthDataLocal) {
- CreateItemData(args, "CND", finalStr, containerListArrayItemCardInfoList);
- }
- }
- }
- }
- }
- GFxValue haveExtraData;
- haveExtraData.SetBool(true);
- containerListArrayItem.SetMember("haveExtraData", &haveExtraData);
- }
- }
- }
- return (this->*Invoke_Original)(args);
- }
- static void InitHooks()
- {
- Invoke_Original = HookUtil::SafeWrite64(RelocAddr<uintptr_t>(0x2DB03F0), &Invoke_Hook);
- }
- };
- ContainerMenu::FnInvoke ContainerMenu::Invoke_Original = nullptr;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement