Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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
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(eFramerateFixingProperty)
ADD_ENUM(eFramerateFixingProperty::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(eFramerateFixingProperty);

class CRemoteCall;

Expand Down
35 changes: 35 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,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 +2611,29 @@ 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->FramerateFixingSetPhysicsTimeStep(0); //use default, Should we reset this when player disconnects?
}

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

std::variant <bool, float> CLuaEngineDefs::EngineFramerateFixingGetProperty(eFramerateFixingProperty propertyName)
{
switch (propertyName)
{
case eFramerateFixingProperty::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(eFramerateFixingProperty propertyName, float timestep);
static std::variant<bool, float> EngineFramerateFixingGetProperty(eFramerateFixingProperty 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 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: 21 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,26 @@ 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() 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 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;
};
5 changes: 5 additions & 0 deletions Server/mods/deathmatch/logic/CCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -1068,6 +1068,11 @@ enum eStats
STAT_MAYBE_WU_ZI_MEETING = 342
};

enum class eFramerateFixingProperty
{
FFP_VEHICLE_PHYSICS = 0
};

#include "json.h"
// Prettify toJSON (see mantis #9210)
enum eJSONPrettyType
Expand Down
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 eFramerateFixingProperty
{
FFP_VEHICLE_PHYSICS
};