Fix and add features

This commit is contained in:
Craig Banks 2023-02-18 20:23:20 +00:00
parent bd52f88452
commit 944bb7d135
10 changed files with 167 additions and 299 deletions

3
.gitignore vendored
View File

@ -241,6 +241,9 @@ ClientBin/
*.pfx *.pfx
*.publishsettings *.publishsettings
orleans.codegen.cs orleans.codegen.cs
.idea
Freecam.sln.DotSettings.user
Project/.idea/
# Including strong name files can present a security risk # Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424) # (https://github.com/github/gitignore/pull/2483#issue-259490424)

View File

@ -0,0 +1,16 @@

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Terkoiz.Freecam", "Terkoiz.Freecam\Terkoiz.Freecam.csproj", "{BC26F21D-2987-4504-BBE6-0867001DFEB3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BC26F21D-2987-4504-BBE6-0867001DFEB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BC26F21D-2987-4504-BBE6-0867001DFEB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BC26F21D-2987-4504-BBE6-0867001DFEB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BC26F21D-2987-4504-BBE6-0867001DFEB3}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@ -1,4 +1,3 @@
using JetBrains.Annotations;
using UnityEngine; using UnityEngine;
namespace Terkoiz.Freecam namespace Terkoiz.Freecam
@ -14,7 +13,6 @@ namespace Terkoiz.Freecam
{ {
public bool IsActive = false; public bool IsActive = false;
[UsedImplicitly]
public void Update() public void Update()
{ {
if (!IsActive) if (!IsActive)
@ -27,44 +25,44 @@ namespace Terkoiz.Freecam
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
{ {
transform.position += (-transform.right * movementSpeed * Time.deltaTime); transform.position += (-transform.right * (movementSpeed * Time.deltaTime));
} }
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
{ {
transform.position += (transform.right * movementSpeed * Time.deltaTime); transform.position += (transform.right * (movementSpeed * Time.deltaTime));
} }
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
{ {
transform.position += (transform.forward * movementSpeed * Time.deltaTime); transform.position += (transform.forward * (movementSpeed * Time.deltaTime));
} }
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{ {
transform.position += (-transform.forward * movementSpeed * Time.deltaTime); transform.position += (-transform.forward * (movementSpeed * Time.deltaTime));
} }
if (FreecamPlugin.CameraHeightMovement.Value) if (FreecamPlugin.CameraHeightMovement.Value)
{ {
if (Input.GetKey(KeyCode.Q)) if (Input.GetKey(KeyCode.Q))
{ {
transform.position += (transform.up * movementSpeed * Time.deltaTime); transform.position += (transform.up * (movementSpeed * Time.deltaTime));
} }
if (Input.GetKey(KeyCode.E)) if (Input.GetKey(KeyCode.E))
{ {
transform.position += (-transform.up * movementSpeed * Time.deltaTime); transform.position += (-transform.up * (movementSpeed * Time.deltaTime));
} }
if (Input.GetKey(KeyCode.R) || Input.GetKey(KeyCode.PageUp)) if (Input.GetKey(KeyCode.R) || Input.GetKey(KeyCode.PageUp))
{ {
transform.position += (Vector3.up * movementSpeed * Time.deltaTime); transform.position += (Vector3.up * (movementSpeed * Time.deltaTime));
} }
if (Input.GetKey(KeyCode.F) || Input.GetKey(KeyCode.PageDown)) if (Input.GetKey(KeyCode.F) || Input.GetKey(KeyCode.PageDown))
{ {
transform.position += (-Vector3.up * movementSpeed * Time.deltaTime); transform.position += (-Vector3.up * (movementSpeed * Time.deltaTime));
} }
} }
@ -78,9 +76,14 @@ namespace Terkoiz.Freecam
if (axis != 0) if (axis != 0)
{ {
var zoomSensitivity = fastMode ? FreecamPlugin.CameraFastZoomSpeed.Value : FreecamPlugin.CameraZoomSpeed.Value; var zoomSensitivity = fastMode ? FreecamPlugin.CameraFastZoomSpeed.Value : FreecamPlugin.CameraZoomSpeed.Value;
transform.position += transform.forward * axis * zoomSensitivity; transform.position += transform.forward * (axis * zoomSensitivity);
} }
} }
} }
private void OnDestroy()
{
Destroy(this);
}
} }
} }

