From 02f3312e8373b00b82b591915f61738b9be1dc81 Mon Sep 17 00:00:00 2001 From: Martynas Gestautas Date: Wed, 2 Jun 2021 23:05:01 +0300 Subject: [PATCH] Initial mod file commit --- README.md | 32 +++- mod/Terkoiz-Freecam/LICENSE | 31 ++++ mod/Terkoiz-Freecam/disclaimer.pdf | Bin 0 -> 54143 bytes mod/Terkoiz-Freecam/module.dll | Bin 0 -> 8192 bytes mod/Terkoiz-Freecam/package.json | 7 + project/Terkoiz.Freecam/Freecam.cs | 103 +++++++++++ project/Terkoiz.Freecam/FreecamController.cs | 163 ++++++++++++++++++ project/Terkoiz.Freecam/Program.cs | 17 ++ .../Properties/AssemblyInfo.cs | 36 ++++ .../Terkoiz.Freecam/Terkoiz.Freecam.csproj | 83 +++++++++ 10 files changed, 471 insertions(+), 1 deletion(-) create mode 100644 mod/Terkoiz-Freecam/LICENSE create mode 100644 mod/Terkoiz-Freecam/disclaimer.pdf create mode 100644 mod/Terkoiz-Freecam/module.dll create mode 100644 mod/Terkoiz-Freecam/package.json create mode 100644 project/Terkoiz.Freecam/Freecam.cs create mode 100644 project/Terkoiz.Freecam/FreecamController.cs create mode 100644 project/Terkoiz.Freecam/Program.cs create mode 100644 project/Terkoiz.Freecam/Properties/AssemblyInfo.cs create mode 100644 project/Terkoiz.Freecam/Terkoiz.Freecam.csproj diff --git a/README.md b/README.md index d5bfa16..106272c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,33 @@ # Freecam -A freecam mode SPT-AKI \ No newline at end of file +An SPT-AKI modules mod that allows you to detach the camera and fly around freely in Escape From Tarkov. + +### Controls + +For now, the keybinds are non-configurable (unless you change it in code and build from source). +Keypad Plus - toggle free camera mode +Keypad Enter - teleport player to camera position +Keypad Multiply - toggle UI + +### 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. + +### 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) + +### 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 `modules.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 diff --git a/mod/Terkoiz-Freecam/LICENSE b/mod/Terkoiz-Freecam/LICENSE new file mode 100644 index 0000000..32560ba --- /dev/null +++ b/mod/Terkoiz-Freecam/LICENSE @@ -0,0 +1,31 @@ +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 new file mode 100644 index 0000000000000000000000000000000000000000..4ad7dc5f2a1674912a64c5c72cc08ab8937ae8eb GIT binary patch literal 54143 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

