Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Client/game_sa/CPedSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,16 @@ void CPedSA::GetAttachedSatchels(std::vector<SSatchelsData>& satchelsList) const
}
}

void CPedSA::SetInWaterFlags(bool inWater)
{
auto* physicalInterface = static_cast<CPhysicalSAInterface*>(m_pInterface);
if (!physicalInterface)
return;

physicalInterface->bTouchingWater = inWater;
physicalInterface->bSubmergedInWater = inWater;
}

////////////////////////////////////////////////////////////////
//
// CPed_PreRenderAfterTest
Expand Down
2 changes: 2 additions & 0 deletions Client/game_sa/CPedSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,8 @@ class CPedSA : public virtual CPed, public virtual CPhysicalSA

void GetAttachedSatchels(std::vector<SSatchelsData> &satchelsList) const override;

void SetInWaterFlags(bool inWater) override;

static void StaticSetHooks();

private:
Expand Down
4 changes: 4 additions & 0 deletions Client/game_sa/CTaskManagementSystemSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "TaskPhysicalResponseSA.h"
#include "TaskSA.h"
#include "TaskSecondarySA.h"
#include "TaskSimpleSwimSA.h"

extern CGameSA* pGame;

Expand Down Expand Up @@ -181,6 +182,9 @@ CTaskSA* CTaskManagementSystemSA::CreateAppropriateTask(CTaskSAInterface* pTaskI
case TASK_COMPLEX_SUNBATHE:
pTaskSA = new CTaskComplexSunbatheSA;
break;
case TASK_SIMPLE_SWIM:
pTaskSA = new CTaskSimpleSwimSA;
break;

// Car accessories
case TASK_SIMPLE_CAR_SET_PED_IN_AS_PASSENGER:
Expand Down
7 changes: 7 additions & 0 deletions Client/game_sa/CTasksSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,13 @@ CTaskSimpleRunNamedAnim* CTasksSA::CreateTaskSimpleRunNamedAnim(const char* pAni
return pTask;
}

CTaskComplexInWater* CTasksSA::CreateTaskComplexInWater()
{
CTaskComplexInWaterSA* task = NewTask<CTaskComplexInWaterSA>();
m_pTaskManagementSystem->AddTask(task);
return task;
}

CTaskComplexDie* CTasksSA::CreateTaskComplexDie(const eWeaponType eMeansOfDeath, const AssocGroupId animGroup, const AnimationId anim, const float fBlendDelta,
const float fAnimSpeed, const bool bBeingKilledByStealth, const bool bFallingToDeath, const int iFallToDeathDir,
const bool bFallToDeathOverRailing)
Expand Down
3 changes: 3 additions & 0 deletions Client/game_sa/CTasksSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class CTaskSimpleRunNamedAnim;
class CTaskSimpleStealthKill;
class CTaskSimpleTriggerLookAt;
class CTaskSimpleUseGun;
class CTaskComplexInWater;

class CTasksSA : public CTasks
{
Expand Down Expand Up @@ -80,6 +81,8 @@ class CTasksSA : public CTasks
const int iTime = -1, const bool bDontInterrupt = false, const bool bRunInSequence = false,
const bool bOffsetPed = false, const bool bHoldLastFrame = false);

CTaskComplexInWater* CreateTaskComplexInWater();

CTaskComplexDie* CreateTaskComplexDie(const eWeaponType eMeansOfDeath = WEAPONTYPE_UNARMED, const AssocGroupId animGroup = 0 /*ANIM_STD_PED*/,
const AnimationId anim = 0 /*ANIM_STD_KO_FRONT*/, const float fBlendDelta = 4.0f, const float fAnimSpeed = 0.0f,
const bool bBeingKilledByStealth = false, const bool bFallingToDeath = false, const int iFallToDeathDir = 0,
Expand Down
10 changes: 10 additions & 0 deletions Client/game_sa/TaskBasicSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,3 +246,13 @@ CTaskComplexFacialSA::CTaskComplexFacialSA()
call dwFunc
}
}

CTaskComplexInWaterSA::CTaskComplexInWaterSA()
{
CreateTaskInterface(sizeof(CTaskComplexInWaterSA));
if (!IsValid())
return;

// Call the constructor
((void(__thiscall*)(CTaskComplexInWaterSAInterface*))0x6350D0)(static_cast<CTaskComplexInWaterSAInterface*>(GetInterface()));
}
11 changes: 11 additions & 0 deletions Client/game_sa/TaskBasicSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,3 +251,14 @@ class CTaskComplexFacialSA : public virtual CTaskComplexSA, public virtual CTask
public:
CTaskComplexFacialSA();
};