View File

@ -1,11 +1,8 @@
using System.Reflection;
using Comfort.Common; using Comfort.Common;
using EFT; using EFT;
using EFT.CameraControl; using EFT.CameraControl;
using EFT.UI; using EFT.UI;
using HarmonyLib; using HarmonyLib;
using JetBrains.Annotations;
using MonoMod.RuntimeDetour;
using UnityEngine; using UnityEngine;
namespace Terkoiz.Freecam namespace Terkoiz.Freecam
@ -17,11 +14,9 @@ namespace Terkoiz.Freecam
private BattleUIScreen _playerUi; private BattleUIScreen _playerUi;
private bool _uiHidden; private bool _uiHidden;
private bool _fallDamageToggle = false;
private MethodInfo _playerMoveMethod; private GamePlayerOwner _gamePlayerOwner;
private MethodInfo _playerRotateMethod;
private Detour _moveDetour;
private Detour _rotateDetour;
private Vector3? _lastPosition; private Vector3? _lastPosition;
private Quaternion? _lastRotation; private Quaternion? _lastRotation;
@ -31,25 +26,24 @@ namespace Terkoiz.Freecam
// Button to toggle between camera and player movement // Button to toggle between camera and player movement
// Independent FoV setting for Freecam mode (_mainCamera.GetComponent<Camera>().fieldOfView = ...) // Independent FoV setting for Freecam mode (_mainCamera.GetComponent<Camera>().fieldOfView = ...)
[UsedImplicitly]
public void Start() public void Start()
{ {
// We locate and get the MethodInfo for the Move method that we will later detour to prevent the player from moving during Freecam // Find Main Camera
_playerMoveMethod = typeof(Player).GetMethod("Move"); _mainCamera = GameObject.Find("FPS Camera");
if (_playerMoveMethod == null) if (_mainCamera == null)
{ FreecamPlugin.Logger.LogError("Failed to locate main camera");
FreecamPlugin.Logger.LogError("Failed to locate the Player.Move method!");
}
// Same deal here, but for player rotation // Add Freecam script to main camera in scene
_playerRotateMethod = typeof(Player).GetMethod("Rotate"); _freeCamScript = _mainCamera.AddComponent<Freecam>();
if (_playerRotateMethod == null) if (_freeCamScript == null)
{ FreecamPlugin.Logger.LogError("Failed to add Freecam script to Camera");
FreecamPlugin.Logger.LogError("Failed to locate the Player.Rotate method!");
} // Get GamePlayerOwner component
_gamePlayerOwner = GetLocalPlayerFromWorld().GetComponentInChildren<GamePlayerOwner>();
if (_gamePlayerOwner == null)
FreecamPlugin.Logger.LogError("Failed to locate GamePlayerOwner");
} }
[UsedImplicitly]
public void Update() public void Update()
{ {
if (FreecamPlugin.ToggleUi.Value.IsDown()) if (FreecamPlugin.ToggleUi.Value.IsDown())
@ -66,6 +60,29 @@ namespace Terkoiz.Freecam
{ {
MovePlayerToCamera(); MovePlayerToCamera();
} }
if (_fallDamageToggle != FreecamPlugin.FallDamageToggle.Value)
{
_fallDamageToggle = ToggleFallDamage(FreecamPlugin.FallDamageToggle.Value);
}
}
private bool ToggleFallDamage(bool config)
{
var localPlayer = GetLocalPlayerFromWorld();
if (localPlayer == null)
return false;
// Set Safe fall height to 99999
if (config)
{
localPlayer.ActiveHealthController.FallSafeHeight = 99999;
return true;
}
// Set Safe fall height to 3
localPlayer.ActiveHealthController.FallSafeHeight = 3;
return false;
} }
/// <summary> /// <summary>
@ -76,29 +93,7 @@ namespace Terkoiz.Freecam
// Get our own Player instance. Null means we're not in a raid // Get our own Player instance. Null means we're not in a raid
var localPlayer = GetLocalPlayerFromWorld(); var localPlayer = GetLocalPlayerFromWorld();
if (localPlayer == null) if (localPlayer == null)
{
return; return;
}
// If we don't have the main camera object cached, go look for it in the scene
if (_mainCamera == null)
{
// Finding a GameObject by name directly is apparently better than searching for objects of a type.
// 'FPS Camera' is our main camera instance - so we just grab that
_mainCamera = GameObject.Find("FPS Camera");
if (_mainCamera == null)
{
FreecamPlugin.Logger.LogError("Failed to locate main camera");
return;
}
}
// Create the Freecam script and attach it to the main camera
if (_freeCamScript == null)
{
ClearDetours();
_freeCamScript = _mainCamera.AddComponent<Freecam>();
}
if (!_freeCamScript.IsActive) if (!_freeCamScript.IsActive)
{ {
@ -117,15 +112,7 @@ namespace Terkoiz.Freecam
{ {
var localPlayer = GetLocalPlayerFromWorld(); var localPlayer = GetLocalPlayerFromWorld();
if (localPlayer == null) if (localPlayer == null)
{
return; return;
}
// If we don't have the main camera cached, it means we have yet to enter Freecam mode and there is nowhere to teleport to
if (_mainCamera == null)
{
return;
}
// Move the player to the camera's current position and switch to First Person mode // Move the player to the camera's current position and switch to First Person mode
if (_freeCamScript.IsActive) if (_freeCamScript.IsActive)
@ -133,6 +120,7 @@ namespace Terkoiz.Freecam
// We grab the camera's position, but we subtract a bit off the Y axis, because the players coordinate origin is at the feet // We grab the camera's position, but we subtract a bit off the Y axis, because the players coordinate origin is at the feet
var position = new Vector3(_mainCamera.transform.position.x, _mainCamera.transform.position.y - 1.8f, _mainCamera.transform.position.z); var position = new Vector3(_mainCamera.transform.position.x, _mainCamera.transform.position.y - 1.8f, _mainCamera.transform.position.z);
localPlayer.gameObject.transform.SetPositionAndRotation(position, Quaternion.Euler(0, _mainCamera.transform.rotation.y, 0)); localPlayer.gameObject.transform.SetPositionAndRotation(position, Quaternion.Euler(0, _mainCamera.transform.rotation.y, 0));
// localPlayer.gameObject.transform.SetPositionAndRotation(position, _mainCamera.transform.rotation); // localPlayer.gameObject.transform.SetPositionAndRotation(position, _mainCamera.transform.rotation);
SetPlayerToFirstPersonMode(localPlayer); SetPlayerToFirstPersonMode(localPlayer);
} }
@ -145,9 +133,7 @@ namespace Terkoiz.Freecam
{ {
// Check if we're currently in a raid // Check if we're currently in a raid
if (GetLocalPlayerFromWorld() == null) if (GetLocalPlayerFromWorld() == null)
{
return; return;
}
// If we don't have the UI Component cached, go look for it in the scene // If we don't have the UI Component cached, go look for it in the scene
if (_playerUi == null) if (_playerUi == null)
@ -194,17 +180,8 @@ namespace Terkoiz.Freecam
FreecamPlugin.Logger.LogError("Failed to get the PlayerBody field"); FreecamPlugin.Logger.LogError("Failed to get the PlayerBody field");
} }
// Detour the Player.Move method into an empty one, preventing the character from moving during Freecam mode // Instead of Detouring, just turn off _gamePlayerOwner which takes the input
if (_playerMoveMethod != null) _gamePlayerOwner.enabled = false;
{
_moveDetour = new Detour(_playerMoveMethod, typeof(FreecamController).GetMethod(nameof(DisabledMove)));
}
// Same deal here, but for player rotation
if (_playerRotateMethod != null)
{
_rotateDetour = new Detour(_playerRotateMethod, typeof(FreecamController).GetMethod(nameof(DisabledRotate)));
}
if (FreecamPlugin.CameraRememberLastPosition.Value && _lastPosition != null && _lastRotation != null) if (FreecamPlugin.CameraRememberLastPosition.Value && _lastPosition != null && _lastRotation != null)
{ {
@ -229,7 +206,8 @@ namespace Terkoiz.Freecam
_lastRotation = _mainCamera.transform.rotation; _lastRotation = _mainCamera.transform.rotation;
} }
ClearDetours(); // re-enable _gamePlayerOwner
_gamePlayerOwner.enabled = true;
localPlayer.PointOfView = EPointOfView.FirstPerson; localPlayer.PointOfView = EPointOfView.FirstPerson;
} }
@ -242,56 +220,18 @@ namespace Terkoiz.Freecam
{ {
// If the GameWorld instance is null or has no RegisteredPlayers, it most likely means we're not in a raid // If the GameWorld instance is null or has no RegisteredPlayers, it most likely means we're not in a raid
var gameWorld = Singleton<GameWorld>.Instance; var gameWorld = Singleton<GameWorld>.Instance;
if (gameWorld == null || gameWorld.RegisteredPlayers == null) if (gameWorld == null || gameWorld.MainPlayer == null)
{
return null; return null;
}
// One of the RegisteredPlayers will have the IsYourPlayer flag set, which will be our own Player instance // One of the RegisteredPlayers will have the IsYourPlayer flag set, which will be our own Player instance
return gameWorld.RegisteredPlayers.Find(p => p.IsYourPlayer); return gameWorld.MainPlayer;
} }
[UsedImplicitly] private void OnDestroy()
public void OnDestroy()
{
_freeCamScript.IsActive = false;
// Making sure no stray Detours are left
ClearDetours();
_lastPosition = null;
_lastRotation = null;
}
public void ClearDetours()
{
if (_moveDetour != null)
{
_moveDetour.Dispose();
_moveDetour = null;
}
if (_rotateDetour != null)
{
_rotateDetour.Dispose();
_rotateDetour = null;
}
}
/// <summary>
/// An empty method that's used to detour the player Move method, preventing movement during Freecam mode
/// </summary>
[UsedImplicitly]
public static void DisabledMove(Player self, Vector2 direction)
{
}
/// <summary>
/// An empty method that's used to detour the player Rotate method, preventing rotation during Freecam mode
/// </summary>
[UsedImplicitly]
public static void DisabledRotate(Player self, Vector2 deltaRotation, bool ignoreClamp = false)
{ {
// Destroy FreeCamScript before FreeCamController if exists
Destroy(_freeCamScript);
Destroy(this);
} }
} }
} }

