From a4424ecd09ec5659086accd8b62d9f24503b89aa Mon Sep 17 00:00:00 2001 From: Martynas Gestautas Date: Sun, 20 Feb 2022 00:39:32 +0200 Subject: [PATCH] Updated Freecam to support the new BepInEx plugin loader for SPT-AKI --- README.md | 21 ++-- mod/Terkoiz-Freecam/LICENSE | 31 ------ mod/Terkoiz-Freecam/disclaimer.pdf | Bin 54143 -> 0 bytes mod/Terkoiz-Freecam/module.dll | Bin 8192 -> 0 bytes mod/Terkoiz-Freecam/package.json | 7 -- project/Terkoiz.Freecam/Freecam.cs | 35 +------ project/Terkoiz.Freecam/FreecamController.cs | 12 +-- project/Terkoiz.Freecam/FreecamPlugin.cs | 98 ++++++++++++++++++ project/Terkoiz.Freecam/Program.cs | 17 --- .../Terkoiz.Freecam/Terkoiz.Freecam.csproj | 54 ++++------ project/Terkoiz.Freecam/app.config | 11 ++ project/Terkoiz.Freecam/packages.config | 4 + 12 files changed, 152 insertions(+), 138 deletions(-) delete mode 100644 mod/Terkoiz-Freecam/LICENSE delete mode 100644 mod/Terkoiz-Freecam/disclaimer.pdf delete mode 100644 mod/Terkoiz-Freecam/module.dll delete mode 100644 mod/Terkoiz-Freecam/package.json create mode 100644 project/Terkoiz.Freecam/FreecamPlugin.cs delete mode 100644 project/Terkoiz.Freecam/Program.cs create mode 100644 project/Terkoiz.Freecam/app.config create mode 100644 project/Terkoiz.Freecam/packages.config diff --git a/README.md b/README.md index 0c94c42..b8430f1 100644 --- a/README.md +++ b/README.md @@ -4,30 +4,31 @@ An SPT-AKI module mod that allows you to detach the camera and fly around freely ### Controls -For now, the keybinds are non-configurable (unless you change it in code and build from source). +The default controls are as follows: - Keypad Plus - toggle free camera mode - Keypad Enter - teleport player to camera position - Keypad Multiply - toggle UI +If you need to change them, press F12 in-game and expand the `Freecam #.#.#` section and configure your keybinds there. +Alternatively, you can find the `com.terkoiz.freecam.cfg` file in your `BepInEx/config/` folder after you've started up the game at least once with Freecam installed, and change the keybinds there. + + ### How to install 1. Download the latest release here: [link](https://dev.sp-tarkov.com/Terkoiz/Freecam/releases) -OR- build from source (instructions below) -2. Simply drop the folder `Terkoiz-Freecam` into your SPT-AKI `user/mods/` directory. +2. Simply extract the zip file contents into your root SPT-AKI folder (where EscapeFromTarkov.exe is). +3. Your `BepInEx/plugins` folder should now contain a `Terkoiz.Freecam.dll` file inside. ### Known issues 1. Your weapon doesn't turn invisible when you enter freecam mode 2. When teleporting to camera position, the camera rotation gets copied exactly, potentially causing the player model to tilt 3. Game version UI element is not hidden when toggling UI -4. None of the camera settings (speed, senstivity, etc.) are user-configurable -5. When flying to distant parts of the map in freecam mode, LODs are not triggered (these seem to follow the player) +4. When flying to distant parts of the map in freecam mode, LODs are not triggered (these seem to follow the player) ### How to build from source 1. Download/clone this repository -2. Download/clone the `SPT-AKI/Modules` repository: [link](https://dev.sp-tarkov.com/SPT-AKI/Modules) -3. Move the contents of the `project` folder over to the SPT-AKI Modules `project` folder -4. Add the `Terkoiz.Freecam` project to the SPT-AKI Modules solution -5. Build modules - `Terkoiz.Freecam.dll` should appear under `Build/EscapeFromTarkov_Data/Managed` in the SPT-AKI Modules directory -6. Copy the .dll into the `mod/Terkoiz-Freecam` folder and rename to `module.dll` -7. That's it, you have a working release of this mod! Follow the `How to install` instructions on how to get the mod into your game \ No newline at end of file +2. Re-import dependencies. I recommend you do this from the SPT-AKI/Modules project's `Shared/Managed` folder, if you have the Modules project fully setup. +3. Rebuild the project in the Release configuration. +4. Grab the `Terkoiz.Freecam.dll` file from the `bin/Release` folder and use it wherever. Refer to the "How to install" section if you need help here. \ No newline at end of file diff --git a/mod/Terkoiz-Freecam/LICENSE b/mod/Terkoiz-Freecam/LICENSE deleted file mode 100644 index 32560ba..0000000 --- a/mod/Terkoiz-Freecam/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2021 Martynas Gestautas. All rights reserved. - -Developed by: SPT-Aki - Martynas Gestautas - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation files -(the "Software"), to deal with the Software without restriction, -including without limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of the Software, -and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimers. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimers in the - documentation and/or other materials provided with the distribution. - -* Neither the names of Martynas Gestautas, SPT-Aki nor the names of its - contributors may be used to endorse or promote products derived from - this Software without specific prior written permission. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH -THE SOFTWARE. \ No newline at end of file diff --git a/mod/Terkoiz-Freecam/disclaimer.pdf b/mod/Terkoiz-Freecam/disclaimer.pdf deleted file mode 100644 index 4ad7dc5f2a1674912a64c5c72cc08ab8937ae8eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54143 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

