11/* ****************************************************************************
22 *
3- * PROJECT: Multi Theft Auto v1.0
3+ * PROJECT: Multi Theft Auto
44 * LICENSE: See LICENSE in the top level directory
55 * FILE: game_sa/CSettingsSA.cpp
66 * PURPOSE: Game settings
@@ -24,14 +24,14 @@ unsigned long CSettingsSA::FUNC_GetNumSubSystems;
2424unsigned long CSettingsSA::FUNC_GetCurrentSubSystem;
2525unsigned long CSettingsSA::FUNC_SetSubSystem;
2626
27- #define VAR_CurVideoMode (*((uint*)(0x08D6220 )))
28- #define VAR_SavedVideoMode (*((uint*)(0x0BA6820 )))
29- #define VAR_CurAdapter (*((uint*)(0x0C920F4 )))
27+ #define VAR_CurVideoMode (*((uint*)(0x08D6220 )))
28+ #define VAR_SavedVideoMode (*((uint*)(0x0BA6820 )))
29+ #define VAR_CurAdapter (*((uint*)(0x0C920F4 )))
3030
31- #define HOOKPOS_GetFxQuality 0x49EA50
31+ #define HOOKPOS_GetFxQuality 0x49EA50
3232void HOOK_GetFxQuality ();
3333
34- #define HOOKPOS_StoreShadowForVehicle 0x70BDA0
34+ #define HOOKPOS_StoreShadowForVehicle 0x70BDA0
3535DWORD RETURN_StoreShadowForVehicle = 0x70BDA9 ;
3636void HOOK_StoreShadowForVehicle ();
3737
@@ -227,11 +227,11 @@ float CSettingsSA::GetDrawDistance()
227227void CSettingsSA::SetDrawDistance (float fDistance )
228228{
229229 _asm
230- {
230+ {
231231 push fDistance
232232 call FUNC_SetDrawDistance
233233 add esp, 4
234- }
234+ }
235235 m_pInterface->fDrawDistance = fDistance ;
236236}
237237
@@ -281,11 +281,11 @@ void CSettingsSA::SetAntiAliasing(unsigned int uiAntiAliasing, bool bOnRestart)
281281 {
282282 DWORD dwFunc = FUNC_SetAntiAliasing;
283283 _asm
284- {
284+ {
285285 push uiAntiAliasing
286286 call dwFunc
287287 add esp, 4
288- }
288+ }
289289 SetCurrentVideoMode (m_pInterface->dwVideoMode , false );
290290 }
291291
@@ -369,10 +369,10 @@ void _declspec(naked) HOOK_GetFxQuality()
369369 _asm
370370 {
371371 pushad
372- mov eax, [ecx+054h] // Current FxQuality setting
372+ mov eax, [ecx+054h] // Current FxQuality setting
373373 mov dwFxQualityValue, eax
374374
375- mov eax, [esp+32 ] // Address GetFxQuality was called from
375+ mov eax, [esp+32 ] // Address GetFxQuality was called from
376376 push eax
377377 call MaybeAlterFxQualityValue
378378 add esp, 4
@@ -389,12 +389,12 @@ void _declspec(naked) HOOK_StoreShadowForVehicle()
389389 _asm
390390 {
391391 // Hooked from 0x70BDA0 5 bytes
392- mov eax, [esp+4 ] // Get vehicle
393- mov ax, [eax+34 ] // pEntity->m_nModelIndex
392+ mov eax, [esp+4 ] // Get vehicle
393+ mov ax, [eax+34 ] // pEntity->m_nModelIndex
394394 mov usCallingForVehicleModel, ax
395395 sub esp, 44h
396396 push ebx
397- mov eax, 0x70F9B0 // CVolumetricShadowMgr::IsAvailable
397+ mov eax, 0x70F9B0 // CVolumetricShadowMgr::IsAvailable
398398 call eax
399399 jmp RETURN_StoreShadowForVehicle
400400 }
@@ -562,29 +562,76 @@ void CSettingsSA::SetFieldOfViewVehicleMax(float fAngle, bool bFromScript)
562562// Vehicles LOD draw distance
563563//
564564// //////////////////////////////////////////////
565- void CSettingsSA::SetVehiclesLODDistance ( float fVehiclesLODDistance , float fTrainsPlanesLODDistance )
566- {
567- ms_fVehicleLODDistance = fVehiclesLODDistance ;
568- ms_fTrainPlaneLODDistance = fTrainsPlanesLODDistance ;
569- }
565+ float ms_fClientMaxVehicleLODDistance = DEFAULT_VEHICLE_LOD_DISTANCE;
566+ float ms_fClientMaxTrainPlaneLODDistance = DEFAULT_VEHICLE_LOD_DISTANCE * TRAIN_LOD_DISTANCE_MULTIPLIER;
567+ float ms_fScriptMaxVehicleLODDistance = ms_fClientMaxVehicleLODDistance ;
568+ float ms_fScriptMaxTrainPlaneLODDistance = ms_fClientMaxTrainPlaneLODDistance ;
569+ bool ms_bMaxVehicleLODDistanceFromScript = false ;
570570
571- void CSettingsSA::ResetVehiclesLODDistance ( )
571+ void CSettingsSA::SetVehiclesLODDistance ( float fVehiclesLODDistance , float fTrainsPlanesLODDistance , bool bFromScript )
572572{
573- bool bHighDetailVehicles;
574- g_pCore->GetCVars ()->Get (" high_detail_vehicles" , bHighDetailVehicles);
573+ if (bFromScript)
574+ {
575+ ms_fScriptMaxVehicleLODDistance = fVehiclesLODDistance ;
576+ ms_fScriptMaxTrainPlaneLODDistance = fTrainsPlanesLODDistance ;
577+ ms_bMaxVehicleLODDistanceFromScript = bFromScript;
578+ }
579+ else
580+ {
581+ ms_fClientMaxVehicleLODDistance = fVehiclesLODDistance ;
582+ ms_fClientMaxTrainPlaneLODDistance = fTrainsPlanesLODDistance ;
583+ }
575584
576- if (bHighDetailVehicles )
585+ if (ms_bMaxVehicleLODDistanceFromScript )
577586 {
578- ms_fVehicleLODDistance = MAX_VEHICLE_LOD_DISTANCE ;
579- ms_fTrainPlaneLODDistance = MAX_VEHICLE_LOD_DISTANCE ;
587+ ms_fVehicleLODDistance = Min (ms_fClientMaxVehicleLODDistance, ms_fScriptMaxVehicleLODDistance) ;
588+ ms_fTrainPlaneLODDistance = Min (ms_fClientMaxTrainPlaneLODDistance, ms_fScriptMaxTrainPlaneLODDistance) ;
580589 }
581590 else
582591 {
583- ms_fVehicleLODDistance = DEFAULT_VEHICLE_LOD_DISTANCE ;
584- ms_fTrainPlaneLODDistance = DEFAULT_VEHICLE_LOD_DISTANCE * TRAIN_LOD_DISTANCE_MULTIPLIER ;
592+ ms_fVehicleLODDistance = Min ( fVehiclesLODDistance , ms_fClientMaxVehicleLODDistance) ;
593+ ms_fTrainPlaneLODDistance = Min ( fTrainsPlanesLODDistance , ms_fClientMaxTrainPlaneLODDistance) ;
585594 }
586595}
587596
597+ void CSettingsSA::ResetVehiclesLODDistance (bool bFromScript)
598+ {
599+ if (!bFromScript)
600+ {
601+ bool bHighDetailVehicles;
602+ g_pCore->GetCVars ()->Get (" high_detail_vehicles" , bHighDetailVehicles);
603+
604+ if (bHighDetailVehicles)
605+ {
606+ ms_fClientMaxVehicleLODDistance = MAX_VEHICLE_LOD_DISTANCE;
607+ ms_fClientMaxTrainPlaneLODDistance = MAX_VEHICLE_LOD_DISTANCE;
608+ }
609+ else
610+ {
611+ ms_fClientMaxVehicleLODDistance = DEFAULT_VEHICLE_LOD_DISTANCE;
612+ ms_fClientMaxTrainPlaneLODDistance = DEFAULT_VEHICLE_LOD_DISTANCE * TRAIN_LOD_DISTANCE_MULTIPLIER;
613+ }
614+
615+ // Script still wants to override client setting, let's make sure we use latest max
616+ if (ms_bMaxVehicleLODDistanceFromScript)
617+ {
618+ ms_fVehicleLODDistance = Min (ms_fClientMaxVehicleLODDistance, ms_fScriptMaxVehicleLODDistance);
619+ ms_fTrainPlaneLODDistance = Min (ms_fClientMaxTrainPlaneLODDistance, ms_fScriptMaxTrainPlaneLODDistance);
620+ return ;
621+ }
622+ }
623+
624+ ms_bMaxVehicleLODDistanceFromScript = false ;
625+ ms_fVehicleLODDistance = ms_fClientMaxVehicleLODDistance;
626+ ms_fTrainPlaneLODDistance = ms_fClientMaxTrainPlaneLODDistance;
627+ }
628+
629+ void CSettingsSA::ResetVehiclesLODDistanceFromScript ()
630+ {
631+ ms_bMaxVehicleLODDistanceFromScript = false ;
632+ ResetVehiclesLODDistance (false );
633+ }
634+
588635void CSettingsSA::GetVehiclesLODDistance (float & fVehiclesLODDistance , float & fTrainsPlanesLODDistance )
589636{
590637 fVehiclesLODDistance = ms_fVehicleLODDistance;
@@ -596,29 +643,59 @@ void CSettingsSA::GetVehiclesLODDistance(float& fVehiclesLODDistance, float& fTr
596643// Peds LOD draw distance
597644//
598645// //////////////////////////////////////////////
646+ float ms_fClientMaxPedsLODDistance = DEFAULT_PEDS_LOD_DISTANCE;
647+ float ms_fScriptMaxPedsLODDistance = ms_fClientMaxPedsLODDistance;
648+ bool ms_bMaxPedsLODDistanceFromScript = false ;
599649
600- void CSettingsSA::SetPedsLODDistance (float fPedsLODDistance )
650+ void CSettingsSA::SetPedsLODDistance (float fPedsLODDistance , bool bFromScript )
601651{
602- ms_fPedsLODDistance = fPedsLODDistance ;
603- }
652+ if (bFromScript)
653+ {
654+ ms_fScriptMaxPedsLODDistance = fPedsLODDistance ;
655+ ms_bMaxPedsLODDistanceFromScript = bFromScript;
656+ }
657+ else
658+ ms_fClientMaxPedsLODDistance = fPedsLODDistance ;
604659
605- float CSettingsSA::GetPedsLODDistance ()
606- {
607- return ms_fPedsLODDistance;
660+ if (ms_bMaxPedsLODDistanceFromScript)
661+ ms_fPedsLODDistance = Min (ms_fClientMaxPedsLODDistance, ms_fScriptMaxPedsLODDistance);
662+ else
663+ ms_fPedsLODDistance = Min (fPedsLODDistance , ms_fClientMaxPedsLODDistance);
608664}
609665
610- void CSettingsSA::ResetPedsLODDistance ()
666+ void CSettingsSA::ResetPedsLODDistance (bool bFromScript )
611667{
612- bool bHighDetailPeds;
613- g_pCore->GetCVars ()->Get (" high_detail_peds" , bHighDetailPeds);
614- if (bHighDetailPeds)
668+ if (!bFromScript)
615669 {
616- ms_fPedsLODDistance = MAX_PEDS_LOD_DISTANCE;
617- }
618- else
619- {
620- ms_fPedsLODDistance = DEFAULT_PEDS_LOD_DISTANCE;
670+ bool bHighDetailPeds;
671+ g_pCore->GetCVars ()->Get (" high_detail_peds" , bHighDetailPeds);
672+
673+ if (bHighDetailPeds)
674+ ms_fClientMaxPedsLODDistance = MAX_PEDS_LOD_DISTANCE;
675+ else
676+ ms_fClientMaxPedsLODDistance = DEFAULT_PEDS_LOD_DISTANCE;
677+
678+ // Script still wants to override client setting, let's make sure we use latest max
679+ if (ms_bMaxPedsLODDistanceFromScript)
680+ {
681+ ms_fPedsLODDistance = Min (ms_fClientMaxPedsLODDistance, ms_fScriptMaxPedsLODDistance);
682+ return ;
683+ }
621684 }
685+
686+ ms_bMaxPedsLODDistanceFromScript = false ;
687+ ms_fPedsLODDistance = ms_fClientMaxPedsLODDistance;
688+ }
689+
690+ void CSettingsSA::ResetPedsLODDistanceFromScript ()
691+ {
692+ ms_bMaxPedsLODDistanceFromScript = false ;
693+ ResetPedsLODDistance (false );
694+ }
695+
696+ float CSettingsSA::GetPedsLODDistance ()
697+ {
698+ return ms_fPedsLODDistance;
622699}
623700
624701// //////////////////////////////////////////////
@@ -867,15 +944,14 @@ __declspec(noinline) int OnMY_SelectDevice()
867944}
868945
869946// Hook info
870- #define HOOKPOS_SelectDevice 0x0746219
871- #define HOOKSIZE_SelectDevice 6
947+ #define HOOKPOS_SelectDevice 0x0746219
948+ #define HOOKSIZE_SelectDevice 6
872949DWORD RETURN_SelectDeviceSingle = 0x0746273 ;
873950DWORD RETURN_SelectDeviceMultiHide = 0x074622C ;
874951DWORD RETURN_SelectDeviceMultiShow = 0x0746227 ;
875952void _declspec (naked) HOOK_SelectDevice()
876953{
877- _asm
878- {
954+ _asm {
879955 pushad
880956 call OnMY_SelectDevice
881957 cmp eax, 1
@@ -884,7 +960,7 @@ void _declspec(naked) HOOK_SelectDevice()
884960 jl single
885961 jz multishow
886962
887- // multhide
963+ // multhide
888964 mov eax, 1
889965 jmp RETURN_SelectDeviceMultiHide
890966
0 commit comments