Advertisement
expired6978

Thread V2

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