wz6cUW1R)}gAD1Z*jY+5#;P>({4sw*I| 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

G4c2 zXfdK)Pilt+=1d;kW}|lE?qo)tl^(Q>zWvu_rP7)?I5wue-*l0Dwh22uMiLV>#%*$H zP(1@W#dJ4|d6ktJ7tKVDDyN!6qS@*rF%_A@?KCJY9vC1Ux_!Vhjzk-6U5{(2Xd;=M zNJIIHuO6B5r4Cy&9TZqfREj&=>o>L-iG*%at>$7LJDXy0C^fU?mg%+NaiQ(~C>z^E z_Q^_jcbb|#xJ~a9DdnKrEXNSpHxuoa>yf#t?QAFWAhqkgnFop0AW|_(xRuVRAP3_{ zJ4h%TcTw%B6l~)$!ZT5C9Wp6f8s&Ad{hFN?I{MR;Nec=FPbQvPTQHiOU06iCC!LVp z2HUo5it+*iC~o7Ho9u&MZ)km{<+w)N$&#`&)?^|fRywBJ14dk*#P+IBw@3NjqlF2^ zLkn@v4nC4-$p)-jb`7s?jtG4c5f6^Tf!7>19BSA5u=?p(CcR+5!4uWmb2pYJp|fwS zyT!5&#)1K4s5tq&Dn=D$ada(m}IvC!<4P2Ow|I5sFeH=sY4Wq;7|N1GVGVii>-V zpc~MqQvy8~<5cu4A@72!LN`m8z&srpOPl|f^vuk9=*2+`YhlmDkA3Q-CdA0`a||X? z-T%~T8hSJu#Aq84us*7~agLgi0Sy`9xciVr{t>k=s=3u&{y_B?+w@PoHFEB&q^Ob< z^ro*icl890Uk&$FViMJ-j`SWWMF&0Foc{@bGq_WIK)% z;q7uDUm+>KAfWmrXi@T{NDIcuk-^9yR7M&Kz?K#SXGcbkOOcU#F{qG~KxE`TzbZ=w z1%7 zn@(-H_D?Tt-f;d>*Ts_;JE~v(!5RXzWVs;;V7RY|l$qGdh$s)W9F)#~y!>w0?uDyquYuU)^k zymD=oR#{cGuBxgMZ{qm&lvjy2Zv2Q^Bw7&N*3dC}s#uxXMn8_X@~UVh+$|^?W!4)G zZ=&0Rb(EtDX}sK^MRp|q#p;Q^p#9H^^=6vHIBIe=F$@*Vom3vh0cH?c*!X zb3hHZ@8uoB*&A!a5$u39u-7{@I(zZ25#BZSPME8`R?ppgabVIlN1w=xrV~B%M&>I$ zTmLEJDr1vd_G`Y!>Bf1rKA9AUi4-5PbzK}?Jnl!!p=Cly{BAD(B{Aa3WFeO!5vG3< zoh7#5+F6bNqi#T6L1S14TWK5mO@NKwe_iO$m4ChFy&JIwZr=S4 zuOr@-yc*9CaH|(mU05w`=<#-vCajvhSV6fh6Qer7)j)N`YV1PJ;?-QV=aer)sRW-~ zNO>#nWKEwDG8Ks1`>mlK&H?`Y!uhC!zLeMnO=uAxn!sC{!%GYMgNWAKEj`E4Y?WfZfbi` z>`i%^EEM8&7D6sjqStf_cDcs9mnZsItE_1kMGXnYc-4|7(S-=4Am*ZhAi1OE*S CRk+On diff --git a/mod/Terkoiz-Freecam/package.json b/mod/Terkoiz-Freecam/package.json deleted file mode 100644 index 9c381eb..0000000 --- a/mod/Terkoiz-Freecam/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "Freecam", - "author": "Terkoiz", - "version": "1.0.1", - "license": "NCSA Open Source", - "dependencies": {} -} \ No newline at end of file diff --git a/project/Terkoiz.Freecam/Freecam.cs b/project/Terkoiz.Freecam/Freecam.cs index 70c438a..8125da9 100644 --- a/project/Terkoiz.Freecam/Freecam.cs +++ b/project/Terkoiz.Freecam/Freecam.cs @@ -11,31 +11,6 @@ namespace Terkoiz.Freecam /// public class Freecam : MonoBehaviour { - ///

