Skip to content

Commit

Permalink
feat: sneak sync in fallout 4
Browse files Browse the repository at this point in the history
  • Loading branch information
RobbeBryssinck committed Nov 25, 2021
1 parent 0906e17 commit cce6f47
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 39 deletions.
29 changes: 29 additions & 0 deletions Code/client/Games/Fallout4/Actor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <PlayerCharacter.h>
#include <Games/Fallout4/EquipManager.h>
#include <Forms/BGSObjectInstance.h>
#include <Games/Misc/ActorKnowledge.h>

#include <Services/PapyrusService.h>
#include <World.h>
Expand Down Expand Up @@ -368,22 +369,50 @@ void TP_MAKE_THISCALL(HookApplyActorEffect, ActiveEffect, Actor* apTarget, float
return ThisCall(RealApplyActorEffect, apThis, apTarget, aEffectValue, apActorValueInfo);
}

TP_THIS_FUNCTION(TRunDetection, void, void, ActorKnowledge*);
static TRunDetection* RealRunDetection = nullptr;

void TP_MAKE_THISCALL(HookRunDetection, void, ActorKnowledge* apTarget)
{
auto pOwner = TESObjectREFR::GetByHandle(apTarget->hOwner);
auto pTarget = TESObjectREFR::GetByHandle(apTarget->hTarget);

if (pOwner && pTarget)
{
auto pOwnerActor = RTTI_CAST(pOwner, TESObjectREFR, Actor);
auto pTargetActor = RTTI_CAST(pTarget, TESObjectREFR, Actor);
if (pOwnerActor && pTargetActor)
{
if (pOwnerActor->GetExtension()->IsRemotePlayer() && pTargetActor->GetExtension()->IsLocalPlayer())
{
spdlog::info("Cancelling detection from remote player to local player");
//return;
}
}
}

return ThisCall(RealRunDetection, apThis, apTarget);
}

static TiltedPhoques::Initializer s_specificReferencesHooks([]() {
POINTER_FALLOUT4(TActorConstructor, s_actorCtor, 0x140D6E9A0 - 0x140000000);
POINTER_FALLOUT4(TActorConstructor2, s_actorCtor2, 0x140D6ED80 - 0x140000000);
POINTER_FALLOUT4(TActorDestructor, s_actorDtor, 0x140D6F1C0 - 0x140000000);
POINTER_FALLOUT4(TDamageActor, s_damageActor, 0x140D79EB0 - 0x140000000);
POINTER_FALLOUT4(TApplyActorEffect, s_applyActorEffect, 0x140C8B189 - 0x140000000);
POINTER_FALLOUT4(TRunDetection, s_runDetection, 0x140F60320 - 0x140000000);

RealActorConstructor = s_actorCtor.Get();
RealActorConstructor2 = s_actorCtor2.Get();
RealActorDestructor = s_actorDtor.Get();
RealDamageActor = s_damageActor.Get();
RealApplyActorEffect = s_applyActorEffect.Get();
RealRunDetection = s_runDetection.Get();

TP_HOOK(&RealActorConstructor, HookActorContructor);
TP_HOOK(&RealActorConstructor2, HookActorContructor2);
TP_HOOK(&RealActorDestructor, HookActorDestructor);
TP_HOOK(&RealDamageActor, HookDamageActor);
TP_HOOK(&RealApplyActorEffect, HookApplyActorEffect);
TP_HOOK(&RealRunDetection, HookRunDetection);
});
2 changes: 1 addition & 1 deletion Code/client/Games/Fallout4/EquipManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ void* TP_MAKE_THISCALL(EquipHook, EquipManager, Actor* apActor, TESForm* apItem,
const auto pExtension = apActor->GetExtension();
if (pExtension->IsRemote() && !ScopedEquipOverride::IsOverriden())
{
spdlog::info("Actor[{:X}::Equip()", apActor->formID);
spdlog::info("Actor[{:X}]::Equip(), item form id: {:X}", apActor->formID, apItem->formID);
return nullptr;
}

Expand Down
8 changes: 8 additions & 0 deletions Code/client/Games/Misc/ActorKnowledge.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#pragma once

struct ActorKnowledge : NiRefObject
{
int32_t hOwner;
int32_t hTarget;
int32_t eFactionFightReaction;
};
7 changes: 7 additions & 0 deletions Code/client/Games/Skyrim/AI/AIProcess.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,11 @@ struct AIProcess
int8_t movementType;
};

