Update for SPT-AKI 3.2.1

Compatibility patch for Leupold D-EVO mod
This commit is contained in:
notGreg 2022-08-28 08:19:09 +02:00
parent 43a867df8d
commit 0af21f395f
3 changed files with 97 additions and 41 deletions

View File

@ -1,4 +1,6 @@
using System;
using BepInEx;
using BepInEx.Configuration;
using System;
using UnityEngine;
namespace UniformAim
@ -6,14 +8,14 @@ namespace UniformAim
public class Core
{
//math stuff
public static float CalculateHFOV(float FOV)
public float CalculateHFOV(float FOV)
{
//RETURNS RADIANS
return Camera.VerticalToHorizontalFieldOfView(FOV, Camera.main.aspect);
}
//calculate sensitivity based on FOV delta and coefficient
public static float CalculateSensitivity(float aimedFOV, float hipFOV)
public float CalculateSensitivity(float aimedFOV, float hipFOV)
{
//calculate horizontal FOV values for inputs
aimedFOV = CalculateHFOV(aimedFOV) * Mathf.Deg2Rad;
@ -37,12 +39,53 @@ namespace UniformAim
return false;
}
//figure out current fov based on scope and in-game camera statuses
public static float DetermineCurrentFOV()
public float DetermineCurrentFOV(float FPSCameraFOV, float ScopeCameraFOV, int SelectedScope, int SelectedScopeMode = 0)
{
//dirty fix for the Ultima MP-155 shotgun
if (Plugin.currentFPSCameraFOV> 35 && isScopeCameraActive() && Plugin.currentScopeCameraFOV == 15) { return Plugin.currentFPSCameraFOV; }
try
{
if(GameObject.Find("tactical_mp155_kalashnikov_ultima_camera(Clone)").GetComponent<Behaviour>().isActiveAndEnabled)
{
if (Plugin.currentFPSCameraFOV > (Plugin.configFOV.Value - 15) && isScopeCameraActive() && Plugin.currentScopeCameraFOV == 15) { return Plugin.currentFPSCameraFOV; }
}
}
catch (NullReferenceException)
{
return Plugin.currentFPSCameraFOV;
}
//if (Plugin.currentFPSCameraFOV > (Plugin.configFOV.Value - 15) && isScopeCameraActive() && Plugin.currentScopeCameraFOV == 15) { return Plugin.currentFPSCameraFOV; }
if (Plugin.SelectedScope == 0 && isScopeCameraActive()) { return Plugin.currentScopeCameraFOV; } else { return Plugin.currentFPSCameraFOV; }
//dirty fix for Leupold D-EVO mod
try
{
if(GameObject.Find("scope_leupold_d_evo(Clone)").GetComponent<Behaviour>().isActiveAndEnabled)
{
switch (Plugin.SelectedScope)
{
case 0: return Plugin.currentFPSCameraFOV;
case 1: return Plugin.currentScopeCameraFOV;
}
}
}
catch(NullReferenceException)
{
return Plugin.currentFPSCameraFOV;
}
try
{
if(Camera.main.isActiveAndEnabled && Plugin.SelectedScope == 0 && isScopeCameraActive())
{
return Plugin.currentScopeCameraFOV;
}
else { return Plugin.currentFPSCameraFOV; }
}
catch (NullReferenceException)
{
return Plugin.configFOV.Value;
}
// if (Plugin.SelectedScope == 0 && isScopeCameraActive()) { return Plugin.currentScopeCameraFOV; } else { return Plugin.currentFPSCameraFOV; }
}
}
}

View File