- /// Normal speed of camera movement. - /// - public float MovementSpeed = 10f; - - /// - /// Speed of camera movement when shift is held down. - /// - public float FastMovementSpeed = 100f; - - /// - /// Sensitivity for free look. - /// - public float FreeLookSensitivity = 3f; - - /// - /// Amount to zoom the camera when using the mouse wheel. - /// - public float ZoomSensitivity = 10f; - - /// - /// Amount to zoom the camera when using the mouse wheel (fast mode). - /// - public float FastZoomSensitivity = 50f; - public bool IsActive = false; void Update() @@ -44,9 +19,9 @@ namespace Terkoiz.Freecam { return; } - + var fastMode = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift); - var movementSpeed = fastMode ? FastMovementSpeed : MovementSpeed; + var movementSpeed = fastMode ? FreecamPlugin.CameraFastMoveSpeed.Value : FreecamPlugin.CameraMoveSpeed.Value; if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) { @@ -88,14 +63,14 @@ namespace Terkoiz.Freecam transform.position += (-Vector3.up * movementSpeed * Time.deltaTime); } - float newRotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * FreeLookSensitivity; - float newRotationY = transform.localEulerAngles.x - Input.GetAxis("Mouse Y") * FreeLookSensitivity; + float newRotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * FreecamPlugin.CameraLookSensitivity.Value; + float newRotationY = transform.localEulerAngles.x - Input.GetAxis("Mouse Y") * FreecamPlugin.CameraLookSensitivity.Value; transform.localEulerAngles = new Vector3(newRotationY, newRotationX, 0f); float axis = Input.GetAxis("Mouse ScrollWheel"); if (axis != 0) { - var zoomSensitivity = fastMode ? FastZoomSensitivity : ZoomSensitivity; + var zoomSensitivity = fastMode ? FreecamPlugin.CameraFastZoomSpeed.Value : FreecamPlugin.CameraZoomSpeed.Value; transform.position += transform.forward * axis * zoomSensitivity; } } diff --git a/project/Terkoiz.Freecam/FreecamController.cs b/project/Terkoiz.Freecam/FreecamController.cs index c0244c5..a2a54e4 100644 --- a/project/Terkoiz.Freecam/FreecamController.cs +++ b/project/Terkoiz.Freecam/FreecamController.cs @@ -13,30 +13,24 @@ namespace Terkoiz.Freecam private BattleUIScreen playerUi; private bool uiHidden; - // TODO: - // Menu for adjusting settings - // Config file for default settings - // Configurable keybinds - // TODO MAYBE: // Hide player weapon // Hide version number UI element // FreeCam controller support (camera could be smoother with an analog stick, apparently) - // Adjusting speed/sensitivity without a menu (Ctrl+ScrollWheel for example) public void Update() { - if (Input.GetKeyDown(KeyCode.KeypadMultiply)) + if (FreecamPlugin.ToggleUi.Value.IsDown()) { ToggleUi(); } - if (Input.GetKeyDown(KeyCode.KeypadPlus)) + if (FreecamPlugin.ToggleFreecamMode.Value.IsDown()) { ToggleCamera(); } - if (Input.GetKeyDown(KeyCode.KeypadEnter)) + if (FreecamPlugin.TeleportToCamera.Value.IsDown()) { MovePlayerToCamera(); } diff --git a/project/Terkoiz.Freecam/FreecamPlugin.cs b/project/Terkoiz.Freecam/FreecamPlugin.cs new file mode 100644 index 0000000..8178136 --- /dev/null +++ b/project/Terkoiz.Freecam/FreecamPlugin.cs @@ -0,0 +1,98 @@ +using BepInEx; +using BepInEx.Configuration; +using UnityEngine; + +namespace Terkoiz.Freecam +{ + [BepInPlugin("com.terkoiz.freecam", "Terkoiz.Freecam", "1.1.0")] + public class FreecamPlugin : BaseUnityPlugin + { + private static GameObject HookObject; + + // Keyboard shortcut config entries + private const string KeybindSectionName = "Keybinds"; + internal static ConfigEntry ToggleFreecamMode; + internal static ConfigEntry TeleportToCamera; + internal static ConfigEntry ToggleUi; + + // Camera settings config entries + private const string CameraSettingsSectionName = "CameraSettings"; + internal static ConfigEntry CameraMoveSpeed; + internal static ConfigEntry CameraFastMoveSpeed; + internal static ConfigEntry CameraLookSensitivity; + internal static ConfigEntry CameraZoomSpeed; + internal static ConfigEntry CameraFastZoomSpeed; + + private void Awake() + { + Logger.LogError("Loading Freecam..."); + + InitConfiguration(); + + HookObject = new GameObject(); + HookObject.AddComponent(); + Object.DontDestroyOnLoad(HookObject); + } + + private void InitConfiguration() + { + ToggleFreecamMode = Config.Bind( + KeybindSectionName, + "ToggleCamera", + new KeyboardShortcut(KeyCode.KeypadPlus), + "The keyboard shortcut that toggles Freecam"); + + TeleportToCamera = Config.Bind( + KeybindSectionName, + "TeleportToCamera", + new KeyboardShortcut(KeyCode.KeypadEnter), + "The keyboard shortcut that teleports the player to camera position"); + + ToggleUi = Config.Bind( + KeybindSectionName, + "ToggleUi", + new KeyboardShortcut(KeyCode.KeypadMultiply), + "The keyboard shortcut that toggles the game UI"); + + CameraMoveSpeed = Config.Bind( + CameraSettingsSectionName, + "CameraMoveSpeed", + 10f, + new ConfigDescription( + "The speed at which the camera will move normally", + new AcceptableValueRange(0.01f, 100f))); + + CameraFastMoveSpeed = Config.Bind( + CameraSettingsSectionName, + "CameraFastMoveSpeed", + 100f, + new ConfigDescription( + "The speed at which the camera will move when the Shift key is held down", + new AcceptableValueRange(0.01f, 1000f))); + + CameraLookSensitivity = Config.Bind( + CameraSettingsSectionName, + "CameraLookSensitivity", + 3f, + new ConfigDescription( + "Camera free look mouse sensitivity", + new AcceptableValueRange(0.1f, 10f))); + + CameraZoomSpeed = Config.Bind( + CameraSettingsSectionName, + "CameraMousewheelZoomSpeed", + 10f, + new ConfigDescription( + "Amount to zoom the camera when using the mouse wheel", + new AcceptableValueRange(0.01f, 100f))); + + CameraFastZoomSpeed = Config.Bind( + CameraSettingsSectionName, + "CameraMousewheelFastZoomSpeed", + 50f, + new ConfigDescription( + "Amount to zoom the camera when using the mouse wheel while holding Shift", + new AcceptableValueRange(0.01f, 1000f))); + } + } +} diff --git a/project/Terkoiz.Freecam/Program.cs b/project/Terkoiz.Freecam/Program.cs deleted file mode 100644 index 21a6da5..0000000 --- a/project/Terkoiz.Freecam/Program.cs +++ /dev/null @@ -1,17 +0,0 @@ -using UnityEngine; - -namespace Terkoiz.Freecam -{ - public class Program - { - private static GameObject HookObject; - - static void Main(string[] args) - { - Debug.LogError("Terkoiz.Freecam: Loading..."); - HookObject = new GameObject(); - HookObject.AddComponent(); - Object.DontDestroyOnLoad(HookObject); - } - } -} diff --git a/project/Terkoiz.Freecam/Terkoiz.Freecam.csproj b/project/Terkoiz.Freecam/Terkoiz.Freecam.csproj index 4a92a90..b28ec79 100644 --- a/project/Terkoiz.Freecam/Terkoiz.Freecam.csproj +++ b/project/Terkoiz.Freecam/Terkoiz.Freecam.csproj @@ -9,7 +9,7 @@ Properties Terkoiz.Freecam Terkoiz.Freecam - v4.7.1 + v4.7.2 512 true @@ -32,62 +32,48 @@ 4 - true + false - key.snk + + - - ..\Shared\References\0Harmony.dll - False - - ..\Shared\References\Assembly-CSharp.dll - False + ..\Shared\Hollowed\Assembly-CSharp.dll - - ..\Shared\References\ItemComponent.Types.dll - False + + ..\packages\BepInEx.BaseLib.5.4.17\lib\net35\BepInEx.dll - ..\Shared\References\Comfort.dll - False + ..\Shared\Managed\Comfort.dll - - False - ..\Shared\References\Newtonsoft.Json.dll - False + + ..\Shared\Managed\ItemComponent.Types.dll - ..\Shared\References\UnityEngine.dll - False + ..\Shared\Managed\UnityEngine.dll - ..\Shared\References\UnityEngine.CoreModule.dll - False + ..\Shared\Managed\UnityEngine.CoreModule.dll - - ..\Shared\References\UnityEngine.PhysicsModule.dll - False + + ..\Shared\Managed\UnityEngine.InputLegacyModule.dll + + + ..\Shared\Managed\UnityEngine.UIModule.dll - + - - {7584f43a-5937-417e-abf4-c5f680f300fb} - Aki.Common - False - - - - + + \ No newline at end of file diff --git a/project/Terkoiz.Freecam/app.config b/project/Terkoiz.Freecam/app.config new file mode 100644 index 0000000..2a4bf25 --- /dev/null +++ b/project/Terkoiz.Freecam/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/project/Terkoiz.Freecam/packages.config b/project/Terkoiz.Freecam/packages.config new file mode 100644 index 0000000..14409c9 --- /dev/null +++ b/project/Terkoiz.Freecam/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file