diff --git a/.gitignore b/.gitignore
index 4ae41f9..cbec65c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
/.vs
-x64
\ No newline at end of file
+bin
+obj
\ No newline at end of file
diff --git a/Peak.sln b/Peak.sln
new file mode 100644
index 0000000..5fc197a
--- /dev/null
+++ b/Peak.sln
@@ -0,0 +1,22 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.12.35506.116 d17.12
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Peak", "Peak\Peak.csproj", "{132011FB-CD98-4500-B7A7-B5BB0CD3BFA4}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {132011FB-CD98-4500-B7A7-B5BB0CD3BFA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {132011FB-CD98-4500-B7A7-B5BB0CD3BFA4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {132011FB-CD98-4500-B7A7-B5BB0CD3BFA4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {132011FB-CD98-4500-B7A7-B5BB0CD3BFA4}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Peak/Peak.csproj b/Peak/Peak.csproj
new file mode 100644
index 0000000..4eb9b07
--- /dev/null
+++ b/Peak/Peak.csproj
@@ -0,0 +1,550 @@
+
+
+ netstandard2.1
+ enable
+ disable
+ Peak
+ default
+ false
+ 1.0.0.0
+ 1.0.0.0
+ en-US
+ Peak
+ latest
+ enable
+
+
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Ashley.MeshSplitter.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Assembly-CSharp-firstpass.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Assembly-CSharp.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\com.rlabrecque.steamworks.net.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\DemiLib.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\DOTween.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\DOTweenPro.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\HBAO.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\HBAO.Universal.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Newtonsoft.Json.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Photon3Unity3D.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\PhotonChat.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\PhotonRealtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\PhotonUnityNetworking.Demos.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\PhotonUnityNetworking.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\PhotonUnityNetworking.Utilities.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\PhotonVoice.API.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\PhotonVoice.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\PhotonVoice.PUN.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\pworld.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\sc.posteffects.runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Sirenix.OdinInspector.Attributes.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Sirenix.OdinInspector.Modules.Unity.Addressables.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Sirenix.OdinInspector.Modules.UnityLocalization.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Sirenix.Serialization.Config.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Sirenix.Serialization.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Sirenix.Utilities.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Tayx.Graphy.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\unity-websocket-sharp.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Addressables.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.AI.Navigation.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Animation.Rigging.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Animation.Rigging.DocCodeExamples.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Burst.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Burst.Unsafe.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Cinemachine.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Collections.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Collections.LowLevel.ILSupport.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.InputSystem.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.InputSystem.ForUI.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.InputSystem.RebindingUI.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.InternalAPIEngineBridge.013.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Localization.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Mathematics.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.MemoryProfiler.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Multiplayer.Center.Common.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Multiplayer.Playmode.Common.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Multiplayer.Playmode.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Networking.Transport.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Profiling.Core.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Rendering.LightTransport.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.RenderPipeline.Universal.ShaderLibrary.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.RenderPipelines.Core.Runtime.Shared.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.RenderPipelines.GPUDriven.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.RenderPipelines.Universal.2D.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.RenderPipelines.Universal.Config.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.RenderPipelines.Universal.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.RenderPipelines.Universal.Shaders.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.ResourceManager.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.ScriptableBuildPipeline.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Authentication.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Authentication.PlayerAccounts.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Analytics.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Components.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Configuration.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Device.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Environments.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Environments.Internal.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Internal.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Networking.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Registration.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Scheduler.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Telemetry.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Core.Threading.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Multiplayer.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.QoS.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Services.Wire.Internal.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Splines.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.TextMeshPro.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.Timeline.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Unity.VisualEffectGraph.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.AccessibilityModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.AIModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.AMDModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.AndroidJNIModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.AnimationModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.ARModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.AssetBundleModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.AudioModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.ClothModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.ClusterInputModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.ClusterRendererModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.ContentLoadModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.CoreModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.CrashReportingModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.DirectorModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.DSPGraphModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.GameCenterModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.GIModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.GraphicsStateCollectionSerializerModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.GridModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.HierarchyCoreModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.HotReloadModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.ImageConversionModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.IMGUIModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.InputForUIModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.InputLegacyModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.InputModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.JSONSerializeModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.LocalizationModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.MarshallingModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.MultiplayerModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.NVIDIAModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.ParticleSystemModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.PerformanceReportingModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.Physics2DModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.PhysicsModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.PropertiesModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.ScreenCaptureModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.ShaderVariantAnalyticsModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.SharedInternalsModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.SpriteMaskModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.SpriteShapeModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.StreamingModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.SubstanceModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.SubsystemsModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.TerrainModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.TerrainPhysicsModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.TextCoreFontEngineModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.TextCoreTextEngineModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.TextRenderingModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.TilemapModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.TLSModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UI.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UIElementsModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UIModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UmbraModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UnityAnalyticsCommonModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UnityAnalyticsModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UnityConnectModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UnityCurlModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UnityTestProtocolModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UnityWebRequestModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.VehiclesModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.VFXModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.VideoModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.VirtualTexturingModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.VRModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.WindModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityEngine.XRModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\UnityUIExtensions.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\websocket-sharp.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Whinarn.UnityMeshSimplifier.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Zorro.AutoLOD.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Zorro.ControllerSupport.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Zorro.Core.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Zorro.JiggleBones.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Zorro.PhotonUtility.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Zorro.Settings.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\PEAK_Data\Managed\Zorro.UI.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\MelonLoader\net35\MelonLoader.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\PEAK\MelonLoader\net35\0Harmony.dll
+
+
+
+
+
+ True
+ false
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Peak/PeakMenu.cs b/Peak/PeakMenu.cs
new file mode 100644
index 0000000..8b8c21e
--- /dev/null
+++ b/Peak/PeakMenu.cs
@@ -0,0 +1,20 @@
+using MelonLoader;
+
+[assembly: MelonInfo(typeof(Peak.PeakMenu), "PeakMenu", "1.0.0", "KaseToatz")]
+[assembly: MelonGame("LandCrab", "PEAK")]
+
+namespace Peak
+{
+ public class PeakMenu : MelonMod
+ {
+ public override void OnLateUpdate()
+ {
+ Character local = Character.localCharacter;
+ if (local != null)
+ {
+ local.refs.climbing.climbSpeedMod = 5F;
+ local.data.currentStamina = local.GetMaxStamina();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Peak/Speed.cs b/Peak/Speed.cs
new file mode 100644
index 0000000..de8ebfb
--- /dev/null
+++ b/Peak/Speed.cs
@@ -0,0 +1,16 @@
+using HarmonyLib;
+using System.Reflection;
+
+[HarmonyPatch(typeof(CharacterMovement), "GetMovementForce")]
+public static class Speed
+{
+ private static readonly FieldInfo character = typeof(CharacterMovement).GetField("character", BindingFlags.NonPublic | BindingFlags.Instance);
+
+ public static void Postfix(CharacterMovement __instance, ref float __result)
+ {
+ if (ReferenceEquals(character.GetValue(__instance), Character.localCharacter))
+ {
+ __result *= 5F;
+ }
+ }
+}
diff --git a/PeakMenu.sln b/PeakMenu.sln
deleted file mode 100644
index 5d1db76..0000000
--- a/PeakMenu.sln
+++ /dev/null
@@ -1,28 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.12.35506.116 d17.12
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PeakMenu", "PeakMenu\PeakMenu.vcxproj", "{AF72AD5F-FAC1-489C-A022-36C08515D36B}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {AF72AD5F-FAC1-489C-A022-36C08515D36B}.Debug|x64.ActiveCfg = Debug|x64
- {AF72AD5F-FAC1-489C-A022-36C08515D36B}.Debug|x64.Build.0 = Debug|x64
- {AF72AD5F-FAC1-489C-A022-36C08515D36B}.Debug|x86.ActiveCfg = Debug|Win32
- {AF72AD5F-FAC1-489C-A022-36C08515D36B}.Debug|x86.Build.0 = Debug|Win32
- {AF72AD5F-FAC1-489C-A022-36C08515D36B}.Release|x64.ActiveCfg = Release|x64
- {AF72AD5F-FAC1-489C-A022-36C08515D36B}.Release|x64.Build.0 = Release|x64
- {AF72AD5F-FAC1-489C-A022-36C08515D36B}.Release|x86.ActiveCfg = Release|Win32
- {AF72AD5F-FAC1-489C-A022-36C08515D36B}.Release|x86.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/PeakMenu/PeakMenu.vcxproj b/PeakMenu/PeakMenu.vcxproj
deleted file mode 100644
index f2bfc18..0000000
--- a/PeakMenu/PeakMenu.vcxproj
+++ /dev/null
@@ -1,156 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
- Release
- Win32
-
-
- Debug
- x64
-
-
- Release
- x64
-
-
-
- 17.0
- Win32Proj
- {af72ad5f-fac1-489c-a022-36c08515d36b}
- PeakMenu
- 10.0
-
-
-
- Application
- true
- v143
- Unicode
-
-
- Application
- false
- v143
- true
- Unicode
-
-
- DynamicLibrary
- true
- v143
- Unicode
-
-
- Application
- false
- v143
- true
- Unicode
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Level3
- true
- WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
-
-
- Console
- true
-
-
-
-
- Level3
- true
- true
- true
- WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
-
-
- Console
- true
- true
- true
-
-
-
-
- Level3
- true
- _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
- stdcpp20
- C:\Users\raefb\Documents\GitHub\PeakMenu\PeakMenu\g3log;%(AdditionalIncludeDirectories)
-
-
- Console
- true
-
-
-
-
- Level3
- true
- true
- true
- NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
- true
-
-
- Console
- true
- true
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/PeakMenu/PeakMenu.vcxproj.filters b/PeakMenu/PeakMenu.vcxproj.filters
deleted file mode 100644
index 37e66e7..0000000
--- a/PeakMenu/PeakMenu.vcxproj.filters
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
- {06b8dc19-35a5-4810-9c1c-bc3255a43a94}
-
-
-
-
- Source Files
-
-
- Source Files\g3log
-
-
- Source Files\g3log
-
-
- Source Files\g3log
-
-
- Source Files\g3log
-
-
- Source Files\g3log
-
-
- Source Files\g3log
-
-
- Source Files\g3log
-
-
- Source Files\g3log
-
-
- Source Files\g3log
-
-
- Source Files
-
-
-
-
- Header Files
-
-
- Source Files\g3log
-
-
- Source Files\g3log
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
-
\ No newline at end of file
diff --git a/PeakMenu/PeakMenu.vcxproj.user b/PeakMenu/PeakMenu.vcxproj.user
deleted file mode 100644
index 88a5509..0000000
--- a/PeakMenu/PeakMenu.vcxproj.user
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/PeakMenu/common.hpp b/PeakMenu/common.hpp
deleted file mode 100644
index df566f2..0000000
--- a/PeakMenu/common.hpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#pragma once
-
-#include
-#include
-#include
-#include
-
-namespace peak
-{
- using namespace std::chrono_literals;
- inline bool isRunning{true};
- inline HMODULE hModule;
- inline HANDLE mainThread{};
- inline DWORD mainThreadId{};
-}
\ No newline at end of file
diff --git a/PeakMenu/g3log/crashhandler_windows.cpp b/PeakMenu/g3log/crashhandler_windows.cpp
deleted file mode 100644
index 757ab98..0000000
--- a/PeakMenu/g3log/crashhandler_windows.cpp
+++ /dev/null
@@ -1,249 +0,0 @@
-/** ==========================================================================
- * 2011 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
- * with no warranties. This code is yours to share, use and modify with no
- * strings attached and no restrictions or obligations.
- *
- * For more information see g3log/LICENSE or refer refer to http://unlicense.org
- * ============================================================================*/
-
-#if !(defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
-#error "crashhandler_windows.cpp used but not on a windows system"
-#endif
-
-#include // getpid
-#include
-#include
-#include
-#include
-#include
-#include "g3log/crashhandler.hpp"
-#include "g3log/g3log.hpp"
-#include "g3log/logcapture.hpp"
-#include "g3log/stacktrace_windows.hpp"
-
-#define getpid _getpid
-
-namespace {
- std::atomic gBlockForFatal{true};
- LPTOP_LEVEL_EXCEPTION_FILTER g_previous_unexpected_exception_handler = nullptr;
-
-#if !(defined(DISABLE_FATAL_SIGNALHANDLING))
- thread_local bool g_installed_thread_signal_handler = false;
-#endif
-
-#if !(defined(DISABLE_VECTORED_EXCEPTIONHANDLING))
- void* g_vector_exception_handler = nullptr;
-#endif
-
- // called for fatal signals SIGABRT, SIGFPE, SIGSEGV, SIGILL, SIGTERM
- void signalHandler(int signal_number) {
- using namespace g3::internal;
- std::string dump = stacktrace::stackdump();
-
- std::ostringstream fatal_stream;
- fatal_stream << "\n***** Received fatal signal " << g3::internal::exitReasonName(g3::internal::FATAL_SIGNAL, signal_number);
- fatal_stream << "(" << signal_number << ")\tPID: " << getpid() << std::endl;
-
- LogCapture trigger(FATAL_SIGNAL, static_cast(signal_number), dump.c_str());
- trigger.stream() << fatal_stream.str();
-
- // Trigger debug break point, if we're in debug. This breakpoint CAN cause a slowdown when it happens.
- // Be patient. The "Debug" dialog should pop-up eventually if you doing it in Visual Studio.
- // For fatal signals only, not exceptions.
- // This is a way to tell the IDE (if in dev mode) that it can stop at this breakpoint
- // Note that at this time the fatal log event with stack trace is NOT yet flushed to the logger
- // This call will do nothing unless we're in DEBUG and "DEBUG_BREAK_AT_FATAL_SIGNAL" is enabled
- // ref: g3log/Options.cmake
-#if (!defined(NDEBUG) && defined(DEBUG_BREAK_AT_FATAL_SIGNAL))
- __debugbreak();
-#endif
- } // scope exit - message sent to LogWorker, wait to die...
-
- // Unhandled exception catching
- LONG WINAPI exceptionHandling(EXCEPTION_POINTERS* info, const std::string& handler) {
- std::string dump = stacktrace::stackdump(info);
-
- std::ostringstream fatal_stream;
- const g3::SignalType exception_code = info->ExceptionRecord->ExceptionCode;
- fatal_stream << "\n***** " << handler << ": Received fatal exception " << g3::internal::exitReasonName(g3::internal::FATAL_EXCEPTION, exception_code);
- fatal_stream << "\tPID: " << getpid() << std::endl;
-
- const auto fatal_id = static_cast(exception_code);
- LogCapture trigger(g3::internal::FATAL_EXCEPTION, fatal_id, dump.c_str());
- trigger.stream() << fatal_stream.str();
- // FATAL Exception: It doesn't necessarily stop here. we pass on continue search
- // if no one else will catch that then it's goodbye anyhow.
- // The RISK here is if someone is catching this and returning "EXCEPTION_EXECUTE_HANDLER"
- // but does not shutdown then the software will be running with g3log shutdown.
- // .... However... this must be seen as a bug from standard handling of fatal exceptions
- // https://msdn.microsoft.com/en-us/library/6wxdsc38.aspx
- return EXCEPTION_CONTINUE_SEARCH;
- }
-
- // Unhandled exception catching
- LONG WINAPI unexpectedExceptionHandling(EXCEPTION_POINTERS* info) {
- g3::internal::restoreFatalHandlingToDefault();
- return exceptionHandling(info, "Unexpected Exception Handler");
- }
-
- /// Setup through (Windows API) AddVectoredExceptionHandler
- /// Ref: http://blogs.msdn.com/b/zhanli/archive/2010/06/25/c-tips-addvectoredexceptionhandler-addvectoredcontinuehandler-and-setunhandledexceptionfilter.aspx
-#if !(defined(DISABLE_VECTORED_EXCEPTIONHANDLING))
- LONG WINAPI vectorExceptionHandling(PEXCEPTION_POINTERS p) {
- const g3::SignalType exception_code = p->ExceptionRecord->ExceptionCode;
- if (false == stacktrace::isKnownException(exception_code)) {
- // The unknown exception is ignored. Since it is not a Windows
- // fatal exception generated by the OS we leave the
- // responsibility to deal with this by the client software.
- return EXCEPTION_CONTINUE_SEARCH;
- } else {
- g3::internal::restoreFatalHandlingToDefault();
- return exceptionHandling(p, "Vectored Exception Handler");
- }
- }
-#endif
-} // end anonymous namespace
-
-namespace g3 {
- namespace internal {
- // For windows exceptions this might ONCE be set to false, in case of a
- // windows exceptions and not a signal
- bool shouldBlockForFatalHandling() {
- return gBlockForFatal;
- }
-
- /// Generate stackdump. Or in case a stackdump was pre-generated and
- /// non-empty just use that one. i.e. the latter case is only for
- /// Windows and test purposes
- std::string stackdump(const char* dump) {
- if (nullptr != dump && !std::string(dump).empty()) {
- return {dump};
- }
-
- return stacktrace::stackdump();
- }
-
- /// string representation of signal ID or Windows exception id
- std::string exitReasonName(const LEVELS& level, g3::SignalType fatal_id) {
- if (level == g3::internal::FATAL_EXCEPTION) {
- return stacktrace::exceptionIdToText(fatal_id);
- }
-
- switch (fatal_id) {
- case SIGABRT:
- return "SIGABRT";
- break;
- case SIGFPE:
- return "SIGFPE";
- break;
- case SIGSEGV:
- return "SIGSEGV";
- break;
- case SIGILL:
- return "SIGILL";
- break;
- case SIGTERM:
- return "SIGTERM";
- break;
- default:
- std::ostringstream oss;
- oss << "UNKNOWN SIGNAL(" << fatal_id << ")";
- return oss.str();
- }
- }
-
- // Triggered by g3log::LogWorker after receiving a FATAL trigger
- // which is LOG(FATAL), CHECK(false) or a fatal signal our signalhandler caught.
- // --- If LOG(FATAL) or CHECK(false) the signal_number will be SIGABRT
- void exitWithDefaultSignalHandler(const LEVELS& level, g3::SignalType fatal_signal_id) {
- restoreFatalHandlingToDefault();
- // For windows exceptions we want to continue the possibility of
- // exception handling now when the log and stacktrace are flushed
- // to sinks. We therefore avoid to kill the process here. Instead
- // it will be the exceptionHandling functions above that
- // will let exception handling continue with: EXCEPTION_CONTINUE_SEARCH
- if (g3::internal::FATAL_EXCEPTION == level) {
- gBlockForFatal = false;
- return;
- }
-
- // for a signal however, we exit through that fatal signal
- const int signal_number = static_cast(fatal_signal_id);
- raise(signal_number);
- }
-
- // FYI: Concept of async-signal-safe operations does not exist on windows
- // we stick to perror for lack of better alternatives.
- size_t writeErrorMessage(const char* message) {
- perror(message);
- return std::strlen(message);
- }
-
- // Restore back to default fatal event handling
- void restoreFatalHandlingToDefault() {
-#if !(defined(DISABLE_FATAL_SIGNALHANDLING))
- SetUnhandledExceptionFilter(g_previous_unexpected_exception_handler);
-
-#if !(defined(DISABLE_VECTORED_EXCEPTIONHANDLING))
- RemoveVectoredExceptionHandler(g_vector_exception_handler);
-#endif
-
- if (SIG_ERR == signal(SIGABRT, SIG_DFL))
- internal::writeErrorMessage("signal - SIGABRT");
-
- if (SIG_ERR == signal(SIGFPE, SIG_DFL))
- internal::writeErrorMessage("signal - SIGABRT");
-
- if (SIG_ERR == signal(SIGSEGV, SIG_DFL))
- internal::writeErrorMessage("signal - SIGABRT");
-
- if (SIG_ERR == signal(SIGILL, SIG_DFL))
- internal::writeErrorMessage("signal - SIGABRT");
-
- if (SIG_ERR == signal(SIGTERM, SIG_DFL))
- internal::writeErrorMessage("signal - SIGABRT");
-#endif
- }
-
- void installSignalHandler() {
- g3::installSignalHandlerForThread();
- }
-
- } // namespace internal
-
- /// SIGFPE, SIGILL, and SIGSEGV handling must be installed per thread
- /// on Windows. This is automatically done if you do at least one LOG(...) call
- /// you can also use this function call, per thread so make sure these three
- /// fatal signals are covered in your thread (even if you don't do a LOG(...) call
- void installSignalHandlerForThread() {
-#if !(defined(DISABLE_FATAL_SIGNALHANDLING))
- if (!g_installed_thread_signal_handler) {
- g_installed_thread_signal_handler = true;
- if (SIG_ERR == signal(SIGTERM, signalHandler))
- internal::writeErrorMessage("signal - SIGTERM");
- if (SIG_ERR == signal(SIGABRT, signalHandler))
- internal::writeErrorMessage("signal - SIGABRT");
- if (SIG_ERR == signal(SIGFPE, signalHandler))
- internal::writeErrorMessage("signal - SIGFPE");
- if (SIG_ERR == signal(SIGSEGV, signalHandler))
- internal::writeErrorMessage("signal - SIGSEGV");
- if (SIG_ERR == signal(SIGILL, signalHandler))
- internal::writeErrorMessage("signal - SIGILL");
- }
-#endif
- }
-
- void installCrashHandler() {
- internal::installSignalHandler();
- g_previous_unexpected_exception_handler = SetUnhandledExceptionFilter(unexpectedExceptionHandling);
-
-#if !(defined(DISABLE_VECTORED_EXCEPTIONHANDLING))
- // const size_t kFirstExceptionHandler = 1;
- // kFirstExceptionsHandler is kept here for documentation purposes.
- // The last exception seems more like what we want.
- const size_t kLastExceptionHandler = 0;
- g_vector_exception_handler = AddVectoredExceptionHandler(kLastExceptionHandler, vectorExceptionHandling);
-#endif
- }
-
-} // end namespace g3
diff --git a/PeakMenu/g3log/filesink.cpp b/PeakMenu/g3log/filesink.cpp
deleted file mode 100644
index 2e559d0..0000000
--- a/PeakMenu/g3log/filesink.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/** ==========================================================================
- * 2013 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
- * with no warranties. This code is yours to share, use and modify with no
- * strings attached and no restrictions or obligations.
- *
- * For more information see g3log/LICENSE or refer refer to http://unlicense.org
- * ============================================================================*/
-
-#include "g3log/filesink.hpp"
-#include
-#include
-#include "filesinkhelper.ipp"
-
-namespace g3 {
- using namespace internal;
-
- FileSink::FileSink(const std::string& log_prefix, const std::string& log_directory, const std::string& logger_id, size_t write_to_log_every_x_message) :
- _log_details_func(&LogMessage::DefaultLogDetailsToString),
- _log_file_with_path(log_directory),
- _log_prefix_backup(log_prefix),
- _outptr(new std::ofstream),
- _header("\t\tLOG format: [YYYY/MM/DD hh:mm:ss uuu* LEVEL FILE->FUNCTION:LINE] message\n\n\t\t(uuu*: microseconds fractions of the seconds value)\n\n"),
- _firstEntry(true),
- _write_counter(0),
- _write_to_log_every_x_message(write_to_log_every_x_message) {
- _log_prefix_backup = prefixSanityFix(log_prefix);
- if (!isValidFilename(_log_prefix_backup)) {
- std::cerr << "g3log: forced abort due to illegal log prefix [" << log_prefix << "]" << std::endl;
- abort();
- }
-
- std::string file_name = createLogFileName(_log_prefix_backup, logger_id);
- _log_file_with_path = pathSanityFix(_log_file_with_path, file_name);
- _outptr = createLogFile(_log_file_with_path);
-
- if (!_outptr) {
- std::cerr << "Cannot write log file to location, attempting current directory" << std::endl;
- _log_file_with_path = "./" + file_name;
- _outptr = createLogFile(_log_file_with_path);
- }
- assert(_outptr && "cannot open log file at startup");
- }
-
- FileSink::~FileSink() {
- std::string exit_msg = {"g3log g3FileSink shutdown at: "};
- auto now = std::chrono::system_clock::now();
- exit_msg.append(localtime_formatted(now, internal::time_formatted)).append("\n");
-
- // write anything buffered up and then end with the exit msg
- filestream() << _write_buffer << exit_msg << std::flush;
-
- exit_msg.append("Log file at: [").append(_log_file_with_path).append("]\n");
- std::cerr << exit_msg << std::flush;
- }
-
- // The actual log receiving function
- void FileSink::fileWrite(LogMessageMover message) {
- if (_firstEntry) {
- addLogFileHeader();
- _firstEntry = false;
- }
-
- auto data = message.get().toString(_log_details_func);
-
- _write_buffer.append(data);
- if (++_write_counter % _write_to_log_every_x_message == 0) {
- filestream() << _write_buffer << std::flush;
- _write_buffer.clear();
- }
- }
-
- std::string FileSink::changeLogFile(const std::string& directory, const std::string& logger_id) {
-
- auto now = std::chrono::system_clock::now();
- auto now_formatted = g3::localtime_formatted(now, {internal::date_formatted + " " + internal::time_formatted});
-
- std::string file_name = createLogFileName(_log_prefix_backup, logger_id);
- std::string prospect_log = directory + file_name;
- std::unique_ptr log_stream = createLogFile(prospect_log);
- if (nullptr == log_stream) {
- filestream() << "\n"
- << now_formatted << " Unable to change log file. Illegal filename or busy? Unsuccessful log name was: " << prospect_log;
- return {}; // no success
- }
-
- addLogFileHeader();
- std::ostringstream ss_change;
- ss_change << "\n\tChanging log file from : " << _log_file_with_path;
- ss_change << "\n\tto new location: " << prospect_log << "\n";
- filestream() << now_formatted << ss_change.str();
- ss_change.str("");
-
- std::string old_log = _log_file_with_path;
- _log_file_with_path = std::move(prospect_log);
- _outptr = std::move(log_stream);
- ss_change << "\n\tNew log file. The previous log file was at: ";
- ss_change << old_log << "\n";
- filestream() << now_formatted << ss_change.str();
- return _log_file_with_path;
- }
-
- std::string FileSink::fileName() {
- return _log_file_with_path;
- }
-
- void FileSink::overrideLogDetails(LogMessage::LogDetailsFunc func) {
- _log_details_func = func;
- }
-
- void FileSink::overrideLogHeader(const std::string& change) {
- _header = change;
- }
-
- void FileSink::addLogFileHeader() {
- filestream() << header(_header);
- }
-} // namespace g3
diff --git a/PeakMenu/g3log/filesinkhelper.ipp b/PeakMenu/g3log/filesinkhelper.ipp
deleted file mode 100644
index 1e42999..0000000
--- a/PeakMenu/g3log/filesinkhelper.ipp
+++ /dev/null
@@ -1,127 +0,0 @@
-/** ==========================================================================
- * 2013 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
- * with no warranties. This code is yours to share, use and modify with no
- * strings attached and no restrictions or obligations.
- *
- * For more information see g3log/LICENSE or refer refer to http://unlicense.org
- * ============================================================================*/
-
-#pragma once
-
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-
-namespace g3 {
- namespace internal {
- static const std::string file_name_time_formatted = "%Y%m%d-%H%M%S";
-
- // check for filename validity - filename should not be part of PATH
- bool isValidFilename(const std::string &prefix_filename) {
- std::string illegal_characters("/,|<>:#$%{}[]\'\"^!?+* ");
- size_t pos = prefix_filename.find_first_of(illegal_characters, 0);
- if (pos != std::string::npos) {
- std::cerr << "Illegal character [" << prefix_filename.at(pos) << "] in logname prefix: " << "[" << prefix_filename << "]" << std::endl;
- return false;
- } else if (prefix_filename.empty()) {
- std::cerr << "Empty filename prefix is not allowed" << std::endl;
- return false;
- }
-
- return true;
- }
-
- std::string prefixSanityFix(std::string prefix) {
- prefix.erase(std::remove_if(prefix.begin(), prefix.end(), ::isspace), prefix.end());
- prefix.erase(std::remove(prefix.begin(), prefix.end(), '/'), prefix.end());
- prefix.erase(std::remove(prefix.begin(), prefix.end(), '\\'), prefix.end());
- prefix.erase(std::remove(prefix.begin(), prefix.end(), '.'), prefix.end());
- prefix.erase(std::remove(prefix.begin(), prefix.end(), ':'), prefix.end());
- if (!isValidFilename(prefix)) {
- return
- {
- };
- }
- return prefix;
- }
-
- std::string pathSanityFix(std::string path, const std::string &file_name) {
- // Unify the delimeters,. maybe sketchy solution but it seems to work
- // on at least win7 + ubuntu. All bets are off for older windows
- std::replace(path.begin(), path.end(), '\\', '/');
-
- // clean up in case of multiples
- auto contains_end = [&](std::string & in) -> bool {
- size_t size = in.size();
- if (!size) return false;
- char end = in[size - 1];
- return (end == '/' || end == ' ');
- };
-
- while (contains_end(path)) {
- path.erase(path.size() - 1);
- }
-
- if (!path.empty()) {
- path.insert(path.end(), '/');
- }
-
- path.insert(path.size(), file_name);
- return path;
- }
-
- std::string header(const std::string& headerFormat) {
- std::ostringstream ss_entry;
- // Day Month Date Time Year: is written as "%a %b %d %H:%M:%S %Y" and formatted output as : Wed Sep 19 08:28:16 2012
- auto now = std::chrono::system_clock::now();
- ss_entry << "\t\tg3log created log at: " << g3::localtime_formatted(now, "%a %b %d %H:%M:%S %Y") << "\n";
- ss_entry << headerFormat;
- return ss_entry.str();
- }
-
- std::string createLogFileName(const std::string &verified_prefix, const std::string &logger_id) {
- std::stringstream oss_name;
- oss_name << verified_prefix << ".";
- if( !logger_id.empty() ) {
- oss_name << logger_id << ".";
- }
- auto now = std::chrono::system_clock::now();
- oss_name << g3::localtime_formatted(now, file_name_time_formatted);
- oss_name << ".log";
- return oss_name.str();
- }
-
- bool openLogFile(const std::string &complete_file_with_path, std::ofstream &outstream) {
- std::ios_base::openmode mode = std::ios_base::out; // for clarity: it's really overkill since it's an ofstream
- mode |= std::ios_base::trunc;
- outstream.open(complete_file_with_path, mode);
- if (!outstream.is_open()) {
- std::ostringstream ss_error;
- ss_error << "FILE ERROR: could not open log file:[" << complete_file_with_path << "]";
- ss_error << "\n\t\t std::ios_base state = " << outstream.rdstate();
- std::cerr << ss_error.str().c_str() << std::endl;
- outstream.close();
- return false;
- }
- return true;
- }
-
- std::unique_ptr createLogFile(const std::string &file_with_full_path) {
- std::unique_ptr out(new std::ofstream);
- std::ofstream &stream(*(out.get()));
- bool success_with_open_file = openLogFile(file_with_full_path, stream);
- if (false == success_with_open_file) {
- out.reset();
- }
- return out;
- }
-
-
- }
-}
diff --git a/PeakMenu/g3log/g2log.hpp b/PeakMenu/g3log/g2log.hpp
deleted file mode 100644
index 2ab9ee9..0000000
--- a/PeakMenu/g3log/g2log.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-/** ==========================================================================
-* 2015 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
-* with no warranties. This code is yours to share, use and modify with no
-* strings attached and no restrictions or obligations.
-*
-* For more information see g3log/LICENSE or refer refer to http://unlicense.org
-* ============================================================================*/
-
-#pragma once
-
-// For convenience: If you don't want to do a recursive search and replace in your source code
-// for replacing g2log.hpp for g3log/g3log.hpp then you can choose to add this header file to your
-// code. It will get the necessary includes
-//
-//
-// Btw: replacing g2log for g3log include is easy on Linux
-// find . -name "*.cpp*" -print | xargs sed -i -e 's/\g2log\.hpp/\g3log\/g3log\.hpp/g'
-
-#include
-#include
-#include
-#include
diff --git a/PeakMenu/g3log/g3log.cpp b/PeakMenu/g3log/g3log.cpp
deleted file mode 100644
index a5bfa52..0000000
--- a/PeakMenu/g3log/g3log.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-/** ==========================================================================
- * 2011 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
- * with no warranties. This code is yours to share, use and modify with no
- * strings attached and no restrictions or obligations.
- *
- * For more information see g3log/LICENSE or refer refer to http://unlicense.org
- * ============================================================================
- *
- * Filename:g3log.cpp Framework for Logging and Design By Contract
- * Created: 2011 by Kjell Hedström
- *
- * PUBLIC DOMAIN and Not copyrighted since it was built on public-domain software and at least in "spirit" influenced
- * from the following sources
- * 1. kjellkod.cc ;)
- * 2. Dr.Dobbs, Petru Marginean: http://drdobbs.com/article/printableArticle.jhtml?articleId=201804215&dept_url=/cpp/
- * 3. Dr.Dobbs, Michael Schulze: http://drdobbs.com/article/printableArticle.jhtml?articleId=225700666&dept_url=/cpp/
- * 4. Google 'glog': http://google-glog.googlecode.com/svn/trunk/doc/glog.html
- * 5. Various Q&A at StackOverflow
- * ********************************************* */
-
-#include "g3log/g3log.hpp"
-#include "g3log/crashhandler.hpp"
-#include "g3log/loglevels.hpp"
-#include "g3log/logmessage.hpp"
-#include "g3log/logworker.hpp"
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-namespace {
- std::once_flag g_initialize_flag;
- g3::LogWorker* g_logger_instance = nullptr; // instantiated and OWNED somewhere else (main)
- std::mutex g_logging_init_mutex;
-
- std::unique_ptr g_first_uninitialized_msg = {nullptr};
- std::once_flag g_set_first_uninitialized_flag;
- std::once_flag g_save_first_uninitialized_flag;
- const std::function g_pre_fatal_hook_that_does_nothing = [] { /*does nothing */ };
- std::function g_fatal_pre_logging_hook;
-
- std::atomic g_fatal_hook_recursive_counter = {0};
-} // namespace
-
-namespace g3 {
- // signalhandler and internal clock is only needed to install once
- // for unit testing purposes the initializeLogging might be called
- // several times...
- // for all other practical use, it shouldn't!
-
- void initializeLogging(LogWorker* bgworker) {
- std::call_once(g_initialize_flag, [] {
- installCrashHandler();
- });
- std::lock_guard lock(g_logging_init_mutex);
- if (internal::isLoggingInitialized() || nullptr == bgworker) {
- std::ostringstream exitMsg;
- exitMsg << __FILE__ "->" << __FUNCTION__ << ":" << __LINE__ << std::endl;
- exitMsg << "\tFatal exit due to illegal initialization of g3::LogWorker\n";
- exitMsg << "\t(due to multiple initializations? : " << std::boolalpha << internal::isLoggingInitialized();
- exitMsg << ", due to nullptr == bgworker? : " << std::boolalpha << (nullptr == bgworker) << ")";
- std::cerr << exitMsg.str() << std::endl;
- std::exit(EXIT_FAILURE);
- }
-
- // Save the first uninitialized message, if any
- std::call_once(g_save_first_uninitialized_flag, [&bgworker] {
- if (g_first_uninitialized_msg) {
- bgworker->save(LogMessagePtr{std::move(g_first_uninitialized_msg)});
- }
- });
-
- g_logger_instance = bgworker;
- // by default the pre fatal logging hook does nothing
- // if it WOULD do something it would happen in
- setFatalPreLoggingHook(g_pre_fatal_hook_that_does_nothing);
- // recursive crash counter re-set to zero
- g_fatal_hook_recursive_counter.store(0);
- }
-
- /**
- * default does nothing, @ref ::g_pre_fatal_hook_that_does_nothing
- * It will be called just before sending the fatal message, @ref pushFatalmessageToLogger
- * It will be reset to do nothing in ::initializeLogging(...)
- * so please call this function, if you ever need to, after initializeLogging(...)
- */
- void setFatalPreLoggingHook(std::function pre_fatal_hook) {
- static std::mutex m;
- std::lock_guard lock(m);
- g_fatal_pre_logging_hook = pre_fatal_hook;
- }
-
- // By default this function pointer goes to \ref pushFatalMessageToLogger;
- std::function g_fatal_to_g3logworker_function_ptr = internal::pushFatalMessageToLogger;
-
- /** REPLACE fatalCallToLogger for fatalCallForUnitTest
- * This function switches the function pointer so that only
- * 'unitTest' mock-fatal calls are made.
- * */
- void setFatalExitHandler(std::function fatal_call) {
- g_fatal_to_g3logworker_function_ptr = fatal_call;
- }
-
- namespace internal {
-
- bool isLoggingInitialized() {
- return g_logger_instance != nullptr;
- }
-
- /**
- * Shutdown the logging by making the pointer to the background logger to nullptr. The object is not deleted
- * that is the responsibility of its owner. *
- */
- void shutDownLogging() {
- std::lock_guard lock(g_logging_init_mutex);
- g_logger_instance = nullptr;
- }
-
- /** Same as the Shutdown above but called by the destructor of the LogWorker, thus ensuring that no further
- * LOG(...) calls can happen to a non-existing LogWorker.
- * @param active MUST BE the LogWorker initialized for logging. If it is not then this call is just ignored
- * and the logging continues to be active.
- * @return true if the correct worker was given,. and shutDownLogging was called
- */
- bool shutDownLoggingForActiveOnly(LogWorker* active) {
- if (isLoggingInitialized() && nullptr != active && (active != g_logger_instance)) {
- LOG(WARNING) << "\n\t\tAttempted to shut down logging, but the ID of the Logger is not the one that is active."
- << "\n\t\tHaving multiple instances of the g3::LogWorker is likely a BUG"
- << "\n\t\tEither way, this call to shutDownLogging was ignored"
- << "\n\t\tTry g3::internal::shutDownLogging() instead";
- return false;
- }
- shutDownLogging();
- return true;
- }
-
- /** explicitly copy of all input. This is makes it possibly to use g3log across dynamically loaded libraries
- * i.e. (dlopen + dlsym) */
- void saveMessage(const char* entry, const char* file, int line, const char* function, const LEVELS& level,
- const char* boolean_expression, int fatal_signal, const char* stack_trace) {
- LEVELS msgLevel{level};
- LogMessagePtr message{std::make_unique(file, line, function, msgLevel)};
- message.get()->write().append(entry);
- message.get()->setExpression(boolean_expression);
-
- if (internal::wasFatal(level)) {
- saveFatalMessage(stack_trace, message, fatal_signal);
- } else {
- pushMessageToLogger(message);
- }
- }
-
- void saveFatalMessage(const char* stack_trace, g3::LogMessagePtr& message, int& fatal_signal) {
- auto fatalhook = g_fatal_pre_logging_hook;
- // In case the fatal_pre logging actually will cause a crash in its turn
- // let's not do recursive crashing!
- setFatalPreLoggingHook(g_pre_fatal_hook_that_does_nothing);
- ++g_fatal_hook_recursive_counter; // thread safe counter
- // "benign" race here. If two threads crashes, with recursive crashes
- // then it's possible that the "other" fatal stack trace will be shown
- // that's OK since it was anyhow the first crash detected
- static const std::string first_stack_trace = stack_trace;
- fatalhook();
- message.get()->write().append(stack_trace);
-
- if (g_fatal_hook_recursive_counter.load() > 1) {
- message.get()->write().append(
- "\n\n\nWARNING\n"
- "A recursive crash detected. It is likely the hook set with 'setFatalPreLoggingHook(...)' is responsible\n\n")
- .append("---First crash stacktrace: ")
- .append(first_stack_trace)
- .append("\n---End of first stacktrace\n");
- }
- FatalMessagePtr fatal_message{std::make_unique(*(message._move_only.get()), fatal_signal)};
- // At destruction, flushes fatal message to g3LogWorker
- // either we will stay here until the background worker has received the fatal
- // message, flushed the crash message to the sinks and exits with the same fatal signal
- //..... OR it's in unit-test mode then we throw a std::runtime_error (and never hit sleep)
- fatalCall(fatal_message);
- }
- /**
- * save the message to the logger. In case of called before the logger is instantiated
- * the first message will be saved. Any following subsequent uninitialized log calls
- * will be ignored.
- *
- * The first initialized log entry will also save the first uninitialized log message, if any
- * @param log_entry to save to logger
- */
- void pushMessageToLogger(LogMessagePtr incoming) { // todo rename to Push SavedMessage To Worker
- // Uninitialized messages are ignored but does not CHECK/crash the logger
- if (!internal::isLoggingInitialized()) {
- std::call_once(g_set_first_uninitialized_flag, [&] {
- g_first_uninitialized_msg = incoming.release();
- std::string err = {"LOGGER NOT INITIALIZED:\n\t\t"};
- err.append(g_first_uninitialized_msg->message());
- std::string& str = g_first_uninitialized_msg->write();
- str.clear();
- str.append(err); // replace content
- std::cerr << str << std::endl; });
- return;
- }
-
- // logger is initialized
- g_logger_instance->save(incoming);
- }
-
- /** Fatal call saved to logger. This will trigger SIGABRT or other fatal signal
- * to exit the program. After saving the fatal message the calling thread
- * will sleep forever (i.e. until the background thread catches up, saves the fatal
- * message and kills the software with the fatal signal.
- */
- void pushFatalMessageToLogger(FatalMessagePtr message) {
- if (!isLoggingInitialized()) {
- std::ostringstream error;
- error << "FATAL CALL but logger is NOT initialized\n"
- << "CAUSE: " << message.get()->reason()
- << "\nMessage: \n"
- << message.get()->toString() << std::flush;
- std::cerr << error.str() << std::flush;
- internal::exitWithDefaultSignalHandler(message.get()->_level, message.get()->_signal_id);
- }
- g_logger_instance->fatal(message);
- while (shouldBlockForFatalHandling()) {
- std::this_thread::sleep_for(std::chrono::seconds(1));
- }
- }
-
- /** The default, initial, handling to send a 'fatal' event to g3logworker
- * the caller will stay here, eternally, until the software is aborted
- * ... in the case of unit testing it is the given "Mock" fatalCall that will
- * define the behaviour.
- */
- void fatalCall(FatalMessagePtr message) {
- g_fatal_to_g3logworker_function_ptr(FatalMessagePtr{std::move(message)});
- }
-
- } // namespace internal
-} // namespace g3
diff --git a/PeakMenu/g3log/g3log/active.hpp b/PeakMenu/g3log/g3log/active.hpp
deleted file mode 100644
index 3711f9d..0000000
--- a/PeakMenu/g3log/g3log/active.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/** ==========================================================================
- * 2010 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
- * with no warranties. This code is yours to share, use and modify with no
- * strings attached and no restrictions or obligations.
- *
- * For more information see g3log/LICENSE or refer refer to http://unlicense.org
- * ============================================================================
- *
- * Example of a Active Object, using C++11 std::thread mechanisms to make it
- * safe for thread communication.
- *
- * This was originally published at http://sites.google.com/site/kjellhedstrom2/active-object-with-cpp0x
- * and inspired from Herb Sutter's C++11 Active Object
- * http://herbsutter.com/2010/07/12/effective-concurrency-prefer-using-active-objects-instead-of-naked-threads
- *
- * Last update 2013-12-19 by Kjell Hedstrom,
- * e-mail: hedstrom at kjellkod dot cc
- * linkedin: http://linkedin.com/se/kjellkod */
-
-#pragma once
-
-#include
-#include
-#include
-#include "g3log/shared_queue.hpp"
-
-namespace kjellkod {
- typedef std::function Callback;
-
- class Active {
- private:
- Active() :
- done_(false) {} // Construction ONLY through factory createActive();
- Active(const Active&) = delete;
- Active& operator=(const Active&) = delete;
-
- void run() {
- while (!done_) {
- Callback func;
- mq_.wait_and_pop(func);
- func();
- }
- }
-
- shared_queue mq_;
- std::thread thd_;
- bool done_;
-
- public:
- virtual ~Active() {
- send([this]() noexcept { done_ = true; });
- thd_.join();
- }
-
- void send(Callback msg_) {
- mq_.push(msg_);
- }
-
- /// Factory: safe construction of object before thread start
- static std::unique_ptr createActive() {
- std::unique_ptr aPtr(new Active());
- aPtr->thd_ = std::thread(&Active::run, aPtr.get());
- return aPtr;
- }
- };
-
-} // namespace kjellkod
diff --git a/PeakMenu/g3log/g3log/atomicbool.hpp b/PeakMenu/g3log/g3log/atomicbool.hpp
deleted file mode 100644
index d6e51fb..0000000
--- a/PeakMenu/g3log/g3log/atomicbool.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/** ==========================================================================
-* 2015 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
-* with no warranties. This code is yours to share, use and modify with no
-* strings attached and no restrictions or obligations.
-*
-* For more information see g3log/LICENSE or refer refer to http://unlicense.org
-* ============================================================================*/
-
-#pragma once
-
-#include
-
-namespace g3 {
- /// As suggested in: http://stackoverflow.com/questions/13193484/how-to-declare-a-vector-of-atomic-in-c
- struct atomicbool {
- private:
- std::atomic value_;
-
- public:
- atomicbool() :
- value_{false} {}
- atomicbool(bool value) :
- value_{value} {}
- atomicbool(const std::atomic& value) :
- value_{value.load(std::memory_order_acquire)} {}
- atomicbool(const atomicbool& other) :
- value_{other.value_.load(std::memory_order_acquire)} {}
-
- atomicbool& operator=(const atomicbool& other) {
- value_.store(other.value_.load(std::memory_order_acquire), std::memory_order_release);
- return *this;
- }
-
- atomicbool& operator=(const bool other) {
- value_.store(other, std::memory_order_release);
- return *this;
- }
-
- bool operator==(const atomicbool& rhs) const {
- return (value_.load(std::memory_order_acquire) == rhs.value_.load(std::memory_order_acquire));
- }
-
- bool value() { return value_.load(std::memory_order_acquire); }
- std::atomic& get() { return value_; }
- };
-} // namespace g3
- // explicit whitespace/EOF for VS15
\ No newline at end of file
diff --git a/PeakMenu/g3log/g3log/crashhandler.hpp b/PeakMenu/g3log/g3log/crashhandler.hpp
deleted file mode 100644
index bf355f3..0000000
--- a/PeakMenu/g3log/g3log/crashhandler.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#pragma once
-
-/** ==========================================================================
- * 2011 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own risk and comes
- * with no warranties. This code is yours to share, use and modify with no
- * strings attached and no restrictions or obligations.
- *
- * For more information see g3log/LICENSE or refer refer to http://unlicense.org
- * ============================================================================*/
-#include
-#include