class CTaskComplexInWaterSAInterface : public CTaskComplexSAInterface
{
public:
};

class CTaskComplexInWaterSA : public virtual CTaskComplexSA, public virtual CTaskComplexInWater
{
public:
CTaskComplexInWaterSA();
};
22 changes: 22 additions & 0 deletions Client/game_sa/TaskSimpleSwimSA.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*****************************************************************************
*
* PROJECT: Multi Theft Auto
* LICENSE: See LICENSE in the top level directory
*
* Multi Theft Auto is available from https://www.multitheftauto.com/
*
*****************************************************************************/

#include "StdInc.h"
#include "TaskSimpleSwimSA.h"
#include "CPedSA.h"

CTaskSimpleSwimSA::CTaskSimpleSwimSA(CPed* ped, CVector* pos)
{
CreateTaskInterface(sizeof(CTaskSimpleSAInterface));
if (!IsValid())
return;

// Call the constructor
((void(__thiscall*)(CTaskSimpleSwimSAInterface*, CVector*, CPedSAInterface*))0x688930)(static_cast<CTaskSimpleSwimSAInterface*>(GetInterface()), pos, ped ? ped->GetPedInterface() : nullptr);
}
59 changes: 59 additions & 0 deletions Client/game_sa/TaskSimpleSwimSA.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*****************************************************************************
*
* PROJECT: Multi Theft Auto
* LICENSE: See LICENSE in the top level directory
*
* Multi Theft Auto is available from https://www.multitheftauto.com/
*
*****************************************************************************/

#pragma once

#include <CVector.h>
#include "TaskSA.h"
#include <game/TaskSimpleSwim.h>
#include <enums/SurfaceType.h>
#include <game/CTasks.h>

class CPedSAInterface;
class CEntitySAInterface;

class CTaskSimpleSwimSAInterface : public CTaskSimpleSAInterface
{
public:
bool m_finishedBlending;
bool m_animBlockRefAdded;
swimState m_swimState;
int m_animID;
float m_animSpeed;
CVector m_pos;
CPedSAInterface* m_ped;
float m_rotationX;
float m_turningRotationY;
float m_upperTorsoRotationX;
float m_aimingRotation;
float m_stateChanger;
CEntitySAInterface* m_entity;
CVector m_climbPos;
float m_angle;
SurfaceTypes::Enum m_surfaceType;
std::uint8_t m_field4D[3];
float m_randomMoveBlendRatio;
float m_swimStopTime;
std::uint32_t m_timeStep;
void* m_fxSystem; // FxSystem_cSAInterface*
bool m_triggerWaterSplash;
std::uint8_t m_field61[3];
};

class CTaskSimpleSwimSA : public virtual CTaskSimpleSA, public virtual CTaskSimpleSwim
{
public:
CTaskSimpleSwimSA() {};
CTaskSimpleSwimSA(CPed* ped, CVector* pos);

const CTaskSimpleSwimSAInterface* GetTaskInterface() const { return static_cast<const CTaskSimpleSwimSAInterface*>(GetInterface()); }
CTaskSimpleSwimSAInterface* GetTaskInterface() { return static_cast<CTaskSimpleSwimSAInterface*>(GetInterface()); }

swimState GetSwimState() const override { return GetTaskInterface()->m_swimState; }
};
30 changes: 30 additions & 0 deletions Client/mods/deathmatch/logic/CClientPed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include <game/TaskJumpFall.h>
#include <game/TaskPhysicalResponse.h>
#include <game/TaskAttack.h>
#include <game/TaskSimpleSwim.h>
#include "enums/VehicleType.h"

using std::list;
Expand Down Expand Up @@ -7236,3 +7237,32 @@ void CClientPed::RunClimbingTask()

climbTask->SetAsPedTask(m_pPlayerPed, TASK_PRIORITY_PRIMARY, true);
}

CTaskSimpleSwim* CClientPed::GetSwimmingTask() const
{
if (!m_pPlayerPed)
return nullptr;

CTask* simplestTask = const_cast<CTaskManager*>(GetTaskManager())->GetSimplestActiveTask();
if (!simplestTask || simplestTask->GetTaskType() != TASK_SIMPLE_SWIM)
return nullptr;

auto* swimmingTask = dynamic_cast<CTaskSimpleSwim*>(simplestTask);
return swimmingTask;
}

void CClientPed::RunSwimTask() const
{
if (!m_pPlayerPed || GetSwimmingTask())
return;

CTaskComplexInWater* inWaterTask = g_pGame->GetTasks()->CreateTaskComplexInWater();
if (!inWaterTask)
return;

// Set physical flags (bTouchingWater, bSubmergedInWater)
m_pPlayerPed->SetInWaterFlags(true);

inWaterTask->SetAsPedTask(m_pPlayerPed, TASK_PRIORITY_EVENT_RESPONSE_NONTEMP, true);
}

