Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- GameThreads.h
- #pragma once
- #include "Utilities.h"
- class Actor;
- class BGSHeadPart;
- class NiAVObject;
- class BGSTextureSet;
- class PackedTask
- {
- public:
- enum {
- // Vanilla Tasks here
- // SKSE Tasks here
- kTaskId_SKSEUpdateTintMasks = 1000,
- kTaskId_SKSEUpdateHairColor = 1001,
- kTaskId_SKSERegenerateHead = 1002,
- kTaskId_SKSEChangeHeadPart = 1003
- };
- UInt32 id;
- };
- class SKSETaskRegenHead : public PackedTask
- {
- public:
- Actor* actor;
- };
- class SKSETaskChangeHeadPart : public PackedTask
- {
- public:
- Actor* actor;
- BGSHeadPart* newPart;
- };
- typedef void * (__cdecl * _ProcessCommonTask)(PackedTask * task);
- extern _ProcessCommonTask ProcessCommonTask;
- class BSTaskPool
- {
- public:
- MEMBER_FN_PREFIX(BSTaskPool);
- DEFINE_MEMBER_FN(SetNiGeometryTexture, UInt32, 0x006A4300, NiAVObject * geometry, BGSTextureSet * textureSet);
- DEFINE_MEMBER_FN(ProcessTask, UInt32, 0x006A28E0, PackedTask*);
- void UpdateTintMasks();
- void UpdateHairColor();
- void RegenerateHead(Actor * actor);
- void ChangeHeadPart(Actor * actor, BGSHeadPart * headPart);
- static BSTaskPool * GetSingleton(void)
- {
- return *((BSTaskPool **)0x01B375F8);
- }
- };
- GameThreads.cpp
- #include "GameThreads.h"
- _ProcessCommonTask ProcessCommonTask = (_ProcessCommonTask)0x006A1080;
- void BSTaskPool::UpdateTintMasks()
- {
- PackedTask task;
- task.id = PackedTask::kTaskId_SKSEUpdateTintMasks;
- CALL_MEMBER_FN(this, ProcessTask)(&task);
- }
- void BSTaskPool::UpdateHairColor()
- {
- PackedTask task;
- task.id = PackedTask::kTaskId_SKSEUpdateHairColor;
- CALL_MEMBER_FN(this, ProcessTask)(&task);
- }
- void BSTaskPool::RegenerateHead(Actor * actor)
- {
- SKSETaskRegenHead task;
- task.id = PackedTask::kTaskId_SKSERegenerateHead;
- task.actor = actor;
- CALL_MEMBER_FN(this, ProcessTask)(&task);
- }
- void BSTaskPool::ChangeHeadPart(Actor * actor, BGSHeadPart * headPart)
- {
- SKSETaskChangeHeadPart task;
- task.id = PackedTask::kTaskId_SKSEChangeHeadPart;
- task.actor = actor;
- task.newPart = headPart;
- CALL_MEMBER_FN(this, ProcessTask)(&task);
- }
- Hooks_Threads.h
- #pragma once
- void Hooks_Threads_Init(void);
- void Hooks_Threads_Commit(void);
- Hooks_Threads.cpp
- #include "Hooks_Threads.h"
- #include "SafeWrite.h"
- #include "Utilities.h"
- #include "GameThreads.h"
- #include "GameAPI.h"
- #include "GameReferences.h"
- #include "GameData.h"
- #include "GameForms.h"
- #include "GameRTTI.h"
- void * ProcessCommonTask_Hook(PackedTask * task)
- {
- void * result = ProcessCommonTask(task);
- switch(task->id) {
- case PackedTask::kTaskId_SKSEUpdateTintMasks:
- {
- (*g_thePlayer)->UpdateSkinColor();
- UpdatePlayerTints();
- break;
- }
- case PackedTask::kTaskId_SKSEUpdateHairColor:
- {
- (*g_thePlayer)->UpdateHairColor();
- break;
- }
- case PackedTask::kTaskId_SKSERegenerateHead:
- {
- SKSETaskRegenHead * regenTask = (SKSETaskRegenHead*)task;
- Actor * actor = regenTask->actor;
- TESNPC * npc = DYNAMIC_CAST(actor->baseForm, TESForm, TESNPC);
- BSFaceGenNiNode * faceNode = actor->GetFaceGenNiNode();
- BGSHeadPart * facePart = NULL;
- if(CALL_MEMBER_FN(npc, HasOverlays)()) {
- facePart = npc->GetHeadPartOverlayByType(BGSHeadPart::kTypeFace);
- } else {
- facePart = CALL_MEMBER_FN(npc, GetHeadPartByType)(BGSHeadPart::kTypeFace);
- }
- if(npc && faceNode && facePart) {
- CALL_MEMBER_FN(FaceGen::GetSingleton(), RegenerateHead)(faceNode, facePart, npc);
- }
- break;
- }
- case PackedTask::kTaskId_SKSEChangeHeadPart:
- {
- SKSETaskChangeHeadPart * headPartTask = (SKSETaskChangeHeadPart*)task;
- Actor * actor = headPartTask->actor;
- BGSHeadPart * newPart = headPartTask->newPart;
- if(actor && newPart) {
- if(newPart->type != BGSHeadPart::kTypeMisc) {
- TESNPC * npc = DYNAMIC_CAST(actor->baseForm, TESForm, TESNPC);
- if(npc) {
- BGSHeadPart * oldPart = NULL;
- if(CALL_MEMBER_FN(npc, HasOverlays)())
- oldPart = npc->GetHeadPartOverlayByType(newPart->type);
- if(!oldPart)
- oldPart = CALL_MEMBER_FN(npc, GetHeadPartByType)(newPart->type);
- CALL_MEMBER_FN(npc, ChangeHeadPart)(newPart);
- ChangeActorHeadPart(actor, oldPart, newPart);
- }
- }
- }
- break;
- }
- }
- return result;
- }
- void Hooks_Threads_Init(void)
- {
- }
- void Hooks_Threads_Commit(void)
- {
- WriteRelCall(0x006A292D, (UInt32)ProcessCommonTask_Hook);
- WriteRelCall(0x006A2B97, (UInt32)ProcessCommonTask_Hook);
- SafeWrite32(0x0069BE0D + 3, (UInt32)ProcessCommonTask_Hook);
- SafeWrite32(0x0069BE4C + 3, (UInt32)ProcessCommonTask_Hook);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement