Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.80 KB | None | 0 0
  1. class ContainerMenu : public ContainerMenuBase
  2. {
  3. public:
  4.     class ScaleformArgs
  5.     {
  6.     public:
  7.  
  8.         GFxValue * result;  // 00
  9.         GFxMovieView    * movie;    // 08
  10.         GFxValue        * thisObj;  // 10
  11.         GFxValue        * unk18;    // 18
  12.         GFxValue        * args;     // 20
  13.         UInt32          numArgs;    // 28
  14.         UInt32          pad2C;      // 2C
  15.         UInt32          optionID;   // 30 pUserData
  16.     };
  17.  
  18.     using FnInvoke = void(__thiscall ContainerMenu::*)(ScaleformArgs *);
  19.     static FnInvoke Invoke_Original;
  20.  
  21.     bool hasHealth = false;
  22.  
  23.     bool CreateItemData(ContainerMenu::ScaleformArgs * args, std::string text, std::string value, GFxValue list) {
  24.  
  25.         if (!args) {
  26.             return false;
  27.         }
  28.  
  29.         auto * movieRoot = args->movie->movieRoot;
  30.         GFxValue extraData;
  31.         movieRoot->CreateObject(&extraData);
  32.         RegisterString(&extraData, movieRoot, "text", text.c_str());//
  33.         RegisterString(&extraData, movieRoot, "value", value.c_str());
  34.         Register<SInt32>(&extraData, "difference", 0);
  35.         list.PushBack(&extraData);
  36.         return true;
  37.     }
  38.  
  39.     void Invoke_Hook(ScaleformArgs * args)
  40.     {
  41.  
  42.        
  43.         if (args->optionID == 0 || args->optionID == 3) {
  44.             (this->*Invoke_Original)(args);
  45.             _MESSAGE("Update item cards");
  46.             auto movie = args->movie;
  47.             auto root = movie->movieRoot;
  48.  
  49.             GFxValue playerListArray, playerListArrayItem, playerListArrayItemCardInfoList;
  50.             root->GetVariable(&playerListArray, "root1.FilterHolder_mc.Menu_mc.playerListArray");
  51.             TBO_InstanceData* neededInst = nullptr;
  52.             for (size_t i = 0; i < playerListArray.GetArraySize(); i++)
  53.             {
  54.                 playerListArray.GetElement(i, &playerListArrayItem);
  55.                 if (!playerListArrayItem.HasMember("haveExtraData"))
  56.                 {
  57.                     playerListArrayItem.GetMember("ItemCardInfoList", &playerListArrayItemCardInfoList);
  58.  
  59.                     BGSInventoryItem* ii = (*g_itemMenuDataMgr)->GetSelectedItem((this->playerItems[i].HandleID));
  60.                     if (ii)
  61.                     {
  62.  
  63.                         TESForm* form = ii->form;
  64.                         BGSInventoryItem::Stack* currentStack = ii->stack;
  65.                         UInt16 stackid = this->playerItems[i].stackid;
  66.  
  67.                         while (stackid != 0)
  68.                         {
  69.                             if (currentStack) {
  70.                                 currentStack = currentStack->next;
  71.  
  72.                             }
  73.                             stackid--;
  74.  
  75.                         }
  76.                         if (form->formType == kFormType_WEAP)
  77.                         {
  78.                             ExtraDataList * extraDataList = currentStack->extraData;
  79.  
  80.                             if (extraDataList->GetByType(ExtraDataType::kExtraData_Health)) {
  81.                                 hasHealth = true;
  82.                             }
  83.                             BSExtraData * extraData = extraDataList->GetByType(ExtraDataType::kExtraData_InstanceData);
  84.                             if (extraData) {
  85.                                 ExtraInstanceData * objectModData = DYNAMIC_CAST(extraData, BSExtraData, ExtraInstanceData);
  86.                                 if (objectModData)
  87.                                     neededInst = objectModData->instanceData;
  88.                             }
  89.                             else {
  90.  
  91.                             }
  92.                             auto * pWeapon = (TESObjectWEAP::InstanceData*)Runtime_DynamicCast(neededInst, RTTI_TBO_InstanceData, RTTI_TESObjectWEAP__InstanceData);
  93.  
  94.  
  95.                             if (pWeapon && pWeapon->damageTypes != nullptr)
  96.                             {
  97.                                 if (!hasHealth) {
  98.                                     ExtraHealth* eh = ExtraHealth::Create(1);
  99.                                     extraDataList->Add(ExtraDataType::kExtraData_Health, eh);
  100.                                 }
  101.                                 if (currentStack->flags & BGSInventoryItem::Stack::kFlagEquipped) {
  102.                                     StoredHealthData = DYNAMIC_CAST(extraDataList->GetByType(ExtraDataType::kExtraData_Health), BSExtraData, ExtraHealth);
  103.                                 }
  104.  
  105.                                 ExtraHealth* storedHealthDataLocal = DYNAMIC_CAST(extraDataList->GetByType(ExtraDataType::kExtraData_Health), BSExtraData, ExtraHealth);
  106.                                 UInt32  value = storedHealthDataLocal->health * 100;
  107.                                 std::string displayString = std::to_string(value);
  108.                                 std::string finalStr = displayString + "%";
  109.                                 if (storedHealthDataLocal) {
  110.                                     CreateItemData(args, "CND", finalStr, playerListArrayItemCardInfoList);
  111.                                 }
  112.                             }
  113.                         }
  114.                     }
  115.  
  116.                     GFxValue haveExtraData;
  117.                     haveExtraData.SetBool(true);
  118.                     playerListArrayItem.SetMember("haveExtraData", &haveExtraData);
  119.                 }
  120.             }
  121.  
  122.  
  123.             GFxValue containerListArray, containerListArrayItem, containerListArrayItemCardInfoList;
  124.             root->GetVariable(&containerListArray, "root1.FilterHolder_mc.Menu_mc.containerListArray");
  125.  
  126.             for (size_t i = 0; i < containerListArray.GetArraySize(); i++)
  127.             {
  128.                 containerListArray.GetElement(i, &containerListArrayItem);
  129.                 if (!containerListArrayItem.HasMember("haveExtraData"))
  130.                 {
  131.                     containerListArrayItem.GetMember("ItemCardInfoList", &containerListArrayItemCardInfoList);
  132.  
  133.                     BGSInventoryItem* ii = (*g_itemMenuDataMgr)->GetSelectedItem((this->contItems[i].HandleID));
  134.                     if (ii)
  135.                     {
  136.                         TESForm* form = ii->form;
  137.                         BGSInventoryItem::Stack* currentStack = ii->stack;
  138.                         UInt16 stackid = this->contItems[i].stackid;
  139.  
  140.                         while (stackid != 0)
  141.                         {
  142.                             if (currentStack) {
  143.                                 currentStack = currentStack->next;
  144.  
  145.  
  146.                             }
  147.                             stackid--;
  148.                         }
  149.                         if (form->formType == kFormType_WEAP)
  150.                         {
  151.                             ExtraDataList * extraDataList = currentStack->extraData;
  152.  
  153.                             if (extraDataList->GetByType(ExtraDataType::kExtraData_Health)) {
  154.                                 hasHealth = true;
  155.                             }
  156.                             BSExtraData * extraData = extraDataList->GetByType(ExtraDataType::kExtraData_InstanceData);
  157.                             if (extraData) {
  158.                                 ExtraInstanceData * objectModData = DYNAMIC_CAST(extraData, BSExtraData, ExtraInstanceData);
  159.                                 if (objectModData)
  160.                                     neededInst = objectModData->instanceData;
  161.                             }
  162.                             else {
  163.  
  164.                             }
  165.                             auto * pWeapon = (TESObjectWEAP::InstanceData*)Runtime_DynamicCast(neededInst, RTTI_TBO_InstanceData, RTTI_TESObjectWEAP__InstanceData);
  166.  
  167.  
  168.                             if (pWeapon && pWeapon->damageTypes != nullptr)
  169.                             {
  170.                                 if (!hasHealth) {
  171.                                     ExtraHealth* eh = ExtraHealth::Create(1);
  172.                                     extraDataList->Add(ExtraDataType::kExtraData_Health, eh);
  173.                                 }
  174.                                 if (currentStack->flags & BGSInventoryItem::Stack::kFlagEquipped) {
  175.                                     StoredHealthData = DYNAMIC_CAST(extraDataList->GetByType(ExtraDataType::kExtraData_Health), BSExtraData, ExtraHealth);
  176.                                 }
  177.  
  178.                                 ExtraHealth* storedHealthDataLocal = DYNAMIC_CAST(extraDataList->GetByType(ExtraDataType::kExtraData_Health), BSExtraData, ExtraHealth);
  179.                                 if (storedHealthDataLocal) {
  180.                                     UInt32  value = storedHealthDataLocal->health * 100;
  181.                                     std::string displayString = std::to_string(value);
  182.                                     std::string finalStr = displayString + "%";
  183.                                     if (storedHealthDataLocal) {
  184.                                         CreateItemData(args, "CND", finalStr, containerListArrayItemCardInfoList);
  185.                                     }
  186.                                 }
  187.                             }
  188.                         }
  189.                     }
  190.  
  191.                     GFxValue haveExtraData;
  192.                     haveExtraData.SetBool(true);
  193.                     containerListArrayItem.SetMember("haveExtraData", &haveExtraData);
  194.                    
  195.                 }
  196.             }
  197.         }
  198.         return (this->*Invoke_Original)(args);
  199.     }
  200.  
  201.     static void InitHooks()
  202.     {
  203.         Invoke_Original = HookUtil::SafeWrite64(RelocAddr<uintptr_t>(0x2DB03F0), &Invoke_Hook);
  204.     }
  205. };
  206. ContainerMenu::FnInvoke  ContainerMenu::Invoke_Original = nullptr;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement