Skip to content

Commit 04d2d26

Browse files
Synchronize changes from 1.6 master branch [ci skip]
8b29ce8 Fix missing climbing animation (PR #4387, Fixes #1016) bee4783 Update client en_US pot
2 parents 9842a0e + 8b29ce8 commit 04d2d26

File tree

13 files changed

+66
-9
lines changed

13 files changed

+66
-9
lines changed

Client/game_sa/CTasksSA.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ CTaskSimpleChoking* CTasksSA::CreateTaskSimpleChoking(CPed* pAttacker, bool bIsT
124124
return pTask;
125125
}
126126

127-
CTaskSimpleClimb* CTasksSA::CreateTaskSimpleClimb(CEntity* pClimbEnt, const CVector& vecTarget, float fHeading, unsigned char nSurfaceType, char nHeight,
127+
CTaskSimpleClimb* CTasksSA::CreateTaskSimpleClimb(CEntitySAInterface* pClimbEnt, const CVector& vecTarget, float fHeading, unsigned char nSurfaceType, eClimbHeights nHeight,
128128
const bool bForceClimb)
129129
{
130130
CTaskSimpleClimbSA* pTask = NewTask<CTaskSimpleClimbSA>(pClimbEnt, vecTarget, fHeading, nSurfaceType, nHeight, bForceClimb);

Client/game_sa/CTasksSA.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class CTasksSA : public CTasks
7070
CTaskSimpleDuck* CreateTaskSimpleDuck(eDuckControlTypes nDuckControl, unsigned short nLengthOfDuck = 0, unsigned short nUseShotsWhizzingEvents = -1);
7171
CTaskSimpleChoking* CreateTaskSimpleChoking(CPed* pAttacker, bool bIsTearGas);
7272

73-
CTaskSimpleClimb* CreateTaskSimpleClimb(CEntity* pClimbEnt, const CVector& vecTarget, float fHeading, unsigned char nSurfaceType, char nHeight = CLIMB_GRAB,
73+
CTaskSimpleClimb* CreateTaskSimpleClimb(CEntitySAInterface* pClimbEnt, const CVector& vecTarget, float fHeading, unsigned char nSurfaceType, eClimbHeights nHeight = CLIMB_GRAB,
7474
const bool bForceClimb = false);
7575
CTaskSimpleJetPack* CreateTaskSimpleJetpack(const CVector* pVecTargetPos = NULL, float fCruiseHeight = 10.0f, int nHoverTime = 0);
7676

Client/game_sa/TaskJumpFallSA.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "StdInc.h"
1313
#include "TaskJumpFallSA.h"
1414

15-
CTaskSimpleClimbSA::CTaskSimpleClimbSA(CEntity* pClimbEnt, const CVector& vecTarget, float fHeading, unsigned char nSurfaceType, char nHeight,
15+
CTaskSimpleClimbSA::CTaskSimpleClimbSA(CEntitySAInterface* pClimbEnt, const CVector& vecTarget, float fHeading, unsigned char nSurfaceType, eClimbHeights nHeight,
1616
const bool bForceClimb)
1717
{
1818
CreateTaskInterface(sizeof(CTaskSimpleClimbSAInterface));

Client/game_sa/TaskJumpFallSA.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class CTaskSimpleClimbSAInterface : public CTaskSimpleSAInterface
3737
char m_nFallAfterVault;
3838
float m_fHandholdHeading;
3939
CVector m_vecHandholdPos;
40-
CEntity* m_pClimbEnt;
40+
CEntitySAInterface* m_pClimbEnt;
4141

4242
short m_nGetToPosCounter;
4343
CAnimBlendAssociation* m_pAnim;
@@ -47,7 +47,7 @@ class CTaskSimpleClimbSA : public virtual CTaskSimpleSA, public virtual CTaskSim
4747
{
4848
public:
4949
CTaskSimpleClimbSA(){};
50-
CTaskSimpleClimbSA(CEntity* pClimbEnt, const CVector& vecTarget, float fHeading, unsigned char nSurfaceType, char nHeight = CLIMB_GRAB,
50+
CTaskSimpleClimbSA(CEntitySAInterface* pClimbEnt, const CVector& vecTarget, float fHeading, unsigned char nSurfaceType, eClimbHeights nHeight = CLIMB_GRAB,
5151
const bool bForceClimb = false);
5252

5353
eClimbHeights GetHeightForPos() const override { return static_cast<const CTaskSimpleClimbSAInterface*>(GetInterface())->m_nHeightForPos; }

Client/mods/deathmatch/logic/CClientPed.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7203,3 +7203,36 @@ void CClientPed::SetSyncing(bool bIsSyncing)
72037203
ResetVehicleInOut();
72047204
}
72057205
}
7206+
7207+
void CClientPed::RunClimbingTask()
7208+
{
7209+
if (!m_pPlayerPed)
7210+
return;
7211+
7212+
CVector climbPos;
7213+
float climbAngle;
7214+
int surfaceType;
7215+
7216+
CEntitySAInterface* climbEntity = CTaskSimpleClimb::TestForClimb(m_pPlayerPed, climbPos, climbAngle, surfaceType, true);
7217+
7218+
// If a ped is in the air, its rotation is inverted (see GetRotationDegressNew, GetRotationRadiansNew)
7219+
if (!IsOnGround() && !climbEntity)
7220+
{
7221+
CVector rot;
7222+
GetRotationDegrees(rot);
7223+
7224+
rot.fZ += 180.0f;
7225+
SetRotationDegrees(rot);
7226+
7227+
climbEntity = CTaskSimpleClimb::TestForClimb(m_pPlayerPed, climbPos, climbAngle, surfaceType, true);
7228+
}
7229+
7230+
if (!climbEntity)
7231+
return;
7232+
7233+
CTaskSimpleClimb* climbTask = g_pGame->GetTasks()->CreateTaskSimpleClimb(climbEntity, climbPos, climbAngle, surfaceType, eClimbHeights::CLIMB_GRAB, false);
7234+
if (!climbTask)
7235+
return;
7236+
7237+
climbTask->SetAsPedTask(m_pPlayerPed, TASK_PRIORITY_PRIMARY, true);
7238+
}

Client/mods/deathmatch/logic/CClientPed.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,8 @@ class CClientPed : public CClientStreamElement, public CAntiCheatModule
564564
void SetHasSyncedAnim(bool synced) noexcept { m_hasSyncedAnim = synced; }
565565
bool HasSyncedAnim() const noexcept { return m_hasSyncedAnim; }
566566

567+
void RunClimbingTask();
568+
567569
protected:
568570
// This constructor is for peds managed by a player. These are unknown to the ped manager.
569571
CClientPed(CClientManager* pManager, unsigned long ulModelID, ElementID ID, bool bIsLocalPlayer);

Client/mods/deathmatch/logic/CClientTask.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ CTask* CClientTask::CreateTask(bool& bTaskPrimary, int& iTaskPriority)
617617
iTaskPriority = TASK_PRIORITY_PRIMARY;
618618

619619
// Create the task
620-
return g_pGame->GetTasks()->CreateTaskSimpleClimb(NULL, vecTarget, fHeading, static_cast<unsigned char>(fSurfaceType), static_cast<char>(fClimbStage),
620+
return g_pGame->GetTasks()->CreateTaskSimpleClimb(NULL, vecTarget, fHeading, static_cast<unsigned char>(fSurfaceType), static_cast<eClimbHeights>(fClimbStage),
621621
bForceClimb);
622622
}
623623

Client/mods/deathmatch/logic/CNetAPI.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,9 @@ void CNetAPI::ReadPlayerPuresync(CClientPlayer* pPlayer, NetBitStreamInterface&
981981
pPlayer->SetOnFire(flags.data.bIsOnFire);
982982
pPlayer->SetStealthAiming(flags.data.bStealthAiming);
983983

984+
if (flags.data.hangingDuringClimb && pPlayer->GetMovementState() != eMovementState::MOVEMENTSTATE_HANGING && pPlayer->GetMovementState() != eMovementState::MOVEMENTSTATE_CLIMB)
985+
pPlayer->RunClimbingTask();
986+
984987
// Remember now as the last puresync time
985988
pPlayer->SetLastPuresyncTime(CClientTime::GetTime());
986989
pPlayer->SetLastPuresyncPosition(position.data.vecPosition);
@@ -1112,6 +1115,7 @@ void CNetAPI::WritePlayerPuresync(CClientPlayer* pPlayerModel, NetBitStreamInter
11121115
flags.data.bStealthAiming = (pPlayerModel->IsStealthAiming() == true);
11131116
flags.data.isReloadingWeapon = (pPlayerModel->IsReloadingWeapon() == true);
11141117
flags.data.animInterrupted = pPlayerModel->HasSyncedAnim() && (!pPlayerModel->IsRunningAnimation() || pPlayerModel->m_animationOverridedByClient);
1118+
flags.data.hangingDuringClimb = pPlayerModel->GetMovementState() == eMovementState::MOVEMENTSTATE_HANGING;
11151119

11161120
// The animation has been overwritten or interrupted by the client
11171121
if (flags.data.animInterrupted)

Client/sdk/game/CTasks.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ class CTasks
8686
unsigned short nUseShotsWhizzingEvents = -1) = 0;
8787
virtual CTaskSimpleChoking* CreateTaskSimpleChoking(CPed* pAttacker, bool bIsTearGas) = 0;
8888

89-
virtual CTaskSimpleClimb* CreateTaskSimpleClimb(CEntity* pClimbEnt, const CVector& vecTarget, float fHeading, unsigned char nSurfaceType,
90-
char nHeight = CLIMB_GRAB, const bool bForceClimb = false) = 0;
89+
virtual CTaskSimpleClimb* CreateTaskSimpleClimb(CEntitySAInterface* pClimbEnt, const CVector& vecTarget, float fHeading, unsigned char nSurfaceType,
90+
eClimbHeights nHeight = CLIMB_GRAB, const bool bForceClimb = false) = 0;
9191
virtual CTaskSimpleJetPack* CreateTaskSimpleJetpack(const CVector* pVecTargetPos = NULL, float fCruiseHeight = 10.0f, int nHoverTime = 0) = 0;
9292

9393
virtual CTaskSimpleRunAnim* CreateTaskSimpleRunAnim(const AssocGroupId animGroup, const AnimationId animID, const float fBlendDelta, const int iTaskType,

Client/sdk/game/TaskJumpFall.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#pragma once
1313

1414
#include "Task.h"
15+
#include "CPed.h"
1516

1617
enum eClimbHeights : std::int8_t;
1718

@@ -21,6 +22,15 @@ class CTaskSimpleClimb : public virtual CTaskSimple
2122
virtual ~CTaskSimpleClimb(){};
2223

2324
virtual eClimbHeights GetHeightForPos() const = 0;
25+
26+
static class CEntitySAInterface* TestForClimb(CPed* ped, CVector& climbPos, float& climbAngle, int& surfaceType, bool launch)
27+
{
28+
if (!ped)
29+
return nullptr;
30+
31+
// CTaskSimpleClimb::TestForClimb
32+
return ((class CEntitySAInterface*(__cdecl*)(class CPedSAInterface*, CVector*, float*, int*, bool))0x6803A0)(ped->GetPedInterface(), &climbPos, &climbAngle, &surfaceType, launch);
33+
}
2434
};
2535

2636
class CTaskSimpleJetPack : public virtual CTaskSimple

0 commit comments

Comments
 (0)