Files

621 lines
18 KiB
Lua
Raw Permalink Normal View History

2025-07-17 18:11:51 +02:00
require(GlobalDependencys:GetDependency("StandardBase"):GetPackageName())
--GAME VARS
fAdditionalFPFOV = 0
fAdditionalTPFOV = 0
fAdditionalDialogFOV = 0
fAdditionalWeaponFOV = 0
fHUDSafeZoneX = 0
fHUDSafeZoneY = 0
Default_Auto = 2.388888836
Default_FPFOV = 0
Default_TPFOV = 0
Default_Safe_Zone_X = 0
Default_Safe_Zone_Y = 0
fAspectRatio = DisplayInfo:GetWidth() / DisplayInfo:GetHeight()
--ControlVars
bFixEnabled = true
bFPFOV = false
bTPFOV = false
bDialogFOV = false
bWeaponFOV = false
bHUD = false
bAspect = false
bPhotoMode = true
AdditionalFPFOV = 1.0
--PROCESS VARS
Process_FriendlyName = Module:GetFriendlyName()
Process_WindowName = "*"
Process_ClassName = "*"
Process_EXEName = "starfield.exe"
--INJECTION BEHAVIOUR
InjectDelay = 100
WriteInterval = 500
SearchInterval = 2000
SuspendThread = false
--Name Manual/Auto/Hybrid Steam/Origin/Any IncludeFile:Configure;Enable;Periodic;Disable;
SupportedVersions = {
{"Automatically Detect", "Hybrid", "Any", "Configure_SignatureScan;Enable_Inject;Periodic;Disable_Inject;"},
}
function Init_Controls()
DefaultControls.AddHeader("Header_FixesEnableDisable","Individual Fixes",245,70,210,17)
DefaultControls.AddFixToggle("CKFPFOVAdjustment_Enable","1st person FOV Adjustment","CKFPFOV_Changed",255,100,180,14)
DefaultControls.AddFixToggle("CKTPFOVAdjustment_Enable","3rd person FOV Adjustment","CKTPFOV_Changed",255,120,180,14)
DefaultControls.AddFixToggle("CKDIALOGFOVAdjustment_Enable","Dialog FOV Adjustment","CKDIALOGFOV_Changed",255,140,180,14)
DefaultControls.AddFixToggle("CKWEAPONFOVAdjustment_Enable","Weapon FOV Adjustment","CKWEAPONFOV_Changed",255,160,180,14)
DefaultControls.AddFixToggle("CKDisableLetterBox_Enable","Override aspect limitation","CKAspect_Changed",255,180,180,14)
DefaultControls.AddFixToggle("CKHUDSafeZone_Enable","HUD Safe zone adjustment","CKHUDSafeZone_Changed",255,200,180,14)
DefaultControls.AddFixToggle("CKPhotoMode_Enable","Disable photomode black bars","CKPhotoMode_Changed",255,220,190,14)
DefaultControls.AddHeader("Header_FPFOV","1st person FOV Fine adjustment",15,70,210,17)
DefaultControls.AddFixedFOVSlider("FPFOVSlider","FPFOVSlider_Changed",55,100,125,35,0,40,0,1)
FPFOVSlider:SetTickFrequency(10)
FPFOVSlider:SetLabel1Text("0")
FPFOVSlider:SetLabel2Text("40")
DefaultControls.AddHeader("Header_TPFOV","3rd person FOV Fine adjustment",15,155,210,17)
DefaultControls.AddFixedFOVSlider("TPFOVSlider","TPFOVSlider_Changed",55,185,125,35,0,90,0,1)
TPFOVSlider:SetTickFrequency(10)
TPFOVSlider:SetLabel1Text("0")
TPFOVSlider:SetLabel2Text("90")
DefaultControls.AddHeader("Header_WEAPONFOV","Weapon FOV Fine adjustment",15,270,210,17)
DefaultControls.AddFixedFOVSlider("WEAPONFOVSlider","WEAPONFOVSlider_Changed",55,300,125,35,0,50,0,1)
WEAPONFOVSlider:SetTickFrequency(10)
WEAPONFOVSlider:SetLabel1Text("0")
WEAPONFOVSlider:SetLabel2Text("50")
DefaultControls.AddHeader("Header_DIALOGFOV","Dialog FOV Fine adjustment",245,270,210,17)
DefaultControls.AddFixedFOVSlider("DIALOGFOVSlider","DIALOGFOVSlider_Changed",245,300,125,35,0,70,0,1)
DIALOGFOVSlider:SetTickFrequency(10)
DIALOGFOVSlider:SetLabel1Text("0")
DIALOGFOVSlider:SetLabel2Text("70")
DefaultControls.AddHeader("Header_SZONEX","HUD width scaling",15,360,210,17)
DefaultControls.AddFixedFOVSlider("SZONEXFOVSlider","SZONEXFOVSlider_Changed",55,390,125,35,0,80,0,1)
SZONEXFOVSlider:SetTickFrequency(10)
SZONEXFOVSlider:SetLabel1Text("0")
SZONEXFOVSlider:SetLabel2Text("80")
DefaultControls.AddHeader("Header_SZONEY","HUD height scaling",245,360,210,17)
DefaultControls.AddFixedFOVSlider("SZONEYFOVSlider","SZONEYFOVSlider_Changed",245,390,125,35,0,80,0,1)
SZONEYFOVSlider:SetTickFrequency(10)
SZONEYFOVSlider:SetLabel1Text("0")
SZONEYFOVSlider:SetLabel2Text("80")
end
function Configure_SignatureScan()
local tAddress = HackTool:AddAddress("FPFOV")
if HackTool:SignatureScan("E8 ?? ?? ?? ?? C4 C1 ?? ?? ?? ?? ?? ?? ?? B1 ?? E8",tAddress,PAGE_EXECUTE_READ,0x0,Process_EXEName) == 0 then
return ErrorOccurred(string.format(SigScanError,tAddress:GetName()))
else
--Starfield.exe+2873F25 - 48 8B CE - mov rcx,rsi
--Starfield.exe+2873F28 - E8 73 EE FF FF - call Starfield.exe+2872DA0
--Starfield.exe+2873F2D - E8 EA 3A 71 FF - call Starfield.exe+1F87A1C
--Starfield.exe+2873F32 - C4 C1 7A 11 86 60 02 00 00 - vmovss [r14+00000260],xmm0
--Starfield.exe+2873F3B - 48 8B CE - mov rcx,rsi
print( tAddress:GetInfo(TYPE_ADDRESS) )
end
local tAddress = HackTool:AddAddress("TPFOV")
if HackTool:SignatureScan("E8 ?? ?? ?? ?? C4 C1 ?? ?? ?? ?? ?? ?? ?? E8 ?? ?? ?? ?? C5 ?? ?? ?? 48 8B",tAddress,PAGE_EXECUTE_READ,0x0,Process_EXEName) == 0 then
return ErrorOccurred(string.format(SigScanError,tAddress:GetName()))
else
--Starfield.exe+2883593 - E8 5C E1 FF FF - call Starfield.exe+28816F4
--Starfield.exe+2883598 - B1 01 - mov cl,01
--Starfield.exe+288359A - E8 E9 44 70 FF - call Starfield.exe+1F87A88
--Starfield.exe+288359F - C4 C1 7A 11 86 60 02 00 00 - vmovss [r14+00000260],xmm0
--Starfield.exe+28835A8 - E8 B3 CD FF FF - call Starfield.exe+2880360
print( tAddress:GetInfo(TYPE_ADDRESS) )
end
local tAddress = HackTool:AddAddress("WeaponFOV")
if HackTool:SignatureScan("80 3D ?? ?? ?? ?? ?? 48 8B ?? ?? ?? ?? ?? C5 FA",tAddress,PAGE_EXECUTE_READ,0x07,Process_EXEName) == 0 then
return ErrorOccurred(string.format(SigScanError,tAddress:GetName()))
else
--Starfield.exe+1F817A2 - E8 65 92 8E 00 - call Starfield.exe+286AA0C
--Starfield.exe+1F817A7 - 80 3D CA F5 98 03 00 - cmp byte ptr [Starfield.exe+5910D78],00
--Starfield.exe+1F817AE - 48 8B 05 23 C9 76 03 - mov rax,[Starfield.exe+56EE0D8]
--Starfield.exe+1F817B5 - C5 FA 11 80 D8 02 00 00 - vmovss [rax+000002D8],xmm0
--Starfield.exe+1F817BD - 48 8B 05 DC 31 9B 03 - mov rax,[Starfield.exe+59349A0]
print( tAddress:GetInfo(TYPE_ADDRESS) )
end
local tAddress = HackTool:AddAddress("Aspect")
if HackTool:SignatureScan("C5 FA ?? ?? ?? ?? ?? ?? C5 FA ?? ?? ?? ?? ?? ?? C5 F8 ?? ?? 76 ?? C5 E2 ?? ??",tAddress,PAGE_EXECUTE_READ,0x0,Process_EXEName) == 0 then
return ErrorOccurred(string.format(SigScanError,tAddress:GetName()))
else
--Starfield.exe+2DFE45F - C5 F8 28 C1 - vmovaps xmm0,xmm1
--Starfield.exe+2DFE463 - EB 10 - jmp Starfield.exe+2DFE475
--Starfield.exe+2DFE465 - C5 FA 10 0D C3 3B 7E 02 - vmovss xmm1,[Starfield.exe+55E2030]
--Starfield.exe+2DFE46D - C5 FA 10 05 DB 3B 7E 02 - vmovss xmm0,[Starfield.exe+55E2050]
--Starfield.exe+2DFE475 - C5 F8 2F D1 - vcomiss xmm2,xmm1
print( tAddress:GetInfo(TYPE_ADDRESS) )
tAddress:AcquireAddress(0x4)
print( tAddress:GetInfo(TYPE_FLOAT) )
Default_Auto = tAddress:ReadFloat()
tAddress:SetAutoUnprotect(true)
end
local tAddress = HackTool:AddAddress("DialogFOV")
if HackTool:SignatureScan("74 ?? C5 FA ?? ?? ?? ?? ?? ?? E9 ?? ?? ?? ?? 48 8D",tAddress,PAGE_EXECUTE_READ,0x0,Process_EXEName) == 0 then
return ErrorOccurred(string.format(SigScanError,tAddress:GetName()))
else
--Starfield.exe+1A55802 - C5 FA 11 85 A8 01 00 00 - vmovss [rbp+000001A8],xmm0
--Starfield.exe+1A5580A - F6 87 A4 00 00 00 08 - test byte ptr [rdi+000000A4],08
--Starfield.exe+1A55811 - 74 0D - je Starfield.exe+1A55820
--Starfield.exe+1A55813 - C5 FA 10 35 4D 06 B1 03 - vmovss xmm6,[Starfield.exe+5565E68]
--Starfield.exe+1A5581B - E9 C9 00 00 00 - jmp Starfield.exe+1A558E9
local DialogFOV_1 = HackTool:AddAddress("DialogFOV_1", tAddress)
local DialogFOV_2 = HackTool:AddAddress("DialogFOV_2", tAddress)
DialogFOV_1:OffsetAddress(0xa)
print( DialogFOV_1:GetInfo(TYPE_ADDRESS) )
print( DialogFOV_2:GetInfo(TYPE_ADDRESS) )
end
local tAddress = HackTool:AddAddress("SafeZone")
if HackTool:SignatureScan("C5 F8 ?? ?? ?? ?? ?? ?? 76 ?? C4 E1",tAddress,PAGE_EXECUTE_READ,0x0a,Process_EXEName) == 0 then
return ErrorOccurred(string.format(SigScanError,tAddress:GetName()))
else
--Starfield.exe+2E70AE8 - C5 F8 2F 0D A8 01 92 01 - vcomiss xmm1,[Starfield.exe+4790C98]
--Starfield.exe+2E70AF0 - 76 14 - jna Starfield.exe+2E70B06
--Starfield.exe+2E70AF2 - C4 E1 FA 2C 0D 85 50 77 02 - vcvttss2si rcx,[Starfield.exe+55E5B80]
--Starfield.exe+2E70AFB - C4 E1 FA 2C 15 9C 50 77 02 - vcvttss2si rdx,[Starfield.exe+55E5BA0]
--Starfield.exe+2E70B04 - EB 12 - jmp Starfield.exe+2E70B18
local SafeZoneX = HackTool:AddAddress("SafeZoneX", tAddress)
local SafeZoneY = HackTool:AddAddress("SafeZoneY", tAddress)
SafeZoneY:OffsetAddress(0x9)
print( SafeZoneX:GetInfo(TYPE_ADDRESS) )
SafeZoneX:AcquireAddress(0x5)
print( SafeZoneX:GetInfo(TYPE_FLOAT) )
Default_Safe_Zone_X = SafeZoneX:ReadFloat()
SafeZoneX:SetAutoUnprotect(true)
print( SafeZoneY:GetInfo(TYPE_ADDRESS) )
SafeZoneY:AcquireAddress(0x5)
print( SafeZoneY:GetInfo(TYPE_FLOAT) )
Default_Safe_Zone_Y = SafeZoneY:ReadFloat()
SafeZoneY:SetAutoUnprotect(true)
end
local tAddress = HackTool:AddAddress("PhotoMode")
if HackTool:SignatureScan("C7 47 ?? ?? ?? ?? ?? C6 ?? ?? ?? EB ?? 38",tAddress,PAGE_EXECUTE_READ,0x0,Process_EXEName) == 0 then
return ErrorOccurred(string.format(SigScanError,tAddress:GetName()))
else
--Starfield.exe+2E79A9E - 48 8B 0D 33 46 87 02 - mov rcx,[Starfield.exe+56EE0D8]
--Starfield.exe+2E79AA5 - 48 83 C1 08 - add rcx,08
--Starfield.exe+2E79AA9 - C7 41 44 39 8E E3 3F - mov [rcx+44],3FE38E39
--Starfield.exe+2E79AB0 - C6 41 42 01 - mov byte ptr [rcx+42],01
--Starfield.exe+2E79AB4 - EB 16 - jmp Starfield.exe+2E79ACC
print( tAddress:GetInfo(TYPE_ADDRESS) )
end
return true
end
function Enable_Inject()
local Variables = HackTool:AllocateMemory("Variables",0)
Variables:PushFloat("FOVFP_In")
Variables:PushFloat("FOVFP_Out")
Variables:PushFloat("FOVTP_In")
Variables:PushFloat("FOVTP_Out")
Variables:PushFloat("FOVDialog_In")
Variables:PushFloat("FOVDialog_Out")
Variables:PushFloat("FOVWeapon_In")
Variables:PushFloat("FOVWeapon_Out")
Variables:PushFloat("AdditionalFPFOV")
Variables:PushFloat("AdditionalTPFOV")
Variables:PushFloat("AdditionalDialogFOV")
Variables:PushFloat("AdditionalWeaponFOV")
Variables:PushFloat("AspectRatio")
Variables:Allocate()
Variables["AspectRatio"]:WriteFloat(fAspectRatio)
ResolutionChanged()
asm = [[
(codecave:jmp)FPFOV,FPFOV_cc:
%originalcode%
movss [(allocation)Variables->FOVFP_In],xmm0
addss xmm0, [(allocation)Variables->AdditionalFPFOV]
movss [(allocation)Variables->FOVFP_Out],xmm0
jmp %returnaddress%
%end%
(codecave:jmp)TPFOV,TPFOV_cc:
%originalcode%
movss [(allocation)Variables->FOVTP_In],xmm0
addss xmm0, [(allocation)Variables->AdditionalTPFOV]
movss [(allocation)Variables->FOVTP_Out],xmm0
jmp %returnaddress%
%end%
(codecave:jmp)WeaponFOV,WeaponFOV_cc:
movss [(allocation)Variables->FOVWeapon_In],xmm0
addss xmm0, [(allocation)Variables->AdditionalWeaponFOV]
movss [(allocation)Variables->FOVWeapon_Out],xmm0
%originalcode%
jmp %returnaddress%
%end%
(codecave:jmp)PhotoMode,PhotoMode_cc:
fld dword ptr [(allocation)Variables->AspectRatio]
fstp dword ptr [$$1] $ctx=1
jmp %returnaddress%
%end%
(codecave:jmp)DialogFOV_1,DialogFOV_1_cc:
movss [(allocation)Variables->FOVDialog_In],xmm6
addss xmm6, [(allocation)Variables->AdditionalDialogFOV]
movss [(allocation)Variables->FOVDialog_Out],xmm6
%originalcode%
jmp %returnaddress%
%end%
(codecave)DialogFOV_2,DialogFOV_2_cc:
nop
nop
%end%
]]
if HackTool:CompileAssembly(asm,"Fixes") == nil then
return ErrorOccurred("Assembly compilation failed...")
else
Toggle_CodeCave("FPFOV_cc",bFPFOV)
Toggle_CodeCave("TPFOV_cc",bTPFOV)
Toggle_CodeCave("DialogFOV_1_cc",bDialogFOV)
Toggle_CodeCave("DialogFOV_2_cc",bDialogFOV)
Toggle_CodeCave("WeaponFOV_cc",bWeaponFOV)
Toggle_CodeCave("PhotoMode_cc",bPhotoMode)
end
if bFPFOV == true then
WriteFPFOV()
end
if bTPFOV == true then
WriteTPFOV()
end
if bDialogFOV == true then
WriteDialogFOV()
end
WriteWeaponFOV()
if bAspect == true then
WriteAspectRatio()
end
if bHUD == true then
WriteHUDSafeZone()
end
end
function Periodic()
PluginViewport:AppendStatusMessage( "\r\n" )
local Variables = HackTool:GetAllocation("Variables")
if Variables and Variables["FOVFP_In"] then
if bFPFOV or bTPFOV == true then
PluginViewport:AppendStatusMessage( string.format("1st person FOV In=%.2f, Out=%.2f -- 3rd person FOV In=%.2f, Out=%.2f\r\nDialog FOV In=%.2f, Out=%.2f -- Weapon FOV In=%.2f, Out=%.2f", Variables["FOVFP_In"]:ReadFloat(), Variables["FOVFP_Out"]:ReadFloat(), Variables["FOVTP_In"]:ReadFloat(), Variables["FOVTP_Out"]:ReadFloat(), Variables["FOVDialog_In"]:ReadFloat(), Variables["FOVDialog_Out"]:ReadFloat(), Variables["FOVWeapon_In"]:ReadFloat(), Variables["FOVWeapon_Out"]:ReadFloat()) )
end
end
end
function Disable_Inject()
if bFPFOV == true then
RestoreFPFOV()
end
if bTPFOV == true then
RestoreTPFOV()
end
if bAspect == true then
RestoreAspectDefaults()
end
CleanUp()
end
function FPFOVSlider_Changed(Sender)
fAdditionalFPFOV = Sender:GetPosition()
lblFPFOVSlider.Caption:SetCaption( string.format("Value: +%.0f",fAdditionalFPFOV) )
if bFPFOV == true then
WriteFPFOV()
end
ForceUpdate()
end
function TPFOVSlider_Changed(Sender)
fAdditionalTPFOV = Sender:GetPosition()
lblTPFOVSlider.Caption:SetCaption( string.format("Value: +%.0f",fAdditionalTPFOV) )
if bTPFOV == true then
WriteTPFOV()
end
ForceUpdate()
end
function WEAPONFOVSlider_Changed(Sender)
fAdditionalWeaponFOV = Sender:GetPosition()
lblWEAPONFOVSlider.Caption:SetCaption( string.format("Value: +%.0f",fAdditionalWeaponFOV) )
if bWeaponFOV == true then
WriteWeaponFOV()
end
ForceUpdate()
end
function DIALOGFOVSlider_Changed(Sender)
fAdditionalDialogFOV = Sender:GetPosition()
lblDIALOGFOVSlider.Caption:SetCaption( string.format("Value: +%.0f",fAdditionalDialogFOV) )
if bDialogFOV == true then
WriteDialogFOV()
end
ForceUpdate()
end
function SZONEXFOVSlider_Changed(Sender)
fHUDSafeZoneX = Sender:GetPosition()
lblSZONEXFOVSlider.Caption:SetCaption( string.format("Value: %.0f%%",fHUDSafeZoneX) )
if bHUD == true then
WriteHUDSafeZone()
end
ForceUpdate()
end
function SZONEYFOVSlider_Changed(Sender)
fHUDSafeZoneY = Sender:GetPosition()
lblSZONEYFOVSlider.Caption:SetCaption( string.format("Value: %.0f%%",fHUDSafeZoneY) )
if bHUD == true then
WriteHUDSafeZone()
end
ForceUpdate()
end
function CKFPFOV_Changed(Sender)
bFPFOV = Toggle_CheckFix(Sender)
Toggle_CodeCave("FPFOV_cc",bFPFOV)
ForceUpdate()
end
function CKTPFOV_Changed(Sender)
bTPFOV = Toggle_CheckFix(Sender)
Toggle_CodeCave("TPFOV_cc",bTPFOV)
ForceUpdate()
end
function CKWEAPONFOV_Changed(Sender)
bWeaponFOV = Toggle_CheckFix(Sender)
Toggle_CodeCave("WeaponFOV_cc",bWeaponFOV)
ForceUpdate()
end
function CKDIALOGFOV_Changed(Sender)
bDialogFOV = Toggle_CheckFix(Sender)
Toggle_CodeCave("DialogFOV_1_cc",bDialogFOV)
Toggle_CodeCave("DialogFOV_2_cc",bDialogFOV)
ForceUpdate()
end
function CKAspect_Changed(Sender)
bAspect = Toggle_CheckFix(Sender)
if bAspect == false then
RestoreAspectDefaults()
else
WriteAspectRatio()
end
ForceUpdate()
end
function CKHUDSafeZone_Changed(Sender)
bHUD = Toggle_CheckFix(Sender)
if bHUD == false then
RestoreHUDDefaults()
else
WriteHUDSafeZone()
end
ForceUpdate()
end
function CKPhotoMode_Changed(Sender)
bPhotoMode = Toggle_CheckFix(Sender)
Toggle_CodeCave("PhotoMode_cc",bPhotoMode)
ForceUpdate()
end
function ResolutionChanged()
fAspectRatio = DisplayInfo:GetAspectRatio()
if bAspect == true then
WriteAspectRatio()
end
end
function WriteAspectRatio()
local AspectRatio = HackTool:GetAddress("Aspect")
if AspectRatio then
AspectRatio:WriteFloat(fAspectRatio)
print("Updated aspect ratio")
end
end
function RestoreAspectDefaults()
local AspectRatio = HackTool:GetAddress("Aspect")
if AspectRatio then
AspectRatio:WriteFloat(Default_Auto)
print("Restored aspect ratio default")
end
end
function WriteHUDSafeZone()
local HUDSafeZoneX = HackTool:GetAddress("SafeZoneX")
local HUDSafeZoneY = HackTool:GetAddress("SafeZoneY")
local fSaveZoneX = (DisplayInfo:GetWidth() / 2) * (fHUDSafeZoneX / 100)
local fSaveZoneY = (DisplayInfo:GetHeight() / 2) * (fHUDSafeZoneY / 100)
if HUDSafeZoneX and HUDSafeZoneY then
HUDSafeZoneX:WriteFloat(fSaveZoneX)
HUDSafeZoneY:WriteFloat(fSaveZoneY)
end
end
function RestoreHUDDefaults()
local HUDSafeZoneX = HackTool:GetAddress("SafeZoneX")
local HUDSafeZoneY = HackTool:GetAddress("SafeZoneY")
if HUDSafeZoneX and HUDSafeZoneY then
HUDSafeZoneX:WriteFloat(Default_Safe_Zone_X)
HUDSafeZoneY:WriteFloat(Default_Safe_Zone_Y)
end
end
function WriteFPFOV()
local Variables = HackTool:GetAllocation("Variables")
if Variables and Variables["AdditionalFPFOV"] then
Variables["AdditionalFPFOV"]:WriteFloat(fAdditionalFPFOV)
end
end
function WriteTPFOV()
local Variables = HackTool:GetAllocation("Variables")
if Variables and Variables["AdditionalTPFOV"] then
Variables["AdditionalTPFOV"]:WriteFloat(fAdditionalTPFOV)
end
end
function WriteDialogFOV()
local Variables = HackTool:GetAllocation("Variables")
if Variables and Variables["AdditionalDialogFOV"] then
Variables["AdditionalDialogFOV"]:WriteFloat(fAdditionalDialogFOV)
end
end
function WriteWeaponFOV()
local Variables = HackTool:GetAllocation("Variables")
if Variables and Variables["AdditionalWeaponFOV"] then
Variables["AdditionalWeaponFOV"]:WriteFloat(fAdditionalWeaponFOV)
end
end
function RestoreFPFOV()
local FPFOV = HackTool:GetAddress("FPFOV")
if FPFOV then
FPFOV:WriteFloat(Default_FPFOV)
end
end
function RestoreTPFOV()
local TPFOV = HackTool:GetAddress("TPFOV")
if TPFOV then
TPFOV:WriteFloat(Default_TPFOV)
end
end
function Init()
Init_BaseControls()
Init_Controls()
end
function DeInit()
DisableFix()
end