Skip to content
Open
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
3 changes: 3 additions & 0 deletions Client/mods/deathmatch/logic/CClientGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3495,6 +3495,9 @@ void CClientGame::Event_OnIngame()

g_pGame->GetVehicleAudioSettingsManager()->ResetAudioSettingsData();

// Reset framerate fixing property
g_pMultiplayer->FramerateFixingResetPhysicsTimeStep();

// Tell doggy we got the game running
WatchDogCompletedSection("L1");
}
Expand Down
4 changes: 4 additions & 0 deletions Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -981,6 +981,10 @@ ADD_ENUM(VehicleAudioSettingProperty::VEHICLE_TYPE_FOR_AUDIO, "vehicle-type-for-
IMPLEMENT_ENUM_CLASS_END("vehicle-audio-setting")


IMPLEMENT_ENUM_CLASS_BEGIN(FramerateFixingProperty)
ADD_ENUM(FramerateFixingProperty::FFP_VEHICLE_PHYSICS, "vehicle_physics")
IMPLEMENT_ENUM_END("framerate-fixing-property")

//
// CResource from userdata
//
Expand Down
2 changes: 2 additions & 0 deletions Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "enums/SoundEffectParams.h"
#include "enums/SoundEffectType.h"
#include "enums/ObjectGroupPhysicalProperties.h"
#include "enums/FramerateFixingProperty.h"

enum eLuaType
{
Expand Down Expand Up @@ -101,6 +102,7 @@ DECLARE_ENUM_CLASS(PreloadAreaOption);
DECLARE_ENUM_CLASS(taskType);
DECLARE_ENUM(eEntityType);
DECLARE_ENUM_CLASS(VehicleAudioSettingProperty);
DECLARE_ENUM_CLASS(FramerateFixingProperty);

class CRemoteCall;

Expand Down
33 changes: 33 additions & 0 deletions Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <game/CStreaming.h>
#include <game/CPtrNodeSingleLinkPool.h>
#include <lua/CLuaFunctionParser.h>
#include <lua/CLuaFunctionParseHelpers.h>
#include "CLuaEngineDefs.h"
#include <enums/VehicleType.h>

Expand Down Expand Up @@ -150,6 +151,9 @@ void CLuaEngineDefs::LoadFunctions()
{"engineGetPoolUsedCapacity", ArgumentParser<EngineGetPoolUsedCapacity>},
{"engineSetPoolCapacity", ArgumentParser<EngineSetPoolCapacity>},
{"enginePreloadWorldArea", ArgumentParser<EnginePreloadWorldArea>},
{"engineFramerateFixingSetProperty", ArgumentParser<EngineFramerateFixingSetProperty>},
{"engineFramerateFixingGetProperty", ArgumentParser<EngineFramerateFixingGetProperty>},
{"engineFramerateFixingResetProperties", ArgumentParser<EngineFramerateFixingResetProperties>},

// CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics );
// CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics );
Expand Down Expand Up @@ -199,6 +203,10 @@ void CLuaEngineDefs::AddClass(lua_State* luaVM)
lua_classfunction(luaVM, "setModelTXDID", "engineSetModelTXDID");
lua_classfunction(luaVM, "resetModelTXDID", "engineResetModelTXDID");

lua_classfunction(luaVM, "framerateFixingSetProperty", "engineFramerateFixingSetProperty");
lua_classfunction(luaVM, "framerateFixingGetProperty", "engineFramerateFixingGetProperty");
lua_classfunction(luaVM, "framerateFixingResetProperties", "engineFramerateFixingResetProperties");

lua_registerstaticclass(luaVM, "Engine");

// `EngineStreaming` class
Expand Down Expand Up @@ -2602,3 +2610,28 @@ void CLuaEngineDefs::EnginePreloadWorldArea(CVector position, std::optional<Prel
if (option == PreloadAreaOption::ALL || option == PreloadAreaOption::COLLISIONS)
g_pGame->GetStreaming()->LoadSceneCollision(&position);
}

void CLuaEngineDefs::EngineFramerateFixingResetProperties()
{
g_pMultiplayer->FramerateFixingResetPhysicsTimeStep();
}

void CLuaEngineDefs::EngineFramerateFixingSetProperty(FramerateFixingProperty propertyName, float timestep)
{
switch (propertyName)
{
case FramerateFixingProperty::FFP_VEHICLE_PHYSICS:
g_pMultiplayer->FramerateFixingSetPhysicsTimeStep(timestep);
break;
}
}

std::variant <bool, float> CLuaEngineDefs::EngineFramerateFixingGetProperty(FramerateFixingProperty propertyName)
{
switch (propertyName)
{
case FramerateFixingProperty::FFP_VEHICLE_PHYSICS:
return g_pMultiplayer->FramerateFixingGetPhysicsTimeStep();
}
return false;
}
4 changes: 4 additions & 0 deletions Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ class CLuaEngineDefs : public CLuaDefs

static void EnginePreloadWorldArea(CVector position, std::optional<PreloadAreaOption> option);

static void EngineFramerateFixingResetProperties();
static void EngineFramerateFixingSetProperty(FramerateFixingProperty propertyName, float timestep);
static std::variant<bool, float> EngineFramerateFixingGetProperty(FramerateFixingProperty propertyName);

private:
static void AddEngineColClass(lua_State* luaVM);
static void AddEngineTxdClass(lua_State* luaVM);
Expand Down
6 changes: 5 additions & 1 deletion Client/multiplayer_sa/CMultiplayerSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,11 @@ class CMultiplayerSA : public CMultiplayer
unsigned int EntryInfoNodePool_NoOfUsedSpaces() const noexcept override;
unsigned int PtrNodeDoubleLinkPool_NoOfUsedSpaces() const noexcept override;

//Framerate Fixing Property
void FramerateFixingResetPhysicsTimeStep() override;
void FramerateFixingSetPhysicsTimeStep(float timestep) override;
float FramerateFixingGetPhysicsTimeStep() const noexcept override;

CVector m_vecAkimboTarget;
bool m_bAkimboTargetUp;
static char* ms_PlayerImgCachePtr;
Expand All @@ -390,7 +395,6 @@ class CMultiplayerSA : public CMultiplayer
float m_fShadowsOffset;

bool m_isRapidVehicleStopFixEnabled{false};

/* VOID SetPlayerShotVectors(CPlayerPed* player, Vector3D * vecTarget, Vector3D * vecStart);
VOID SetPlayerCameraVectors(CPlayerPed* player, Vector3D * vecSource, Vector3D * vecFront);
Vector3D * GetLocalShotOriginVector();*/
Expand Down
24 changes: 22 additions & 2 deletions Client/multiplayer_sa/CMultiplayerSA_FrameRateFixes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,12 @@
static bool bWouldBeNewFrame = false;
static unsigned int nLastFrameTime = 0;

// The global constant timestep for framerate fixing.
constexpr float kOriginalTimeStep = 50.0f / 30.0f;

// The timestep for vehicle physics framerate fixing is adjustable by script.
static float kPhysicTimeStep = kOriginalTimeStep;

// Fixes player movement issue while aiming and walking on high FPS.
#define HOOKPOS_CTaskSimpleUseGun__SetMoveAnim 0x61E4F2
#define HOOKSIZE_CTaskSimpleUseGun__SetMoveAnim 0x6
Expand Down Expand Up @@ -714,7 +718,7 @@ static void __declspec(naked) HOOK_CPhysical__ApplyAirResistance()
{
fld ds:[0x862CD0] // 0.99000001f
fld ds:[0xB7CB5C] // CTimer::ms_fTimeStep
fdiv kOriginalTimeStep // 1.666f
fdiv kPhysicTimeStep // 1.666f
mov eax, 0x822130 // powf
call eax

Expand Down Expand Up @@ -742,11 +746,27 @@ static void __declspec(naked) HOOK_VehicleRapidStopFix()
{
fld ds:[0xC2B9CC] // mod_HandlingManager.m_fWheelFriction
fmul ds:[0xB7CB5C] // CTimer::ms_fTimeStep
fdiv kOriginalTimeStep // 1.666f
fdiv kPhysicTimeStep // 1.666f
jmp RETURN_VehicleRapidStopFix
}
}

void CMultiplayerSA::FramerateFixingResetPhysicsTimeStep()
{
kPhysicTimeStep = kOriginalTimeStep;
}

void CMultiplayerSA::FramerateFixingSetPhysicsTimeStep(float timestep)
{
// Just change time step, will be automatically applied when related hook is installed
kPhysicTimeStep = timestep;
}

float CMultiplayerSA::FramerateFixingGetPhysicsTimeStep() const noexcept
{
return kPhysicTimeStep;
}

void CMultiplayerSA::SetRapidVehicleStopFixEnabled(bool enabled)
{
if (m_isRapidVehicleStopFixEnabled == enabled)
Expand Down
4 changes: 4 additions & 0 deletions Client/sdk/multiplayer/CMultiplayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,10 @@ class CMultiplayer
virtual eAnimID GetLastStaticAnimationID() = 0;
virtual DWORD GetLastAnimArrayAddress() = 0;

virtual void FramerateFixingResetPhysicsTimeStep() = 0;
virtual void FramerateFixingSetPhysicsTimeStep(float timestep) = 0;
virtual float FramerateFixingGetPhysicsTimeStep() const noexcept = 0;

virtual unsigned int EntryInfoNodePool_NoOfUsedSpaces() const noexcept = 0;
virtual unsigned int PtrNodeDoubleLinkPool_NoOfUsedSpaces() const noexcept = 0;
};
17 changes: 17 additions & 0 deletions Shared/sdk/enums/FramerateFixingProperty.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*****************************************************************************
*
* PROJECT: Multi Theft Auto
* LICENSE: See LICENSE in the top level directory
* FILE: sdk/FramerateFixingProperty.h
* PURPOSE: Header for common definitions
*
* Multi Theft Auto is available from https://www.multitheftauto.com/
*
*****************************************************************************/

#pragma once

enum class FramerateFixingProperty
{
FFP_VEHICLE_PHYSICS
};