struct HighProcessData
{
uint8_t pad0[0x218];
char* strVoiceSubtitle;
GameArray<std::tuple<uint32_t, void*>> KnowledgeArray; // BSTuple, std::tuple is prolly wrong
};

static_assert(offsetof(AIProcess, movementType) == 0x137);
98 changes: 63 additions & 35 deletions Code/client/Games/Skyrim/Actor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

#include <Games/Skyrim/Misc/InventoryEntry.h>
#include <Games/Skyrim/ExtraData/ExtraCount.h>
#include <Games/Misc/ActorKnowledge.h>

#ifdef SAVE_STUFF

Expand Down Expand Up @@ -618,39 +619,66 @@ void* TP_MAKE_THISCALL(HookPickUpItem, Actor, TESObjectREFR* apObject, int32_t a
return ThisCall(RealPickUpItem, apThis, apObject, aCount, aUnk1, aUnk2);
}

static TiltedPhoques::Initializer s_actorHooks([]()
TP_THIS_FUNCTION(TRunDetection, void, void, ActorKnowledge*);
static TRunDetection* RealRunDetection = nullptr;

void TP_MAKE_THISCALL(HookRunDetection, void, ActorKnowledge* apTarget)
{
auto pOwner = TESObjectREFR::GetByHandle(apTarget->hOwner);
auto pTarget = TESObjectREFR::GetByHandle(apTarget->hTarget);

if (pOwner && pTarget)
{
POINTER_SKYRIMSE(TCharacterConstructor, s_characterCtor, 0x1406BA510 - 0x140000000);
POINTER_SKYRIMSE(TCharacterConstructor2, s_characterCtor2, 0x1406BA510 - 0x140000000);
POINTER_SKYRIMSE(TCharacterDestructor, s_characterDtor, 0x1405F2330 - 0x140000000);
POINTER_SKYRIMSE(TGetLocation, s_GetActorLocation, 0x1402ABB40 - 0x140000000);
POINTER_SKYRIMSE(TForceState, s_ForceState, 0x1405F8860 - 0x140000000);
POINTER_SKYRIMSE(TSpawnActorInWorld, s_SpawnActorInWorld, 0x1402A66A0 - 0x140000000);
POINTER_SKYRIMSE(TDamageActor, s_damageActor, 0x1405FAC30 - 0x140000000);
POINTER_SKYRIMSE(TApplyActorEffect, s_applyActorEffect, 0x1405845F9 - 0x140000000);
POINTER_SKYRIMSE(TRegenAttributes, s_regenAttributes, 0x140607080 - 0x140000000);
POINTER_SKYRIMSE(TAddInventoryItem, s_addInventoryItem, 0x14060CEA0 - 0x140000000);
POINTER_SKYRIMSE(TPickUpItem, s_pickUpItem, 0x14060C510 - 0x140000000);

FUNC_GetActorLocation = s_GetActorLocation.Get();
RealCharacterConstructor = s_characterCtor.Get();
RealCharacterConstructor2 = s_characterCtor2.Get();
RealForceState = s_ForceState.Get();
RealSpawnActorInWorld = s_SpawnActorInWorld.Get();
RealDamageActor = s_damageActor.Get();
RealApplyActorEffect = s_applyActorEffect.Get();
RealRegenAttributes = s_regenAttributes.Get();
RealAddInventoryItem = s_addInventoryItem.Get();
RealPickUpItem = s_pickUpItem.Get();

TP_HOOK(&RealCharacterConstructor, HookCharacterConstructor);
TP_HOOK(&RealCharacterConstructor2, HookCharacterConstructor2);
TP_HOOK(&RealForceState, HookForceState);
TP_HOOK(&RealSpawnActorInWorld, HookSpawnActorInWorld);
TP_HOOK(&RealDamageActor, HookDamageActor);
TP_HOOK(&RealApplyActorEffect, HookApplyActorEffect);
TP_HOOK(&RealRegenAttributes, HookRegenAttributes);
TP_HOOK(&RealAddInventoryItem, HookAddInventoryItem);
TP_HOOK(&RealPickUpItem, HookPickUpItem);

});
auto pOwnerActor = RTTI_CAST(pOwner, TESObjectREFR, Actor);
auto pTargetActor = RTTI_CAST(pTarget, TESObjectREFR, Actor);
if (pOwnerActor && pTargetActor)
{
if (pOwnerActor->GetExtension()->IsRemotePlayer() && pTargetActor->GetExtension()->IsLocalPlayer())
{
spdlog::info("Cancelling detection from remote player to local player");
return;
}
}
}

