mirror of
https://github.com/dashr9230/SA-MP.git
synced 2025-09-19 20:26:14 +08:00
[saco] Implement CTask member functions
This commit is contained in:
@ -35,6 +35,13 @@ typedef struct _MATRIX4X4 {
|
||||
float pad_p;
|
||||
} MATRIX4X4, *PMATRIX4X4;
|
||||
|
||||
typedef struct _PED_TASKS_TYPE
|
||||
{
|
||||
char _gap0[16];
|
||||
|
||||
DWORD * pdwJumpJetPack;
|
||||
} PED_TASKS_TYPE;
|
||||
|
||||
//-----------------------------------------------------------
|
||||
#pragma pack(1)
|
||||
typedef struct _ENTITY_TYPE
|
||||
@ -67,6 +74,10 @@ typedef struct _PED_TYPE
|
||||
{
|
||||
ENTITY_TYPE entity;
|
||||
|
||||
char _gapB8[964];
|
||||
|
||||
PED_TASKS_TYPE *Tasks; // 1148-1152
|
||||
|
||||
} PED_TYPE;
|
||||
|
||||
//-----------------------------------------------------------
|
||||
|
@ -8,6 +8,7 @@ extern DWORD dwGraphicsLoop; // Used for the external dll game loop.
|
||||
#define NUDE void _declspec(naked)
|
||||
|
||||
BYTE *pbyteCameraMode = (BYTE *)0xB6F1A8;
|
||||
BYTE *pbyteCurrentPlayer = (BYTE *)0xB7CD74;
|
||||
|
||||
float fFarClip=1400.0f;
|
||||
|
||||
|
278
saco/game/task.cpp
Normal file
278
saco/game/task.cpp
Normal file
@ -0,0 +1,278 @@
|
||||
|
||||
#include "../main.h"
|
||||
#include "task.h"
|
||||
|
||||
//==========================================================
|
||||
// GENERIC TASK
|
||||
|
||||
CTask::CTask()
|
||||
{
|
||||
m_pTaskType = NULL;
|
||||
m_pPlayerPed = NULL;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
CTask::CTask(DWORD dwSize)
|
||||
{
|
||||
m_pTaskType = NULL;
|
||||
m_pPlayerPed = NULL;
|
||||
Create(dwSize);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
CTask::CTask(BYTE *pTaskType)
|
||||
{
|
||||
m_pTaskType = NULL;
|
||||
m_pPlayerPed = NULL;
|
||||
Create(pTaskType);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
CTask::~CTask()
|
||||
{
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
void CTask::Create(DWORD dwSize)
|
||||
{
|
||||
BYTE *pTaskType;
|
||||
__asm
|
||||
{
|
||||
push dwSize;
|
||||
mov eax, 0x61A5A0; // CTask_New
|
||||
call eax;
|
||||
add esp, 4;
|
||||
mov pTaskType, eax;
|
||||
}
|
||||
m_bSelfCreated = TRUE;
|
||||
m_pTaskType = pTaskType;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
void CTask::Create(BYTE *pTaskType)
|
||||
{
|
||||
m_bSelfCreated = FALSE;
|
||||
m_pTaskType = pTaskType;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
CTask* CTask::CreateCopy()
|
||||
{
|
||||
BYTE *pTaskType = m_pTaskType;
|
||||
__asm
|
||||
{
|
||||
push ecx;
|
||||
mov ecx, pTaskType;
|
||||
mov eax, [ecx];
|
||||
call [eax+0x4];
|
||||
mov pTaskType, eax;
|
||||
pop ecx;
|
||||
}
|
||||
return new CTask(pTaskType);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
void CTask::Destroy()
|
||||
{
|
||||
if (!IsDestroyed())
|
||||
{
|
||||
BYTE *pTaskType = m_pTaskType;
|
||||
if (m_bSelfCreated)
|
||||
{
|
||||
__asm
|
||||
{
|
||||
push ecx;
|
||||
mov ecx, pTaskType;
|
||||
mov eax, [ecx];
|
||||
push 0; // remove from pool?
|
||||
call [eax+0];
|
||||
pop ecx;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
__asm
|
||||
{
|
||||
push ecx;
|
||||
mov ecx, pTaskType;
|
||||
mov eax, [ecx];
|
||||
push 1; // remove from pool?
|
||||
call [eax+0];
|
||||
pop ecx;
|
||||
}
|
||||
}
|
||||
m_pTaskType = NULL;
|
||||
m_pPlayerPed = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
/*void CTask::ApplyToPed(CActorPed *pPed)
|
||||
{
|
||||
//m_pPlayerPed = pPed;
|
||||
PED_TASKS_TYPE *pPedTasksType = pPed->m_pPed->Tasks;
|
||||
BYTE *pTaskType = m_pTaskType;
|
||||
|
||||
__asm
|
||||
{
|
||||
push ecx;
|
||||
|
||||
mov ecx, pPedTasksType;
|
||||
push 0;
|
||||
push 3;
|
||||
push pTaskType;
|
||||
add ecx, 4;
|
||||
mov eax, 0x681AF0;
|
||||
call eax; // AddTaskToActor
|
||||
|
||||
pop ecx;
|
||||
}
|
||||
}*/
|
||||
|
||||
void CTask::ApplyToPed(CPlayerPed *pPed)
|
||||
{
|
||||
extern BYTE *pbyteCurrentPlayer;
|
||||
m_pPlayerPed = pPed;
|
||||
PED_TASKS_TYPE *pPedTasksType = pPed->m_pPed->Tasks;
|
||||
BYTE *pTaskType = m_pTaskType;
|
||||
|
||||
*pbyteCurrentPlayer = pPed->m_bytePlayerNumber;
|
||||
|
||||
__asm
|
||||
{
|
||||
push ecx;
|
||||
|
||||
mov ecx, pPedTasksType;
|
||||
push 0;
|
||||
push 3;
|
||||
push pTaskType;
|
||||
add ecx, 4;
|
||||
mov eax, 0x681AF0;
|
||||
call eax; // AddTaskToActor
|
||||
|
||||
pop ecx;
|
||||
}
|
||||
|
||||
*pbyteCurrentPlayer = 0;
|
||||
|
||||
|
||||
/*
|
||||
(aru) Disabling this messy thing... The one above works just fine for now.
|
||||
|
||||
// Call a default applier here, but can be overloaded for special tasks
|
||||
PED_TYPE *pPedType = pPed->m_pPed;
|
||||
PED_TASKS_TYPE *pPedTasksType = pPedType->Tasks;
|
||||
BYTE *pTaskType = m_pTaskType;
|
||||
|
||||
BYTE TaskAppBlock[24];
|
||||
|
||||
DWORD dwSomeSpecialArg = 0;
|
||||
|
||||
__asm
|
||||
{
|
||||
push ecx;
|
||||
push edi;
|
||||
|
||||
push 0;
|
||||
push pTaskType;
|
||||
push 3;
|
||||
lea ecx, TaskAppBlock;
|
||||
mov eax, 0x4B0A00;
|
||||
call eax; // Initializes the TaskAppBlock
|
||||
|
||||
lea eax, TaskAppBlock;
|
||||
push eax;
|
||||
mov eax, pPedTasksType;
|
||||
lea ecx, [eax+0x68];
|
||||
mov eax, 0x4AB420;
|
||||
call eax; // Does something with CPedIntelligence+0x68
|
||||
|
||||
mov edi, eax;
|
||||
test edi, edi;
|
||||
jz skipExtended; // Skip out of the extended stuff
|
||||
|
||||
mov eax, 0x608540; // This gets something and returns it in eax (3)
|
||||
call eax;
|
||||
|
||||
mov ecx, dwSomeSpecialArg;
|
||||
push edi;
|
||||
push ecx;
|
||||
lea ecx, [eax+eax*4];
|
||||
push pPedType;
|
||||
lea ecx, ds:0xC0B1E8[ecx*4];
|
||||
mov eax, 0x608390;
|
||||
call eax; // No idea what this does. (10)
|
||||
|
||||
skipExtended:
|
||||
|
||||
lea ecx, TaskAppBlock;
|
||||
mov eax, 0x4B0A50;
|
||||
call eax; // No idea what this does either (11)
|
||||
|
||||
pop edi;
|
||||
pop ecx;
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
DWORD CTask::GetID()
|
||||
{
|
||||
BYTE *pTaskType = m_pTaskType;
|
||||
DWORD dwID;
|
||||
__asm
|
||||
{
|
||||
push ecx;
|
||||
mov ecx, pTaskType;
|
||||
mov eax, [ecx];
|
||||
call [eax+0x10];
|
||||
mov dwID, eax;
|
||||
pop ecx;
|
||||
}
|
||||
return dwID;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
BOOL CTask::IsDestroyed()
|
||||
{
|
||||
if (m_pTaskType == NULL)
|
||||
return TRUE;
|
||||
|
||||
DWORD dwVTbl = *((DWORD*)m_pTaskType);
|
||||
|
||||
if (dwVTbl == 0x86D48C) // CTask_vtbl
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
|
||||
BOOL CTask::IsSimple()
|
||||
{
|
||||
BYTE *pTaskType = m_pTaskType;
|
||||
BOOL bRet;
|
||||
__asm
|
||||
{
|
||||
push ecx;
|
||||
mov ecx, pTaskType;
|
||||
mov eax, [ecx];
|
||||
call [eax+0xC];
|
||||
movzx eax, al;
|
||||
mov bRet, eax;
|
||||
pop ecx;
|
||||
}
|
||||
return bRet;
|
||||
}
|
||||
|
34
saco/game/task.h
Normal file
34
saco/game/task.h
Normal file
@ -0,0 +1,34 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
class CPlayerPed;
|
||||
|
||||
class CTask
|
||||
{
|
||||
protected:
|
||||
BOOL m_bSelfCreated;
|
||||
|
||||
public:
|
||||
CPlayerPed *m_pPlayerPed;
|
||||
BYTE *m_pTaskType;
|
||||
|
||||
CTask();
|
||||
CTask(DWORD dwSize);
|
||||
CTask(BYTE *pTaskType);
|
||||
virtual ~CTask();
|
||||
|
||||
void Create(DWORD dwSize);
|
||||
void Create(BYTE *pTaskType);
|
||||
virtual CTask* CreateCopy();
|
||||
virtual void Destroy();
|
||||
|
||||
virtual void ApplyToPed(CPlayerPed *pPed);
|
||||
//virtual void ApplyToPed(CActorPed *pPed);
|
||||
|
||||
virtual DWORD GetID();
|
||||
|
||||
virtual BOOL IsDestroyed();
|
||||
virtual BOOL IsSimple();
|
||||
|
||||
};
|
||||
|
@ -197,6 +197,12 @@
|
||||
<File
|
||||
RelativePath=".\game\scripting.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\game\task.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\game\task.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\game\unnamed_1.cpp">
|
||||
</File>
|
||||
|
Reference in New Issue
Block a user