@ -1,27 +1,26 @@
using BepInEx;
using BepInEx.Configuration;
using UnityEngine;
using System;
namespace UniformAim
{
[BepInPlugin("com.greg.tarkovuniformaim", "Uniform Aim for Tarkov", "1.1.2")]
[BepInPlugin("com.greg.tarkovuniformaim", "Uniform Aim for Tarkov", "1.1.3")]
[BepInProcess("EscapeFromTarkov.exe")]
public class Plugin : BaseUnityPlugin
{
//Bepinex.Configurator fields
public static ConfigEntry<int> configFOV;
int[] FOVRange = new int[2] { 50, 75 };
public static ConfigEntry<bool> configFOVRangeOverride;
ConfigEntry<bool> configFOVRangeOverride;
public static ConfigEntry<int> configCoeff;
public static ConfigEntry<int> configSens;
public static ConfigEntry<bool> configDebug;
ConfigEntry<bool> configDebug;
//only for persistence
public static ConfigEntry<float> inGameSens;
ConfigEntry<float> inGameSens;
public static float mySens = 1f;
//public static float aimingSens;
@ -32,21 +31,14 @@ namespace UniformAim
public static bool isAiming = false;
//human-friendly names for variables used later
public static float baseCameraFOV = 75;
float baseCameraFOV = 75;
public static float currentFPSCameraFOV = 75;
public static float currentScopeCameraFOV = 75;
string lastDebugLog;
void printDebug()
{
string debugLog = $"\nIn-Game FOV: {configFOV.Value} | In-Game Sens: {inGameSens.Value} | FOV Override: {configFOVRangeOverride.Value}" +
$"\nFPS Camera FOV: {currentFPSCameraFOV}V / {Core.CalculateHFOV(currentFPSCameraFOV)}H | BaseOpticCamera FOV: {currentScopeCameraFOV}V / {Core.CalculateHFOV(currentScopeCameraFOV)}H | CurrentFOV: {Core.DetermineCurrentFOV()}V / {Core.CalculateHFOV(Core.DetermineCurrentFOV())}H" +
$"\nisAiming? {isAiming} | SelectedScope: {SelectedScope} | SelectedScopeMode:{SelectedScopeMode}" +
$"\nCalculated sensitivity: {Core.CalculateSensitivity(Core.DetermineCurrentFOV(), baseCameraFOV)}" +
$"\nAspect Ratio: {Camera.main.aspect}" +
$"\nFinal Sensitivity: {mySens * inGameSens.Value}";
if (lastDebugLog != debugLog) { Logger.LogInfo(debugLog); lastDebugLog = debugLog; }
}
Core core = new Core();
Utils utils = new Utils();
Vector2 FOVInfo;
Vector2 ScopeInfo;
void Awake()
{
@ -77,31 +69,38 @@ namespace UniformAim
//settings for persistence, these values get updated when the in-game menu is opened
inGameSens = Config.Bind("¡Do not touch unless necessary!", "In-game Aiming Sensitivity value", 0.5f, new ConfigDescription("Should update on its own - kept for persistence between sessions.", new AcceptableValueRange<float>(0.1f, 5.0f)));
}
void FixedUpdate()
{
//FixedUpdate() at 50Hz (Unity default) tickrate appears to resolve the issue of this script breaking when AI spawns
Time.fixedDeltaTime = (1f / 50f);
if (Utils.SetRootObject() != null)
if (utils.SetRootObject() != null)
{
var rootObject = Utils.SetRootObject();
var rootObject = utils.SetRootObject();
//only update these values if the menu has been opened, otherwise read the config
if (rootObject.transform.Find("Game Settings").gameObject.activeInHierarchy)
{
if (!configFOVRangeOverride.Value) { configFOV.Value = 50 + Utils.GetInGameFOV(rootObject); }
inGameSens.Value = Utils.GetInGameSens(rootObject);
if (!configFOVRangeOverride.Value) { configFOV.Value = 50 + utils.GetInGameFOV(rootObject); }
inGameSens.Value = utils.GetInGameSens(rootObject);
}
}
//check if the player is in the Hideout or in a Raid
var isRunning = utils.checkIsReady();
if (!isRunning) return;
try {
if (Camera.main.isActiveAndEnabled != true)
{ return; }
}catch(NullReferenceException)
{
Logger.LogInfo("Main camera is disabled!");
}
//Print debug info in BepInEx console
if (configDebug.Value) printDebug();
//check if the player is in the Hideout or in a Raid
var isRunning = Utils.checkIsReady();
if (!isRunning) return;
if (isRunning)
{
//check if the player is aiming
@ -113,11 +112,25 @@ namespace UniformAim
//Figure out if the FPSCamera is zoomed in, prevents the script from ticking while the player is healing
if (currentFPSCameraFOV < configFOV.Value) {
mySens = inGameSens.Value * Core.CalculateSensitivity(Core.DetermineCurrentFOV(), configFOV.Value);
FOVInfo = new Vector2(currentFPSCameraFOV, currentScopeCameraFOV);
ScopeInfo = new Vector2(SelectedScope, SelectedScopeMode);
mySens = inGameSens.Value * core.CalculateSensitivity(core.DetermineCurrentFOV(FOVInfo.x, FOVInfo.y, (int)ScopeInfo.x, (int)ScopeInfo.y), configFOV.Value);
}
}
}
}
string lastDebugLog;
void printDebug()
{
string debugLog = $"\nIn-Game FOV: {configFOV.Value} | In-Game Sens: {inGameSens.Value} | FOV Override: {configFOVRangeOverride.Value}" +
$"\nFPS Camera FOV: {currentFPSCameraFOV}V / {core.CalculateHFOV(currentFPSCameraFOV)}H | BaseOpticCamera FOV: {currentScopeCameraFOV}V / {core.CalculateHFOV(currentScopeCameraFOV)}H | CurrentFOV: {core.DetermineCurrentFOV(FOVInfo.x, FOVInfo.y, (int)ScopeInfo.x, (int)ScopeInfo.y)}V / {core.CalculateHFOV(core.DetermineCurrentFOV(FOVInfo.x, FOVInfo.y, (int)ScopeInfo.x, (int)ScopeInfo.y))}H" +
$"\nisAiming? {isAiming} | SelectedScope: {SelectedScope} | SelectedScopeMode:{SelectedScopeMode}" +
$"\nCalculated sensitivity: {core.CalculateSensitivity(core.DetermineCurrentFOV(FOVInfo.x, FOVInfo.y, (int)ScopeInfo.x, (int)ScopeInfo.y), baseCameraFOV)}" +
$"\nAspect Ratio: {Camera.main.aspect}" +
$"\nFinal Sensitivity: {mySens}";
if (lastDebugLog != debugLog) { Logger.LogInfo(debugLog); lastDebugLog = debugLog; }
}
}
}