return ThisCall(RealRunDetection, apThis, apTarget);
}

static TiltedPhoques::Initializer s_actorHooks([]()
{
POINTER_SKYRIMSE(TCharacterConstructor, s_characterCtor, 0x1406BA510 - 0x140000000);
POINTER_SKYRIMSE(TCharacterConstructor2, s_characterCtor2, 0x1406BA510 - 0x140000000);
POINTER_SKYRIMSE(TCharacterDestructor, s_characterDtor, 0x1405F2330 - 0x140000000);
POINTER_SKYRIMSE(TGetLocation, s_GetActorLocation, 0x1402ABB40 - 0x140000000);
POINTER_SKYRIMSE(TForceState, s_ForceState, 0x1405F8860 - 0x140000000);
POINTER_SKYRIMSE(TSpawnActorInWorld, s_SpawnActorInWorld, 0x1402A66A0 - 0x140000000);
POINTER_SKYRIMSE(TDamageActor, s_damageActor, 0x1405FAC30 - 0x140000000);
POINTER_SKYRIMSE(TApplyActorEffect, s_applyActorEffect, 0x1405845F9 - 0x140000000);
POINTER_SKYRIMSE(TRegenAttributes, s_regenAttributes, 0x140607080 - 0x140000000);
POINTER_SKYRIMSE(TAddInventoryItem, s_addInventoryItem, 0x14060CEA0 - 0x140000000);
POINTER_SKYRIMSE(TPickUpItem, s_pickUpItem, 0x14060C510 - 0x140000000);
POINTER_SKYRIMSE(TRunDetection, s_runDetection, 0x140F60320 - 0x140000000);

FUNC_GetActorLocation = s_GetActorLocation.Get();
RealCharacterConstructor = s_characterCtor.Get();
RealCharacterConstructor2 = s_characterCtor2.Get();
RealForceState = s_ForceState.Get();
RealSpawnActorInWorld = s_SpawnActorInWorld.Get();
RealDamageActor = s_damageActor.Get();
RealApplyActorEffect = s_applyActorEffect.Get();
RealRegenAttributes = s_regenAttributes.Get();
RealAddInventoryItem = s_addInventoryItem.Get();
RealPickUpItem = s_pickUpItem.Get();
RealRunDetection = s_runDetection.Get();

TP_HOOK(&RealCharacterConstructor, HookCharacterConstructor);
TP_HOOK(&RealCharacterConstructor2, HookCharacterConstructor2);
TP_HOOK(&RealForceState, HookForceState);
TP_HOOK(&RealSpawnActorInWorld, HookSpawnActorInWorld);
TP_HOOK(&RealDamageActor, HookDamageActor);
TP_HOOK(&RealApplyActorEffect, HookApplyActorEffect);
TP_HOOK(&RealRegenAttributes, HookRegenAttributes);
TP_HOOK(&RealAddInventoryItem, HookAddInventoryItem);
TP_HOOK(&RealPickUpItem, HookPickUpItem);
TP_HOOK(&RealRunDetection, HookRunDetection);
});
6 changes: 3 additions & 3 deletions Code/client/Services/Generic/TestService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,9 @@ void TestService::OnUpdate(const UpdateEvent& acUpdateEvent) noexcept
{
s_f8Pressed = true;

/*
PlaceActorInWorld();

/*
const auto pPlayerBaseForm = static_cast<TESNPC*>(PlayerCharacter::Get()->baseForm);
//const auto pNpc = TESNPC::Create(data, pPlayerBaseForm->GetChangeFlags());
Expand Down Expand Up @@ -705,10 +705,10 @@ void TestService::OnDraw() noexcept
ImGui::InputScalar("Vtable address", ImGuiDataType_U64, (void*)pFetchForm, 0, 0, "%" PRIx64,
ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_ReadOnly);

ImGui::InputInt("Form id", (int*)&pFetchForm->formID, 0, 0, ImGuiInputTextFlags_ReadOnly | ImGuiInputTextFlags_CharsHexadecimal);

FormType formType = pFetchForm->GetFormType();
ImGui::InputScalar("Form type", ImGuiDataType_U8, (void*)&formType, 0, 0, nullptr, ImGuiInputTextFlags_ReadOnly);

ImGui::InputInt("Form id", (int*)&pFetchForm->formID, 0, 0, ImGuiInputTextFlags_ReadOnly | ImGuiInputTextFlags_CharsHexadecimal);
}

ImGui::End();
Expand Down

0 comments on commit cce6f47

Please sign in to comment.