4 changes: 4 additions & 0 deletions Client/mods/deathmatch/logic/CClientPed.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class CClientPlayerClothes;
class CClientProjectile;
class CClientVehicle;
class CTask;
class CTaskSimpleSwim;

enum eDelayedSyncData
{
Expand Down Expand Up @@ -566,6 +567,9 @@ class CClientPed : public CClientStreamElement, public CAntiCheatModule

void RunClimbingTask();

CTaskSimpleSwim* GetSwimmingTask() const;
void RunSwimTask() const;

protected:
// This constructor is for peds managed by a player. These are unknown to the ped manager.
CClientPed(CClientManager* pManager, unsigned long ulModelID, ElementID ID, bool bIsLocalPlayer);
Expand Down
3 changes: 3 additions & 0 deletions Client/mods/deathmatch/logic/CNetAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -984,6 +984,9 @@ void CNetAPI::ReadPlayerPuresync(CClientPlayer* pPlayer, NetBitStreamInterface&
if (flags.data.hangingDuringClimb && pPlayer->GetMovementState() != eMovementState::MOVEMENTSTATE_HANGING && pPlayer->GetMovementState() != eMovementState::MOVEMENTSTATE_CLIMB)
pPlayer->RunClimbingTask();

if (flags.data.bIsInWater && !pPlayer->IsInWater())
pPlayer->RunSwimTask();

// Remember now as the last puresync time
pPlayer->SetLastPuresyncTime(CClientTime::GetTime());
pPlayer->SetLastPuresyncPosition(position.data.vecPosition);
Expand Down
2 changes: 2 additions & 0 deletions Client/sdk/game/CPed.h
Original file line number Diff line number Diff line change
Expand Up @@ -307,4 +307,6 @@ class CPed : public virtual CPhysical
virtual void GetAttachedSatchels(std::vector<SSatchelsData> &satchelsList) const = 0;

virtual void Say(const ePedSpeechContext& speechId, float probability) = 0;

virtual void SetInWaterFlags(bool inWater) = 0;
};
3 changes: 3 additions & 0 deletions Client/sdk/game/CTasks.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class CTaskSimpleRunNamedAnim;
class CTaskSimpleStealthKill;
class CTaskSimpleTriggerLookAt;
class CTaskSimpleUseGun;
class CTaskComplexInWater;
class CVector;
class CVehicle;

Expand Down Expand Up @@ -96,6 +97,8 @@ class CTasks
const int iTime = -1, const bool bDontInterrupt = false, const bool bRunInSequence = false,
const bool bOffsetPed = false, const bool bHoldLastFrame = false) = 0;

virtual CTaskComplexInWater* CreateTaskComplexInWater() = 0;

virtual CTaskComplexDie* CreateTaskComplexDie(const eWeaponType eMeansOfDeath = WEAPONTYPE_UNARMED, const AssocGroupId animGroup = 0 /*ANIM_STD_PED*/,
const AnimationId anim = 0 /*ANIM_STD_KO_FRONT*/, const float fBlendDelta = 4.0f,
const float fAnimSpeed = 0.0f, const bool bBeingKilledByStealth = false, const bool bFallingToDeath = false,
Expand Down
6 changes: 6 additions & 0 deletions Client/sdk/game/TaskBasic.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,3 +95,9 @@ class CTaskComplexFacial : public virtual CTaskComplex
public:
virtual ~CTaskComplexFacial(){};
};

class CTaskComplexInWater : public virtual CTaskComplex
{
public:
virtual ~CTaskComplexInWater(){};
};
30 changes: 30 additions & 0 deletions Client/sdk/game/TaskSimpleSwim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*****************************************************************************
*
* PROJECT: Multi Theft Auto
* LICENSE: See LICENSE in the top level directory
* FILE: sdk/game/TaskSimpleSwim.h
*
* Multi Theft Auto is available from https://www.multitheftauto.com/
*
*****************************************************************************/

#pragma once
#include "Task.h"

enum swimState : std::uint16_t
{
SWIM_TREAD = 0,
SWIM_SPRINT,
SWIM_SPRINTING,
SWIM_DIVE_UNDERWATER,
SWIM_UNDERWATER_SPRINTING,
SWIM_BACK_TO_SURFACE,
};

class CTaskSimpleSwim : public virtual CTaskSimple
{
public:
virtual ~CTaskSimpleSwim() {};

virtual swimState GetSwimState() const = 0;
};
Loading
Loading