View File

@ -8,10 +8,10 @@ namespace UniformAim
{
public class Utils
{
public static bool isPlaying = false;
public static GameObject rootObject = null;
//bool isPlaying = false;
//GameObject rootObject = null;
public static bool checkIsReady()
public bool checkIsReady()
{
var gameWorld = Singleton<GameWorld>.Instance;
var sessionResultPanel = Singleton<SessionResultPanel>.Instance;
@ -26,7 +26,7 @@ namespace UniformAim
return true;
}
public static bool checkPlayerIsAlive()
bool checkPlayerIsAlive()
{
var gameWorld = Singleton<GameWorld>.Instance;
var currentHealth = gameWorld.AllPlayers[0].HealthController.GetBodyPartHealth(EBodyPart.Common).Current;
@ -35,7 +35,7 @@ namespace UniformAim
}
public static GameObject SetRootObject()
public GameObject SetRootObject()
{
string path = "Common UI/Common UI/SettingsScreen";
@ -47,7 +47,7 @@ namespace UniformAim
else { return null; }
}
public static int GetInGameFOV(GameObject root)
public int GetInGameFOV(GameObject root)
{
GameObject fovObject = root.transform.Find("Game Settings/Image/Other Settings/FOV/FOV").gameObject;
int rootFOV = fovObject.GetComponent<EFT.UI.SelectSlider>().CurrentValue();
@ -55,7 +55,7 @@ namespace UniformAim
return rootFOV;
}
public static float GetInGameSens(GameObject root)
public float GetInGameSens(GameObject root)
{
GameObject sensObject = root.transform.Find("Control Settings/ControlPanel/Mouse Settings/Sensitivity Aiming Panel/Mouse Sensitivity Aiming").gameObject;
float rootSens = sensObject.GetComponent<EFT.UI.FloatSlider>().CurrentValue();