From a1105b80541010fa301eff00d3b512a1f910a3d1 Mon Sep 17 00:00:00 2001 From: Pirulax Date: Sat, 9 Mar 2024 22:29:33 +0100 Subject: [PATCH] `CTaskSimpleDoHandSignal` (#464) --- .../TaskTypes/TaskSimpleDoHandSignal.cpp | 49 +++++++++++++++++++ .../Tasks/TaskTypes/TaskSimpleDoHandSignal.h | 38 ++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 source/game_sa/Tasks/TaskTypes/TaskSimpleDoHandSignal.cpp create mode 100644 source/game_sa/Tasks/TaskTypes/TaskSimpleDoHandSignal.h diff --git a/source/game_sa/Tasks/TaskTypes/TaskSimpleDoHandSignal.cpp b/source/game_sa/Tasks/TaskTypes/TaskSimpleDoHandSignal.cpp new file mode 100644 index 0000000000..11f3006d9a --- /dev/null +++ b/source/game_sa/Tasks/TaskTypes/TaskSimpleDoHandSignal.cpp @@ -0,0 +1,49 @@ +#include "StdInc.h" +#include "TaskSimpleDoHandSignal.h" +#include "TaskComplexPlayHandSignalAnim.h" + +void CTaskSimpleDoHandSignal::InjectHooks() { + RH_ScopedVirtualClass(CTaskSimpleDoHandSignal, 0x86fa68, 9); + RH_ScopedCategory("Tasks/TaskTypes"); + + RH_ScopedInstall(Constructor, 0x660880); + RH_ScopedInstall(Destructor, 0x6608B0); + + RH_ScopedVMTInstall(Clone, 0x6608C0); + RH_ScopedVMTInstall(GetTaskType, 0x6608A0); + RH_ScopedVMTInstall(MakeAbortable, 0x660930); + RH_ScopedVMTInstall(ProcessPed, 0x660940); +} + +CTaskSimpleDoHandSignal::CTaskSimpleDoHandSignal(const CTaskSimpleDoHandSignal& o) : + m_Initialized{ o.m_Initialized } +{ +} + +// 0x660940 +bool CTaskSimpleDoHandSignal::ProcessPed(CPed* ped) { + if (!ped->GetIsOnScreen()) { + return true; + } + + const auto animTask = ped->GetTaskManager().GetTaskSecondary(TASK_SECONDARY_PARTIAL_ANIM); + + if (m_Initialized) { + return !animTask || !CTask::IsA(animTask); + } + + if (animTask) { + if (CTask::IsA(animTask)) { + return true; + } + animTask->MakeAbortable(ped, ABORT_PRIORITY_URGENT, nullptr); + return false; + } + + ped->GetTaskManager().SetTaskSecondary( + new CTaskComplexPlayHandSignalAnim{}, + TASK_SECONDARY_PARTIAL_ANIM + ); + m_Initialized = true; + return false; +} diff --git a/source/game_sa/Tasks/TaskTypes/TaskSimpleDoHandSignal.h b/source/game_sa/Tasks/TaskTypes/TaskSimpleDoHandSignal.h new file mode 100644 index 0000000000..d26a5a7b84 --- /dev/null +++ b/source/game_sa/Tasks/TaskTypes/TaskSimpleDoHandSignal.h @@ -0,0 +1,38 @@ +#pragma once + +#include "TaskSimple.h" + +class CTaskSimpleDoHandSignal; +class CPed; +class CEvent; + +class NOTSA_EXPORT_VTABLE CTaskSimpleDoHandSignal : public CTaskSimple { +public: + static void InjectHooks(); + + static constexpr auto Type = eTaskType::TASK_SIMPLE_DO_HAND_SIGNAL; + + CTaskSimpleDoHandSignal() = default; + CTaskSimpleDoHandSignal(const CTaskSimpleDoHandSignal&); + ~CTaskSimpleDoHandSignal() = default; + + CTask* Clone() const override { return new CTaskSimpleDoHandSignal{*this}; } + eTaskType GetTaskType() const override { return Type; } + bool MakeAbortable(CPed* ped, eAbortPriority priority, CEvent const* event) override { return true; } + bool ProcessPed(CPed* ped) override; + +private: // Wrappers for hooks + // 0x660880 + CTaskSimpleDoHandSignal* Constructor() { + this->CTaskSimpleDoHandSignal::CTaskSimpleDoHandSignal(); + return this; + } + // 0x6608B0 + CTaskSimpleDoHandSignal* Destructor() { + this->CTaskSimpleDoHandSignal::~CTaskSimpleDoHandSignal(); + return this; + } + +protected: + bool m_Initialized{}; +};