Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
40 changes: 40 additions & 0 deletions Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,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 +202,11 @@ 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,35 @@ void CLuaEngineDefs::EnginePreloadWorldArea(CVector position, std::optional<Prel
if (option == PreloadAreaOption::ALL || option == PreloadAreaOption::COLLISIONS)
g_pGame->GetStreaming()->LoadSceneCollision(&position);
}


bool CLuaEngineDefs::EngineFramerateFixingResetProperties()
{
g_pMultiplayer->FramerateFixingSetPhysicsTimeStep(0); //use default, Should we reset this when player disconnects?
return true;
}

bool CLuaEngineDefs::EngineFramerateFixingSetProperty(std::string strPropertyName, float timestep)
{
if (strPropertyName.compare("vehicle_physics") == 0)
{
g_pMultiplayer->FramerateFixingSetPhysicsTimeStep(timestep);
}
else
{
throw std::invalid_argument("Unsupported property name at argument 1");
}
return true;
}

float CLuaEngineDefs::EngineFramerateFixingGetProperty(std::string strPropertyName)
{
if (strPropertyName.compare("vehicle_physics") == 0)
{
return g_pMultiplayer->FramerateFixingGetPhysicsTimeStep();
}
else
{
throw std::invalid_argument("Unsupported property name at argument 1");
}
}
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 bool EngineFramerateFixingResetProperties();
static bool EngineFramerateFixingSetProperty(std::string strPropertyName, float timestep);
static float EngineFramerateFixingGetProperty(std::string strPropertyName);

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 FramerateFixingSetPhysicsTimeStep(float timestep) override;
float FramerateFixingGetPhysicsTimeStep() 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
21 changes: 18 additions & 3 deletions Client/multiplayer_sa/CMultiplayerSA_FrameRateFixes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@

static bool bWouldBeNewFrame = false;
static unsigned int nLastFrameTime = 0;

constexpr float kOriginalTimeStep = 50.0f / 30.0f;

//
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 +717,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 +745,23 @@ 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::FramerateFixingSetPhysicsTimeStep(float timestep){
// Just change time step, will be automatically applied when related hook is installed
// If time step is not set, kOriginalTimeStep will be used as default;
if (timestep == 0)
timestep = kOriginalTimeStep;
kPhysicTimeStep = timestep;
}

float CMultiplayerSA::FramerateFixingGetPhysicsTimeStep(){
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 FramerateFixingSetPhysicsTimeStep(float timestep) = 0;
virtual float FramerateFixingGetPhysicsTimeStep() = 0;


virtual unsigned int EntryInfoNodePool_NoOfUsedSpaces() const noexcept = 0;
virtual unsigned int PtrNodeDoubleLinkPool_NoOfUsedSpaces() const noexcept = 0;
};