Advertisement
expired6978

BSTaskPool

Feb 21st, 2013
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.61 KB | None | 0 0
  1. GameThreads.h
  2.  
  3. #pragma once
  4.  
  5. #include "Utilities.h"
  6.  
  7. class Actor;
  8. class BGSHeadPart;
  9. class NiAVObject;
  10. class BGSTextureSet;
  11.  
  12. class PackedTask
  13. {
  14. public:
  15.     enum {
  16.         // Vanilla Tasks here
  17.  
  18.         // SKSE Tasks here
  19.         kTaskId_SKSEUpdateTintMasks = 1000,
  20.         kTaskId_SKSEUpdateHairColor = 1001,
  21.         kTaskId_SKSERegenerateHead = 1002,
  22.         kTaskId_SKSEChangeHeadPart = 1003
  23.     };
  24.  
  25.     UInt32 id;
  26. };
  27.  
  28. class SKSETaskRegenHead : public PackedTask
  29. {
  30. public:
  31.     Actor* actor;
  32. };
  33.  
  34. class SKSETaskChangeHeadPart : public PackedTask
  35. {
  36. public:
  37.     Actor* actor;
  38.     BGSHeadPart* newPart;
  39. };
  40.  
  41. typedef void * (__cdecl * _ProcessCommonTask)(PackedTask * task);
  42. extern _ProcessCommonTask ProcessCommonTask;
  43.  
  44. class BSTaskPool
  45. {
  46. public:
  47.     MEMBER_FN_PREFIX(BSTaskPool);
  48.     DEFINE_MEMBER_FN(SetNiGeometryTexture, UInt32, 0x006A4300, NiAVObject * geometry, BGSTextureSet * textureSet);
  49.     DEFINE_MEMBER_FN(ProcessTask, UInt32, 0x006A28E0, PackedTask*);
  50.  
  51.     void UpdateTintMasks();
  52.     void UpdateHairColor();
  53.  
  54.     void RegenerateHead(Actor * actor);
  55.     void ChangeHeadPart(Actor * actor, BGSHeadPart * headPart);
  56.  
  57.     static BSTaskPool * GetSingleton(void)
  58.     {
  59.         return *((BSTaskPool **)0x01B375F8);
  60.     }
  61. };
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76. GameThreads.cpp
  77.  
  78. #include "GameThreads.h"
  79.  
  80. _ProcessCommonTask ProcessCommonTask = (_ProcessCommonTask)0x006A1080;
  81.  
  82. void BSTaskPool::UpdateTintMasks()
  83. {
  84.     PackedTask task;
  85.     task.id = PackedTask::kTaskId_SKSEUpdateTintMasks;
  86.     CALL_MEMBER_FN(this, ProcessTask)(&task);
  87. }
  88.  
  89. void BSTaskPool::UpdateHairColor()
  90. {
  91.     PackedTask task;
  92.     task.id = PackedTask::kTaskId_SKSEUpdateHairColor;
  93.     CALL_MEMBER_FN(this, ProcessTask)(&task);
  94. }
  95.  
  96. void BSTaskPool::RegenerateHead(Actor * actor)
  97. {
  98.     SKSETaskRegenHead task;
  99.     task.id = PackedTask::kTaskId_SKSERegenerateHead;
  100.     task.actor = actor;
  101.     CALL_MEMBER_FN(this, ProcessTask)(&task);
  102. }
  103.  
  104. void BSTaskPool::ChangeHeadPart(Actor * actor, BGSHeadPart * headPart)
  105. {
  106.     SKSETaskChangeHeadPart task;
  107.     task.id = PackedTask::kTaskId_SKSEChangeHeadPart;
  108.     task.actor = actor;
  109.     task.newPart = headPart;
  110.     CALL_MEMBER_FN(this, ProcessTask)(&task);
  111. }
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127. Hooks_Threads.h
  128.  
  129. #pragma once
  130.  
  131. void Hooks_Threads_Init(void);
  132. void Hooks_Threads_Commit(void);
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141. Hooks_Threads.cpp
  142.  
  143. #include "Hooks_Threads.h"
  144. #include "SafeWrite.h"
  145. #include "Utilities.h"
  146.  
  147. #include "GameThreads.h"
  148. #include "GameAPI.h"
  149. #include "GameReferences.h"
  150. #include "GameData.h"
  151. #include "GameForms.h"
  152. #include "GameRTTI.h"
  153.  
  154.  
  155. void * ProcessCommonTask_Hook(PackedTask * task)
  156. {
  157.     void * result = ProcessCommonTask(task);
  158.     switch(task->id) {
  159.         case PackedTask::kTaskId_SKSEUpdateTintMasks:
  160.             {
  161.                 (*g_thePlayer)->UpdateSkinColor();
  162.                 UpdatePlayerTints();
  163.                 break;
  164.             }
  165.         case PackedTask::kTaskId_SKSEUpdateHairColor:
  166.             {
  167.                 (*g_thePlayer)->UpdateHairColor();
  168.                 break;
  169.             }
  170.         case PackedTask::kTaskId_SKSERegenerateHead:
  171.             {
  172.                 SKSETaskRegenHead * regenTask = (SKSETaskRegenHead*)task;
  173.                 Actor * actor = regenTask->actor;
  174.                 TESNPC * npc = DYNAMIC_CAST(actor->baseForm, TESForm, TESNPC);
  175.                 BSFaceGenNiNode * faceNode = actor->GetFaceGenNiNode();
  176.                 BGSHeadPart * facePart = NULL;
  177.                 if(CALL_MEMBER_FN(npc, HasOverlays)()) {
  178.                     facePart = npc->GetHeadPartOverlayByType(BGSHeadPart::kTypeFace);
  179.                 } else {
  180.                     facePart = CALL_MEMBER_FN(npc, GetHeadPartByType)(BGSHeadPart::kTypeFace);
  181.                 }
  182.                 if(npc && faceNode && facePart) {
  183.                     CALL_MEMBER_FN(FaceGen::GetSingleton(), RegenerateHead)(faceNode, facePart, npc);
  184.                 }
  185.                 break;
  186.             }
  187.         case PackedTask::kTaskId_SKSEChangeHeadPart:
  188.             {
  189.                 SKSETaskChangeHeadPart * headPartTask = (SKSETaskChangeHeadPart*)task;
  190.                 Actor * actor = headPartTask->actor;
  191.                 BGSHeadPart * newPart = headPartTask->newPart;
  192.                 if(actor && newPart) {
  193.                     if(newPart->type != BGSHeadPart::kTypeMisc) {
  194.                         TESNPC * npc = DYNAMIC_CAST(actor->baseForm, TESForm, TESNPC);
  195.                         if(npc) {
  196.                             BGSHeadPart * oldPart = NULL;
  197.                             if(CALL_MEMBER_FN(npc, HasOverlays)())
  198.                                 oldPart = npc->GetHeadPartOverlayByType(newPart->type);
  199.                             if(!oldPart)
  200.                                 oldPart = CALL_MEMBER_FN(npc, GetHeadPartByType)(newPart->type);
  201.  
  202.                             CALL_MEMBER_FN(npc, ChangeHeadPart)(newPart);
  203.                             ChangeActorHeadPart(actor, oldPart, newPart);
  204.                         }
  205.                     }
  206.                 }
  207.                 break;
  208.             }
  209.     }
  210.     return result;
  211. }
  212.  
  213. void Hooks_Threads_Init(void)
  214. {
  215.    
  216. }
  217.  
  218. void Hooks_Threads_Commit(void)
  219. {
  220.     WriteRelCall(0x006A292D, (UInt32)ProcessCommonTask_Hook);
  221.     WriteRelCall(0x006A2B97, (UInt32)ProcessCommonTask_Hook);
  222.     SafeWrite32(0x0069BE0D + 3, (UInt32)ProcessCommonTask_Hook);
  223.     SafeWrite32(0x0069BE4C + 3, (UInt32)ProcessCommonTask_Hook);
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement