Update for 3.3.0
Documented code for future maintability
This commit is contained in:
parent
711ca80dec
commit
c5dc51a0db
@ -9,14 +9,16 @@ using UnityEngine;
|
|||||||
|
|
||||||
namespace notGreg.UniformAim
|
namespace notGreg.UniformAim
|
||||||
{
|
{
|
||||||
[BepInPlugin("com.notGreg.UniformAim", "notGreg's Uniform Aim for Tarkov", "2.0.0")]
|
[BepInPlugin("com.notGreg.UniformAim", "notGreg's Uniform Aim for Tarkov", "3.3.0")]
|
||||||
public class Plugin : BaseUnityPlugin
|
public class Plugin : BaseUnityPlugin
|
||||||
{
|
{
|
||||||
ConfigEntry<int> configExponent;
|
ConfigEntry<int> configExponent;
|
||||||
|
ConfigEntry<float> configSens;
|
||||||
|
|
||||||
void Awake()
|
void Awake()
|
||||||
{
|
{
|
||||||
configExponent = Config.Bind("General", "Coefficient", 133, new ConfigDescription("", new AcceptableValueRange<int>(10, 200)));
|
configExponent = Config.Bind("General", "Coefficient", 133, new ConfigDescription("", new AcceptableValueRange<int>(10, 200)));
|
||||||
|
configSens = Config.Bind("General", "Sensitivity", 1.0f, new ConfigDescription("", new AcceptableValueRange<float>(0.01f, 2.0f)));
|
||||||
|
|
||||||
new get_AimingSensitivityPatch().Enable();
|
new get_AimingSensitivityPatch().Enable();
|
||||||
}
|
}
|
||||||
@ -26,16 +28,22 @@ namespace notGreg.UniformAim
|
|||||||
float inGameAimedSens;
|
float inGameAimedSens;
|
||||||
public static float aimingSens;
|
public static float aimingSens;
|
||||||
|
|
||||||
|
//this function can be replaced by FixedUpdate() at 50Hz (adjustable via Time.fixedDeltaTime)
|
||||||
|
//FixedUpdate() proved to be slightly more reliable in the past, however it had other unintended effects on the game.
|
||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
|
//check if the world instance exists
|
||||||
//Logger.LogInfo("Checking world instance");
|
//Logger.LogInfo("Checking world instance");
|
||||||
if (Singleton<AbstractGame>.Instance == null)
|
if (Singleton<AbstractGame>.Instance == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//grab the game status of the existing instance
|
||||||
//Logger.LogInfo("Checking game status");
|
//Logger.LogInfo("Checking game status");
|
||||||
GameStatus currentGameStatus = Singleton<AbstractGame>.Instance.Status;
|
GameStatus currentGameStatus = Singleton<AbstractGame>.Instance.Status;
|
||||||
|
|
||||||
|
//check if the game has started and if the player exists. If the player is aiming, update the scoped sensitivity (executed every frame while aiming)
|
||||||
//Logger.LogInfo("Checking GameStatus and isAiming");
|
//Logger.LogInfo("Checking GameStatus and isAiming");
|
||||||
if (currentGameStatus == GameStatus.Started && mainPlayer != null)
|
if (currentGameStatus == GameStatus.Started && mainPlayer != null)
|
||||||
{
|
{
|
||||||
@ -56,12 +64,6 @@ namespace notGreg.UniformAim
|
|||||||
//Logger.LogInfo($"Subscribing to onAimingChanged event");
|
//Logger.LogInfo($"Subscribing to onAimingChanged event");
|
||||||
subscribeOnAimingChanged();
|
subscribeOnAimingChanged();
|
||||||
|
|
||||||
inGameFOV = getInGameFOV();
|
|
||||||
//Logger.LogInfo($"Getting in-game FOV: {inGameFOV}");
|
|
||||||
|
|
||||||
inGameAimedSens = getInGameAimSens();
|
|
||||||
//Logger.LogInfo($"Getting in-game Aiming Sens: {inGameAimedSens}");
|
|
||||||
|
|
||||||
//Logger.LogInfo("TryGetCameras coroutines");
|
//Logger.LogInfo("TryGetCameras coroutines");
|
||||||
StartCoroutine(tryGetMainCamera());
|
StartCoroutine(tryGetMainCamera());
|
||||||
StartCoroutine(tryGetScopeCamera());
|
StartCoroutine(tryGetScopeCamera());
|
||||||
@ -79,16 +81,26 @@ namespace notGreg.UniformAim
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//this function grabs the Field of View from the settings. This is the function that most often needs patching after update.
|
||||||
|
//Appropriate class can usually be found by searching for the ClearSettings function.
|
||||||
int getInGameFOV()
|
int getInGameFOV()
|
||||||
{
|
{
|
||||||
return Singleton<GClass1642>.Instance.Game.Settings.FieldOfView; ;
|
//int fov = Singleton<GClass1642>.Instance.Game.Settings.FieldOfView; //SPT-AKI 3.2.3
|
||||||
|
int fov = Singleton<GClass1653>.Instance.Game.Settings.FieldOfView; //SPT-AKI 3.3.0
|
||||||
|
//Logger.LogInfo($"In-game FOV: {fov}");
|
||||||
|
return fov;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//this function grabs the Aiming Sensitivity from the settings. This is the function that most often needs patching after update.
|
||||||
|
//Appropriate class can usually be found by searching for the ClearSettings function.
|
||||||
float getInGameAimSens()
|
float getInGameAimSens()
|
||||||
{
|
{
|
||||||
return Singleton<GClass1642>.Instance.Control.Settings.MouseAimingSensitivity;
|
//float sens = Singleton<GClass1642>.Instance.Control.Settings.MouseAimingSensitivity; //SPT-AKI 3.2.*
|
||||||
|
float sens = Singleton<GClass1653>.Instance.Control.Settings.MouseAimingSensitivity; //SPT-AKI 3.3.0
|
||||||
|
//Logger.LogInfo($"In-game AimSens: {sens}");
|
||||||
|
return sens;
|
||||||
}
|
}
|
||||||
|
|
||||||
Player getLocalPlayer()
|
Player getLocalPlayer()
|
||||||
@ -99,6 +111,8 @@ namespace notGreg.UniformAim
|
|||||||
WaitForSecondsRealtime myDelay = new WaitForSecondsRealtime(1f);
|
WaitForSecondsRealtime myDelay = new WaitForSecondsRealtime(1f);
|
||||||
Camera mainCamera;
|
Camera mainCamera;
|
||||||
Camera scopeCamera;
|
Camera scopeCamera;
|
||||||
|
|
||||||
|
//this coroutine attempts to find the FPS Camera in the scene.
|
||||||
IEnumerator tryGetMainCamera()
|
IEnumerator tryGetMainCamera()
|
||||||
{
|
{
|
||||||
string cameraName = "FPS Camera";
|
string cameraName = "FPS Camera";
|
||||||
@ -117,6 +131,7 @@ namespace notGreg.UniformAim
|
|||||||
yield return null;
|
yield return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//this coroutine attempts to find existing baseOpticCamera in the scene. The state of this camera is used to determine whether the player is using a magnified optic or not.
|
||||||
IEnumerator tryGetScopeCamera()
|
IEnumerator tryGetScopeCamera()
|
||||||
{
|
{
|
||||||
string cameraName = "BaseOpticCamera(Clone)";
|
string cameraName = "BaseOpticCamera(Clone)";
|
||||||
@ -125,35 +140,41 @@ namespace notGreg.UniformAim
|
|||||||
scopeCamera = GameObject.Find(cameraName).GetComponent<Camera>();
|
scopeCamera = GameObject.Find(cameraName).GetComponent<Camera>();
|
||||||
//Logger.LogInfo($"{scopeCamera.name} found!");
|
//Logger.LogInfo($"{scopeCamera.name} found!");
|
||||||
}
|
}
|
||||||
//else
|
|
||||||
//{
|
|
||||||
//Logger.LogMessage($"Camera \"{cameraName}\" not found");//, rescheduling...");
|
|
||||||
//yield return myDelay;
|
|
||||||
//StartCoroutine(tryGetScopeCamera());
|
|
||||||
yield break;
|
yield break;
|
||||||
//}
|
|
||||||
//yield return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//convert vertical FOV (degrees) to horizontal FOV (degrees)
|
||||||
float calculateHFOV(Camera camera)
|
float calculateHFOV(Camera camera)
|
||||||
{
|
{
|
||||||
return Camera.VerticalToHorizontalFieldOfView(camera.fieldOfView, camera.aspect);
|
return Camera.VerticalToHorizontalFieldOfView(camera.fieldOfView, camera.aspect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//figure out whether the player is using a magnified optic or not. Return the FOV of the sight.
|
||||||
Camera determineCurrentAimedFOV()
|
Camera determineCurrentAimedFOV()
|
||||||
{
|
{
|
||||||
string scopeName = mainPlayer.ProceduralWeaponAnimation.CurrentAimingMod.Item.Name;
|
var currentAimingMode = mainPlayer.ProceduralWeaponAnimation.CurrentAimingMod;
|
||||||
var scopeIndex = mainPlayer.ProceduralWeaponAnimation.CurrentAimingMod.SelectedScopeIndex;
|
|
||||||
var scopeMode = mainPlayer.ProceduralWeaponAnimation.CurrentAimingMod.SelectedScopeMode;
|
|
||||||
|
|
||||||
|
//get the name of the currently active scope
|
||||||
|
string scopeName = currentAimingMode.Item.Template.Name;
|
||||||
|
|
||||||
|
//Logger.LogInfo($"Scope name: {scopeName}");
|
||||||
|
|
||||||
|
//scopeMode determines the scope being used (e.g. main magnified optic at index 0, backup RDS at index 1)
|
||||||
|
//scopeIndex determines the mode of the scope being used (e.g. x1 magnification at index 0, x4 magnification at index 1)
|
||||||
|
//there are exceptions to this rule thanks to BSG's inconsistency, some of them are patched below
|
||||||
|
var scopeIndex = currentAimingMode.SelectedScopeIndex;
|
||||||
|
var scopeMode = currentAimingMode.SelectedScopeMode;
|
||||||
|
|
||||||
|
//patches for specific scopes, matches item name
|
||||||
switch (scopeName)
|
switch (scopeName)
|
||||||
{
|
{
|
||||||
case "tactical_mp155_kalashnikov_ultima_camera(Clone)":
|
case "tactical_mp155_kalashnikov_ultima_camera":
|
||||||
{
|
{
|
||||||
//Logger.LogInfo("MP-155 Thermal");
|
//Logger.LogInfo("MP-155 Thermal");
|
||||||
return mainCamera;
|
return mainCamera;
|
||||||
}
|
}
|
||||||
case "scope_leupold_d_evo(Clone)":
|
//SAM-SWAT's Leupold D-Evo optic patch. The modes on this scope are reversed. Causes detection based on baseOpticCamera to fail as the magnified optic camera is always active
|
||||||
|
case "scope_leupold_d_evo":
|
||||||
{
|
{
|
||||||
if (scopeMode == 0)
|
if (scopeMode == 0)
|
||||||
{
|
{
|
||||||
@ -184,24 +205,33 @@ namespace notGreg.UniformAim
|
|||||||
|
|
||||||
float calculateSensitivity()
|
float calculateSensitivity()
|
||||||
{
|
{
|
||||||
|
//grab vertical hipfire field of view (FOV set by the user in the setting), then convert it to horizontal FOV
|
||||||
|
//convert degrees to radians
|
||||||
float hipFOV = Mathf.Deg2Rad * Camera.VerticalToHorizontalFieldOfView(inGameFOV, mainCamera.aspect);
|
float hipFOV = Mathf.Deg2Rad * Camera.VerticalToHorizontalFieldOfView(inGameFOV, mainCamera.aspect);
|
||||||
|
|
||||||
|
//grab current field of view while aiming, then convert it to horizontal FOV
|
||||||
|
//convert degrees to radians
|
||||||
float aimedFOV = Mathf.Deg2Rad * calculateHFOV(determineCurrentAimedFOV());
|
float aimedFOV = Mathf.Deg2Rad * calculateHFOV(determineCurrentAimedFOV());
|
||||||
|
|
||||||
|
//exponent applied to the ratio of aimedFOV to hipFOV, causes sights to become relatively faster or slower as zoom increases
|
||||||
float exponent = 100f / configExponent.Value;
|
float exponent = 100f / configExponent.Value;
|
||||||
|
|
||||||
float tanRatio = (float)(Mathf.Tan(aimedFOV / 2) / Mathf.Tan(hipFOV / 2));
|
float tanRatio = (float)(Mathf.Tan(aimedFOV / 2) / Mathf.Tan(hipFOV / 2));
|
||||||
|
|
||||||
float sensitivity = (float)Math.Pow(tanRatio, exponent);
|
float sensitivity = (float)Math.Pow(tanRatio, exponent) * inGameAimedSens;
|
||||||
|
|
||||||
//Logger.LogInfo($"Final sensitivity: {sensitivity * inGameAimedSens}");
|
//Logger.LogInfo($"Sensitivity: {sensitivity}");
|
||||||
return sensitivity * inGameAimedSens;
|
return sensitivity * configSens.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void subscribeOnAimingChanged()
|
void subscribeOnAimingChanged()
|
||||||
{
|
{
|
||||||
|
//HandsChangedEvent triggers whenever player changes weapons
|
||||||
|
//without it the patch would cease to work as expected when weapons were changed
|
||||||
mainPlayer.HandsChangedEvent += (handsArgs) =>
|
mainPlayer.HandsChangedEvent += (handsArgs) =>
|
||||||
{
|
{
|
||||||
StartCoroutine(tryGetScopeCamera());
|
//onAimingChanged triggers whenever the player starts or stops aiming.
|
||||||
mainPlayer.HandsController.OnAimingChanged += (aimArgs) =>
|
mainPlayer.HandsController.OnAimingChanged += (aimArgs) =>
|
||||||
{
|
{
|
||||||
inGameFOV = getInGameFOV();
|
inGameFOV = getInGameFOV();
|
||||||
|
@ -30,48 +30,36 @@
|
|||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="Aki.Build">
|
|
||||||
<HintPath>E:\SPT-AKI\SPT-AKI 3.2.3\EscapeFromTarkov_Data\Managed\Aki.Build.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Aki.Common">
|
|
||||||
<HintPath>E:\SPT-AKI\SPT-AKI 3.2.3\EscapeFromTarkov_Data\Managed\Aki.Common.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Aki.Reflection">
|
|
||||||
<HintPath>E:\SPT-AKI\SPT-AKI 3.2.3\EscapeFromTarkov_Data\Managed\Aki.Reflection.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Assembly-CSharp">
|
|
||||||
<HintPath>E:\SPT-AKI\SPT-AKI 3.2.3\EscapeFromTarkov_Data\Managed\Assembly-CSharp.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="BepInEx">
|
|
||||||
<HintPath>E:\SPT-AKI\SPT-AKI 3.2.3\BepInEx\core\BepInEx.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Comfort">
|
|
||||||
<HintPath>E:\SPT-AKI\SPT-AKI 3.2.3\EscapeFromTarkov_Data\Managed\Comfort.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="ItemComponent.Types, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
|
||||||
<SpecificVersion>False</SpecificVersion>
|
|
||||||
<HintPath>E:\SPT-AKI\SPT-AKI 3.2.3\EscapeFromTarkov_Data\Managed\ItemComponent.Types.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Net.Http" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
<Reference Include="UnityEngine">
|
|
||||||
<HintPath>E:\SPT-AKI\SPT-AKI 3.2.3\EscapeFromTarkov_Data\Managed\UnityEngine.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine.CoreModule">
|
|
||||||
<HintPath>E:\SPT-AKI\SPT-AKI 3.2.3\EscapeFromTarkov_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Patch.cs" />
|
<Compile Include="Patch.cs" />
|
||||||
<Compile Include="Plugin.cs" />
|
<Compile Include="Plugin.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Aki.Reflection, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>E:\SPT-AKI\SPT-AKI 3.3.0\EscapeFromTarkov_Data\Managed\Aki.Reflection.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Assembly-CSharp, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>E:\SPT-AKI\SPT-AKI 3.3.0\EscapeFromTarkov_Data\Managed\Assembly-CSharp.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="BepInEx, Version=5.4.21.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>E:\SPT-AKI\SPT-AKI 3.3.0\BepInEx\core\BepInEx.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Comfort, Version=1.0.0.4, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>E:\SPT-AKI\SPT-AKI 3.3.0\EscapeFromTarkov_Data\Managed\Comfort.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>E:\SPT-AKI\SPT-AKI 3.3.0\EscapeFromTarkov_Data\Managed\UnityEngine.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>E:\SPT-AKI\SPT-AKI 3.3.0\EscapeFromTarkov_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
</Project>
|
</Project>
|
Loading…
x
Reference in New Issue
Block a user