Added EFT TrackIR plugin
This commit is contained in:
parent
679f2eda5f
commit
d79e7a4c62
45
JBTrackIR/JBTrackIR.csproj
Normal file
45
JBTrackIR/JBTrackIR.csproj
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
|
<AssemblyName>JBTrackIR</AssemblyName>
|
||||||
|
<Description>My first plugin</Description>
|
||||||
|
<Version>1.0.0</Version>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
<RestoreAdditionalProjectSources>
|
||||||
|
https://api.nuget.org/v3/index.json;
|
||||||
|
https://nuget.bepinex.dev/v3/index.json;
|
||||||
|
https://nuget.samboy.dev/v3/index.json
|
||||||
|
</RestoreAdditionalProjectSources>
|
||||||
|
<RootNamespace>JBTrackIR</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition="'$(TargetFramework.TrimEnd(`0123456789`))' == 'net'">
|
||||||
|
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.2" PrivateAssets="all" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="0Harmony">
|
||||||
|
<HintPath>..\References\0Harmony.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Aki.Reflection">
|
||||||
|
<HintPath>..\References\Aki.Reflection.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Assembly-CSharp">
|
||||||
|
<HintPath>..\References\Assembly-CSharp.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="BepInEx">
|
||||||
|
<HintPath>..\References\BepInEx.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="TrackIRUnity">
|
||||||
|
<HintPath>..\References\TrackIRUnity.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine">
|
||||||
|
<HintPath>..\References\UnityEngine.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
|
<HintPath>..\References\UnityEngine.CoreModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
25
JBTrackIR/JBTrackIR.sln
Normal file
25
JBTrackIR/JBTrackIR.sln
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.5.33516.290
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JBTrackIR", "JBTrackIR.csproj", "{A4AC854D-33F9-464C-A05D-E1030F892CB1}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{A4AC854D-33F9-464C-A05D-E1030F892CB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A4AC854D-33F9-464C-A05D-E1030F892CB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A4AC854D-33F9-464C-A05D-E1030F892CB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A4AC854D-33F9-464C-A05D-E1030F892CB1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {C22410CD-BDAB-4AE8-87C7-E5CF5D1A0FFA}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
174
JBTrackIR/Plugin.cs
Normal file
174
JBTrackIR/Plugin.cs
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
using Aki.Reflection.Patching;
|
||||||
|
using BepInEx;
|
||||||
|
using BepInEx.Configuration;
|
||||||
|
using EFT;
|
||||||
|
using EFT.Animations;
|
||||||
|
using EFT.InventoryLogic;
|
||||||
|
using HarmonyLib;
|
||||||
|
using RootMotion;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Reflection.Emit;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using TrackIRUnity;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace JBTrackIR;
|
||||||
|
|
||||||
|
[BepInPlugin("com.jonbons.trackir", "JonBons.TrackIR", "1.0.0")]
|
||||||
|
public class Plugin : BaseUnityPlugin
|
||||||
|
{
|
||||||
|
static ConfigEntry<bool> tirEnabled;
|
||||||
|
static ConfigEntry<float> tirSensitivityCoef;
|
||||||
|
static ConfigEntry<int> tirLimitPitchLower;
|
||||||
|
static ConfigEntry<int> tirLimitPitchUpper;
|
||||||
|
static ConfigEntry<int> tirLimitYawLower;
|
||||||
|
static ConfigEntry<int> tirLimitYawUpper;
|
||||||
|
static TrackIRClient tirClient;
|
||||||
|
static bool tirRunning = false;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
// Plugin startup logic
|
||||||
|
Logger.LogInfo($"Plugin com.jonbons.trackir is loaded!");
|
||||||
|
|
||||||
|
tirClient = new TrackIRClient();
|
||||||
|
if (tirClient != null && !tirRunning)
|
||||||
|
{
|
||||||
|
tirClient.TrackIR_Enhanced_Init();
|
||||||
|
tirRunning = true;
|
||||||
|
Logger.LogInfo($"com.jonbons.trackir: trackir is running");
|
||||||
|
}
|
||||||
|
|
||||||
|
BindSettings();
|
||||||
|
|
||||||
|
new Transpiler().Enable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDestroy()
|
||||||
|
{
|
||||||
|
if (tirClient != null && tirRunning)
|
||||||
|
{
|
||||||
|
tirClient.TrackIR_Shutdown();
|
||||||
|
tirRunning = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BindSettings()
|
||||||
|
{
|
||||||
|
tirEnabled = Config.Bind(
|
||||||
|
"Main Settings",
|
||||||
|
"TrackIR Enabled",
|
||||||
|
true,
|
||||||
|
new ConfigDescription("Enable TrackIR support")
|
||||||
|
);
|
||||||
|
|
||||||
|
tirSensitivityCoef = Config.Bind(
|
||||||
|
"Main Settings",
|
||||||
|
"TrackIR Sensitivity coef",
|
||||||
|
0.5f,
|
||||||
|
new ConfigDescription("Senstivity coefficient to apply to all TrackIR inputs",
|
||||||
|
new AcceptableValueRange<float>(0, 1))
|
||||||
|
);
|
||||||
|
|
||||||
|
tirLimitPitchLower = Config.Bind(
|
||||||
|
"Main Settings",
|
||||||
|
"TrackIR Pitch lower limit",
|
||||||
|
-85,
|
||||||
|
new ConfigDescription("Lower limit of TrackIR pitch angles",
|
||||||
|
new AcceptableValueRange<int>(-180, 180))
|
||||||
|
);
|
||||||
|
|
||||||
|
tirLimitPitchUpper = Config.Bind(
|
||||||
|
"Main Settings",
|
||||||
|
"TrackIR Pitch upper limit",
|
||||||
|
85,
|
||||||
|
new ConfigDescription("Upper limit of TrackIR pitch angles",
|
||||||
|
new AcceptableValueRange<int>(-180, 180))
|
||||||
|
);
|
||||||
|
|
||||||
|
tirLimitYawLower = Config.Bind(
|
||||||
|
"Main Settings",
|
||||||
|
"TrackIR Yaw lower limit",
|
||||||
|
-150,
|
||||||
|
new ConfigDescription("Lower limit of TrackIR yaw angles",
|
||||||
|
new AcceptableValueRange<int>(-180, 180))
|
||||||
|
);
|
||||||
|
|
||||||
|
tirLimitYawUpper = Config.Bind(
|
||||||
|
"Main Settings",
|
||||||
|
"TrackIR Yaw upper limit",
|
||||||
|
150,
|
||||||
|
new ConfigDescription("Upper limit of TrackIR yaw angles",
|
||||||
|
new AcceptableValueRange<int>(-180, 180))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class Limit
|
||||||
|
{
|
||||||
|
public Limit()
|
||||||
|
{
|
||||||
|
lower = 0;
|
||||||
|
upper = 360;
|
||||||
|
}
|
||||||
|
public Limit(float low, float up)
|
||||||
|
{
|
||||||
|
lower = low;
|
||||||
|
upper = up;
|
||||||
|
}
|
||||||
|
public float lower, upper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Transpiler : ModulePatch
|
||||||
|
{
|
||||||
|
protected override MethodBase GetTargetMethod()
|
||||||
|
{
|
||||||
|
return typeof(Player).GetMethod("Look", BindingFlags.Instance | BindingFlags.Public);
|
||||||
|
}
|
||||||
|
|
||||||
|
[PatchPostfix]
|
||||||
|
private static void PatchPostfix(ref Player __instance)
|
||||||
|
{
|
||||||
|
if (!tirRunning) return;
|
||||||
|
if (!tirEnabled.Value) return;
|
||||||
|
|
||||||
|
float positionReductionFactor = 0.045f * tirSensitivityCoef.Value;
|
||||||
|
float rotationReductionFactor = 0.045f * tirSensitivityCoef.Value;
|
||||||
|
Limit positionXLimits = new Limit();
|
||||||
|
Limit positionYLimits = new Limit();
|
||||||
|
Limit positionZLimits = new Limit();
|
||||||
|
Limit pitchLimits = new Limit(tirLimitPitchLower.Value, tirLimitPitchUpper.Value);
|
||||||
|
Limit yawLimits = new Limit(tirLimitYawLower.Value, tirLimitYawUpper.Value);
|
||||||
|
Limit rollLimits = new Limit(-100, 100);
|
||||||
|
bool useLimits = true;
|
||||||
|
|
||||||
|
//Logger.LogInfo(string.Format("TIR DATA Start"));
|
||||||
|
|
||||||
|
TrackIRClient tirClient = Plugin.tirClient;
|
||||||
|
|
||||||
|
TrackIRClient.LPTRACKIRDATA tid = tirClient.client_HandleTrackIRData(); // Data for head tracking
|
||||||
|
|
||||||
|
//Logger.LogInfo(string.Format("TIR DATA Pitch = {0}; Yaw = {1}, Roll = {2}", tid.fNPPitch, tid.fNPYaw, tid.fNPRoll));
|
||||||
|
|
||||||
|
Vector3 rot = __instance.ProceduralWeaponAnimation.HandsContainer.CameraTransform.localRotation.eulerAngles;
|
||||||
|
rot.z = 0; // we don't need to use the existing Z value
|
||||||
|
if (!useLimits)
|
||||||
|
{
|
||||||
|
rot.y = tid.fNPYaw * rotationReductionFactor;
|
||||||
|
rot.x = tid.fNPPitch * rotationReductionFactor;
|
||||||
|
//rot.z = -tid.fNPRoll * rotationReductionFactor;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rot.y = Mathf.Clamp(tid.fNPYaw * rotationReductionFactor, yawLimits.lower, yawLimits.upper);
|
||||||
|
rot.x = Mathf.Clamp(tid.fNPPitch * rotationReductionFactor, pitchLimits.lower, pitchLimits.upper);
|
||||||
|
//rot.z = Mathf.Clamp(-tid.fNPRoll * rotationReductionFactor, rollLimits.lower, rollLimits.upper);
|
||||||
|
}
|
||||||
|
|
||||||
|
__instance.ProceduralWeaponAnimation.SetHeadRotation(rot);
|
||||||
|
//Logger.LogInfo(string.Format("TIR DATA Final pos = {0}; Final rot = {1}", pos, rot));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user