diff --git a/.gitignore b/.gitignore
index 6db9ba9..a1dff74 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
-# ---> VisualStudio
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
@@ -21,6 +20,8 @@
[Rr]eleases/
x64/
x86/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
@@ -210,7 +211,7 @@ _pkginfo.txt
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
-!*.[Cc]ache/
+!?*.[Cc]ache/
# Others
ClientBin/
@@ -254,6 +255,7 @@ ServiceFabricBackup/
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
+*- Backup*.rdl
# Microsoft Fakes
FakesAssemblies/
@@ -334,3 +336,13 @@ ASALocalRun/
# Local History for Visual Studio
.localhistory/
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# references
+ref
+
+# doxygen docs
+doxygen/**
+**.bak
+dox.log
diff --git a/Leadercraft.sln b/Leadercraft.sln
new file mode 100644
index 0000000..31d126a
--- /dev/null
+++ b/Leadercraft.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29609.76
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Leadercraft", "Leadercraft\Leadercraft.csproj", "{E0EEA15D-AB3C-4C73-A000-C49B5AE9EA66}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {E0EEA15D-AB3C-4C73-A000-C49B5AE9EA66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E0EEA15D-AB3C-4C73-A000-C49B5AE9EA66}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E0EEA15D-AB3C-4C73-A000-C49B5AE9EA66}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E0EEA15D-AB3C-4C73-A000-C49B5AE9EA66}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {588EB8B7-9ADA-4723-BAC9-04B676A88771}
+ EndGlobalSection
+EndGlobal
diff --git a/Leadercraft/Leadercraft.csproj b/Leadercraft/Leadercraft.csproj
new file mode 100644
index 0000000..d49ded7
--- /dev/null
+++ b/Leadercraft/Leadercraft.csproj
@@ -0,0 +1,732 @@
+
+
+
+ net472
+ true
+ 0.0.1
+ Me
+ MIT
+ https://git.exmods.org/modtainers/HelloModdingWorld
+ en-CA
+
+
+
+
+
+
+
+
+
+
+
+ ..\ref\Plugins\GamecraftModdingAPI.dll
+..\..\ref\Plugins\GamecraftModdingAPI.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\IllusionInjector.dll
+..\..\ref\Gamecraft_Data\Managed\IllusionInjector.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\IllusionPlugin.dll
+..\..\ref\Gamecraft_Data\Managed\IllusionPlugin.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Analytics.dll
+..\..\ref\Gamecraft_Data\Managed\Analytics.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Assembly-CSharp-firstpass.dll
+..\..\ref\Gamecraft_Data\Managed\Assembly-CSharp-firstpass.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Assembly-CSharp.dll
+..\..\ref\Gamecraft_Data\Managed\Assembly-CSharp.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Authentication.dll
+..\..\ref\Gamecraft_Data\Managed\Authentication.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\BlockEntityFactory.dll
+..\..\ref\Gamecraft_Data\Managed\BlockEntityFactory.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\CommandLine.dll
+..\..\ref\Gamecraft_Data\Managed\CommandLine.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\DataLoader.dll
+..\..\ref\Gamecraft_Data\Managed\DataLoader.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\DDNA.dll
+..\..\ref\Gamecraft_Data\Managed\DDNA.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Facepunch.Steamworks.Win64.dll
+..\..\ref\Gamecraft_Data\Managed\Facepunch.Steamworks.Win64.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\FMOD.dll
+..\..\ref\Gamecraft_Data\Managed\FMOD.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\FullGame.dll
+..\..\ref\Gamecraft_Data\Managed\FullGame.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Gamecraft.Blocks.ConsoleBlock.dll
+..\..\ref\Gamecraft_Data\Managed\Gamecraft.Blocks.ConsoleBlock.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Gamecraft.Effects.dll
+..\..\ref\Gamecraft_Data\Managed\Gamecraft.Effects.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Gamecraft.GUI.GraphicsScreen.dll
+..\..\ref\Gamecraft_Data\Managed\Gamecraft.GUI.GraphicsScreen.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Gamecraft.GUI.Tweaks.dll
+..\..\ref\Gamecraft_Data\Managed\Gamecraft.GUI.Tweaks.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Gamecraft.GUI.Wires.dll
+..\..\ref\Gamecraft_Data\Managed\Gamecraft.GUI.Wires.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Gamecraft.Tweaks.dll
+..\..\ref\Gamecraft_Data\Managed\Gamecraft.Tweaks.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Gamecraft.Wires.dll
+..\..\ref\Gamecraft_Data\Managed\Gamecraft.Wires.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Gamecraft.Wires.Input.dll
+..\..\ref\Gamecraft_Data\Managed\Gamecraft.Wires.Input.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\GameState.dll
+..\..\ref\Gamecraft_Data\Managed\GameState.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\GPUInstancer.dll
+..\..\ref\Gamecraft_Data\Managed\GPUInstancer.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Havok.Physics.dll
+..\..\ref\Gamecraft_Data\Managed\Havok.Physics.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Havok.Physics.Hybrid.dll
+..\..\ref\Gamecraft_Data\Managed\Havok.Physics.Hybrid.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\HdgRemoteDebugRuntime.dll
+..\..\ref\Gamecraft_Data\Managed\HdgRemoteDebugRuntime.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\IllusionInjector.dll
+..\..\ref\Gamecraft_Data\Managed\IllusionInjector.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\IllusionPlugin.dll
+..\..\ref\Gamecraft_Data\Managed\IllusionPlugin.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\JWT.dll
+..\..\ref\Gamecraft_Data\Managed\JWT.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\LZ4.dll
+..\..\ref\Gamecraft_Data\Managed\LZ4.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\MultiplayerNetworking.dll
+..\..\ref\Gamecraft_Data\Managed\MultiplayerNetworking.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\MultiplayerTest.dll
+..\..\ref\Gamecraft_Data\Managed\MultiplayerTest.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Newtonsoft.Json.dll
+..\..\ref\Gamecraft_Data\Managed\Newtonsoft.Json.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RCX.ScreenshotTaker.dll
+..\..\ref\Gamecraft_Data\Managed\RCX.ScreenshotTaker.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Rewired_Core.dll
+..\..\ref\Gamecraft_Data\Managed\Rewired_Core.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Rewired_Windows.dll
+..\..\ref\Gamecraft_Data\Managed\Rewired_Windows.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Robocraft.MainGame.AutoEnterSimulation.dll
+..\..\ref\Gamecraft_Data\Managed\Robocraft.MainGame.AutoEnterSimulation.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.AccountPreferences.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.AccountPreferences.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Blocks.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Blocks.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Blocks.Ghost.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Blocks.Ghost.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Blocks.Triggers.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Blocks.Triggers.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Character.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Character.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Common.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Common.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.ControlsScreen.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.ControlsScreen.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Crosshair.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Crosshair.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.EntityStreamUtility.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.EntityStreamUtility.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.FrontEnd.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.FrontEnd.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.GameSignalHandling.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.GameSignalHandling.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.GUI.DebugDisplay.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.GUI.DebugDisplay.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.GUI.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.GUI.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.GUI.RemoveBlock.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.GUI.RemoveBlock.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.GUI.ScaleGhost.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.GUI.ScaleGhost.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.GUI.SignalLabel.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.GUI.SignalLabel.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.GUIs.WorkshopPrefabs.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.GUIs.WorkshopPrefabs.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Input.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Input.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Inventory.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Inventory.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.MachineEditor.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.MachineEditor.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.MainGame.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.MainGame.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.MainSimulation.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.MainSimulation.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Multiplayer.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Multiplayer.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Multiplayer.NetworkEntityStream.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Multiplayer.NetworkEntityStream.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.MultiplayerInput.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.MultiplayerInput.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Party.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Party.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.PartyGui.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.PartyGui.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Physics.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Physics.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.PilotSeat.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.PilotSeat.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Player.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Player.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Priority.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Priority.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Rendering.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Rendering.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Rendering.Mock.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Rendering.Mock.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.SaveAndLoad.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.SaveAndLoad.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.SaveGameDialog.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.SaveGameDialog.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Serializers.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Serializers.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.Services.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.Services.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.SignalHandling.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.SignalHandling.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX.StateSync.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX.StateSync.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX_SpawnPoints.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX_SpawnPoints.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocraftX_TextBlock.dll
+..\..\ref\Gamecraft_Data\Managed\RobocraftX_TextBlock.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\RobocratX.SimulationCompositionRoot.dll
+..\..\ref\Gamecraft_Data\Managed\RobocratX.SimulationCompositionRoot.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\StringFormatter.dll
+..\..\ref\Gamecraft_Data\Managed\StringFormatter.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Svelto.Common.dll
+..\..\ref\Gamecraft_Data\Managed\Svelto.Common.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Svelto.ECS.Debugger.dll
+..\..\ref\Gamecraft_Data\Managed\Svelto.ECS.Debugger.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Svelto.ECS.dll
+..\..\ref\Gamecraft_Data\Managed\Svelto.ECS.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Svelto.Services.dll
+..\..\ref\Gamecraft_Data\Managed\Svelto.Services.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Svelto.Tasks.dll
+..\..\ref\Gamecraft_Data\Managed\Svelto.Tasks.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Addressables.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Addressables.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Burst.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Burst.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Burst.Unsafe.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Burst.Unsafe.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Collections.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Collections.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Entities.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Entities.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Entities.Hybrid.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Entities.Hybrid.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Entities.Properties.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Entities.Properties.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Entities.StaticTypeRegistry.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Entities.StaticTypeRegistry.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Jobs.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Jobs.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Mathematics.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Mathematics.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Mathematics.Extensions.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Mathematics.Extensions.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Mathematics.Extensions.Hybrid.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Mathematics.Extensions.Hybrid.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Physics.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Physics.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Physics.Hybrid.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Physics.Hybrid.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Postprocessing.Runtime.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Postprocessing.Runtime.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Properties.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Properties.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.RenderPipelines.Lightweight.Runtime.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.RenderPipelines.Lightweight.Runtime.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.ResourceManager.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.ResourceManager.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Scenes.Hybrid.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Scenes.Hybrid.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.ScriptableBuildPipeline.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.ScriptableBuildPipeline.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.TextMeshPro.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.TextMeshPro.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Timeline.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Timeline.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Transforms.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Transforms.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\Unity.Transforms.Hybrid.dll
+..\..\ref\Gamecraft_Data\Managed\Unity.Transforms.Hybrid.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.AccessibilityModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.AccessibilityModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.AIModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.AIModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.AndroidJNIModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.AndroidJNIModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.AnimationModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.AnimationModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.ARModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.ARModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.AssetBundleModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.AssetBundleModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.AudioModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.AudioModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.ClothModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.ClothModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.ClusterInputModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.ClusterInputModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.ClusterRendererModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.ClusterRendererModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.CoreModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.CoreModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.CrashReportingModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.CrashReportingModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.DirectorModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.DirectorModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.DSPGraphModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.DSPGraphModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.FileSystemHttpModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.FileSystemHttpModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.GameCenterModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.GameCenterModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.GridModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.GridModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.HotReloadModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.HotReloadModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.ImageConversionModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.ImageConversionModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.IMGUIModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.IMGUIModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.InputLegacyModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.InputLegacyModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.InputModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.InputModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.JSONSerializeModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.JSONSerializeModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.LocalizationModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.LocalizationModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.ParticleSystemModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.ParticleSystemModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.PerformanceReportingModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.PerformanceReportingModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.Physics2DModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.Physics2DModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.PhysicsModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.PhysicsModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.ProfilerModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.ProfilerModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.ScreenCaptureModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.ScreenCaptureModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.SharedInternalsModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.SharedInternalsModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.SpriteMaskModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.SpriteMaskModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.SpriteShapeModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.SpriteShapeModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.StreamingModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.StreamingModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.SubstanceModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.SubstanceModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.TerrainModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.TerrainModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.TerrainPhysicsModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.TerrainPhysicsModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.TextCoreModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.TextCoreModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.TextRenderingModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.TextRenderingModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.TilemapModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.TilemapModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.TLSModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.TLSModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UI.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UI.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UIElementsModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UIElementsModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UIModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UIModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UmbraModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UmbraModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UNETModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UNETModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UnityAnalyticsModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UnityAnalyticsModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UnityConnectModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UnityConnectModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UnityTestProtocolModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UnityTestProtocolModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UnityWebRequestModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UnityWebRequestModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.VehiclesModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.VehiclesModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.VFXModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.VFXModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.VideoModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.VideoModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.VRModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.VRModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.WindModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.WindModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\UnityEngine.XRModule.dll
+..\..\ref\Gamecraft_Data\Managed\UnityEngine.XRModule.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\uREPL.dll
+..\..\ref\Gamecraft_Data\Managed\uREPL.dll
+
+
+ ..\ref\Gamecraft_Data\Managed\VisualProfiler.dll
+..\..\ref\Gamecraft_Data\Managed\VisualProfiler.dll
+
+
+
+
+
+
+
+
+
diff --git a/Leadercraft/LeadercraftPlugin.cs b/Leadercraft/LeadercraftPlugin.cs
new file mode 100644
index 0000000..43f991e
--- /dev/null
+++ b/Leadercraft/LeadercraftPlugin.cs
@@ -0,0 +1,46 @@
+using System.Reflection;
+
+using IllusionPlugin;
+using GamecraftModdingAPI;
+
+namespace Leadercraft
+{
+ public class LeadercraftPlugin : IPlugin // the Illusion Plugin Architecture (IPA) will ignore classes that don't implement IPlugin'
+ {
+ public string Name { get; } = Assembly.GetExecutingAssembly().GetName().Name; // mod name
+
+ public string Version { get; } = Assembly.GetExecutingAssembly().GetName().Version.ToString(); // mod & assembly version
+
+ // called when Gamecraft shuts down
+ public void OnApplicationQuit()
+ {
+ // Shutdown this mod
+ GamecraftModdingAPI.Utility.Logging.LogDebug($"{Name} has shutdown");
+
+ // Shutdown the Gamecraft modding API last
+ GamecraftModdingAPI.Main.Shutdown();
+ }
+
+ // called when Gamecraft starts up
+ public void OnApplicationStart()
+ {
+ // Initialize the Gamecraft modding API first
+ GamecraftModdingAPI.Main.Init();
+ // check out the modding API docs here: https://mod.exmods.org/
+
+ // Initialize this mod
+
+ GamecraftModdingAPI.Utility.Logging.LogDebug($"{Name} has started up");
+ }
+
+ // unused methods
+
+ public void OnFixedUpdate() { } // called once per physics update
+
+ public void OnLevelWasInitialized(int level) { } // called after a level is initialized
+
+ public void OnLevelWasLoaded(int level) { } // called after a level is loaded
+
+ public void OnUpdate() { } // called once per rendered frame (frame update)
+ }
+}
\ No newline at end of file
diff --git a/Leadercraft/Server/CriteriaStruct.cs b/Leadercraft/Server/CriteriaStruct.cs
new file mode 100644
index 0000000..730b3c7
--- /dev/null
+++ b/Leadercraft/Server/CriteriaStruct.cs
@@ -0,0 +1,16 @@
+using System;
+namespace Leadercraft.Server
+{
+ internal struct CriteriaStruct
+ {
+ public float[][] Location; // 2 x (x,y,z) vector (min and then max)
+
+ public int Time; // time since start of game (seconds)
+
+ public int GameID;
+
+ public int PlayerID;
+
+ public bool Complete;
+ }
+}
diff --git a/Leadercraft/Server/KeyStruct.cs b/Leadercraft/Server/KeyStruct.cs
new file mode 100644
index 0000000..94a897a
--- /dev/null
+++ b/Leadercraft/Server/KeyStruct.cs
@@ -0,0 +1,10 @@
+using System;
+namespace Leadercraft.Server
+{
+ internal struct KeyStruct
+ {
+ public string Token;
+
+ public int PlayerID;
+ }
+}
diff --git a/Leadercraft/Server/LeadercraftApi.cs b/Leadercraft/Server/LeadercraftApi.cs
new file mode 100644
index 0000000..f094d8e
--- /dev/null
+++ b/Leadercraft/Server/LeadercraftApi.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Net;
+using System.Text;
+using System.IO;
+using Newtonsoft.Json;
+namespace Leadercraft.Server
+{
+ internal class LeadercraftApi
+ {
+ private readonly uint _userId;
+
+ private readonly string _tokenUrl;
+
+ private readonly string _criteriaUrl;
+
+ public LeadercraftApi(uint userId, string tokenUrl, string criteriaUrl)
+ {
+ this._userId = userId;
+ this._tokenUrl = tokenUrl;
+ this._criteriaUrl = criteriaUrl;
+ }
+
+ public LeadercraftResult RequestPOSTToken()
+ {
+ NewKeyStruct reqBodyObj = new NewKeyStruct{ PlayerID = _userId };
+ byte[] reqBodyBytes = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(reqBodyObj));
+ // Request
+ WebRequest request = WebRequest.Create(_tokenUrl);
+ request.Method = "POST";
+ request.ContentLength = reqBodyBytes.Length;
+ request.ContentType = "application/json";
+ Stream body = request.GetRequestStream();
+ body.Write(reqBodyBytes, 0, reqBodyBytes.Length);
+ body.Close();
+ // Response
+ HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+ body = response.GetResponseStream();
+ byte[] respBodyBytes = new byte[int.Parse(response.GetResponseHeader("Content-Length"))];
+ body.Read(respBodyBytes, 0, int.Parse(response.GetResponseHeader("Content-Length")));
+ response.Close();
+ return new LeadercraftResult(respBodyBytes, (int)response.StatusCode);
+ }
+
+ public LeadercraftResult RequestPOSTCriteria(CriteriaStruct criteria, string token)
+ {
+ criteria.PlayerID = (int)_userId;
+ byte[] reqBodyBytes = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(criteria));
+ // Request
+ WebRequest request = WebRequest.Create(_criteriaUrl);
+ request.Method = "POST";
+ request.ContentLength = reqBodyBytes.Length;
+ request.ContentType = "application/json";
+ request.Headers.Add(HttpRequestHeader.Authorization, "leadercraft "+token);
+ Stream body = request.GetRequestStream();
+ body.Write(reqBodyBytes, 0, reqBodyBytes.Length);
+ body.Close();
+ // Response
+ HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+ body = response.GetResponseStream();
+ byte[] respBodyBytes = new byte[int.Parse(response.GetResponseHeader("Content-Length"))];
+ body.Read(respBodyBytes, 0, int.Parse(response.GetResponseHeader("Content-Length")));
+ response.Close();
+ return new LeadercraftResult(respBodyBytes, (int)response.StatusCode);
+ }
+ }
+}
diff --git a/Leadercraft/Server/LeadercraftResult.cs b/Leadercraft/Server/LeadercraftResult.cs
new file mode 100644
index 0000000..96e9008
--- /dev/null
+++ b/Leadercraft/Server/LeadercraftResult.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Text;
+using Newtonsoft.Json;
+namespace Leadercraft.Server
+{
+ internal class LeadercraftResult
+ {
+ private string _responseJson;
+
+ public readonly int StatusCode;
+
+ public bool IsError { get => StatusCode < 200 || StatusCode > 299; }
+
+ public ResultStruct ParseResult()
+ {
+ return JsonConvert.DeserializeObject>(_responseJson);
+ }
+
+ public ResultStruct ParseError()
+ {
+ return JsonConvert.DeserializeObject>(_responseJson);
+ }
+
+ public LeadercraftResult(string response, int status = 200)
+ {
+ this._responseJson = response;
+ this.StatusCode = status;
+ }
+
+ public LeadercraftResult(byte[] response, int status = 200)
+ {
+ this._responseJson = Encoding.ASCII.GetString(response);
+ this.StatusCode = status;
+ }
+ }
+}
diff --git a/Leadercraft/Server/NewKeyStruct.cs b/Leadercraft/Server/NewKeyStruct.cs
new file mode 100644
index 0000000..7f483f9
--- /dev/null
+++ b/Leadercraft/Server/NewKeyStruct.cs
@@ -0,0 +1,8 @@
+using System;
+namespace Leadercraft.Server
+{
+ internal struct NewKeyStruct
+ {
+ public uint PlayerID;
+ }
+}
diff --git a/Leadercraft/Server/ResultStruct.cs b/Leadercraft/Server/ResultStruct.cs
new file mode 100644
index 0000000..d5a1c2d
--- /dev/null
+++ b/Leadercraft/Server/ResultStruct.cs
@@ -0,0 +1,18 @@
+using System;
+namespace Leadercraft.Server
+{
+ internal struct ResultStruct
+ {
+ public int StatusCode; // HTTP Response status code
+
+ public T[] Items; // Result items
+
+ public int Elapsed; // Time (ns)
+
+ public string Query; // pseudo query language
+
+ public string URL; // request URL
+
+ public string Start; // start time
+ }
+}
diff --git a/Leadercraft/Server/Tests.cs b/Leadercraft/Server/Tests.cs
new file mode 100644
index 0000000..c9dc3cb
--- /dev/null
+++ b/Leadercraft/Server/Tests.cs
@@ -0,0 +1,48 @@
+using System;
+using NUnit.Framework;
+namespace Leadercraft.Server
+{
+ [TestFixture]
+ public class Tests
+ {
+ private static readonly string tokenUrl = "http://192.168.122.229:1337/token";
+
+ private static readonly string criteriaUrl = "http://192.168.122.229:7048/criteria";
+
+ private LeadercraftApi api;
+
+ [SetUp]
+ public void SetUp()
+ {
+ api = new LeadercraftApi(13, tokenUrl, criteriaUrl);
+ }
+
+ [Test]
+ public void TokenIntegrationTest()
+ {
+ LeadercraftResult result = api.RequestPOSTToken();
+ Assert.AreEqual(200, result.StatusCode, "Expected HTTP 200 Ok StatusCode");
+ ResultStruct resultStruct = result.ParseResult();
+ Assert.Greater(resultStruct.Items.Length, 0, "Expected a non-zero item count");
+ Assert.AreEqual(1, resultStruct.Items.Length, "Expected one result item");
+ Assert.IsNotEmpty(resultStruct.Items[0].Token, "Expected a non-empty token string");
+ }
+
+ [Test]
+ public void CriteriaIntegrationTest()
+ {
+ CriteriaStruct criteria = new CriteriaStruct
+ {
+ Location = new float[][] { new float[] { 1, 1, 0 }, new float[] { 1, 1, 0 } },
+ Time = 42,
+ GameID = 2,
+ PlayerID = 333,
+ Complete = true
+ };
+ // this may fail when TokenIntegrationTest also fails
+ string token = api.RequestPOSTToken().ParseResult().Items[0].Token;
+ LeadercraftResult result = api.RequestPOSTCriteria(criteria, token);
+ Assert.AreEqual(200, result.StatusCode, "Expected HTTP 200 Ok StatusCode");
+ }
+ }
+}
diff --git a/Leadercraft/Server/Tools.cs b/Leadercraft/Server/Tools.cs
new file mode 100644
index 0000000..11eb597
--- /dev/null
+++ b/Leadercraft/Server/Tools.cs
@@ -0,0 +1,17 @@
+using System;
+using Steamworks;
+namespace Leadercraft.Server
+{
+ public static class Tools
+ {
+ public static bool IsSteamAvailable
+ {
+ get => SteamClient.IsValid;
+ }
+
+ public static uint UserId
+ {
+ get => SteamClient.SteamId.AccountId;
+ }
+ }
+}
diff --git a/README.md b/README.md
index 7f41e0e..a30379b 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,35 @@
-# leadercraft
+# Leadercraft
-Follow the leader
\ No newline at end of file
+Shell project for Gamecraft mods.
+Use this as a quick-start project structure for your own mods, or to learn how modding works.
+
+## Installation
+
+First, install the [Gamecraft Modding API](https://git.exmods.org/modtainers/GamecraftModdingAPI) ([direct link to install guide](https://www.exmods.org/guides/install.html)).
+To install the Leadercraft mod, copy the latest release's `Leadercraft.dll` and `0Harmony.dll` files into the `Plugins` folder in Gamecraft's main folder or follow the [install guide](https://www.exmods.org/guides/install.html) again for Leadercraft.
+
+## Development
+
+### Setup
+
+This project requires most of Gamecraft's `.dll` files to function correctly.
+Most, but not all, of these files are stored in Gamecraft's `Gamecraft_Data\Managed` folder.
+The project is pre-configured to look in a folder called ref in the solution's main directory or one level up from that.
+
+You can make sure Leadercraft can find all of `.dll` files it needs by copying your Gamecraft folder here and renaming it to `ref`, but you'll have to re-copy it after every Gamecraft update.
+You can also create a symbolic link (look it up) to your Gamecraft install folder named `ref` in this folder to avoid having to re-copy files.
+
+For any mod to work, you will have to patch your game with [GCIPA](https://git.exmods.org/modtainers/GCIPA).
+[Direct link to install guide](https://git.exmods.org/modtainers/GCIPA/src/branch/master/README.md#how-to-install).
+!!Download a release from git.exmods.org not github.com!!
+
+This project also requires the [GamecraftModdingAPI](https://git.exmods.org/modtainers/GamecraftModdingAPI) library to be installed (in `ref/Plugins/GamecraftModdingAPI.dll`).
+[Direct link to install guide](https://www.exmods.org/guides/install.html).
+
+### Building
+
+After you've completed the setup, open the solution file `Leadercraft.sln` in your prefered C# .NET/Mono development environment.
+I'd recommend Visual Studio Community Edition or JetBrains Rider for Windows and Monodevelop for Linux.
+
+If you've successfully completed setup, you should be able to build the Leadercraft project without errors.
+If it doesn't work and you can't figure out why, ask for help on the [Gamecraft Modding Discord server](https://discord.gg/xjnFxQV).
\ No newline at end of file