View File

@ -0,0 +1,27 @@
using System.Reflection;
using Aki.Reflection.Patching;
using Comfort.Common;
using EFT;
namespace Terkoiz.Freecam
{
public class FreecamPatch : ModulePatch
{
protected override MethodBase GetTargetMethod()
{
return typeof(GameWorld).GetMethod("OnGameStarted", BindingFlags.Public | BindingFlags.Instance);
}
[PatchPostfix]
public static void PatchPostFix()
{
var gameworld = Singleton<GameWorld>.Instance;
if (gameworld == null)
return;
// Add FreeCamController to GameWorld GameObject
gameworld.GetOrAddComponent<FreecamController>();
}
}
}

View File

@ -1,24 +1,23 @@
using BepInEx; using BepInEx;
using BepInEx.Configuration; using BepInEx.Configuration;
using BepInEx.Logging; using BepInEx.Logging;
using JetBrains.Annotations;
using UnityEngine; using UnityEngine;
using KeyboardShortcut = BepInEx.Configuration.KeyboardShortcut;
namespace Terkoiz.Freecam namespace Terkoiz.Freecam
{ {
[BepInPlugin("com.terkoiz.freecam", "Terkoiz.Freecam", "1.2.0")] [BepInPlugin("com.terkoiz.freecam", "Terkoiz.Freecam", "1.3.0")]
public class FreecamPlugin : BaseUnityPlugin public class FreecamPlugin : BaseUnityPlugin
{ {
internal new static ManualLogSource Logger { get; private set; } internal new static ManualLogSource Logger { get; private set; }
private static GameObject HookObject;
// Keyboard shortcut config entries // Keyboard shortcut config entries
private const string KeybindSectionName = "Keybinds"; private const string KeybindSectionName = "Keybinds";
internal static ConfigEntry<KeyboardShortcut> ToggleFreecamMode; internal static ConfigEntry<KeyboardShortcut> ToggleFreecamMode;
internal static ConfigEntry<KeyboardShortcut> TeleportToCamera; internal static ConfigEntry<KeyboardShortcut> TeleportToCamera;
internal static ConfigEntry<KeyboardShortcut> ToggleUi; internal static ConfigEntry<KeyboardShortcut> ToggleUi;
// Camera settings config entries // Camera settings config entries
private const string CameraSettingsSectionName = "CameraSettings"; private const string CameraSettingsSectionName = "CameraSettings";
internal static ConfigEntry<float> CameraMoveSpeed; internal static ConfigEntry<float> CameraMoveSpeed;
@ -31,19 +30,14 @@ namespace Terkoiz.Freecam
internal static ConfigEntry<bool> CameraHeightMovement; internal static ConfigEntry<bool> CameraHeightMovement;
internal static ConfigEntry<bool> CameraMousewheelZoom; internal static ConfigEntry<bool> CameraMousewheelZoom;
internal static ConfigEntry<bool> CameraRememberLastPosition; internal static ConfigEntry<bool> CameraRememberLastPosition;
public static ConfigEntry<bool> FallDamageToggle;
// TODO: Hook into camera OnDestroy to run the OnDestroy from FreecamController
[UsedImplicitly]
internal void Start() internal void Start()
{ {
new FreecamPatch().Enable();
Logger = base.Logger; Logger = base.Logger;
InitConfiguration(); InitConfiguration();
HookObject = new GameObject();
HookObject.AddComponent<FreecamController>();
DontDestroyOnLoad(HookObject);
} }
private void InitConfiguration() private void InitConfiguration()
@ -124,6 +118,12 @@ namespace Terkoiz.Freecam
"CameraRememberLastPosition", "CameraRememberLastPosition",
false, false,
"If enabled, returning to Freecam mode will put the camera to it's last position which was saved when exiting Freecam mode."); "If enabled, returning to Freecam mode will put the camera to it's last position which was saved when exiting Freecam mode.");
FallDamageToggle = Config.Bind(
TogglesSectionName,
"FallHeightToggle",
true,
"True disables fall damage, False doesn't simplez");
} }
} }
} }

View File

@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Terkoiz.Freecam")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Terkoiz.Freecam")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("be2de623-48ff-4807-9696-167a17787718")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -1,109 +1,44 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{BE2DE623-48FF-4807-9696-167A17787718}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Terkoiz.Freecam</RootNamespace>
<AssemblyName>Terkoiz.Freecam</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<SignAssembly>false</SignAssembly>
</PropertyGroup>
<PropertyGroup>
<AssemblyOriginatorKeyFile>
</AssemblyOriginatorKeyFile>
</PropertyGroup>
<ItemGroup>
<Reference Include="0Harmony, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\HarmonyX.2.7.0\lib\net45\0Harmony.dll</HintPath>
</Reference>
<Reference Include="Assembly-CSharp">
<HintPath>..\Shared\Hollowed\Assembly-CSharp.dll</HintPath>
</Reference>
<Reference Include="BepInEx, Version=5.4.19.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\BepInEx.BaseLib.5.4.19\lib\net35\BepInEx.dll</HintPath>
</Reference>
<Reference Include="Comfort">
<HintPath>..\Shared\Managed\Comfort.dll</HintPath>
</Reference>
<Reference Include="ItemComponent.Types">
<HintPath>..\Shared\Managed\ItemComponent.Types.dll</HintPath>
</Reference>
<Reference Include="Mono.Cecil, Version=0.11.4.0, Culture=neutral, PublicKeyToken=50cebf1cceb9d05e, processorArchitecture=MSIL">
<HintPath>..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.dll</HintPath>
</Reference>
<Reference Include="Mono.Cecil.Mdb, Version=0.11.4.0, Culture=neutral, PublicKeyToken=50cebf1cceb9d05e, processorArchitecture=MSIL">
<HintPath>..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.Mdb.dll</HintPath>
</Reference>
<Reference Include="Mono.Cecil.Pdb, Version=0.11.4.0, Culture=neutral, PublicKeyToken=50cebf1cceb9d05e, processorArchitecture=MSIL">
<HintPath>..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.Pdb.dll</HintPath>
</Reference>
<Reference Include="Mono.Cecil.Rocks, Version=0.11.4.0, Culture=neutral, PublicKeyToken=50cebf1cceb9d05e, processorArchitecture=MSIL">
<HintPath>..\packages\Mono.Cecil.0.11.4\lib\net40\Mono.Cecil.Rocks.dll</HintPath>
</Reference>
<Reference Include="MonoMod.RuntimeDetour, Version=21.12.13.1, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MonoMod.RuntimeDetour.21.12.13.1\lib\net452\MonoMod.RuntimeDetour.dll</HintPath>
</Reference>
<Reference Include="MonoMod.Utils, Version=21.12.13.1, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MonoMod.Utils.21.12.13.1\lib\net452\MonoMod.Utils.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="UnityEngine">
<HintPath>..\Shared\Managed\UnityEngine.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.CoreModule">
<HintPath>..\Shared\Managed\UnityEngine.CoreModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.InputLegacyModule">
<HintPath>..\Shared\Managed\UnityEngine.InputLegacyModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UIModule">
<HintPath>..\Shared\Managed\UnityEngine.UIModule.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Freecam.cs" />
<Compile Include="FreecamController.cs" />
<Compile Include="FreecamPlugin.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\BepInEx.Core.5.4.19\build\BepInEx.Core.targets" Condition="Exists('..\packages\BepInEx.Core.5.4.19\build\BepInEx.Core.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup> <PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> <TargetFramework>net472</TargetFramework>
<Version>1.3.0</Version>
</PropertyGroup> </PropertyGroup>
<Error Condition="!Exists('..\packages\BepInEx.Core.5.4.19\build\BepInEx.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\BepInEx.Core.5.4.19\build\BepInEx.Core.targets'))" />
</Target> <ItemGroup>
<Reference Include="0Harmony">
<HintPath>..\..\Shared\0Harmony.dll</HintPath>
</Reference>
<Reference Include="Aki.Reflection">
<HintPath>..\..\Shared\Aki.Reflection.dll</HintPath>
</Reference>
<Reference Include="Assembly-CSharp">
<HintPath>..\..\Shared\Assembly-CSharp.dll</HintPath>
</Reference>
<Reference Include="BepInEx">
<HintPath>..\..\Shared\BepInEx.dll</HintPath>
</Reference>
<Reference Include="Comfort">
<HintPath>..\..\Shared\Comfort.dll</HintPath>
</Reference>
<Reference Include="ConfigurationManager">
<HintPath>..\..\Shared\ConfigurationManager.dll</HintPath>
</Reference>
<Reference Include="ItemComponent.Types">
<HintPath>..\..\Shared\ItemComponent.Types.dll</HintPath>
</Reference>
<Reference Include="UnityEngine">
<HintPath>..\..\Shared\UnityEngine.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.CoreModule">
<HintPath>..\..\Shared\UnityEngine.CoreModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.InputLegacyModule">
<HintPath>..\..\Shared\UnityEngine.InputLegacyModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UIModule">
<HintPath>..\..\Shared\UnityEngine.UIModule.dll</HintPath>
</Reference>
</ItemGroup>
</Project> </Project>

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Mono.Cecil" publicKeyToken="50cebf1cceb9d05e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-0.11.4.0" newVersion="0.11.4.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="BepInEx.BaseLib" version="5.4.19" targetFramework="net472" />
<package id="BepInEx.Core" version="5.4.19" targetFramework="net472" />
<package id="HarmonyX" version="2.7.0" targetFramework="net472" />
<package id="Mono.Cecil" version="0.11.4" targetFramework="net472" />
<package id="MonoMod.RuntimeDetour" version="21.12.13.1" targetFramework="net472" />
<package id="MonoMod.Utils" version="21.12.13.1" targetFramework="net472" />
</packages>