commit 3d30f7754ffbd85f971ad0a82160b13efcef3491 Author: Magnus von Wachenfeldt Date: Wed Dec 6 16:54:16 2017 +0100 nice diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..67ff55f --- /dev/null +++ b/.gitignore @@ -0,0 +1,319 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# TypeScript v1 declaration files +typings/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +References/Assembly-CSharp.dll +References/UnityEngine.dll +References/UnityEngine.Networking.dll \ No newline at end of file diff --git a/Injector/h4x.bat b/Injector/h4x.bat new file mode 100644 index 0000000..b292d93 --- /dev/null +++ b/Injector/h4x.bat @@ -0,0 +1 @@ +injector64.exe --dll "D:\Projekt\tarkov-hax\TarkovHax\bin\Debug\TarkovHax.dll" --target EscapeFromTarkov.exe --namespace TarkovHax --class TarkovHaxBehaviour --method Load \ No newline at end of file diff --git a/Injector/injector64.exe b/Injector/injector64.exe new file mode 100644 index 0000000..3d40133 Binary files /dev/null and b/Injector/injector64.exe differ diff --git a/Readme.txt b/Readme.txt new file mode 100644 index 0000000..efa9ff8 --- /dev/null +++ b/Readme.txt @@ -0,0 +1,7 @@ +Add Assembly-CSharp.dll, UnityEngine.dll and UnityEngine.Networking.dll from Escape from Tarkov/EscapeFromTarkov_Data/Managed + +Edit dll path in Injector/h4x.bat, or use another injector + +Start game, run h4x.bat + +creds to gummy8unny who first made the hax \ No newline at end of file diff --git a/References/dummy.txt b/References/dummy.txt new file mode 100644 index 0000000..e69de29 diff --git a/TarkovHax.sln b/TarkovHax.sln new file mode 100644 index 0000000..853ee9d --- /dev/null +++ b/TarkovHax.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27004.2010 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TarkovHax", "TarkovHax\TarkovHax.csproj", "{10B1EFC0-649C-4CFF-8D13-0D36E868F95D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {10B1EFC0-649C-4CFF-8D13-0D36E868F95D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {10B1EFC0-649C-4CFF-8D13-0D36E868F95D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {10B1EFC0-649C-4CFF-8D13-0D36E868F95D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {10B1EFC0-649C-4CFF-8D13-0D36E868F95D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {38AD8D0C-7278-431E-947E-3BB14B90C957} + EndGlobalSection +EndGlobal diff --git a/TarkovHax/GuiHelper.cs b/TarkovHax/GuiHelper.cs new file mode 100644 index 0000000..f09c18b --- /dev/null +++ b/TarkovHax/GuiHelper.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace TarkovHax +{ + public static class GuiHelper + { + private static Texture2D _coloredLineTexture; + private static Color _coloredLineColor; + + public static void DrawLine(Vector2 lineStart, Vector2 lineEnd, Color color) + { + DrawLine(lineStart, lineEnd, color, 1); + } + + public static void DrawBox(float x, float y, float w, float h, Color color) + { + DrawLine(new Vector2(x, y), new Vector2(x + w, y), color); + DrawLine(new Vector2(x, y), new Vector2(x, y + h), color); + DrawLine(new Vector2(x + w, y), new Vector2(x + w, y + h), color); + DrawLine(new Vector2(x, y + h), new Vector2(x + w, y + h), color); + } + + public static void DrawLine(Vector2 lineStart, Vector2 lineEnd, Color color, int thickness) + { + if (_coloredLineTexture == null || _coloredLineColor != color) + { + _coloredLineColor = color; + _coloredLineTexture = new Texture2D(1, 1); + _coloredLineTexture.SetPixel(0, 0, _coloredLineColor); + _coloredLineTexture.wrapMode = 0; + _coloredLineTexture.Apply(); + } + + DrawLineStretched(lineStart, lineEnd, _coloredLineTexture, thickness); + } + + public static void DrawLineStretched(Vector2 lineStart, Vector2 lineEnd, Texture2D texture, int thickness) + { + var vector = lineEnd - lineStart; + float num = 57.29578f * Mathf.Atan(vector.y / vector.x); + if (vector.x < 0f) + { + num += 180f; + } + + if (thickness < 1) + { + thickness = 1; + } + + int yOffset = (int)Mathf.Ceil((float)(thickness / 2)); + + GUIUtility.RotateAroundPivot(num, lineStart); + GUI.DrawTexture(new Rect(lineStart.x, lineStart.y - (float)yOffset, vector.magnitude, (float)thickness), texture); + GUIUtility.RotateAroundPivot(-num, lineStart); + } + + public static void DrawLine(Vector2 lineStart, Vector2 lineEnd, Texture2D texture) + { + DrawLine(lineStart, lineEnd, texture, 1); + } + + public static void DrawLine(Vector2 lineStart, Vector2 lineEnd, Texture2D texture, int thickness) + { + var vector = lineEnd - lineStart; + float pivot = 57.29578f * Mathf.Atan(vector.y / vector.x); + + if (vector.x < 0f) + { + pivot += 180f; + } + + if (thickness < 1) + { + thickness = 1; + } + + int num2 = (int)Mathf.Ceil((float)(thickness / 2)); + var rect = new Rect(lineStart.x, lineStart.y - (float)num2, Vector2.Distance(lineStart, lineEnd), (float)thickness); + GUIUtility.RotateAroundPivot(pivot, lineStart); + GUI.BeginGroup(rect); + int num3 = Mathf.RoundToInt(rect.width); + int num4 = Mathf.RoundToInt(rect.height); + + for (int i = 0; i < num4; i += texture.height) + { + for (int j = 0; j < num3; j += texture.width) + { + GUI.DrawTexture(new Rect((float)j, (float)i, (float)texture.width, (float)texture.height), texture); + } + } + + GUI.EndGroup(); + GUIUtility.RotateAroundPivot(-pivot, lineStart); + } + } +} diff --git a/TarkovHax/Properties/AssemblyInfo.cs b/TarkovHax/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b1f1915 --- /dev/null +++ b/TarkovHax/Properties/AssemblyInfo.cs @@ -0,0 +1,21 @@ +using System; +using System.Diagnostics; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; + +[assembly: AssemblyVersion("1.0.6544.33693")] +[assembly: CompilationRelaxations(8)] +[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] +[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] +[assembly: AssemblyTitle("UnityTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnityTest")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: ComVisible(false)] +[assembly: Guid("87a9c8b1-7e18-410f-b75a-4f3b99f20f53")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/TarkovHax/TarkovHax.csproj b/TarkovHax/TarkovHax.csproj new file mode 100644 index 0000000..0b92960 --- /dev/null +++ b/TarkovHax/TarkovHax.csproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + {10B1EFC0-649C-4CFF-8D13-0D36E868F95D} + Library + TarkovHax + TarkovHax + v4.5.2 + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\References\UnityEngine.dll + + + ..\References\Assembly-CSharp.dll + + + ..\References\UnityEngine.Networking.dll + + + + + + + + + + + + \ No newline at end of file diff --git a/TarkovHax/TarkovHaxBehaviour.cs b/TarkovHax/TarkovHaxBehaviour.cs new file mode 100644 index 0000000..5512048 --- /dev/null +++ b/TarkovHax/TarkovHaxBehaviour.cs @@ -0,0 +1,255 @@ +using System; +using EFT; +using UnityEngine; + +namespace TarkovHax +{ + public class TarkovHaxBehaviour : MonoBehaviour + { + public static GameObject GameObjectHolder; + + private float _playerNextUpdateTime; + private float _lootNextUpdateTime; + private float _lootContainerNextUpdateTime; + + private UnityEngine.Object[] _playerObjects; + private UnityEngine.Object[] _lootableObjects; + private UnityEngine.Object[] _lootableContainerObjects; + + private bool _isESPMenuActive; + private bool _showPlayersESP; + private bool _showLootESP; + private bool _showLootableContainersESP; + + private float _maxDrawingDistance = 15000f; + + private static void Load() + { + GameObjectHolder = new GameObject(); + GameObjectHolder.AddComponent(); + + DontDestroyOnLoad(GameObjectHolder); + } + + public static void Unload() + { + var component = GameObjectHolder.GetComponent(); + if (component != null) + { + DestroyImmediate(component, true); + } + } + + private void Update() + { + if (Input.GetKeyDown(KeyCode.End)) + { + Unload(); + } + if (Input.GetKeyDown(KeyCode.Insert)) + { + this._isESPMenuActive = !this._isESPMenuActive; + } + if (Input.GetKeyDown(KeyCode.Keypad0)) + { + OpenDoors(); + } + if (Input.GetKeyDown(KeyCode.Keypad1)) + { + ToggleNightVision(); + } + + if (Input.GetKeyDown(KeyCode.KeypadPlus)) + { + IncreaseFov(); + } + if (Input.GetKeyDown(KeyCode.KeypadMinus)) + { + DecreaseFov(); + } + } + + private void IncreaseFov() + { + Camera.main.fieldOfView += 1f; + } + + private void DecreaseFov() + { + Camera.main.fieldOfView -= 1f; + } + + private void OpenDoors() + { + var doors = FindObjectsOfType(typeof(Door)); + foreach (Door door in doors) + { + if (door.DoorState == WorldInteractiveObject.EDoorState.Locked) + { + door.DoorState = WorldInteractiveObject.EDoorState.Shut; + } + } + } + + private bool _nightVisionOn = false; + private void ToggleNightVision() + { + //var camera = (PlayerCameraController)FindObjectOfType(typeof(PlayerCameraController)); + //if (_nightVisionOn) + //{ + // var component = camera.gameObject.AddComponent(); + // if (component != null) + // { + // DestroyImmediate(component); + // } + //} + //else + //{ + // camera.gameObject.AddComponent(); + //} + + //_nightVisionOn = !_nightVisionOn; + } + + private void OnGUI() + { + if (this._isESPMenuActive) + { + DrawESPMenu(); + } + + GUI.color = Color.red; + GUI.Label(new Rect(10f, 10f, 100f, 50f), "tarkov h4x"); + + if (Time.time >= this._playerNextUpdateTime) + { + this._playerObjects = FindObjectsOfType(typeof(Player)); + this._playerNextUpdateTime = Time.time + 0.5f; + } + + if (this._showLootESP && Time.time >= this._lootNextUpdateTime) + { + this._lootableObjects = FindObjectsOfType(typeof(LootItem)); + this._lootNextUpdateTime = Time.time + 0.01f; + } + + if (this._showLootableContainersESP && Time.time >= this._lootContainerNextUpdateTime) + { + this._lootableContainerObjects = FindObjectsOfType(typeof(LootableContainer)); + this._lootContainerNextUpdateTime = Time.time + 0.01f; + } + + if (this._showLootESP) + { + DrawLoot(); + } + + if (this._showLootableContainersESP) + { + DrawLootableContainers(); + } + + if (this._showPlayersESP) + { + DrawPlayers(); + } + } + + private void DrawLoot() + { + foreach (LootItem lootItem in this._lootableObjects) + { + float distanceToObject = Vector3.Distance(Camera.main.transform.position, lootItem.transform.position); + var viewTransform = new Vector3( + Camera.main.WorldToScreenPoint(lootItem.transform.position).x, + Camera.main.WorldToScreenPoint(lootItem.transform.position).y, + Camera.main.WorldToScreenPoint(lootItem.transform.position).z); + + if (distanceToObject <= _maxDrawingDistance && viewTransform.z > 0.01f) + { + GUI.color = Color.green; + GUI.Label(new Rect(viewTransform.x - 50f, (float)Screen.height - viewTransform.y, 100f, 50f), lootItem.name); + } + } + } + + private void DrawLootableContainers() + { + foreach (LootableContainer lootableContainer in this._lootableContainerObjects) + { + float distanceToObject = Vector3.Distance(Camera.main.transform.position, lootableContainer.transform.position); + var viewTransform = new Vector3( + Camera.main.WorldToScreenPoint(lootableContainer.transform.position).x, + Camera.main.WorldToScreenPoint(lootableContainer.transform.position).y, + Camera.main.WorldToScreenPoint(lootableContainer.transform.position).z); + + if (distanceToObject <= _maxDrawingDistance && viewTransform.z > 0.01f) + { + GUI.color = Color.cyan; + GUI.Label(new Rect(viewTransform.x - 50f, (float)Screen.height - viewTransform.y, 100f, 50f), lootableContainer.name); + } + } + } + + private void DrawPlayers() + { + foreach (Player player in this._playerObjects) + { + var playerBoundingVector = new Vector3( + Camera.main.WorldToScreenPoint(player.Transform.position).x, + Camera.main.WorldToScreenPoint(player.Transform.position).y, + Camera.main.WorldToScreenPoint(player.Transform.position).z); + + var playerHeadVector = new Vector3( + Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position).x, + Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position).y, + Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position).z); + + float distanceToObject = Vector3.Distance(Camera.main.transform.position, player.Transform.position); + float boxXOffset = Camera.main.WorldToScreenPoint(player.Transform.position).x; + float boxYOffset = Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position).y + 10f; + float boxHeight = Math.Abs(Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position).y - Camera.main.WorldToScreenPoint(player.Transform.position).y) + 10f; + float boxWidth = boxHeight * 0.65f; + + if (distanceToObject <= _maxDrawingDistance) + { + var uiColor = player.Profile.Health.IsAlive ? Color.red : Color.white; + GUI.color = uiColor; + + GuiHelper.DrawBox(boxXOffset - boxWidth / 2f, (float)Screen.height - boxYOffset, boxWidth, boxHeight, uiColor); + GuiHelper.DrawLine(new Vector2(playerHeadVector.x - 2f, (float)Screen.height - playerHeadVector.y), new Vector2(playerHeadVector.x + 2f, (float)Screen.height - playerHeadVector.y), uiColor); + GuiHelper.DrawLine(new Vector2(playerHeadVector.x, (float)Screen.height - playerHeadVector.y - 2f), new Vector2(playerHeadVector.x, (float)Screen.height - playerHeadVector.y + 2f), uiColor); + + string playerName = player.Profile.Health.IsAlive ? player.Profile.Info.Nickname : player.Profile.Info.Nickname + " (DEAD)"; + int playerHealth = (int)player.HealthController.SummaryHealth.CurrentValue / 435 * 100; + int distance = (int)distanceToObject; + string playerText = $"[{playerHealth}%] {playerName} [{distance}m]"; + + var playerTextVector = GUI.skin.GetStyle(playerText).CalcSize(new GUIContent(playerText)); + GUI.Label(new Rect(playerBoundingVector.x - playerTextVector.x / 2f, (float)Screen.height - boxYOffset - 20f, 300f, 50f), playerText); + + var weaponTextVector = GUI.skin.GetStyle(player.Weapon.Template.ShortName).CalcSize(new GUIContent(player.Weapon.Template.ShortName)); + GUI.Label(new Rect(playerBoundingVector.x - weaponTextVector.x / 2f, (float)Screen.height - playerBoundingVector.y + 2f, 100f, 20f), player.Weapon.Template.ShortName); + } + } + } + + private void DrawESPMenu() + { + GUI.color = Color.black; + GUI.Box(new Rect(100f, 100f, 190f, 190f), ""); + + GUI.color = Color.white; + GUI.Label(new Rect(180f, 110f, 50f, 20f), "ESP"); + + this._showPlayersESP = GUI.Toggle(new Rect(110f, 140f, 120f, 20f), this._showPlayersESP, " Players"); + this._showLootESP = GUI.Toggle(new Rect(110f, 160f, 120f, 20f), this._showLootESP, " Loot"); + this._showLootableContainersESP = GUI.Toggle(new Rect(110f, 180f, 120f, 20f), this._showLootableContainersESP, " Lootables"); + } + + private double GetDistance(double x1, double y1, double x2, double y2) + { + return Math.Sqrt(Math.Pow(x2 - x1, 2.0) + Math.Pow(y2 - y1, 2.0)); + } + } +}