wz6cUW1R)}gAD1Z*jY+5#;P>({4sw*I| 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 + /// A simple free camera to be added to a Unity game object. + /// + /// Full credit to Ashley Davis on GitHub for the inital code: + /// https://gist.github.com/ashleydavis/f025c03a9221bc840a2b + /// + /// + 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() + { + if (!IsActive) + { + return; + } + + var fastMode = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift); + var movementSpeed = fastMode ? FastMovementSpeed : MovementSpeed; + + if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) + { + transform.position += (-transform.right * movementSpeed * Time.deltaTime); + } + + if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) + { + transform.position += (transform.right * movementSpeed * Time.deltaTime); + } + + if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) + { + transform.position += (transform.forward * movementSpeed * Time.deltaTime); + } + + if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) + { + transform.position += (-transform.forward * movementSpeed * Time.deltaTime); + } + + if (Input.GetKey(KeyCode.Q)) + { + transform.position += (transform.up * movementSpeed * Time.deltaTime); + } + + if (Input.GetKey(KeyCode.E)) + { + transform.position += (-transform.up * movementSpeed * Time.deltaTime); + } + + if (Input.GetKey(KeyCode.R) || Input.GetKey(KeyCode.PageUp)) + { + transform.position += (Vector3.up * movementSpeed * Time.deltaTime); + } + + if (Input.GetKey(KeyCode.F) || Input.GetKey(KeyCode.PageDown)) + { + 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; + transform.localEulerAngles = new Vector3(newRotationY, newRotationX, 0f); + + float axis = Input.GetAxis("Mouse ScrollWheel"); + if (axis != 0) + { + var zoomSensitivity = fastMode ? FastZoomSensitivity : ZoomSensitivity; + transform.position += transform.forward * axis * zoomSensitivity; + } + } + } +} \ No newline at end of file diff --git a/project/Terkoiz.Freecam/FreecamController.cs b/project/Terkoiz.Freecam/FreecamController.cs new file mode 100644 index 0000000..c0244c5 --- /dev/null +++ b/project/Terkoiz.Freecam/FreecamController.cs @@ -0,0 +1,163 @@ +using Comfort.Common; +using EFT; +using EFT.UI; +using UnityEngine; + +namespace Terkoiz.Freecam +{ + public class FreecamController : MonoBehaviour + { + private GameObject mainCamera; + private Freecam freeCamScript; + + 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)) + { + ToggleUi(); + } + + if (Input.GetKeyDown(KeyCode.KeypadPlus)) + { + ToggleCamera(); + } + + if (Input.GetKeyDown(KeyCode.KeypadEnter)) + { + MovePlayerToCamera(); + } + } + + /// + /// Toggles the Freecam mode + /// + private void ToggleCamera() + { + // Get our own Player instance. Null means we're not in a raid + var localPlayer = GetLocalPlayerFromWorld(); + if (localPlayer == null) + { + 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 apparantly 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) + { + Debug.LogError("Terkoiz.Freecam: ERROR: Failed to locate main camera"); + PreloaderUI.Instance.Console.AddLog("ERROR: Failed to locate main camera", "FreeCam"); + return; + } + } + + // Create the Freecam script and attach it to the main camera + if (freeCamScript == null) + { + freeCamScript = mainCamera.AddComponent(); + } + + // We disable the player's GameObject, which prevents the player from moving and interacting with the world while we're in Freecam mode + // Also, since the camera position keeps getting updated to where the player is, disabling the player's GameObject also stops this behaviour + if (!freeCamScript.IsActive) + { + localPlayer.gameObject.SetActive(false); + freeCamScript.IsActive = true; + } + else + { + freeCamScript.IsActive = false; + localPlayer.gameObject.SetActive(true); + } + } + + /// + /// When triggered during Freecam mode, teleports the player to where the camera was and exits Freecam mode + /// + private void MovePlayerToCamera() + { + var localPlayer = GetLocalPlayerFromWorld(); + if (localPlayer == null) + { + 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; + } + + // We basically do what ToggleCamera() does, but with extra code inbetween + if (freeCamScript.IsActive) + { + freeCamScript.IsActive = false; + // 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); + localPlayer.gameObject.transform.SetPositionAndRotation(position, mainCamera.transform.rotation); + localPlayer.gameObject.SetActive(true); + } + } + + /// + /// Hides the main UI (health, stamina, stance, hotbar, etc.) + /// + private void ToggleUi() + { + // Check if we're currently in a raid + if (GetLocalPlayerFromWorld() == null) + { + return; + } + + // If we don't have the UI Component cached, go look for it in the scene + if (playerUi == null) + { + playerUi = GameObject.Find("BattleUIScreen").GetComponent(); + + if (playerUi == null) + { + PreloaderUI.Instance.Console.AddLog("ERROR: Failed to locate player UI", "FreeCam"); + return; + } + } + + playerUi.gameObject.SetActive(uiHidden); + uiHidden = !uiHidden; + } + + /// + /// Gets the current instance if it's available + /// + /// Local instance; returns null if the game is not in raid + private static Player GetLocalPlayerFromWorld() + { + // If the GameWorld instance is null or has no RegisteredPlayers, it most likely means we're not in a raid + var gameWorld = Singleton.Instance; + if (gameWorld == null || gameWorld.RegisteredPlayers == null) + { + return null; + } + + // One of the RegisterdPlayers will have the IsYourPlayer flag set, which will be our own Player instance + return gameWorld.RegisteredPlayers.Find(p => p.IsYourPlayer); + } + } +} \ No newline at end of file diff --git a/project/Terkoiz.Freecam/Program.cs b/project/Terkoiz.Freecam/Program.cs new file mode 100644 index 0000000..21a6da5 --- /dev/null +++ b/project/Terkoiz.Freecam/Program.cs @@ -0,0 +1,17 @@ +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/Properties/AssemblyInfo.cs b/project/Terkoiz.Freecam/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..92fb4d3 --- /dev/null +++ b/project/Terkoiz.Freecam/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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")] diff --git a/project/Terkoiz.Freecam/Terkoiz.Freecam.csproj b/project/Terkoiz.Freecam/Terkoiz.Freecam.csproj new file mode 100644 index 0000000..56fc12e --- /dev/null +++ b/project/Terkoiz.Freecam/Terkoiz.Freecam.csproj @@ -0,0 +1,83 @@ + + + + + Debug + AnyCPU + {BE2DE623-48FF-4807-9696-167A17787718} + Library + Properties + Terkoiz.Freecam + Terkoiz.Freecam + v4.6.1 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\Shared\References\0Harmony.dll + False + + + ..\Shared\References\Assembly-CSharp.dll + False + + + ..\Shared\References\ItemComponent.Types.dll + False + + + ..\Shared\References\Comfort.dll + False + + + False + ..\Shared\References\Newtonsoft.Json.dll + False + + + + ..\Shared\References\UnityEngine.dll + False + + + ..\Shared\References\UnityEngine.CoreModule.dll + False + + + ..\Shared\References\UnityEngine.PhysicsModule.dll + False + + + + + + + + + + + {7584f43a-5937-417e-abf4-c5f680f300fb} + Aki.Common + False + + + + \ No newline at end of file